/**
 *  Based on: bsn
 *   author:		Timothy Groves - http://www.brandspankingnew.net
 *	version:	1.2 - 2006-11-17
 *              1.3 - 2006-12-04
 *              2.0 - 2007-02-07
 *
 */

var useBSNns;

if (useBSNns)
{
	if (typeof(bsn) == "undefined")
		bsn = {}
	_bsn = bsn;
}
else
{
	_bsn = this;
}



if (typeof(_bsn.Autosuggest) == "undefined")
	_bsn.Autosuggest = {}


var AS_Delay = 500; // milliseconds
var AS_Offsety = 0;
var AS_Maxheight = 300;
var AS_KEY_ARROW_UP = 38;
var AS_KEY_ARROW_DOWN = 40;
var AS_KEY_ALT_ARROW_DOWN = 192;
var AS_KEY_ESC = 27;
var AS_KEY_ENTER = 13;
var AS_KEY_TAB = 9;
var AS_OpenASList = new Array();
var AS_OpenASList_timeout = new Array();
var AS_RegisterMultiSelect = new Array();
var AS_RegisterCategorySelect = new Array();

//var timeoutClose = null;

function AS_AddToOpenAList(asName)
{
	AS_OpenASList.push(asName);
	AS_SetTimeout(asName);
}



function AS_RemoveFromOpenAList(asName)
{
	
	AS_KillTimeout(asName)
	AS_OpenASList_timeout[asName] = null;
	
	for(i=0;i<AS_OpenASList.length;i++)
	{
		if(AS_OpenASList[i] == asName)
		{
			AS_OpenASList.splice(i,1);
			//alert('sz=' + AS_OpenASList.length) 
			return;
		}
	}
}


function AS_SetTimeout(asName)
{
	AS_OpenASList_timeout[asName] = window.setTimeout(function(){AS_ClearSuggestions(asName);}, 500);
}

function AS_KillTimeout(asName)
{
	window.clearTimeout(AS_OpenASList_timeout[asName]);
}

/* To be called from a multi-select object */
function AS_OnButtonClickMulti(asName)
{
	AS_RegisterMultiSelect[asName] = true;
	AS_OnButtonClick(asName);
}

function AS_OnKeyPressMulti(ev, asName)
{
	AS_RegisterMultiSelect[asName] = true;
	AS_OnKeyPress(ev, asName);
}

function AS_OnKeyUpMulti(ev, asName)
{
	AS_RegisterMultiSelect[asName] = true;
	AS_OnKeyUp(ev, asName);
}

function AS_GetSuggestionsMulti(asName, comingFromButton)
{
	AS_RegisterMultiSelect[asName] = true;
	document.getElementById(asName + '_csi').value='';
	AS_GetSuggestions(asName, comingFromButton);
}
/* END Multi select Object call */

/* To be called from a Category-Mix-select object */
function AS_OnButtonClickCategory(asName)
{
	AS_RegisterCategorySelect[asName] = true;
	document.getElementById(asName + '_csi').value='';
	AS_OnButtonClick(asName);
}

function AS_OnKeyPressCategory(ev, asName)
{
	AS_RegisterCategorySelect[asName] = true;
	document.getElementById(asName + '_csi').value='';
	AS_OnKeyPress(ev, asName);
}

function AS_OnKeyUpCategory(ev, asName)
{
	AS_RegisterCategorySelect[asName] = true;
	document.getElementById(asName + '_csi').value='';
	AS_OnKeyUp(ev, asName);
}

function AS_GetSuggestionsCategory(asName, comingFromButton)
{
	AS_RegisterCategorySelect[asName] = true;
	AS_GetSuggestions(asName, comingFromButton);
}
/* END Category-Mix select Object call */


function AS_OnButtonClick(asName)
{
	//alert('AS_OnButtonClick ' + asName)
    AS_GetSuggestions(asName, true);
	return true;
}

function AS_OnKeyPress(ev, asName)
{
	var key = (window.event) ? window.event.keyCode : ev.keyCode;

	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// AS_KEY_ESCAPE clears the list
	// TAB sets the current highlighted value
	//
	
	var bubble = true;
	var hli = Number(_bsn.DOM.getElement(asName + "_hli").value);
	//alert(hli)
	//alert(key)
	switch(key)
	{

		case AS_KEY_ENTER:
			if(hli && hli >= 0)
			{
				//alert(hli)
				AS_SetHighlightedValue(asName, hli);
			}
			AS_ClearSuggestions(asName);
			bubble = false;
			break;

		case AS_KEY_TAB:
			if(hli && hli >= 0)
			{
				//alert(hli)
				AS_SetHighlightedValue(asName, hli);
			}
			AS_ClearSuggestions(asName);
			//alert('kk')
			bubble = true;
			break;

		case AS_KEY_ESC:
			AS_ClearSuggestions(asName);
			bubble = false;
			break;
			
		case AS_KEY_ALT_ARROW_DOWN:
			AS_GetSuggestions(asName, true);
			bubble = false;
			break;
	}

	return bubble;
}

function AS_OnKeyUp(ev, asName)
{
	var key = (window.event) ? window.event.keyCode : ev.keyCode;
	
	//alert('AS_OnKeyUp ' + asName + ' code=' + key);
	 
	// user came from AutoComplete
	var bDDSelected = false;
	var startIndex = 0;

	// set responses to keydown events in the field
	// this allows the user to use the arrow keys to scroll through the results
	// AS_KEY_ESCAPE clears the list
	// TAB sets the current highlighted value
	//

	
	var bubble = true;

	switch(key)
	{
		case AS_KEY_ARROW_UP:
			AS_ChangeHighlight(asName, key);
			bubble = false;
			break;

		case AS_KEY_ARROW_DOWN:
			AS_ChangeHighlight(asName, key);
			bubble = false;
			break;
		
		case AS_KEY_ENTER:
		case AS_KEY_ESC:
			//AS_ClearSuggestions(asName);
			bubble = true;
			break;
			
		case AS_KEY_TAB:
			break;
					
		default:
			AS_GetSuggestions(asName, false);
	}

	return bubble;
}


function AS_GetSuggestions(asName, comingFromButton)
{
	//alert('AS_GetSuggestions ' + asName);
	var sInput = document.getElementById(asName + '_text');
		
	// if input stays the same, do nothing
	//
	//if (val == this.sInput && !this.bDDSelected)
	//	return false;

	
	// input length is less than the min required to trigger a request
	// reset input string
	// do nothing
	//
	//if (val.length < this.oP.minchars && !this.bDDSelected)
	//{
	//	this.sInput = "";
	//	return false;
	//}
	
	
	
	
	var request = "AS_DoAjaxRequest('" + asName + "', " + comingFromButton + ")"

	//TODOwindow.clearTimeout(request);
	if(comingFromButton)
	{
		window.setTimeout(request, 0)
	}
	else
	{
		window.setTimeout(request, AS_Delay)
	}

	return false;
}

function AS_DoAjaxRequest(asName, comingFromButton)
{
	//alert('AS_DoAjaxRequest ' + asName);

	var target = document.getElementById(asName + '_target').value;
	var value = document.getElementById(asName + '_text').value;
	var firstRowIndex = document.getElementById(asName + '_fri').value;
	var defaultCategoryID = "-1";
	if (AS_RegisterCategorySelect[asName])
		defaultCategoryID = "0";
	var categoryID = (document.getElementById(asName + '_csi') == null || document.getElementById(asName + '_csi').value=="")?defaultCategoryID:document.getElementById(asName + '_csi').value;

		
	var controlId = asName;
	
	if(comingFromButton)
	{
		//	Open up the whole list
		value = ''
	}
	
	var s = ''
	s += "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
	s += "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:bo=\"http://cmms.ma.com/\">";
	s += "<soapenv:Header/>";
	s += "<soapenv:Body>";
	s += "<bo:handleDropDownRequest>";
	s += "<target>";
	if (target != null)
		s += target.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g,"&gt;");

	s += "</target>";
	s += "<characters>";
	if (value != null)
		s += value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g,"&gt;");

	s += "</characters>";
	s += "<firstRowIndex>";
	if (firstRowIndex != null)
		s += firstRowIndex.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
	
	
	s += "</firstRowIndex>";
	s += "<categoryID>";
	if (categoryID != null)
		s += categoryID.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
	
	
	s += "</categoryID>";
	s += "<controlId>";
	if (controlId != null)
		s += controlId.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");

	s += "</controlId>";
	s += "</bo:handleDropDownRequest>";
	s += "</soapenv:Body>";
	s += "</soapenv:Envelope>";
	

	var req = WSClient.prototype.getXmlHttp();
	var wsUrl = document.URL;
	var six = wsUrl.lastIndexOf("/");
	if (six > 0 && six < wsUrl.length - 1) {
		wsUrl = wsUrl.substring(0, six + 1);
	}
	wsUrl = wsUrl + "ws";
	//alert(wsUrl);
	
	req.open("POST", wsUrl, true); // always async
	req.setRequestHeader("SOAPAction", "\"handleDropDownRequest\"");
	req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
	req.onreadystatechange = function() {
		if(req.readyState == 4)
		{
			AS_ProcessAjaxResponse(req);
		}
	}

		
	req.send(s);
}


function AS_CreateArrayFromWSResponse(results, indexVal, asName)
{
	var aSuggestions = [];
	
	/*if (!xml.getElementsByTagName('DropDownResponse')[indexVal])
		return null;
	
	var results = xml.getElementsByTagName('DropDownResponse')[indexVal];
	//alert(results)*/
	var items;

/*	items = results.getElementsByTagName("categories");

	for (var i=0;i<items.length;i++)
	{
		var idValue = '';
		var labelValue = '';
		
		var item = items[i];
		var id = item.getElementsByTagName("id");
		//alert('id='+id)
		if(id)
		{
			if(id.length)
			{
				var fff = id[0];
				if(fff.firstChild)
				{
					idValue = fff.firstChild.nodeValue;
					//alert('id=' + idValue)
				}
				else
				{
					//idValue = fff.innerHTML;
					//alert('no children, val=' + idValue)
				}
			}
			else
			{
				//alert('no length')
			}
		}
		
		var label=item.getElementsByTagName("label");
		if(label && label.length && label.length > 0 && label[0].firstChild)
		{
			//alert('label ok')
			labelValue = label[0].firstChild.nodeValue;
			//alert('label=' + labelValue)
		}
//		else
//		{
//			alert('empty label')
//		}
		//alert('adding text=' + labelValue + ", id=" + idValue)
		info = 'category';
		
		aSuggestions.push(  { 'id':idValue, 'value':labelValue, 'info':''+info+'' }  );
	}
	
	*/
	items = results.getElementsByTagName("items");

	for (i=0;i<items.length;i++)
	{
		var idValue = '';
		var labelValue = '';
		
		var item = items[i];
		var id = item.getElementsByTagName("id");
		//alert('id='+id)
		if(id)
		{
			if(id.length)
			{
				var fff = id[0];
				if(fff.firstChild)
				{
					idValue = fff.firstChild.nodeValue;
					//alert('id=' + idValue)
				}
				else
				{
					//idValue = fff.innerHTML;
					//alert('no children, val=' + idValue)
				}
			}
			else
			{
				//alert('no length')
			}
		}
		
		var label=item.getElementsByTagName("label");
		if(label && label.length && label.length > 0 && label[0].firstChild)
		{
			//alert('label ok')
			labelValue = label[0].firstChild.nodeValue;
			//alert('label=' + labelValue)
		}
//		else
//		{
//			alert('empty label')
//		}
		//alert('adding text=' + labelValue + ", id=" + idValue)
		var type = item.getElementsByTagName("type");
		if(type && type.length && type.length > 0 && type[0].firstChild)
			type = type[0].firstChild.nodeValue;
		else
			type = "";

		aSuggestions.push(  { 'id':idValue, 'value':labelValue, 'type':type, 'info':'' }  );
	}
	
	return aSuggestions;	
}

function AS_ProcessAjaxResponse(req)
{
	var xml = req.responseXML;
	//alert(xml);

	var results = xml.getElementsByTagName('DropDownResponse')[0];
	var asName = results.getElementsByTagName("controlId")[0].firstChild.nodeValue;

	
	//	Keep the response, we will need it lates.
	_bsn.DOM.getElement(asName+'_wsr').value = req.responseText;
	
	var aSuggestions;
	var aSuggestionsTemp;
	var pageSize = 0;
	var firstItemIndex = 0;
	var totalItems = 0;
	var controlId = asName;
	
	/*if (!AS_RegisterCategorySelect[asName])
	{*/
		aSuggestions = AS_CreateArrayFromWSResponse(results, 0, asName);
		
		firstItemIndex = Number(results.getElementsByTagName("firstItemIndex")[0].firstChild.nodeValue);
		pageSize = Number(results.getElementsByTagName("pageSize")[0].firstChild.nodeValue);
		totalItems = Number(results.getElementsByTagName("totalItems")[0].firstChild.nodeValue);
	/*}
	else
	{
		aSuggestions = new Array();
		for(var i = 0; i < xml.getElementsByTagName('DropDownResponse').length; i++)
		{
			results = xml.getElementsByTagName('DropDownResponse')[i];
			aSuggestionsTemp = AS_CreateArrayFromWSResponse(results, i);
			if (aSuggestionsTemp != null)
			{
				aSuggestions[i] = aSuggestionsTemp;
				
				firstItemIndex = Number(results.getElementsByTagName("firstItemIndex")[i].firstChild.nodeValue);
				pageSize = Number(results.getElementsByTagName("pageSize")[i].firstChild.nodeValue);
				totalItems += Number(results.getElementsByTagName("totalItems")[i].firstChild.nodeValue);
				
			}
		}
	}*/
	
	//var aSuggestions = AS_CreateArrayFromWSResponse(_bsn.DOM.getElement(asName+'_wsr').value);
	

	AS_CreateList(aSuggestions, firstItemIndex, pageSize, totalItems, controlId);
	var text = _bsn.DOM.getElement(asName + "_text");
	text.focus();
}

function AS_SetHighlight(asName, n)
{
	var list = _bsn.DOM.getElement(asName + "_as_ul");
	if (!list)
		return false;
	
	var hli = Number(_bsn.DOM.getElement(asName + "_hli").value);

	if (hli >= 0)
	{
		AS_ClearHighlight(asName);
	}
	
	_bsn.DOM.getElement(asName + "_hli").value = n; 
	
	list.childNodes[n].className = "as_highlight";


	//this.killTimeout();
}

function AS_ClearHighlight(asName)
{
	var list = _bsn.DOM.getElement(asName + "_as_ul");
	if (!list)
		return false;
	
	var hli = Number(_bsn.DOM.getElement(asName + "_hli").value);

	//if (hli > 0)
	{
		list.childNodes[hli].className = "";
	}
}

function AS_ChangeHighlight(asName, key)
{	
	//alert('AS_ChangeHighlight ' + asName + ' ' + key)

	var list = _bsn.DOM.getElement(asName + "_as_ul");
	if (!list)
		return false;
	
	var n;

	var hli = Number(_bsn.DOM.getElement(asName + "_hli").value);

	//alert('hli=' + hli);
	
	if(hli < 0)
	{
		if (key == AS_KEY_ARROW_DOWN)
		{
			n = 0;
		}
		else if (key == AS_KEY_ARROW_UP)
		{
			n = list.childNodes.length-1;
		}
		else
		{
			//alert('Y')
		}
	}
	else
	{
		if (key == AS_KEY_ARROW_DOWN)
		{
			n = hli + 1;
		}
		else if (key == AS_KEY_ARROW_UP)
		{
			n = hli - 1;
		}
		else
		{
			//alert('K')
		}
	}
	
	//alert('n=' + n);

	if (n > list.childNodes.length-1)
	{
		n = list.childNodes.length-1;
	}
	if (n < 0)
	{
		n = 0;
	}
	
	//alert('n=' + n);

	AS_SetHighlight(asName, n);
}

function AS_ClearSuggestions(asName)
{
	//this.killTimeout();
	AS_RemoveFromOpenAList(asName)
	
	var ele = _bsn.DOM.getElement(asName + '_divcontainer');
	_bsn.DOM.removeElement(asName + '_divcontainer');
	//if (ele)
	//{
	//	var fade = new _bsn.Fader(ele,1,0,250,function () { _bsn.DOM.removeElement(asName + '_divcontainer') });
	//}
	var hli = _bsn.DOM.getElement(asName + "_hli");
	hli.value = '-1'
}

function AS_TextToXml(text)
{
	try //Internet Explorer
  	{
  		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  		xmlDoc.async="false";
  		xmlDoc.loadXML(text);
  		return xmlDoc;
  	}
	catch(e)
  	{
  		parser=new DOMParser();
  		xmlDoc=parser.parseFromString(text,"text/xml");
  		return xmlDoc;
  	}
}

function AS_SetHighlightedValue(asName, n)
{
	//alert('AS_SetHighlightedValue ' + asName + ', ' + n);
	
	var fld = _bsn.DOM.getElement(asName+'_text');
	var val = _bsn.DOM.getElement(asName);

	var xmlText = _bsn.DOM.getElement(asName+'_wsr').value;
	//alert(xmlText)
	
	var xml = AS_TextToXml(xmlText)
	//alert(xml)
	
	var aSuggestions = AS_CreateArrayFromWSResponse(xml, asName);
	
	var newText = aSuggestions[n].value;
	
	
	/* ################## FOR MULTI SELECT ___________________________ */
	if (AS_RegisterMultiSelect[asName])
	{
		AS_addMultiItem(asName, aSuggestions[n].id, newText);
		
		fld.value = '';
	}
	/* ################## FOR CATEGORY SELECT ___________________________ */
	else if (AS_RegisterCategorySelect[asName])
	{
		//alert(aSuggestions[n].type);
		
		if (aSuggestions[n].type == 'category')
		{
			var cat = _bsn.DOM.getElement(asName+'_csi');
			cat.value = aSuggestions[n].id;
			
			AS_GetSuggestions(asName, true);
			
			return true;
		}
		
		fld.value = newText;
		val.value = aSuggestions[n].id;
	}
	/* ################## FOR SINGLE SELECT ___________________________ */
	else
	{
		fld.value = newText;
		
		val.value = aSuggestions[n].id;
			
		//alert('fld=' + fld + ' fldVl=' + fld.value + ' text=' + newText + ', id=' + val.value + ', val=' + val);
	}
	
	// move cursor to end of input (safari)
	//
	fld.focus();
	if(fld.selectionStart)
	{
		fld.setSelectionRange(0, newText.length);
	}

	AS_ClearSuggestions(asName);
		
	return false;
}

function AS_OnPagingClick(asName, startIndex)
{
	//alert('AS_OnPagingClick ' + asName + ', ' + startIndex)

	var bubble = true;
	
	// user came from Dropdown Arrow
	var bDDSelected = true;
	
	var fri = _bsn.DOM.getElement(asName+'_fri');
	fri.value = startIndex;
	
	AS_GetSuggestions(asName, false); //  // !!!! was true, so impossible to page through the narrowed-down list
	
	return bubble;
}

//function AS_DestroyList(asName)
//{
//	var divcontainerId = asName + '_divcontainer';
//	AS_RemoveFromOpenAList(asName);
//	_bsn.DOM.removeElement(divcontainerId);
//}


function AS_CreateList(arr, firstItemIndex, pageSize, totalItems, asName)
{
	//alert('AS_CreateList');

	// get rid of old list
	// and clear the list removal timeout
	//
	var divcontainerId = asName + '_divcontainer';
	AS_ClearSuggestions(asName)

	var request = "AS_DoAjaxRequest('" + asName + "')"
	//TODOwindow.clearTimeout(request);
	
	var sInput = document.getElementById(asName + '_text').value
	
	// create holding div
	//
	var divcontainer = _bsn.DOM.createElement("div", {id:divcontainerId, className:"autosuggest"});
	var div = _bsn.DOM.createElement("div", {id:divcontainerId, className:"autosuggestlist"});
	// add list to container
	divcontainer.appendChild(div);
	
	
	var hcorner = _bsn.DOM.createElement("div", {className:"as_corner"});
	var hbar = _bsn.DOM.createElement("div", {className:"as_bar"});
	var header = _bsn.DOM.createElement("div", {className:"as_header"});
	header.appendChild(hcorner);
	header.appendChild(hbar);
	div.appendChild(header);
	
	var divcontainerHeight = 0;
	
	
	
		
	// create and populate ul
	//
	var ul = _bsn.DOM.createElement("ul", {id:asName + "_as_ul"});
	if(dialogOpen)
	{
		//	Long as it is more than the dialog
		divcontainer.style.zIndex = 21000;
	}
	
	var mainloop = 1;
	/*if (AS_RegisterCategorySelect[asName])
	{
		var arr_in;
		for (var i = 0; i < arr.length; i++)
		{
			arr_in = arr[i];
			ul = AS_BuildList(arr_in, asName, sInput, ul);
			divcontainerHeight += 22*arr_in.length;
		}
	}
	else
	{
		ul = AS_BuildList(arr, asName, sInput, ul);
		divcontainerHeight += 22*arr.length;
	}*/
	
	// loop throught arr of suggestions
	// creating an LI element for each suggestion
	//
//	var qqq = "";
	for (var i=0;i<arr.length;i++)
	{
		// format output with the input enclosed in a EM element
		// (as HTML, not DOM)
		//
		var val = arr[i].value;
		var st = val.toLowerCase().indexOf( sInput.toLowerCase() );
		var output = val;
		if(st > 0)
		{
			output = val.substring(0,st) + "<em>" + val.substring(st, st+sInput.length) + "</em>" + val.substring(st+sInput.length);
		}
		//qqq += "val="+val+",st=" + st + ", o=[" + output + "]\n"
		if(val.length == 0)
		{
			output += "&nbsp;";
		}
		
		var aHtml;
		if (AS_RegisterCategorySelect[asName])
		{
			if (arr[i].type == 'category')
				classval = 'categoryicon';
			else
				classval = '';
			
			
			aHtml = "<li><a href=\"#\" onclick=\"AS_SetHighlightedValue('" + asName + "', " + i + ")\"";
			aHtml += " onmouseover=\"AS_SetHighlight('" + asName + "', " + i + ")\">";
			if (classval.length > 0)
				aHtml += "<div id=\"" + asName + "_type_" + i + "\" class=\""+classval+"\" >"; 
			// THIS IS THE TEXT OF THE SELECTABLE ENTITY
			aHtml += "<span title=\""+output+"\">" + output + "</span>";
			
			if (classval.length > 0)
				aHtml += "</div>";
			
			
			aHtml += "<span class=\"tl\"> </span>";
			aHtml += "<span class=\"tr\"> </span>";
			
			aHtml += "</a></li>";
			
		}
		else
		{
			aHtml = "<li><a href=\"#\" onclick=\"AS_SetHighlightedValue('" + asName + "', " + i + ")\"";
			aHtml += " onmouseover=\"AS_SetHighlight('" + asName + "', " + i + ")\">";
			aHtml += "<span class=\"tl\"> </span>";
			aHtml += "<span class=\"tr\"> </span>";
			aHtml += "<span title=\""+output+"\">" + output + "</span>";
			aHtml += "</a></li>";
		}
		
		ul.innerHTML += aHtml;
		divcontainerHeight += 22;
	}
		
	//alert(qqq);
		
	
	
	// no results
	//
	//if (arr.length == 0)
	//{
	//	var li = _bsn.DOM.createElement(  "li", {className:"as_warning"}, this.oP.noresults + (this.bDDSelected?"":this.oP.noresultsOnlySearch)  );
	//	
	//	ul.appendChild( li );
	//}
	
	
	div.appendChild( ul );
	
	
	//var fcorner = _bsn.DOM.createElement("div", {className:"as_corner"});
	//var fbar = _bsn.DOM.createElement("div", {className:"as_bar"});
	var footer = _bsn.DOM.createElement("div", {className:"as_footer"});
	//firstItemIndex, pageSize, totalItems
	
	//footer.appendChild(fcorner);
	//footer.appendChild(fbar);
	div.appendChild(footer);
	
	if (totalItems - pageSize > 0)
	{
		var paging = _bsn.DOM.createElement("div", {className:"footer_paging_container"});
		var lastitem = totalItems < pageSize+firstItemIndex?totalItems:pageSize+firstItemIndex;
		var pagingP = _bsn.DOM.createElement("p",{className:""});
		
		//alert(parseInt(pageSize)+parseInt(firstItemIndex));
		
		
		if (lastitem < totalItems)// show next button
		{
			//var aNext = _bsn.DOM.createElement("div", { className:"iconsNextSmall",  title:"View Next "+pageSize+" Results" });
			//aNext.onclick = function(ev) { this.startIndex=lastitem;return AS_OnPagingClick(asName, startIndex); } // return pointer.onButtonClick(ev); }
			//paging.appendChild(aNext);
			
			var next = ''
			next += "<div class=\"iconsNextSmall\" title=\"View Next " + pageSize + " results \"";
			next += " onclick=\"return AS_OnPagingClick('" + asName + "', " + lastitem + ")\" ";
			next += "/>";
			//alert(next);
			paging.innerHTML += next;
		}
			
		pagingP.innerHTML += "Viewing <strong>"+eval(parseInt(firstItemIndex)+1)+"</strong> to <strong>"+lastitem+"</strong> of <strong>"+totalItems+"</strong> results";
		
		paging.appendChild(pagingP);
		
		if (firstItemIndex != 0)// show previous button
		{
			//var aPrev = _bsn.DOM.createElement("div", { className:"iconsBackSmall", title:"View Previous "+pageSize+" Results" });
			//aPrev.onclick = function(ev) { this.startIndex=(parseInt(firstItemIndex) - parseInt(pageSize)<0)?0:parseInt(firstItemIndex) - parseInt(pageSize);return pointer.onPagingClick(this.startIndex); } //return pointer.onButtonClick(ev); }
			//aPrev.onclick = function(ev) { this.startIndex=(parseInt(firstItemIndex) - parseInt(pageSize)<0)?0:parseInt(firstItemIndex) - parseInt(pageSize);return pointer.onPagingClick(this.startIndex); } //return pointer.onButtonClick(ev); }
			//paging.appendChild(aPrev);
			
			var startIndex = firstItemIndex-pageSize;
			if(startIndex<0)
			{
				startIndex = 0;
			}
			var prev = ''
			prev += "<div class=\"iconsBackSmall\" title=\"View Previous " + pageSize + " results \"";
			prev += " onclick=\"return AS_OnPagingClick('" + asName + "', " + startIndex + ")\" ";
			prev += "/>";
			//alert(prev);
			paging.innerHTML += prev;
		}
		
		
		
		divcontainer.appendChild(paging);
		divcontainerHeight += 22;
	}
	
	// get position of target textfield
	// position holding div below it
	// set width of holding div to width of field
	//
	var textField = document.getElementById(asName + '_text');
	var pos = _bsn.DOM.getPos(textField);
	//alert(pos.y)
	var posy = YAHOO.util.Dom.getY(textField)
	var posx = YAHOO.util.Dom.getX(textField)
	divcontainer.style.left 		= posx + "px";
	// display above if it rolls over the height of the screen
	if (posy + textField.offsetHeight + AS_Offsety + divcontainerHeight > GetHeight())
	{
		var modTop = 0;
		if (totalItems - pageSize > 0) // there is paging
			modTop = -2;
		else
			modTop = 2;
		
		divcontainer.style.top 		= ( posy + AS_Offsety - (divcontainerHeight+modTop)) + "px"; // (-2) border overlap: is the border, makes shade over strong border
		divcontainer.className='autosuggest top';
	}
	else
	{
		var modTop = -1;
		var modLeft = 0;
		
		divcontainer.style.top = ( posy + textField.offsetHeight + AS_Offsety ) + modTop + "px"; // -1 moves up so border is shaded
		divcontainer.className='autosuggest';
		
		
	}
	
	divcontainer.style.width 	= textField.offsetWidth + 16 + "px"; // 17px = ddarrow button
	
	
	
	
	// set mouseover functions for div
	// when mouse pointer leaves div, set a timeout to remove the list after an interval
	// when mouse enters div, kill the timeout so the list won't be removed
	//
	
	//divcontainer.onmouseover 	= function(){ pointer.killTimeout() }
	//divcontainer.onmouseout 		= function(){ pointer.resetTimeout() }
	divcontainer.onmouseover = function(){AS_RemoveFromOpenAList(asName);}
	divcontainer.onmouseout = function(){AS_AddToOpenAList(asName);}

	//divcontainer.onblur = function(){alert('a')};//AS_ClearSuggestions

	// add DIV to document
	//
	document.getElementsByTagName("body")[0].appendChild(divcontainer);
	
	// currently no item is highlighted
	//
	//this.iHighlighted = 0;
	
	
	// remove list after an interval
	//
	//var pointer = this;
	//window.setTimeout(function(){AS_ClearSuggestions(asName);}, 6000)
	//this.toID = setTimeout(function () { pointer.clearSuggestions() }, this.oP.timeout);
}




// FOR MULTI SELECTION _______________________________________
function AS_renderMultiItemOnStartup(asName, asMultiName, asIDs, asNames)
{
	var divcontainerId = "";
	
	//var registerToDiv = document.getElementById(asName + '_multiSelect');
	//var sInput = document.getElementById(asName).value;
	
	sInputArray = asIDs.split(',');
	sInputNameArray = asNames.split(',');
	
	for(var i = 0; i < sInputArray.length; i++)
	{
		AS_addMultiItem(asName, sInputArray[i], sInputNameArray[i]);
	}
	
	
}

function AS_addMultiItem(asName, asMultiName, text)
{
	var divcontainerId = asMultiName + '_divcontainer';
	
	var registerToDiv = document.getElementById(asName + '_multiSelect');
	var sInput = document.getElementById(asName).value;
	
	/* APPEND TO sInput */
	if (sInput.length > 0)
		sInput = sInput + ','+asMultiName;
	else
		sInput = asMultiName;
	document.getElementById(asName).value = sInput;
	
	var closetitle = 'Remove '+text;
	// create holding div
	//
	var divcontainer = _bsn.DOM.createElement("div", {id:divcontainerId, className:"multiContainerItem"});
	divcontainer.setAttribute("title",text);
	var p = _bsn.DOM.createElement("p");
	//p.setAttribute("style","margin:0; padding:0;");
	var divclose = _bsn.DOM.createElement("div", {className:"removeButton"});
	divclose.setAttribute("title",closetitle);
	divclose.onmouseover = function(){this.className='removeButtonOn';};
	divclose.onmouseout = function(){this.className='removeButton';};
	divclose.onclick = function(){AS_removeMultiItem(asMultiName, asName);};

	
	// add content
	p.innerHTML = text;
	
	
	// add list to container
	divcontainer.appendChild(p);
	divcontainer.appendChild(divclose);
	registerToDiv.appendChild(divcontainer);
}

function AS_removeMultiItem(asMultiName, asName)
{
	var sInput = document.getElementById(asName).value;
	
	var sInputNew = '';
	var sInputArr = sInput.split(',');
	
	var check = true;
	
	for (var i = 0; i < sInputArr.length; i++)
	{
		if ((sInputArr[i]+'' == asMultiName+'') && check)
		{
			check = false;
			continue;
		}
		
		if (sInputNew.length > 0)
			sInputNew += ',';
		sInputNew += sInputArr[i];
	}
	
	document.getElementById(asName).value = sInputNew;
	
	var ele = _bsn.DOM.getElement(asMultiName + '_divcontainer');
	_bsn.DOM.removeElement(asMultiName + '_divcontainer');	
}






// DOM PROTOTYPE _____________________________________________


if (typeof(_bsn.DOM) == "undefined")
	_bsn.DOM = {}




_bsn.DOM.createElement = function ( type, attr, cont, html )
{
	var ne = document.createElement( type );
	if (!ne)
		return false;
		
	for (var a in attr)
		ne[a] = attr[a];
		
	if (typeof(cont) == "string" && !html)
		ne.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ne.innerHTML = cont;
	else if (typeof(cont) == "object")
		ne.appendChild( cont );

	return ne;
}





_bsn.DOM.clearElement = function ( id )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	while (ele.childNodes.length)
		ele.removeChild( ele.childNodes[0] );
	
	return true;
}









_bsn.DOM.removeElement = function ( ele )
{
	var e = this.getElement(ele);
	
	if (!e)
		return false;
	else if (e.parentNode.removeChild(e))
		return true;
	else
		return false;
}





_bsn.DOM.replaceContent = function ( id, cont, html )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	this.clearElement( ele );
	
	if (typeof(cont) == "string" && !html)
		ele.appendChild( document.createTextNode(cont) );
	else if (typeof(cont) == "string" && html)
		ele.innerHTML = cont;
	else if (typeof(cont) == "object")
		ele.appendChild( cont );
}









_bsn.DOM.getElement = function ( ele )
{
	if (typeof(ele) == "undefined")
	{
		return false;
	}
	else if (typeof(ele) == "string")
	{
		var re = document.getElementById( ele );
		if (!re)
			return false;
		else if (typeof(re.appendChild) != "undefined" ) {
			return re;
		} else {
			return false;
		}
	}
	else if (typeof(ele.appendChild) != "undefined")
		return ele;
	else
		return false;
}







_bsn.DOM.appendChildren = function ( id, arr )
{
	var ele = this.getElement( id );
	
	if (!ele)
		return false;
	
	
	if (typeof(arr) != "object")
		return false;
		
	for (var i=0;i<arr.length;i++)
	{
		var cont = arr[i];
		if (typeof(cont) == "string")
			ele.appendChild( document.createTextNode(cont) );
		else if (typeof(cont) == "object")
			ele.appendChild( cont );
	}
}









_bsn.DOM.getPos = function ( ele )
{
	var ele = this.getElement(ele);

	var obj = ele;

	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;


	var obj = ele;
	
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
//			if(obj.scrollTop)
//			{
//				alert(obj.scrollTop)
//			}
//			else
//			{
//				alert("none")
//			}
//			if(obj['documentElement'] && obj['documentElement'].scrollTop)
//			{
//				alert(obj['documentElement'].scrollTop)
//			}
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;

	return {x:curleft, y:curtop}
}












// FADER PROTOTYPE _____________________________________________



if (typeof(_bsn.Fader) == "undefined")
	_bsn.Fader = {}





_bsn.Fader = function (ele, from, to, fadetime, callback)
{	
	if (!ele)
		return false;
	
	this.ele = ele;
	
	this.from = from;
	this.to = to;
	
	this.callback = callback;
	
	this.nDur = fadetime;
		
	this.nInt = 50;
	this.nTime = 0;
	
	var p = this;
	this.nID = setInterval(function() { p._fade() }, this.nInt);
}




_bsn.Fader.prototype._fade = function()
{
	this.nTime += this.nInt;
	
	var ieop = Math.round( this._tween(this.nTime, this.from, this.to, this.nDur) * 100 );
	var op = ieop / 100;
	
	if (this.ele.filters) // internet explorer
	{
		try
		{
			this.ele.filters.item("DXImageTransform.Microsoft.Alpha").opacity = ieop;
		} catch (e) { 
			// If it is not set initially, the browser will throw an error.  This will set it if it is not set yet.
			this.ele.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';
		}
	}
	else // other browsers
	{
		this.ele.style.opacity = op;
	}
	
	
	if (this.nTime == this.nDur)
	{
		clearInterval( this.nID );
		if (this.callback != undefined)
			this.callback();
	}
}



_bsn.Fader.prototype._tween = function(t,b,c,d)
{
	return b + ( (c-b) * (t/d) );
}


// USED FOR A STRING XML INPUT
function loadXMLString(txt) 
{
try //Internet Explorer
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async="false";
  xmlDoc.loadXML(txt);
  return(xmlDoc);  
  }
catch(e)
  {
  try //Firefox, Mozilla, Opera, etc.
    {
    parser=new DOMParser();
    xmlDoc=parser.parseFromString(txt,"text/xml");
    return(xmlDoc);
    }
  catch(e) {alert(e.message)}
  }
return(null);
}