// adv_select.js
// Advanced Select Component
// Copyright (c) 2003 Zoltan Schavel [ zoltan_schavel@hotmail.com ]
// All Rights Reserved
// http://www.devsrc.com

// Version history:
// 1.0: 2003-05-31 initial version, IE only
// 1.1: 2003-07-02 Opera, Netscape compatibility
// 1.2: 2003-08-20 ASP.NET compatible version
// 1.3: 2003-09-05 images
// 2.0: 2003-09-18 filter mode, HTML items, full ASP.NET component, simplified API
// 2.5: 2003-10-03 multicolumn & sort feature
// 2.6: 2003-10-10 preserve result order, enter new value
// 2.7: 2003-10-28 mouseover highlight, autocomplete, bug fixes

// Global variables

var _advSel_Initializing = false;
var _advSel_DOTNET = '';
var _advSel_FilterMode = new Array();
//var _advSel_Vals = new Array();
var _advSel_Selecteds = new Array();
var _advSel_Input = new Array();
var _advSel_MinChars = new Array();
var _advSel_ItemHTML = new Array();
var _advSel_Text = new Array();
var _advSel_List = new Array();
var _advSel_Source = new Array();
var _advSel_N = new Array();
var _advSel_Height = new Array();
var _advSel_Width = new Array();
var _advSel_InputHeight = new Array();
var _advSel_DefSel = new Array();
var _advSel_Options = new Array();
var _advSel_PrevCtl = new Array();
var _advSel_Found = new Array();
var _advSel_LastSelIndex = new Array();
var _advSel_ButtonImage = new Array();
var _advSel_ButtonDownImage = new Array();
var _advSel_ButtonHLImage = new Array();
var _advSel_ButtonHLDownImage = new Array();
var _advSel_CheckedImage = new Array();
var _advSel_UnCheckedImage = new Array();
var _advSel_SortAscImage = new Array();
var _advSel_SortDescImage = new Array();
var _advSel_ColText = new Array();
var _advSel_ColData = new Array();
var _advSel_ColWidth = new Array();
var _advSel_OrderedSelections = new Array();
var _advSel_PrevInputLen = new Array();
var _advSel_hideit = true;
//var fDefStart = new Array();
var _advSel_sortcol = new Array();
var advSelAscSort = true;
var advSelSortID = 0;
var advSelSortColIdx = 0;
var advSelClickEnabled = true;


_advSel_ColText[1] = new Array();
_advSel_ColWidth[1] = new Array();
_advSel_ColData[1] = new Array();

_advSel_FilterMode[1]=1;
_advSel_MinChars[1]=1;
_advSel_ButtonImage[1]='/scid/generisweb/images/button.gif';
_advSel_ButtonDownImage[1]='/scid/generisweb/images/buttondown.gif';
_advSel_SortAscImage[1]='/scid/generisweb/images/sortdesc.gif';
_advSel_SortDescImage[1]='/scid/generisweb/images/sortdesc.gif';
_advSel_CheckedImage[1]='/scid/generisweb/images/check2.gif';
_advSel_UnCheckedImage[1]='/scid/generisweb/images/uncheck2.gif';
_advSel_ButtonHLImage[1]='/scid/generisweb/images/button_highlight.gif';
_advSel_ButtonHLDownImage[1]='/scid/generisweb/images/button_highlightdown.gif';



//
// advSelOpt
//

function advSelOpt(id, op)
{
	return (_advSel_Options[id].indexOf(op) != -1);
}

//
// advSelPreserveSelectionOrder
//

function advSelPreserveSelectionOrder(id)
{	
	var st = '';
	if (advSelOpt(id, "multiple") && advSelOpt(id, "preserve")) {
		for (var i = 0; i < _advSel_Selecteds[id].length; i++) {
			if (i > 0) { st = st + ','; }
			st = st + _advSel_Selecteds[id][i];
		}
		
		var ctl = advSel_getctl("advSelOrder" + id);
		if (ctl) ctl.value = st; 		
	}
}

//
// advSelTableMouseOver
//

function advSelTableMouseOver(id)
{
	if (advSelOpt(id,'highlight')) {
		var ctl = advSel_getctl('advSelInput' + id);
		if (ctl) ctl.className = 'advSelInputHighLight';
		
		ctl = advSel_getctl('advSelButton' + id);
		if (ctl) {
			var l = advSel_getctl('advSelList' + id);
			if (l && (l.style.display == 'none')) {
				ctl.src = _advSel_ButtonHLImage[id];
			}
			else {
				ctl.src = _advSel_ButtonHLDownImage[id];
			}
		}
	}
}

//
// advSelTableMouseOut
//

function advSelTableMouseOut(id)
{
	if (advSelOpt(id,'highlight')) {
		var ctl = advSel_getctl('advSelInput' + id);
		if (ctl) ctl.className = 'advSelInput';
		
		ctl = advSel_getctl('advSelButton' + id);
		if (ctl) {
			var l = advSel_getctl('advSelList' + id);
			if (l && (l.style.display == 'none')) {
				ctl.src = _advSel_ButtonImage[id];
			}
			else {
				ctl.src = _advSel_ButtonDownImage[id];
			}
		}
	}
}

//
// advSelUpdate
//

function advSelUpdate(id) 
{
	advSelFind(id,false,true,0);
}

//
// advSel_EventSource
//

function advSel_EventSource(e)
{
	var ie = document.all;
	var ns6 = document.getElementById && !document.all
	var source = ie ? event.srcElement : e.target;	
	
	if (source.tagName == "TABLE") return null;
	while (source.tagName != "TR" && source.tagName != "HTML") {		
		source = ns6 ? source.parentNode : source.parentElement;
	}
	
	return source;
}

//
// advSelOver
//

function advSelOver(e)
{
	var source = advSel_EventSource(e);
	if (!source) return;					
	if (source.id != "ignore") {
		var id = source.id; // advSelTRWid_i
		var p = id.indexOf('_');
		if (p != -1) {
			var nid = id.substr(9, p - 9);
			var i = id.substr(p + 1);
			if (i.charAt(i.length - 1) == 's') i = i.substr(0, i.length - 1);
			if (_advSel_Source[nid][i].selected) {
				source.className = "advSelLinkSelHighlight";
			}
			else {
				source.className = "advSelRow";
							
				/*for (var k = 0; k < source.cells.length; k++) {
					source.cells[k].className = "cell_1";
				}*/			 
			}
		}
	}
}

//
// advSelOut
//

function advSelOut(e)
{
	var source = advSel_EventSource(e);
	if (!source) return;
	
	if (source.id != "ignore") {
		var id = source.id; // advSelTRWid_i
		var p = id.indexOf('_');
		if (p != -1) {
			var nid = id.substr(9, p - 9);
			var i = id.substr(p + 1);
			if (i.charAt(i.length - 1) == 's') i = i.substr(0, i.length - 1);		
			
			if (_advSel_Source[nid][i].selected /*|| _advSel_Source[nid][i].defaultSelected*/) {
				source.className = "advSelLinkSel";
			}
			else {
				source.className = "AdvUnselRow";
			}	
		}
	}	
}

//
// advSelClick
//

function advSelClick(e)
{
	if (!advSelClickEnabled) return;

	var source = advSel_EventSource(e);
	if (!source) return;
	var id = source.id; // advSelTRWid_i
	
	var p = id.indexOf('_');
	if (p != -1) {
		var nid = id.substr(9, p - 9);
		var i = id.substr(p + 1);	
		var shortcut = (i.charAt(i.length - 1) == 's');
		if (shortcut) { i = i.substr(0, i.length - 1); }
		if (advSelOpt(nid, "multiple")) {
			advSel_rowsel(nid, i, shortcut);
		}
		else {
			advSel_sel(nid, i);
		}
	}
}

//
// advSel_rowsel
//

function advSel_rowsel(id,i,shortcut)
{
	var ctl, cb, s, i, f;	
	if (shortcut) {	s = 's'; }
	else { s = ''; }
	
	ctl = advSel_getctl('advSelTRW' + id + '_' +i+s);
	if (shortcut) {
		cb = advSel_getctl('advSelscb'+id + '_'+i);
	}
	else {
		cb = advSel_getctl('advSelcb'+id + '_'+i);		
	}
	advSelClickEnabled = false;	
	
	s = '';		
	if (cb.className == 'advSelChecked') {	
		ctl.className = 'AdvUnselRow';
		advSel_removeItems(_advSel_Selecteds[id], _advSel_Source[id][i].value);
		_advSel_Source[id].options[i].selected = false;		
		cb.src = _advSel_UnCheckedImage[id];
		cb.className = 'advSelUnChecked';
		//if (shortcut) ctl.style.display = 'none';
	}
	else {	
		ctl.className = 'advSelLinkSel';		 
		_advSel_Selecteds[id][_advSel_Selecteds[id].length] = _advSel_Source[id][i].value;
		_advSel_Source[id][i].selected = true;
		cb.src = _advSel_CheckedImage[id];
		cb.className = 'advSelChecked';
	}	
	advSelPreserveSelectionOrder(id);
	
	// check/uncheck other
	
	if (shortcut) {
		ctl = advSel_getctl('advSelTRW' + id + '_' +i);		
		cb = advSel_getctl('advSelcb'+id + '_'+i);
		if (cb) {
			if (cb.className == 'advSelChecked') {
				cb.src = _advSel_UnCheckedImage[id];
				cb.className = 'advSelUnChecked';
				ctl.className = 'AdvUnselRow';
			}
			else {
				cb.src = _advSel_CheckedImage[id];			
				cb.className = 'advSelChecked';
				ctl.className = 'advSelLinkSel';
			}
		}
	}
	else {
		ctl = advSel_getctl('advSelTRW' + id + '_' +i+'s');
		cb = advSel_getctl('advSelscb'+id + '_'+i);
		if (cb) {			
			if (cb.className == 'advSelChecked') {
				cb.src = _advSel_UnCheckedImage[id];
				cb.className = 'advSelUnChecked';
				ctl.className = 'AdvUnselRow';
			}
			else {
				cb.src = _advSel_CheckedImage[id];
				cb.className = 'advSelChecked';
				ctl.className = 'advSelLinkSel';				
			}
		}
	}
	
	advSelClickEnabled = true;
	
	//	s = s + _advSel_Items[id][i] + '<br>';
	//	_advSel_Input[id].title = s; //f + ' item(s)';
}

//
// advSel_sel
//

function advSel_sel(id,i)
{
if (i != -1 && _advSel_Input[id] != null) {
	_advSel_Input[id].value = advSelGetItem(id, i);
	_advSel_Source[id].selectedIndex = i;	

	if (!advSelOpt(id, "multiple")) {
		var ctl = advSel_getctl('advSelTRW' + id + '_' + i);	
		if (ctl) { 
			ctl.className = 'advSelLinkSel';
			if (_advSel_PrevCtl[id] == null) _advSel_PrevCtl[id] = advSel_getctl('advSelTRW' + id + '_' + _advSel_LastSelIndex[id]);	
			if ((_advSel_PrevCtl[id] != null) && (_advSel_PrevCtl[id] != ctl)) {
				_advSel_PrevCtl[id].className = 'advSelLink';
			}
			_advSel_PrevCtl[id] = ctl;
			_advSel_LastSelIndex[id] = i;
		}
	}	
}

	if (_advSel_hideit) { 
		advSel_ctlhide(id);
		//advSel_hide2('advSelTblHeader' + id); 
	}
	else {
		_advSel_hideit = true;
	}
	
	if (!_advSel_Initializing && _advSel_Source[id] != null) {
		if (_advSel_Source[id].onchange != null) _advSel_Source[id].onchange(this.form); 
	}
}

//
// compare
//

function compareColData(option1, option2) 
{
	var a = _advSel_ColData[advSelSortID][option1.value];
	var bs = _advSel_ColData[advSelSortID][option2.value];
	var res = 0;
	if (bs != null) {
		var blist = bs.split('|');
		var b = blist[advSelSortColIdx - 1]; 
		res = a < b ? -1 : a > b ? 1 : 0;
	}	
	if (!advSelAscSort) res = -res;
	return res;
}

function compareText (option1, option2) {
  var res = option1.text < option2.text ? -1 :
    option1.text > option2.text ? 1 : 0;
  if (!advSelAscSort) res = -res;
  return res;
}

function compareValue (option1, option2) {
  var res = option1.value < option2.value ? -1 :
    option1.value > option2.value ? 1 : 0;
  if (!advSelAscSort) res = -res;
  return res;
}

function compareTextAsFloat (option1, option2) {
  var value1 = parseFloat(option1.text);
  var value2 = parseFloat(option2.text);
  var res = value1 < value2 ? -1 :
    value1 > value2 ? 1 : 0;
  if (!advSelAscSort) res = -res;
  return res;
}

function compareValueAsFloat (option1, option2) {
  var value1 = parseFloat(option1.value);
  var value2 = parseFloat(option2.value);
  var res = value1 < value2 ? -1 :
    value1 > value2 ? 1 : 0;
  if (!advSelAscSort) res = -res;
  return res;
}

function sortSelect (select, compareFunction) {
	if (!compareFunction) compareFunction = compareText;

	var options = new Array (select.options.length);
	var sels = new Array();
	for (var i = 0; i < options.length; i++) {
		options[i] = new Option(select.options[i].text,
			select.options[i].value);		
		if (select.options[i].selected) {
			sels[sels.length] = select.options[i].text + '@' + select.options[i].value;
		}	
	}	
      
	options.sort(compareFunction);
     
	select.options.length = 0;
	for (var i = 0; i < options.length; i++) {
		select.options[i] = options[i];
		var j = 0;
		var issel = false;
		while ((j < sels.length) && !issel) {
			if (sels[j] == select.options[i].text + '@' + select.options[i].value) {
				issel = true;
				select.options[i].selected = true;		
			}
			else {
				j++;
			}
		}
	}
}

//
// advSelGetAbsc
//

function advSelGetAbsc(sc)
{
	var absc = sc;
	if (absc < 0) absc = -absc;
	absc = absc - 1;
	return absc;	
}

//
// advSelChgColSel
//

function advSelChgCol(id, t) {
var i, tr, a, s, comp;

	// Change header

	s = -1;
	tr = advSel_getctl('advSelTblHeader' + id);
	for (i = 0; i < tr.cells.length; i++) {
		if (tr.cells[i] == t) s = i;
	}	
	
	// Change sort direction
	
	var prevc = _advSel_sortcol[id];
	if (_advSel_sortcol[id] > 0) {
		a = -1;
	}
	else {
		a = 1;
	}
	_advSel_sortcol[id] = a * (s + 1);
	
	// Sort
		
	advSelAscSort = (_advSel_sortcol[id] > 0);
	advSelSortID = id;
	var absc = advSelGetAbsc(_advSel_sortcol[id]);
	if (absc > 0) {
		advSelSortColIdx = absc;
		comp = compareColData;				
	}
	else {
		comp = compareText;
	}
	
	sortSelect(_advSel_Source[id], comp);
	advSelUpdate(id);
}

//
// advSelGetItem
//

function advSelGetItem(id, i)
{
	var st = _advSel_Source[id].options[i].text;
	if ((i == 0) && advSelOpt(id,'nofirst')) {
			st = '';
	}
	return st;
}

//
// advSelHeaderCell
//

function advSelHeaderCell(id,col)
{
	var dir = '';
	var absc = _advSel_sortcol[id];
	if (absc < 0) absc = -absc;
	absc = absc - 1;
	
	if (absc == col) {
		if (_advSel_sortcol[id] > 0) dir = '&nbsp;<img align=absmiddle src="' + _advSel_SortDescImage[id] + '">';
		else dir = '&nbsp;<img align=absmiddle src="' + _advSel_SortAscImage[id] + '">';
	}

	var res =dir + _advSel_ColText[id][col] ;
	return res;
}

//
// advSelHeader
//

function advSelHeader(id)
{
	var i, res, colclass;
	res = '';
	for (i = 0; i < _advSel_ColText[id].length; i++) {
		var cw = _advSel_ColWidth[id][i];
		if (cw != '') cw = 'width="' + cw + '" ';
		
		if (i == advSelGetAbsc(_advSel_sortcol[id])) {
			colclass = 'advSelColSel';
		}
		else {
			colclass = 'advSelCol';
		}
		
		res = res + '<td nowrap id="advSelHdrTD' + id + '_' + i + '" ' + cw + 'class="' + colclass + 
			'" onclick="advSelChgCol(' + id + ',this);">' + advSelHeaderCell(id,i) + '</td>';
	}
	return res;
}

//
// advSelInit0
//

function advSelInit0(id, select, defs, opts, editsize)
{
var i = 0;
var st, ctl, selidx;

	// Hide HTML select

	select.style.display = 'none';
	if (select.options.length > 0) { // Opera workaround: selected=true doesn't work when 'display=none' 
		var xsel = select.options[0].selected;
		select.options[0].selected = true;
		if (!select.options[0].selected) {
			select.style.height = '0';			
			select.style.visibility = 'hidden';
			select.style.display = 'inline';
		}
		select.options[0].selected = xsel;
	}
	
	// Initialization
	
	_advSel_DefSel[id] = defs;
	_advSel_Input[id] = advSel_getctl('advSelInput' + id);	
	_advSel_List[id] = advSel_getctl('advSelList' + id);	
	select.multiple = advSelOpt(id, "multiple");	
	_advSel_Source[id] = select;
//	fDefStart[id] = false; //(_advSel_DefSel != '');
	//_advSel_Vals[id] = new Array(select.options.length);
	_advSel_LastSelIndex[id] = 0;
	if (_advSel_sortcol[id] == null) _advSel_sortcol[id] = 1; // 1 based
	_advSel_Selecteds[id] = new Array();	
	if (_advSel_ItemHTML[id] == null) { _advSel_ItemHTML[id] = new Array(); }
	_advSel_PrevCtl[id] = null;
		
	defs = ',' + defs + ',';
	selidx = -1;
		
	// set position	
	
	var fdivp = advSel_getctl('advSelButtonDiv' + id);	
	var button = advSel_getctl('advSelButton' + id);	

//while(theObj != document.body){
//  objOffsetLeft += theObj.offsetLeft;
//  objOffsetTop += theObj.offsetTop;
//  theObj = theObj.offsetParent;
// }
	
	if (select.style.left != '') {
		_advSel_Input[id].style.left = select.style.left;		
	}
	else {
		//_advSel_Input[id].style.left = ml + "px";
	}
	if (select.style.top != '') {
		_advSel_Input[id].style.top = select.style.top;
//		fdivp.style.position = 'absolute';
		fdivp.style.top = select.style.top;
	}
	else {
		//_advSel_Input[id].style.top = "0px";	
	}
	
	var iw = _advSel_Input[id].style.width;
	//alert('iw='+iw);
	if (iw == '') iw = editsize;
	var sw = select.style.width;
	var bw = parseInt(button.width);
	if (bw == 0) bw = 20;
	if (sw == '') sw = iw - bw;
	if (sw != '') {
		iw = (parseInt(sw) - bw);
		_advSel_Input[id].style.width = iw + "px";
		var sl = _advSel_Input[id].style.left;
		if (sl != '') {
			//fdivp.style.position = 'absolute';			
			fdivp.style.left = (parseInt(sl) + iw) + "px";	
			_advSel_List[id].style.left = sl;	
		}
		if (_advSel_Input[id].style.top != '') {
			_advSel_List[id].style.top = (parseInt(_advSel_Input[id].style.top) + parseInt(_advSel_Input[id].offsetHeight)) + "px";	
		}
		_advSel_List[id].style.width = (iw + bw) + "px";		
	}
	
	// fill items		
	while (i < select.options.length) {		
		if (select.options[i].value == '') {
			select.options[i].value = select.options[i].text;			
		}
		if (select.options[i].text == '') {
			select.options[i].text = '&nbsp;';	
		}
		
		if ((defs.indexOf(',' + _advSel_Source[id].options[i].value + ',') != -1) || (select.options[i].defaultSelected)) {
			selidx = i;		
			var s = advSelGetItem(id, i);
			_advSel_Input[id].value = s;
			//_advSel_Source[id].selectedIndex = i;
			_advSel_LastSelIndex[id] = i;
			_advSel_Selecteds[id][_advSel_Selecteds[id].length] = _advSel_Source[id][i].value;
		}
		i++;
	}	
	_advSel_N[id] = i;
	_advSel_Input[id].title = i + ' item(s)';	
	
	//	
	if (false) {		
		ctl = advSel_getctl('if'+id);
		ctl.src = '.asp';	
	}

	// Set IFRAME width

	var ifrm = advSel_getctl('advSelIFRAME'+id); 
	if (ifrm) {
		ifrm.style.width = _advSel_List[id].style.width;
	}

	// 
		
	advSelUpdate(id);
	if ((selidx != -1) && (!advSelOpt(id, "multiple"))) {
		advSel_sel(id, selidx);
	}	
}

function advSelEnterValue(inp,id) {
	//_advSel_Source[id].options.length = _advSel_Source[id].options.length - 1;	
	var op = new Option(inp.value, inp.value, true, true);
	_advSel_Source[id].options.add(op);
	alert(_advSel_Source[id].options[_advSel_Source[id].options.length-1].value + ' = ' + op.value);	
}

//
// advSelInit
//

function advSelInit(id, xform, xsrcname, defs, editsize, opts)
{
var overflow, browser, i;

	if (id == null || id == '') {
		//alert('advSelInit: Missing list ID.');
		id = 1;
	}
	_advSel_Initializing = true;
	_advSel_PrevInputLen[id] = 0;
	_advSel_Options[id] = opts.toLowerCase();	
	if (_advSel_ButtonImage[id] == null) { _advSel_ButtonImage[id] = '/scid/generisweb/images/button.gif'; }
	if (_advSel_ButtonDownImage[id] == null) { _advSel_ButtonDownImage[id] = '/scid/generisweb/images/buttondown.gif'; }
	if (_advSel_ButtonHLImage[id] == null) { _advSel_ButtonHLImage[id] = '/scid/generisweb/images/button_highlight.gif'; }
	if (_advSel_ButtonHLDownImage[id] == null) { _advSel_ButtonHLDownImage[id] = '/scid/generisweb/images/button_highlightdown.gif'; }
	if (_advSel_SortAscImage[id] == null) { _advSel_SortAscImage[id] = '/scid/generisweb/images/sortasc.gif'; }
	if (_advSel_SortDescImage[id] == null) { _advSel_SortDescImage[id] = '/scid/generisweb/images/sortdesc.gif'; }
	if (_advSel_CheckedImage[id] == null) { _advSel_CheckedImage[id] = '/scid/generisweb/images/check2.gif'; }
	if (_advSel_UnCheckedImage[id] == null) { _advSel_UnCheckedImage[id] = '/scid/generisweb/images/uncheck2.gif'; }
	if (xform == '') { xform = '0'; }	
	var select = document.forms[xform].elements[xsrcname];	
	
	// Old browsers
		
	browser = navigator.userAgent;
	var old = ((browser.indexOf("Mozilla/4") != -1) && (browser.indexOf("compatible") == -1)) || // NN4
			(browser.indexOf("MSIE 4") != -1); // IE4	
	if (old) { 
	//	select.style.display = 'inline';
		return false;
	}

	// Sizes

	if (editsize == '') { editsize = "50"; }

	if (_advSel_Height[id] == null || _advSel_Height[id].length == 0) { _advSel_Height[id] = '300px'; }

	var h = '';
	var w = '';
	var ih = '';
	var txt = '';
	if (_advSel_Text[id] != null) txt = _advSel_Text[id];
	if (_advSel_InputHeight[id] != null) ih = ";height:" + _advSel_InputHeight[id];
	if (_advSel_Height[id] != null) h = ";height:" + _advSel_Height[id];
//	if (_advSel_Width[id] != null) w = ";width:" + _advSel_Width[id];

	var dp = '';
	if (_advSel_DOTNET != '') {
		dp = 'position:absolute;';
	}

	// Overflow & workarounds

	var ifr = '';
	if (browser.indexOf("MSIE") != -1) {
		overflow = "overflow-y: auto";

		// IE workaround: DIV over SELECT bug

		if (browser.indexOf("Opera") == -1) {
		
		//MOZ: document.defaultView.getComputedStyle(..., '').getPropertyValue(...)
		var w2 = ''; //';width:' + select.currentStyle.width;

			ifr = '<iframe frameborder="0" scrolling="no" src="javascript:false;" style="display:none' + w2 + h + 
			';filter:\'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)\';z-index:998;position:absolute;" ' +
			'id="advSelIFRAME' + id + '"></iframe>';
		}
	}
	else {
		overflow = "overflow: auto";
	}

	if (browser.indexOf("Opera") != -1) {
		overflow = "overflow: auto; width:300px";
	}

	//
	
	var lb = 'none';
	var lb2 = 'inline';
	if (advSelOpt(id, "listbox")) {
		lb = 'block';
		lb2 = 'none';
	}

	var ob = '';
	var os = '';
	var ins = '';
	if (advSelOpt(id, "noinput") && advSelOpt(id, "listbox")) ins = 'display: none;';	
	if (advSelOpt(id, "enter")) ob = ' onblur="advSelEnterValue(this,' + id + ');" ';
	if (advSelOpt(id, "preserve")) os = '<input type="hidden" name="advSelOrder' + id + '" id="advSelOrder' + id + '" value=""> ';
	var inp = '<input class="advSelInput" value="' + 
	txt + '" autocomplete="off" type="text" id="advSelInput' + id + '" name="advSelInput' + 
	id + '"  ' + ob + ' onkeyup="advSelFind('+ id + ',true,false,event.keyCode)" ' +
	' style="' + ins + dp + ih + w + ';">';
	
	var html = '<table border=0 cellpadding=0 cellspacing=0>' +
	'<tr onmouseover="advSelTableMouseOver(' + id + ')" onmouseout="advSelTableMouseOut(' + id + ')">' + 
	'<td nowrap>' + inp + os + '</td><td nowrap>';
	html = html + '<div id="advSelButtonDiv' + id +'" class="advSelButtonDiv" style="' + dp + 'display:' + lb2 + ';">' +
	'<img id="advSelButton' + id + '" src="' + _advSel_ButtonImage[id] + '" height="17" width="29" onclick="advSel_showhide('+ id + ')"></div>' +
	'</td></tr>' + 
	'<tr><td>' + ifr + '<div id="advSelList' + id + '" name="advSelList' + id + '" class="advSelListDiv" style="position:absolute;z-index:999; ' + 
	overflow + '; display:' + lb + h + ';"></div>' +
	'</td></tr></table>'; //<input type="hidden" name="' + xname + '" value="' + defs + '">';
	
	//'<div id="xdiv' + id + '" name="xdiv' + id + '" ' +
    //' style="position:absolute;display:none; backGround:none">' +
    //'<iframe id="if' + id + '" src="s.asp"></iframe></div>'

	//var ctl = advSel_getctl('advSeldiv' + id);
	//ctl.innerHTML = html;
	document.write(html);

	advSelInit0(id, select, defs, opts,editsize);

	var ctl = advSel_getctl('advSelList' + id);
	if (advSelOpt(id, "listbox") && ctl) {
		ctl.style.display = 'block';
	}
	
	_advSel_Initializing = false;
}

//
// advSelRenderItem
//

function advSelRenderItem(s, id, i, shortcuts,f)
{
var st = s;
	
	// Add item HTML

	var vv = _advSel_Source[id].options[i].value;
	if (_advSel_ItemHTML[id] != null) {
		if (_advSel_ItemHTML[id][vv] != null) {
			if (_advSel_ItemHTML[id][vv].length > 0) {
				st = _advSel_ItemHTML[id][vv] + st;
			}
		}								
	}		

	// Multiple checkbox
	
	var checked = '';				
	var img = '';
	var rwc = '';
	if (advSelOpt(id, "multiple")) {
		if (_advSel_Source[id][i].selected || _advSel_Source[id][i].defaultSelected) { 
			rwc = 'advSelChecked'; 			
			img = _advSel_CheckedImage[id];
		}
		else {
			rwc = 'advSelUnChecked';						
			img = _advSel_UnCheckedImage[id];
		}
		var cbname = 'advSelcb';
		if (shortcuts) cbname = 'advSelscb';
		
		st = '<img src="' + img + '" class="' + rwc + '" id="' + cbname + id + '_' + i + '" ' + '></img>' + st;
	}				

	// Columns

	var w = '';
	if (advSelOpt(id, "multicol")) {
		if ((_advSel_ColWidth[id][0] != null) && (f == 0)) {
			w = ' width="' + _advSel_ColWidth[id][0] + '"';
		}
	}
	if (rwc == '') {				
		if (_advSel_Source[id][i].selected) {		
			rwc = 'advSelLinkSel';
			_advSel_LastSelIndex[id] = i;
		}
		else rwc = 'advSelList';
	}
	
	var sc = '';
	if (shortcuts) sc = 's';
	var row = '<tr class="' + rwc + '" id="advSelTRW' + id + '_' + i + sc + '">' + 
		'<td nowrap ' + w + ' valign="top">'; //multicolumn		
	var rowe = '</td></tr>';
	
	var cols = '';
	var j;
	var key = _advSel_Source[id][i].value;
	if (advSelOpt(id, "multicol")) {
		var data = _advSel_ColData[id][key];
		if (data) {
			data = data.split('|');
			for (j = 1; j < _advSel_ColText[id].length; j++) {
				w = '';
				if (f == 0) {
					w = ' width="' + _advSel_ColWidth[id][j] + '"';		
				}
				cols = cols + '</td><td nowrap valign="top"' + w + '>'; //multicolumn
				if (data[j - 1]) cols = cols + data[j - 1];
			}
		}
		else {
			for (j = 1; j < _advSel_ColText[id].length; j++) {
				var w = '';
				if (f == 0) {
					w = ' width="' + _advSel_ColWidth[id][j] + '"';
				}		
				cols = cols + '</td><td nowrap valign="top"' + w + '>&nbsp;'; //multicolumn
			}
		}
	}
	return row + st + cols + rowe;
}

//
// advSelListTbl
// 

function advSelListTbl(id)
{
	var w = '100%';
    //if (_advSel_Input[id].style.width != '') w = _advSel_Input[id].style.width;
    w = '<table class="advSelListTbl" width="' + w + '" border="0" cellpadding="0" cellspacing="0" ';      
    //if (!_advSel_Multiple[id]) {
		w = w + 'onClick="advSelClick(event)" onMouseover="advSelOver(event)" onMouseout="advSelOut(event)" ';
     // }
	w = w + '>';
	return w;
}

//
// advSelFind
//

function advSelFind(id,showit,showall,keycode)
{	
    var found = false;          
    var v = _advSel_Input[id].value.toLowerCase();      
    var i = 0;          
    var f = 0;
    var st;
    var prevlen = _advSel_PrevInputLen[id];
    _advSel_PrevInputLen[id] = v.length;
    
    // Header
    
	if (v.length == 0) _advSel_Input[id].title = _advSel_N + ' item(s)';

	var mc = _advSel_MinChars[id];
	if (mc == null || mc == "") mc = 2;
    if (v.length > 0 && v.length < mc) return;	
	
	if (_advSel_Found[id] == null) { _advSel_Found[id] = new Array(); }
    
    // Up & Down key
	
	if (keycode != '') {	
		if (((keycode == "40") || (keycode == "57385") || (keycode == "57386") ||
			(keycode == "38")) && (_advSel_Found[id] != null)) {
			if (!advSelOpt(id, "multiple")) {
				var lastidx = advSel_findArray(_advSel_Found[id], _advSel_LastSelIndex[id]);
				if (lastidx == -1) {
					lastidx = 0;
				}
				else {			
					if (keycode == "40" || keycode == "57386") {
						lastidx = lastidx + 1;
						if (lastidx >= _advSel_Found[id].length) {
							lastidx = 0;
						}					
					}
					else {					
						lastidx = lastidx - 1;
						if (lastidx == -1) {
							lastidx = _advSel_Found[id].length - 1; 
						}				
					}
				}
				_advSel_hideit = false;
				var fidx = _advSel_Found[id][lastidx];				
				advSel_sel(id, fidx);
//				event.returnValue = false;
				return;
			}
		}
	}
	
    // Filtered list

	_advSel_Found[id].length = 0;
    var fi = 0;
    var arr = new Array();
    var n = _advSel_Source[id].length;    
    while (i < n)
    {
		st = advSelGetItem(id, i);
		var v2 = st.toLowerCase();
		var fm = _advSel_FilterMode[id].toString();
		if (fm == '' || fm == null) { fm = '0'; }		
		switch (fm) {			
			case '0': found = (v2.indexOf(v) != -1); break;
			case '1': found = (v2.indexOf(v) == 0); break;
			case '2': found = (v2 == v); break;
			default: found = (v2.indexOf(v) != -1);
		}			
		showall = (showall || (v.length == 0));

		if (found || showall) { //|| fDefStart) {
		    if (st != '') {		   
				if (f == 0) {
					fi = i;				
					
					// Autocomplete
										
					if ((v.length > prevlen) && advSelOpt(id,'autocomplete')) {
						var s = _advSel_Input[id].value;	
						
						if (_advSel_Input[id].createTextRange) {
							var range = _advSel_Input[id].createTextRange();
							_advSel_Input[id].value = s + st.substr(s.length);
							range.moveStart("character", s.length);
							range.select();
						}
						else {
						
							if (_advSel_Input[id].setSelectionRange) {						
								_advSel_Input[id].value = s + st.substr(s.length);
								_advSel_Input[id].setSelectionRange(s.length, 255);							
							}
							else if (document.selection) {
//var range = document.selection.createRange();
//alert(range);
//if (range.parentElement() == input)
//	alert('zzz');//range.text = " " + icon + " "; 
//}
							}
						}
					}
				}
				st = advSelRenderItem(st,id,i,false,f); 
				//if (f == 0) alert(st);
			}			
			arr[f] = st;
			_advSel_Found[id][_advSel_Found[id].length] = i;				
			f++;			
		}
		i++;
    }
    
    var s;
    if (f == 0) {
		s = "";
	}
	else {
	
		// Key select
	
		if (keycode == "39" || keycode == "57388") {
			advSel_sel(id, fi);			
			return;
		}								
	
		// Build list HTML
	
		s = '<div class="advSelListDiv">' + advSelListTbl(id);
		if (advSelOpt(id, "multicol") && advSelOpt(id, "header")) {
			s = s + '<tr class="advSelColHeader" id="advSelTblHeader' + id + '">' + advSelHeader(id) + '</tr>';
		}
		s = s + arr.join('') + '</table></div>'; 
    }
        
    // Shortcut list
    
    var ms = '';    
    if (advSelOpt(id, "multiple")) {
		var sc = 0;
		for (i = 0; i < _advSel_Selecteds[id].length; i++) {
    		var mi = advSel_findOptsArray(_advSel_Source[id].options, _advSel_Selecteds[id][i]); 
			if (mi != -1) {
				ms = ms + advSelRenderItem(advSelGetItem(id, mi), id, mi, true, sc);
				sc++;				
			}
		}
		if (ms != '') {
			ms = '<div class="advSelShortcuts"><b>' + sc + 
			' selection(s):</b>' + advSelListTbl(id) + ms + '</table>';
			if (!advSelOpt(id, "multicol")) { 
				ms = ms + '<div class="advSelHR"></div>'; 
			}
			else ms = ms + '<br>';
			ms = ms + '</div>';
		}		  
    }

	// Render list
    
//var oPopup = window.createPopup(); var oPopupBody = oPopup.document.body;oPopupBody.innerHTML = ms + s;oPopup.show(0, 0, 200, 50, _advSel_List[id]);
   _advSel_List[id].innerHTML = ms + s;

    //_advSel_List[id].style.height = f * 25; //!
    _advSel_Input[id].title = f + ' item(s)';
    //fDefStart[id] = false;          
    if (f > 0 && showit) advSel_ctlshow(id);
}

//
// advSel_getctl/show/hide
//

function advSel_getctl(id)
{
var ctl;

	if (!document.all) {
		ctl = document.getElementById(id);				
	}
	else {
		ctl = document.all[id];
	}
	return ctl;
}

function advSel_ctlshow(id)
{
	advSel_hideall();	
	
	var ctl = advSel_getctl('advSelList'+id);	
	ctl.style.display='inline';
	var ctl2 = advSel_getctl('advSelTblHeader'+id);
	if (ctl2) {
		//ctl2.style.display='inline';
		ctl2.style.visibility='visible';
	}
	var ifrm = advSel_getctl('advSelIFRAME'+id); 
	if (ifrm) {	ifrm.style.display = 'inline'; }
	
	var button = advSel_getctl('advSelButton'+id);	
	var bsrc = _advSel_ButtonDownImage[id];
	if (bsrc == '') bsrc = 'buttondown.gif';	
	button.src = bsrc;
	
				//if (fDefStart) {
			//		advSelFind();
			//	}
				
			//if (_advSel_Multiple[id]) { advSelFind(id,false,true); } 
				//! update selection shortcuts only!
			
	if (!advSelOpt(id, "multiple")) {
		if (_advSel_PrevCtl[id] != null) {
			//if (_advSel_PrevCtl[id].scrollIntoView) {
				_advSel_PrevCtl[id].scrollIntoView();
			//}
		}
	}
}

function advSel_hide(id)
{   
	var ctl = advSel_getctl(id);
	if (ctl) ctl.style.display='none';		
}

/*function advSel_hide2(id)
{   
	var ctl = advSel_getctl(id);
	if (ctl) ctl.style.visibility='hidden';		
}*/

function advSel_ctlhide(id)
{
	var ifrm = advSel_getctl('advSelIFRAME'+id); 
	if (ifrm) {	ifrm.style.display = 'none'; }

	var button = advSel_getctl('advSelButton' + id);	
	var bsrc = _advSel_ButtonImage[id];
	if (bsrc == '') bsrc = 'button.gif';	
	button.src = bsrc;
	advSel_hide('advSelList' + id);
//	advSel_hide2('advSelTblHeader' + id);
}

function advSel_hideall()
{
	for (var i=0; i <= _advSel_List.length; i++) {
		if (_advSel_List[i] != null) advSel_hide(_advSel_List[i].id);
	}
}

function advSel_showhide(id)
{   
var ctl = advSel_getctl('advSelList' + id);
	
	if (ctl.style.display != 'inline') {	
		advSel_ctlshow(id);
	}
	else {
		advSel_ctlhide(id);		
	}
}

//
// array
//

function advSel_findArray(array, item) {
    var i = 0;
    while (i < array.length) {
        if (array[i] == item) {
            return i;
        } else {
            i++;
        }
    } 
    return -1;
}

function advSel_findOptsArray(array, item) {
    var i = 0;
    while (i < array.length) {
        if (array[i].value == item) {
            return i;
        } else {
            i++;
        }
    } 
    return -1;
}

function advSel_removeItems(array, item) {
    var i = 0;
    while (i < array.length) {
        if (array[i] == item) {
            array.splice(i, 1);
        } else {
            i++;
        }
    } 
    return array;
}
