/*******************************************************************************/
/*	credits:	                                                               */
/*			zichun (http://www.codetools.com/jscript/jsactb.asp?print=true)    */
/*			Chris Justus                                                       */
/*                                                                             */
/*	implementation:                                                            */
/*			nikola.i@siol.net                                                  */
/*******************************************************************************/

var ACNIK_EVT_ON_BLUR		= 10000;
var ACNIK_EVT_ON_KEY_DOWN	= 10001;
var ACNIK_EVT_ON_KEY_UP		= 10002;
var ACNIK_EVT_ON_MOUSE_OVER	= 10003;
var ACNIK_EVT_ON_SET_VALUE	= 10004;


var IDX_FIELD	= 0;
var IDX_RESULT	= 1;
var IDX_URL		= 2;
var IDX_VALUES	= 3;
var IDX_TITLES	= 4;
var IDX_RECT	= 5;
var IDX_NITEMS	= 6;
var IDX_OFFSET	= 7;
var IDX_MTITLES	= 8;
var IDX_MVALUES	= 9;
var IDX_MBEGIN	= 10;
var IDX_KEYSEL	= 11;
var IDX_FORCED	= 12;
var IDX_EVENT	= 13;
var IDX_CLEAR	= 14;
var IDX_FOCUS	= 15;


var acnikObjs			= new Array();
var acnikPrevSelection	= null;
var acnikOldKDHandler	= document.onkeydown;

//this is the function that installs the dropdown functionality upon a field
//	text field of drop; 
//	result field where the value is stored, 
//	array of titles to show in drop, 
//	array of values that must be inserted to some other field if needed, 
//	url if remotly feched values and titles, 
//	num items on drop
function acnikRegister(formTextObj, formResultObj, textTitles, textValues, url) {

	if(!formTextObj) {
		alert('WARN: no form object passed in acnikRegister function');
		return;
	}
	
	if(!formResultObj) {
		alert('WARN: no object to store result passed in acnikRegister function');
		return;
	}
	
	if(!url && (!textTitles || !textValues)) {
		alert('WARN: no titles and values or url to get them passed in acnikRegister function');
		return;
	}
	
	//find first empty slot
	var iindex = acnikObjs.length;
	for(var i = 0; i < acnikObjs.length; i++)
		if(acnikObjs[i] == null) {
			iindex = i;
			break;
		}
		
	
	acnikObjs[iindex]	= new Array();
	acnikObjs[iindex][IDX_FIELD] = formTextObj;
	acnikObjs[iindex][IDX_RESULT] = formResultObj;
	if(url) {
		acnikObjs[iindex][IDX_URL] 		= url;
		acnikObjs[iindex][IDX_TITLES]	= null;
		acnikObjs[iindex][IDX_VALUES]	= null;
	} else {
		acnikObjs[iindex][IDX_URL]		= null;
		acnikObjs[iindex][IDX_TITLES]	= textTitles;
		acnikObjs[iindex][IDX_VALUES]	= textValues;
	}
	
	acnikObjs[iindex][IDX_RECT] = acnikObjRect(acnikObjs[iindex][IDX_FIELD]);
	
	acnikObjs[iindex][IDX_NITEMS]	= 5;
	acnikObjs[iindex][IDX_OFFSET]	= -1;
	acnikObjs[iindex][IDX_MTITLES]	= null;
	acnikObjs[iindex][IDX_MVALUES]	= null;
	acnikObjs[iindex][IDX_MBEGIN]	= true;
	acnikObjs[iindex][IDX_FORCED]	= false;
	acnikObjs[iindex][IDX_KEYSEL]	= false;
	acnikObjs[iindex][IDX_CLEAR]	= false;
	acnikObjs[iindex][IDX_EVENT] 	= new Array();
	acnikObjs[iindex][IDX_FOCUS] 	= false;
	document.onkeydown	= acnikOnKeyDown;
	document.onkeyup	= acnikOnKeyUp;
	document.onfocus	= acnikOnFocus;
	acnikObjs[iindex][IDX_FIELD].onblur = acnikOnBlur;
	
}

function acnikMatchBegining(bool) {
	if(bool)
		acnikObjs[acnikObjs.length - 1][IDX_MBEGIN] = true;
	else
		acnikObjs[acnikObjs.length - 1][IDX_MBEGIN] = false;
}


function acnikForceInput(bool) {
	if(bool)
		acnikObjs[acnikObjs.length - 1][IDX_FORCED] = true;
	else
		acnikObjs[acnikObjs.length - 1][IDX_FORCED] = false;
}


function acnikClearOnSetValue(bool) {
	if(bool)
		acnikObjs[acnikObjs.length - 1][IDX_CLEAR] = true;
	else
		acnikObjs[acnikObjs.length - 1][IDX_CLEAR] = false;
}


function acnikSetNumItems(num) {
	
	if(!isNaN(num) && num > 0)
		acnikObjs[acnikObjs.length - 1][IDX_NITEMS] = num;
	
}

function acnikSetAllowFocus(bool) {
	if(bool)
		acnikObjs[acnikObjs.length - 1][IDX_FOCUS] = true;
	else
		acnikObjs[acnikObjs.length - 1][IDX_FOCUS] = false;
	
}

function acnikRegisterEventFunction(eventName, functionName) {
	
	if(!eventName || !functionName) return;
	var idx		= acnikObjs.length - 1;
	var eidx	= acnikObjs[idx][IDX_EVENT].length
	
	if(!acnikObjs[idx]) return;
	
	acnikObjs[idx][IDX_EVENT][eidx] = new Array(eventName, functionName);
}


function acnikObjRect(obj) {
	var objtop		= 0;
	var objleft		= 0;
	var objwidth	= 0;
	var objheight	= 0;
	
	if(obj) {
		objwidth	=	obj.offsetWidth;
		objheight	=	obj.offsetHeight;
	}
	
	while(obj) {
		objtop		+=	obj.offsetTop;
		objleft		+=	obj.offsetLeft;
		
		obj = obj.offsetParent;
	}
	
	return new Array(objtop, objleft, objwidth, objheight);
}


function acnikObjHideDrops() {
	
	for(var i = 0; i < acnikObjs.length; i++) {
		while(document.getElementById('acnik_table' + i)) {
			document.body.removeChild(document.getElementById('acnik_table' + i)); 
		}
	}
}

function acnikObjShowHidden() {
	
	for(var i = 0; i < document.forms.length; i++) {
		var objForm = document.forms[i];
		if(objForm && objForm.elements)
			for(var j = 0; j < objForm.elements.length; j++)
				if(objForm.elements[j] && objForm.elements[j].style)
					if(objForm.elements[j].style.visibility == 'hidden') { 
						objForm.elements[j].style.visibility = 'visible';
					}
	}
}


function acnikGetCaretEnd(obj){
	if(typeof obj.selectionEnd != 'undefined'){
		return obj.selectionEnd;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		var Lp=obj.createTextRange();
		Lp.setEndPoint('EndToEnd',M);
		var rb=Lp.text.length;
		if(rb>obj.value.length){
			return -1;
		}
		return rb;
	}
}


function acnikGetCaretStart(obj){
	if(typeof obj.selectionStart != 'undefined'){
		return obj.selectionStart;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		var Lp=obj.createTextRange();
		Lp.setEndPoint('EndToStart',M);
		var rb=Lp.text.length;
		if(rb>obj.value.length){
			return -1;
		}
		return rb;
	}
}


function acnikSetCaret(obj,l){
	obj.focus();
	if (obj.setSelectionRange){
		obj.setSelectionRange(l,l);
	}else if(obj.createTextRange){
		m = obj.createTextRange();		
		m.moveStart('character',l);
		m.collapse();
		m.select();
	}
}


String.prototype.addslashes = function(){
	return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
}


String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, '$1');
};


function acnikHideFormElts(sourceObj, objForm) {
	
	var rect2 = acnikObjRect(sourceObj);
	
	for(var i = 0; i < objForm.elements.length; i++) {
		if(objForm.elements[i].type.indexOf('select') != -1) {
			var rect1 = acnikObjRect(objForm.elements[i]);
			
			if(		(rect2[0] + rect2[3] >= rect1[0] && rect2[1] + rect2[2] >= rect1[1])
				&&	(rect2[0] <= rect1[0] && rect2[1] <= rect1[1])){
				objForm.elements[i].style.visibility = 'hidden';
			}
		}
	}
}


function acnikObjHttpQString(obj) {
	
	var qstr	= '';
	if(!obj.form) return qstr;
	
	var objForm = obj.form;
	var added1 = false;
	for(var i = 0; i < objForm.elements.length; i++) {
		
		if(objForm.elements[i].type.indexOf('select') != -1) {
			
			if(added1 && objForm.elements[i].options.selectedIndex >= 0) 
				qstr += '&';
			
			if(objForm.elements[i].options) {
				if(objForm.elements[i].multiple) {
					
					var added2 = false;
					for(var j = 0; j < objForm.elements[i].options.length; j++) {
						if(		objForm.elements[i].options[j].value 
							&&	objForm.elements[i].options[j].selected) {
							
							if(!added2)
								qstr += objForm.elements[i].name + '[]=';
							else
								qstr += '&' + objForm.elements[i].name + '[]=';
							
							var val = objForm.elements[i].options[j].value;
							
							if(escape) qstr += escape(val)
							else if(encodeURIComponent) qstr += encodeURIComponent(val);
							
							added2 = true;
						}
					}
					
				} else if (objForm.elements[i].options.selectedIndex >= 0) {
					
					var oindex = objForm.elements[i].options.selectedIndex;
					var val = objForm.elements[i].options[oindex].value;
					if(val) {
						qstr += objForm.elements[i].name + '=';
						if(escape) qstr += escape(val)
						else if(encodeURIComponent) qstr += encodeURIComponent(val);
					}
					
					added1 = true;
				}
			}
			
		} else if(objForm.elements[i].value && objForm.elements[i].name.substring(0,2)!='__') {
			
			if(added1) qstr += '&';
		
			qstr += objForm.elements[i].name + '=';
			
			if(escape) qstr += escape(objForm.elements[i].value)
			else if(encodeURIComponent) qstr += encodeURIComponent(objForm.elements[i].value);
			
			added1 = true;
		}
		
	}
	
	return qstr;
}


function acnikObjHttpRequest(obj, uri) {

	var xmlHttp = null;
	try{
		xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
	}catch(e){
		try{
			xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
		} catch(oc){
			xmlHttp = null
		}
	}
	
	if(!xmlHttp && typeof XMLHttpRequest != 'undefined') {
		xmlHttp = new XMLHttpRequest()
	}
	
	if(xmlHttp && xmlHttp.readyState != 0){
		xmlHttp.abort()
	}
	
	if(xmlHttp){
		var qstr = acnikObjHttpQString(obj);
		if(qstr.length > 0 && uri.indexOf('?')==-1) 
		{
			uri += '?' + qstr;
		}
		else
		{
			uri += '&' + qstr;
		}
		//xmlHttp.setRequestHeader('Cookie', document.cookie);
		
		xmlHttp.open('GET', uri, true);
		xmlHttp.onreadystatechange = function() {
			if(xmlHttp.readyState == 4 && xmlHttp.responseText) {
				
				eval(xmlHttp.responseText);
			}
		}
		xmlHttp.send(null);
	}
}


function acnikObjHttpCallback(objIndexOrName, arrayTitles, arrayValues) {
	
	if(!objIndexOrName) return;
	
	if(isNaN(objIndexOrName)) {
		
		for(var i = 0; i < acnikObjs.length; i++) {
			
			if(		acnikObjs[i][IDX_FIELD] 
				&&	acnikObjs[i][IDX_FIELD].name == objIndexOrName) {
				
				var obj = acnikObjs[i][IDX_FIELD];
				if(!obj) return;
				objIndexOrName = i;
				break;
			}
		}
	
	} else {
	
		if(objIndex < 0) return;
		var obj = acnikObjs[objIndexOrName][IDX_FIELD];
		if(!obj) return;
		
	}
	
	acnikResetMachedValues(objIndexOrName);
	acnikObjs[objIndexOrName][IDX_TITLES] = arrayTitles;
	acnikObjs[objIndexOrName][IDX_VALUES] = arrayValues;
	acnikGetNearest(objIndexOrName);
	acnikObjShowDrop(objIndexOrName, true, false);
}


function acnikGetNearest(objIndex) {
	
	var obj		= acnikObjs[objIndex][IDX_FIELD];
	var titles	= acnikObjs[objIndex][IDX_TITLES];
	var values	= acnikObjs[objIndex][IDX_VALUES];
	
	if(!obj.value) return 0;
	if(obj.value.length <= 0) return 0;
	if(!titles) return 0;
	if(titles.length <= 0) return 0;
	
	var srch = obj.value.trim().addslashes();
	var rx = acnikObjs[objIndex][IDX_MBEGIN]?new RegExp('^'+srch, 'i'):new RegExp(srch, 'i');
	
	titles1 = new Array();
	values1 = new Array();
		
	for(var i = 0; i < titles.length; i++) 
		if(titles[i] && stripAccent(HtmlDecode(titles[i])).trim().search(rx) >= 0) {
			var j = titles1.length;
			titles1[j] = HtmlDecode(titles[i]);
			values1[j] = values[i];
		}
		
	acnikObjs[objIndex][IDX_MTITLES] = titles1;
	acnikObjs[objIndex][IDX_MVALUES] = values1;
	
	return titles1.length;
}


function acnikResetMachedValues(objIndex) {
	
	if(acnikObjs[objIndex][IDX_MTITLES]) 
		acnikObjs[objIndex][IDX_MTITLES] = null;
	
	if(acnikObjs[objIndex][IDX_MVALUES])
		acnikObjs[objIndex][IDX_MVALUES] = null;
		
	acnikObjs[objIndex][IDX_OFFSET] = -1;
	
}

function acnikGetStrStart(srch, subject) {
	
	if(!srch) return -1;
	if(srch.length <= 0) return -1;
	if(!subject) return -1;
	if(subject.length <= 0) return -1;
	
	srch.trim().addslashes();
	var rx = new RegExp(srch, 'i');
	
	return stripAccent(HtmlDecode(subject)).trim().search(rx);
}


function acnikObjSetOffset(objIndex, offset) {
	
	var obj = acnikObjs[objIndex][IDX_FIELD];
	if(!obj) return;
	
	if(!acnikObjs[objIndex][IDX_MTITLES]) {
		acnikObjs[objIndex][IDX_OFFSET] = -1;
		return;
	}
	
	if(!acnikObjs[objIndex][IDX_MTITLES].length) {
		acnikObjs[objIndex][IDX_OFFSET] = -1;
		return;
	}
	
	acnikObjs[objIndex][IDX_OFFSET] = offset;
}


function acnikObjGetOffset(objIndex, offset) {
	
	var obj = acnikObjs[objIndex][IDX_FIELD];
	if(!obj) return -1;
	
	if(!acnikObjs[objIndex][IDX_MTITLES]) return  -1;
	if(!acnikObjs[objIndex][IDX_MTITLES].length) return -1;
	
	return acnikObjs[objIndex][IDX_OFFSET];
}


function acnikObjIncOffset(objIndex) {
	
	var obj = acnikObjs[objIndex][IDX_FIELD];
	if(!obj) return;
	
	if(!acnikObjs[objIndex][IDX_MTITLES]) return;
	if(!acnikObjs[objIndex][IDX_MTITLES].length) return;
	
	var titles = acnikObjs[objIndex][IDX_MTITLES];
	
	if(titles.length - 1 > acnikObjs[objIndex][IDX_OFFSET]) 
		acnikObjs[objIndex][IDX_OFFSET]++;
}


function acnikObjDecOffset(objIndex) {
	
	var obj = acnikObjs[objIndex][IDX_FIELD];
	if(!obj) return;
	
	if(!acnikObjs[objIndex][IDX_MTITLES]) return;
	if(!acnikObjs[objIndex][IDX_MTITLES].length) return;
	
	var titles = acnikObjs[objIndex][IDX_MTITLES];
	
	if(acnikObjs[objIndex][IDX_OFFSET] > 0) 
		acnikObjs[objIndex][IDX_OFFSET]--;
}


function acnikObjSetValue(objIndex) {

	var obj		= acnikObjs[objIndex][IDX_FIELD];
	var resobj	= acnikObjs[objIndex][IDX_RESULT];
	if(!obj) return;
	
	var otitle	= null;
	var offset	= acnikObjs[objIndex][IDX_OFFSET]; 
	var force	= acnikObjs[objIndex][IDX_FORCED];
	
	var titles = acnikObjs[objIndex][IDX_MTITLES];
	if(!titles && !force) {
		return;
	} else if(!titles && force) {
		titles = acnikObjs[objIndex][IDX_TITLES];
		acnikObjs[objIndex][IDX_OFFSET] = 0;
		offset = 0;
	} else if(!titles.length && force) {
		titles = acnikObjs[objIndex][IDX_TITLES];
		acnikObjs[objIndex][IDX_OFFSET] = 0;
		offset = 0;
	}
	
	var values = acnikObjs[objIndex][IDX_MVALUES];
	if(!values && !force) {
		return;
	}else if(!values && force) {
		values = acnikObjs[objIndex][IDX_VALUES];
		acnikObjs[objIndex][IDX_OFFSET] = 0;
		offset = 0;
	} else if(!values.length && force) {
		values = acnikObjs[objIndex][IDX_VALUES];
		acnikObjs[objIndex][IDX_OFFSET] = 0;
		offset = 0;
	}
	
	if(titles && titles.length) {
		if((offset < 0 || offset >= titles.length) && force) {
			acnikObjs[objIndex][IDX_OFFSET] = 0;
			offset = 0;
		}
		
		if(offset > -1 && offset < titles.length && titles[offset]) {
			otitle = titles[offset];
			obj.value = otitle;
		} else {
			if(force) obj.value = '';
		}
		
		if(acnikObjs[objIndex][IDX_CLEAR]) obj.value = '';
	}
		
	if(!resobj) return;
	
	if(values && values.length) {
		if((offset < 0 || offset >= values.length) && force) {
			acnikObjs[objIndex][IDX_OFFSET] = 0;
			offset = 0;
		}
			
		var rvalue = null;
		if(offset > -1 && offset < values.length && values[offset])
			rvalue = values[offset];
		else {
			rvalue = '';
			if(!force) return;
		}
			
		if(resobj.type.indexOf('select') != -1 && otitle) {
			var found = false;
			for(var i = 0; i < resobj.options.length; i++) {
				if(resobj.options[i].value == rvalue) {
					found = true;
					break;
				}
			}
			
			if(!found) {
				resobj.options[resobj.options.length] = new Option(otitle, rvalue);
			}
		} else {
			resobj.value = rvalue;
		}
	}
	
	acnikAfterEvent(objIndex, ACNIK_EVT_ON_SET_VALUE);
}


function acnikObjShowHeader(enabled, table, objIndex) {

	var colspan = 3;
	
	if(enabled) {
		var tr			= table.insertRow(-1);
		var td			= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_ls_prev';
		td.className	= 'acnikDropEltPrevLeftS';
		td.innerHTML	= '';
		td.onmousedown	= acnikOnMouseDown;
		td.setAttribute('IDX', objIndex);
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_ms_prev';
		td.className	= 'acnikDropEltPrevMiddleS';
		td.innerHTML	= '';
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_rs_prev';
		td.className	= 'acnikDropEltPrevRightS';
		td.innerHTML	= '';
		
		
	} else {
		var tr			= table.insertRow(-1);
		var td			= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_l_prev';
		td.className	= 'acnikDropEltPrevLeft';
		td.innerHTML	= '';
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_m_prev';
		td.className	= 'acnikDropEltPrevMiddle';
		td.innerHTML	= '';
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_r_prev';
		td.className	= 'acnikDropEltPrevRight';
		td.innerHTML	= '';
	}
	
	return colspan;
}


function acnikObjShowFooter(enabled, table, objIndex) {

	if(enabled) {
		var tr			= table.insertRow(-1);
		var td			= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_ls_next';
		td.className	= 'acnikDropEltNextLeftS';
		td.innerHTML	= '';
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_ms_next';
		td.className	= 'acnikDropEltNextMiddleS';
		td.innerHTML	= '';
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_rs_next';
		td.className	= 'acnikDropEltNextRightS';
		td.innerHTML	= '';
		td.onmousedown	= acnikOnMouseDown;
		td.setAttribute('IDX', objIndex);
		
	} else {
		var tr			= table.insertRow(-1);
		var td			= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_l_next';
		td.className	= 'acnikDropEltNextLeft';
		td.innerHTML	= '';
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_m_next';
		td.className	= 'acnikDropEltNextMiddle';
		td.innerHTML	= '';
		
		td				= tr.insertCell(-1);
		td.id			= 'acnik_row' + objIndex + '_r_next';
		td.className	= 'acnikDropEltNextRight';
		td.innerHTML	= '';
	}
	
}


function acnikObjShowDrop(objIndex, callback, keysel) {
	if(objIndex < 0) return;
	var obj = acnikObjs[objIndex][IDX_FIELD];
	if(!obj) return;
	
	if(!obj.value) return;
	
	if(acnikObjs[objIndex][IDX_URL] && !callback) {
		acnikObjHttpRequest(obj, acnikObjs[objIndex][IDX_URL]);
	}
	
	var rect = acnikObjRect(obj);
	
	var tab 			= document.createElement('table');
	tab.cellSpacing		= '0px';
	tab.cellPadding		= '0px';
	tab.style.position	= 'absolute';
	tab.style.top 		= (rect[0] + rect[3] + 1) + 'px';
	tab.style.left 		= rect[1] + 'px';
	tab.style.width		= rect[2] + 'px';
	tab.id 				= 'acnik_table' + objIndex;
	tab.className       = 'acnikDrop';
	document.body.appendChild(tab);
	
	var titles = acnikObjs[objIndex][IDX_MTITLES];
	var values = acnikObjs[objIndex][IDX_MVALUES];
		
	if(titles && titles.length && values && values.length) {
		
		var nitems = acnikObjs[objIndex][IDX_NITEMS];
		if(nitems > titles.length) {
			nitems = titles.length;
		}
		
		var start = acnikObjs[objIndex][IDX_OFFSET] - Math.round(nitems / 2);
		if(start < 0 || start > titles.length - 1) {
			start = 0;
		}
		
		if(start + nitems > titles.length) {
			start = titles.length - nitems;
		}
		
		var colspan = 1;
		if(start > 0)
			colspan = acnikObjShowHeader(true, tab, objIndex);
		else
			colspan = acnikObjShowHeader(false, tab, objIndex);
		
		var i = 0;
		for(i = start; i < start + nitems; i++) {
			var tr			= tab.insertRow(-1);
			var td			= tr.insertCell(-1);
	
			td.onmouseover	= acnikOnMouseOver; 
			td.onmousedown	= acnikOnMouseDown;
			td.setAttribute('IDX_OFFSET', i);
			td.setAttribute('IDX', objIndex);
			td.setAttribute('nowrap', 'true');
	
			td.id			= 'acnik_row_' + objIndex + '_' + i;
			td.colSpan		= colspan;
			

			if(i == acnikObjs[objIndex][IDX_OFFSET]) {
				td.className	= 'acnikDropEltSelected';
			} else {
				if(i%2==0)
					td.className	= 'acnikDropElt';
				else
					td.className	= 'acnikDropEltAlt';
					
			}
			
			var ititle = titles[i];
			var idx = acnikGetStrStart(obj.value, ititle);
			if(idx >= 0) {
				var str = '';
				str	= ititle.substring(0, idx);
				str	+= '<span id=\"acnik_span_'+objIndex+'_'+i+'\" class=\"acnikMatched\">'; 
				str	+= ititle.substring(idx, idx + obj.value.length);
				str	+= '</span>';
				str	+= ititle.substring(idx + obj.value.length, ititle.length);
				td.innerHTML = str;
			} else {
				td.innerHTML	= ititle;
			}
		}
		
		if(i < titles.length) 
			acnikObjShowFooter(true, tab, objIndex);
		else
			acnikObjShowFooter(false, tab, objIndex);
		
		var tabRect			= acnikObjRect(tab);
		tab.style.width		= (tabRect[2] > rect[2])?tabRect[2] + 'px' : rect[2] + 'px';
		//alert(tab.style.width);
		
		acnikHideFormElts(tab, acnikObjs[objIndex][IDX_FIELD].form);
	}
	
}


function acnikOnBlur(evt) {
	
	if (!evt) evt = event;
	var kc = evt.keyCode;
	var targetObj = (evt.target) ? evt.target : evt.srcElement;
	
	var currIdx = -1;
	for(var i = 0; i < acnikObjs.length; i++) {
		if(acnikObjs[i][IDX_FIELD] == targetObj) {
			currIdx = i;
			break;
		}
	}
	
	acnikObjHideDrops();
	acnikObjShowHidden();
	acnikObjSetValue(currIdx);
	acnikAfterEvent(currIdx, ACNIK_EVT_ON_BLUR);
}


function acnikOnKeyDown(evt) {
	
	if (!evt) evt = event;
	var kc = evt.keyCode;
	
	if(kc == 9 || kc == 13 || kc == 27) {
		acnikObjShowHidden();
	}
	
	var targetObj = (evt.target) ? evt.target : evt.srcElement;
	var currIdx = -1;
	for(var i = 0; i < acnikObjs.length; i++) {
		if(acnikObjs[i][IDX_FIELD] == targetObj) {
			currIdx = i;
			break;
		}
	}
	
	acnikAfterEvent(currIdx, ACNIK_EVT_ON_KEY_DOWN);
}

function acnikOnFocus(evt) {
	
	if (!evt) evt = event;
	var kc = evt.keyCode;
	var targetObj = (evt.target) ? evt.target : evt.srcElement;
	
	var currIdx = -1;
	for(var i = 0; i < acnikObjs.length; i++) {
		if(acnikObjs[i][IDX_FIELD] == targetObj) {
			currIdx = i;
			break;
		}
	}
	
	if(currIdx < 0) return true;

	if(acnikObjs[currIdx][IDX_FOCUS])
	{
		acnikObjShowHidden();
		acnikObjHideDrops();
		acnikResetMachedValues(currIdx);
		acnikGetNearest(currIdx);
		acnikObjShowDrop(currIdx, false, false);
		acnikSetCaret(targetObj, targetObj.value.length);
	}

	//acnikAfterEvent(currIdx, ACNIK_EVT_ON_KEY_DOWN);
}


function acnikOnKeyUp(evt) {
	if (!evt) evt = event;
	var kc = evt.keyCode;
	var targetObj = (evt.target) ? evt.target : evt.srcElement;
	
	var currIdx = -1;
	for(var i = 0; i < acnikObjs.length; i++) {
		if(acnikObjs[i][IDX_FIELD] == targetObj) {
			currIdx = i;
			break;
		}
	}
	
	if(currIdx < 0) return true;

	switch (kc){
		case 9:
			break;
		case 13:
			acnikObjSetValue(currIdx);
			acnikObjHideDrops();
			break;
		case 27:
			acnikObjSetValue(currIdx);
			acnikObjHideDrops();
			break;
		case 37:
			break;
		case 38:
			acnikObjShowHidden();
			acnikObjHideDrops();
			acnikObjDecOffset(currIdx);
			acnikObjShowDrop(currIdx, true, true);
			acnikSetCaret(targetObj, targetObj.value.length);
			break;
		case 39:
			break;
		case 40:
			acnikObjShowHidden();
			acnikObjHideDrops();
			acnikObjIncOffset(currIdx);
			acnikObjShowDrop(currIdx, true, true);
			acnikSetCaret(targetObj, targetObj.value.length);
			break;
		default:
			acnikObjShowHidden();
			acnikObjHideDrops();
			acnikResetMachedValues(currIdx);
			acnikGetNearest(currIdx);
			acnikObjShowDrop(currIdx, false, false);
			acnikSetCaret(targetObj, targetObj.value.length);
			break;
	}
	
	acnikAfterEvent(currIdx, ACNIK_EVT_ON_KEY_UP);
	return true;
}

function acnikOnMouseDown(evt) {
	
	if (!evt) evt = window.event;
	var targetObj = (evt.target) ? evt.target : evt.srcElement;
	
	
	if(targetObj && targetObj.id) {
		if(targetObj.id.indexOf('acnik_span_') >= 0) {
			targetObj = targetObj.parentNode;
			if(!targetObj) return;
		}
		
		if(targetObj.getAttribute('IDX') == null) return;
		var currIdx = targetObj.getAttribute('IDX');
		
		if(targetObj.id.indexOf('acnik_') >= 0 && targetObj.id.indexOf('_prev') > 0) {
			acnikObjShowHidden();
			acnikObjHideDrops();
			acnikObjDecOffset(currIdx);
			acnikObjShowDrop(currIdx, true, true);
			if(acnikObjs[currIdx][IDX_FIELD].value)
				acnikSetCaret(	acnikObjs[currIdx][IDX_FIELD], 
								acnikObjs[currIdx][IDX_FIELD].value.length);
			else
				acnikSetCaret(acnikObjs[currIdx][IDX_FIELD], '');
			return;
		}
		
		if(targetObj.id.indexOf('acnik_') >= 0 && targetObj.id.indexOf('_next') > 0) {
			acnikObjShowHidden();
			acnikObjHideDrops();
			acnikObjIncOffset(currIdx);
			acnikObjShowDrop(currIdx, true, true);
			if(acnikObjs[currIdx][IDX_FIELD].value)
				acnikSetCaret(	acnikObjs[currIdx][IDX_FIELD], 
								acnikObjs[currIdx][IDX_FIELD].value.length);
			else
				acnikSetCaret(acnikObjs[currIdx][IDX_FIELD], '');
			return;
		}
		
		if(targetObj.getAttribute('IDX_OFFSET') == null) return;
		var offset = targetObj.getAttribute('IDX_OFFSET');
		
		obj = acnikObjs[currIdx][IDX_FIELD];
		
		acnikObjSetOffset(currIdx, offset);
		acnikObjSetValue(currIdx);
		acnikObjShowHidden();
		acnikObjHideDrops();
		acnikSetCaret(obj, obj.value.length);
		acnikAfterEvent(currIdx, ACNIK_EVT_ON_MOUSE_OVER);
	}
	
}


function acnikOnMouseOver(evt) {
	
	if (!evt) evt = window.event;
	var targetObj = (evt.target) ? evt.target : evt.srcElement;
	
	if(targetObj && targetObj.id) {
		if(targetObj == acnikPrevSelection) return;
		
		if(targetObj.id.indexOf('acnik_span_') >= 0) {
			targetObj = targetObj.parentNode;
			if(!targetObj) return;
		}
	
		if(acnikPrevSelection) {
			acnikPrevSelection.className = 'acnikDropElt';
		} 
	
		targetObj.className = 'acnikDropEltSelected';
		acnikPrevSelection = targetObj;
	}
	
}


function acnikAfterEvent(currIdx, acnikEventName){
	
	if(!acnikObjs[currIdx]) return false;
	
	var eventArray = acnikObjs[currIdx][IDX_EVENT];
	
	for(var i = 0; i < eventArray.length;i++){
		if(eventArray[i] && eventArray[i].length == 2){
			if(eventArray[i][0] == acnikEventName){
				eval(eventArray[i][1] + '();');
			}
		}
	}
	
}

// HtmlDecode http://lab.msdn.microsoft.com/annotations/htmldecode.js 

//   client side version of the useful Server.HtmlDecode method 

//   takes one string (encoded) and returns another (decoded) 

function HtmlDecode(s) 

{ 

      var out = ""; 

      if (s==null) return; 

  

      var l = s.length; 

      for (var i=0; i<l; i++) 

      { 

            var ch = s.charAt(i); 

            

            if (ch == '&') 

            { 

                  var semicolonIndex = s.indexOf(';', i+1); 

                  

            if (semicolonIndex > 0) 

            { 

                        var entity = s.substring(i + 1, semicolonIndex); 

                        if (entity.length > 1 && entity.charAt(0) == '#') 

                        { 

                              if (entity.charAt(1) == 'x' || entity.charAt(1) == 'X') 

                                    ch = String.fromCharCode(eval('0'+entity.substring(1))); 

                              else 

                                    ch = String.fromCharCode(eval(entity.substring(1))); 

                        } 

                    else 

                      { 

                              switch (entity) 

                              { 

                                    case 'quot': ch = String.fromCharCode(0x0022); break; 

                                    case 'amp': ch = String.fromCharCode(0x0026); break; 

                                    case 'lt': ch = String.fromCharCode(0x003c); break; 

                                    case 'gt': ch = String.fromCharCode(0x003e); break; 

                                    case 'nbsp': ch = String.fromCharCode(0x00a0); break; 

                                    case 'iexcl': ch = String.fromCharCode(0x00a1); break; 

                                    case 'cent': ch = String.fromCharCode(0x00a2); break; 

                                    case 'pound': ch = String.fromCharCode(0x00a3); break; 

                                    case 'curren': ch = String.fromCharCode(0x00a4); break; 

                                    case 'yen': ch = String.fromCharCode(0x00a5); break; 

                                    case 'brvbar': ch = String.fromCharCode(0x00a6); break; 

                                    case 'sect': ch = String.fromCharCode(0x00a7); break; 

                                    case 'uml': ch = String.fromCharCode(0x00a8); break; 

                                    case 'copy': ch = String.fromCharCode(0x00a9); break; 

                                    case 'ordf': ch = String.fromCharCode(0x00aa); break; 

                                    case 'laquo': ch = String.fromCharCode(0x00ab); break; 

                                    case 'not': ch = String.fromCharCode(0x00ac); break; 

                                    case 'shy': ch = String.fromCharCode(0x00ad); break; 

                                    case 'reg': ch = String.fromCharCode(0x00ae); break; 

                                    case 'macr': ch = String.fromCharCode(0x00af); break; 

                                    case 'deg': ch = String.fromCharCode(0x00b0); break; 

                                    case 'plusmn': ch = String.fromCharCode(0x00b1); break; 

                                    case 'sup2': ch = String.fromCharCode(0x00b2); break; 

                                    case 'sup3': ch = String.fromCharCode(0x00b3); break; 

                                    case 'acute': ch = String.fromCharCode(0x00b4); break; 

                                    case 'micro': ch = String.fromCharCode(0x00b5); break; 

                                    case 'para': ch = String.fromCharCode(0x00b6); break; 

                                    case 'middot': ch = String.fromCharCode(0x00b7); break; 

                                    case 'cedil': ch = String.fromCharCode(0x00b8); break; 

                                    case 'sup1': ch = String.fromCharCode(0x00b9); break; 

                                    case 'ordm': ch = String.fromCharCode(0x00ba); break; 

                                    case 'raquo': ch = String.fromCharCode(0x00bb); break; 

                                    case 'frac14': ch = String.fromCharCode(0x00bc); break; 

                                    case 'frac12': ch = String.fromCharCode(0x00bd); break; 

                                    case 'frac34': ch = String.fromCharCode(0x00be); break; 

                                    case 'iquest': ch = String.fromCharCode(0x00bf); break; 

                                    case 'Agrave': ch = String.fromCharCode(0x00c0); break; 

                                    case 'Aacute': ch = String.fromCharCode(0x00c1); break; 

                                    case 'Acirc': ch = String.fromCharCode(0x00c2); break; 

                                    case 'Atilde': ch = String.fromCharCode(0x00c3); break; 

                                    case 'Auml': ch = String.fromCharCode(0x00c4); break; 

                                    case 'Aring': ch = String.fromCharCode(0x00c5); break; 

                                    case 'AElig': ch = String.fromCharCode(0x00c6); break; 

                                    case 'Ccedil': ch = String.fromCharCode(0x00c7); break; 

                                    case 'Egrave': ch = String.fromCharCode(0x00c8); break; 

                                    case 'Eacute': ch = String.fromCharCode(0x00c9); break; 

                                    case 'Ecirc': ch = String.fromCharCode(0x00ca); break; 

                                    case 'Euml': ch = String.fromCharCode(0x00cb); break; 

                                    case 'Igrave': ch = String.fromCharCode(0x00cc); break; 

                                    case 'Iacute': ch = String.fromCharCode(0x00cd); break; 

                                    case 'Icirc': ch = String.fromCharCode(0x00ce ); break; 

                                    case 'Iuml': ch = String.fromCharCode(0x00cf); break; 

                                    case 'ETH': ch = String.fromCharCode(0x00d0); break; 

                                    case 'Ntilde': ch = String.fromCharCode(0x00d1); break; 

                                    case 'Ograve': ch = String.fromCharCode(0x00d2); break; 

                                    case 'Oacute': ch = String.fromCharCode(0x00d3); break; 

                                    case 'Ocirc': ch = String.fromCharCode(0x00d4); break; 

                                    case 'Otilde': ch = String.fromCharCode(0x00d5); break; 

                                    case 'Ouml': ch = String.fromCharCode(0x00d6); break; 

                                    case 'times': ch = String.fromCharCode(0x00d7); break; 

                                    case 'Oslash': ch = String.fromCharCode(0x00d8); break; 

                                    case 'Ugrave': ch = String.fromCharCode(0x00d9); break; 

                                    case 'Uacute': ch = String.fromCharCode(0x00da); break; 

                                    case 'Ucirc': ch = String.fromCharCode(0x00db); break; 

                                    case 'Uuml': ch = String.fromCharCode(0x00dc); break; 

                                    case 'Yacute': ch = String.fromCharCode(0x00dd); break; 

                                    case 'THORN': ch = String.fromCharCode(0x00de); break; 

                                    case 'szlig': ch = String.fromCharCode(0x00df); break; 

                                    case 'agrave': ch = String.fromCharCode(0x00e0); break; 

                                    case 'aacute': ch = String.fromCharCode(0x00e1); break; 

                                    case 'acirc': ch = String.fromCharCode(0x00e2); break; 

                                    case 'atilde': ch = String.fromCharCode(0x00e3); break; 

                                    case 'auml': ch = String.fromCharCode(0x00e4); break; 

                                    case 'aring': ch = String.fromCharCode(0x00e5); break; 

                                    case 'aelig': ch = String.fromCharCode(0x00e6); break; 

                                    case 'ccedil': ch = String.fromCharCode(0x00e7); break; 

                                    case 'egrave': ch = String.fromCharCode(0x00e8); break; 

                                    case 'eacute': ch = String.fromCharCode(0x00e9); break; 

                                    case 'ecirc': ch = String.fromCharCode(0x00ea); break; 

                                    case 'euml': ch = String.fromCharCode(0x00eb); break; 

                                    case 'igrave': ch = String.fromCharCode(0x00ec); break; 

                                    case 'iacute': ch = String.fromCharCode(0x00ed); break; 

                                    case 'icirc': ch = String.fromCharCode(0x00ee); break; 

                                    case 'iuml': ch = String.fromCharCode(0x00ef); break; 

                                    case 'eth': ch = String.fromCharCode(0x00f0); break; 

                                    case 'ntilde': ch = String.fromCharCode(0x00f1); break; 

                                    case 'ograve': ch = String.fromCharCode(0x00f2); break; 

                                    case 'oacute': ch = String.fromCharCode(0x00f3); break; 

                                    case 'ocirc': ch = String.fromCharCode(0x00f4); break; 

                                    case 'otilde': ch = String.fromCharCode(0x00f5); break; 

                                    case 'ouml': ch = String.fromCharCode(0x00f6); break; 

                                    case 'divide': ch = String.fromCharCode(0x00f7); break; 

                                    case 'oslash': ch = String.fromCharCode(0x00f8); break; 

                                    case 'ugrave': ch = String.fromCharCode(0x00f9); break; 

                                    case 'uacute': ch = String.fromCharCode(0x00fa); break; 

                                    case 'ucirc': ch = String.fromCharCode(0x00fb); break; 

                                    case 'uuml': ch = String.fromCharCode(0x00fc); break; 

                                    case 'yacute': ch = String.fromCharCode(0x00fd); break; 

                                    case 'thorn': ch = String.fromCharCode(0x00fe); break; 

                                    case 'yuml': ch = String.fromCharCode(0x00ff); break; 

                                    case 'OElig': ch = String.fromCharCode(0x0152); break; 

                                    case 'oelig': ch = String.fromCharCode(0x0153); break; 

                                    case 'Scaron': ch = String.fromCharCode(0x0160); break; 

                                    case 'scaron': ch = String.fromCharCode(0x0161); break; 

                                    case 'Yuml': ch = String.fromCharCode(0x0178); break; 

                                    case 'fnof': ch = String.fromCharCode(0x0192); break; 

                                    case 'circ': ch = String.fromCharCode(0x02c6); break; 

                                    case 'tilde': ch = String.fromCharCode(0x02dc); break; 

                                    case 'Alpha': ch = String.fromCharCode(0x0391); break; 

                                    case 'Beta': ch = String.fromCharCode(0x0392); break; 

                                    case 'Gamma': ch = String.fromCharCode(0x0393); break; 

                                    case 'Delta': ch = String.fromCharCode(0x0394); break; 

                                    case 'Epsilon': ch = String.fromCharCode(0x0395); break; 

                                    case 'Zeta': ch = String.fromCharCode(0x0396); break; 

                                    case 'Eta': ch = String.fromCharCode(0x0397); break; 

                                    case 'Theta': ch = String.fromCharCode(0x0398); break; 

                                    case 'Iota': ch = String.fromCharCode(0x0399); break; 

                                    case 'Kappa': ch = String.fromCharCode(0x039a); break; 

                                    case 'Lambda': ch = String.fromCharCode(0x039b); break; 

                                    case 'Mu': ch = String.fromCharCode(0x039c); break; 

                                    case 'Nu': ch = String.fromCharCode(0x039d); break; 

                                    case 'Xi': ch = String.fromCharCode(0x039e); break; 

                                    case 'Omicron': ch = String.fromCharCode(0x039f); break; 

                                    case 'Pi': ch = String.fromCharCode(0x03a0); break; 

                                    case ' Rho ': ch = String.fromCharCode(0x03a1); break; 

                                    case 'Sigma': ch = String.fromCharCode(0x03a3); break; 

                                    case 'Tau': ch = String.fromCharCode(0x03a4); break; 

                                    case 'Upsilon': ch = String.fromCharCode(0x03a5); break; 

                                    case 'Phi': ch = String.fromCharCode(0x03a6); break; 

                                    case 'Chi': ch = String.fromCharCode(0x03a7); break; 

                                    case 'Psi': ch = String.fromCharCode(0x03a8); break; 

                                    case 'Omega': ch = String.fromCharCode(0x03a9); break; 

                                    case 'alpha': ch = String.fromCharCode(0x03b1); break; 

                                    case 'beta': ch = String.fromCharCode(0x03b2); break; 

                                    case 'gamma': ch = String.fromCharCode(0x03b3); break; 

                                    case 'delta': ch = String.fromCharCode(0x03b4); break; 

                                    case 'epsilon': ch = String.fromCharCode(0x03b5); break; 

                                    case 'zeta': ch = String.fromCharCode(0x03b6); break; 

                                    case 'eta': ch = String.fromCharCode(0x03b7); break; 

                                    case 'theta': ch = String.fromCharCode(0x03b8); break; 

                                    case 'iota': ch = String.fromCharCode(0x03b9); break; 

                                    case 'kappa': ch = String.fromCharCode(0x03ba); break; 

                                    case 'lambda': ch = String.fromCharCode(0x03bb); break; 

                                    case 'mu': ch = String.fromCharCode(0x03bc); break; 

                                    case 'nu': ch = String.fromCharCode(0x03bd); break; 

                                    case 'xi': ch = String.fromCharCode(0x03be); break; 

                                    case 'omicron': ch = String.fromCharCode(0x03bf); break; 

                                    case 'pi': ch = String.fromCharCode(0x03c0); break; 

                                    case 'rho': ch = String.fromCharCode(0x03c1); break; 

                                    case 'sigmaf': ch = String.fromCharCode(0x03c2); break; 

                                    case 'sigma': ch = String.fromCharCode(0x03c3); break; 

                                    case 'tau': ch = String.fromCharCode(0x03c4); break; 

                                    case 'upsilon': ch = String.fromCharCode(0x03c5); break; 

                                    case 'phi': ch = String.fromCharCode(0x03c6); break; 

                                    case 'chi': ch = String.fromCharCode(0x03c7); break; 

                                    case 'psi': ch = String.fromCharCode(0x03c8); break; 

                                    case 'omega': ch = String.fromCharCode(0x03c9); break; 

                                    case 'thetasym': ch = String.fromCharCode(0x03d1); break; 

                                    case 'upsih': ch = String.fromCharCode(0x03d2); break; 

                                    case 'piv': ch = String.fromCharCode(0x03d6); break; 

                                    case 'ensp': ch = String.fromCharCode(0x2002); break; 

                                    case 'emsp': ch = String.fromCharCode(0x2003); break; 

                                    case 'thinsp': ch = String.fromCharCode(0x2009); break; 

                                    case 'zwnj': ch = String.fromCharCode(0x200c); break; 

                                    case 'zwj': ch = String.fromCharCode(0x200d); break; 

                                    case 'lrm': ch = String.fromCharCode(0x200e); break; 

                                    case 'rlm': ch = String.fromCharCode(0x200f); break; 

                                    case 'ndash': ch = String.fromCharCode(0x2013); break; 

                                    case 'mdash': ch = String.fromCharCode(0x2014); break; 

                                    case 'lsquo': ch = String.fromCharCode(0x2018); break; 

                                    case 'rsquo': ch = String.fromCharCode(0x2019); break; 

                                    case 'sbquo': ch = String.fromCharCode(0x201a); break; 

                                    case 'ldquo': ch = String.fromCharCode(0x201c); break; 

                                    case 'rdquo': ch = String.fromCharCode(0x201d); break; 

                                    case 'bdquo': ch = String.fromCharCode(0x201e); break; 

                                    case 'dagger': ch = String.fromCharCode(0x2020); break; 

                                    case 'Dagger': ch = String.fromCharCode(0x2021); break; 

                                    case 'bull': ch = String.fromCharCode(0x2022); break; 

                                    case 'hellip': ch = String.fromCharCode(0x2026); break; 

                                    case 'permil': ch = String.fromCharCode(0x2030); break; 

                                    case 'prime': ch = String.fromCharCode(0x2032); break; 

                                    case 'Prime': ch = String.fromCharCode(0x2033); break; 

                                    case 'lsaquo': ch = String.fromCharCode(0x2039); break; 

                                    case 'rsaquo': ch = String.fromCharCode(0x203a); break; 

                                    case 'oline': ch = String.fromCharCode(0x203e); break; 

                                    case 'frasl': ch = String.fromCharCode(0x2044); break; 

                                    case 'euro': ch = String.fromCharCode(0x20ac); break; 

                                    case 'image': ch = String.fromCharCode(0x2111); break; 

                                    case 'weierp': ch = String.fromCharCode(0x2118); break; 

                                    case 'real': ch = String.fromCharCode(0x211c); break; 

                                    case 'trade': ch = String.fromCharCode(0x2122); break; 

                                    case 'alefsym': ch = String.fromCharCode(0x2135); break; 

                                    case 'larr': ch = String.fromCharCode(0x2190); break; 

                                    case 'uarr': ch = String.fromCharCode(0x2191); break; 

                                    case 'rarr': ch = String.fromCharCode(0x2192); break; 

                                    case 'darr': ch = String.fromCharCode(0x2193); break; 

                                    case 'harr': ch = String.fromCharCode(0x2194); break; 

                                    case 'crarr': ch = String.fromCharCode(0x21b5); break; 

                                    case 'lArr': ch = String.fromCharCode(0x21d0); break; 

                                    case 'uArr': ch = String.fromCharCode(0x21d1); break; 

                                    case 'rArr': ch = String.fromCharCode(0x21d2); break; 

                                    case 'dArr': ch = String.fromCharCode(0x21d3); break; 

                                    case 'hArr': ch = String.fromCharCode(0x21d4); break; 

                                    case 'forall': ch = String.fromCharCode(0x2200); break; 

                                    case 'part': ch = String.fromCharCode(0x2202); break; 

                                    case 'exist': ch = String.fromCharCode(0x2203); break; 

                                    case 'empty': ch = String.fromCharCode(0x2205); break; 

                                    case 'nabla': ch = String.fromCharCode(0x2207); break; 

                                    case 'isin': ch = String.fromCharCode(0x2208); break; 

                                    case 'notin': ch = String.fromCharCode(0x2209); break; 

                                    case 'ni': ch = String.fromCharCode(0x220b); break; 

                                    case 'prod': ch = String.fromCharCode(0x220f); break; 

                                    case 'sum': ch = String.fromCharCode(0x2211); break; 

                                    case 'minus': ch = String.fromCharCode(0x2212); break; 

                                    case 'lowast': ch = String.fromCharCode(0x2217); break; 

                                    case 'radic': ch = String.fromCharCode(0x221a); break; 

                                    case 'prop': ch = String.fromCharCode(0x221d); break; 

                                    case 'infin': ch = String.fromCharCode(0x221e); break; 

                                    case 'ang': ch = String.fromCharCode(0x2220); break; 

                                    case 'and': ch = String.fromCharCode(0x2227); break; 

                                    case 'or': ch = String.fromCharCode(0x2228); break; 

                                    case 'cap': ch = String.fromCharCode(0x2229); break; 

                                    case 'cup': ch = String.fromCharCode(0x222a); break; 

                                    case 'int': ch = String.fromCharCode(0x222b); break; 

                                    case 'there4': ch = String.fromCharCode(0x2234); break; 

                                    case 'sim': ch = String.fromCharCode(0x223c); break; 

                                    case 'cong': ch = String.fromCharCode(0x2245); break; 

                                    case 'asymp': ch = String.fromCharCode(0x2248); break; 

                                    case 'ne': ch = String.fromCharCode(0x2260); break; 

                                    case 'equiv': ch = String.fromCharCode(0x2261); break; 

                                    case 'le': ch = String.fromCharCode(0x2264); break; 

                                    case 'ge': ch = String.fromCharCode(0x2265); break; 

                                    case 'sub': ch = String.fromCharCode(0x2282); break; 

                                    case 'sup': ch = String.fromCharCode(0x2283); break; 

                                    case 'nsub': ch = String.fromCharCode(0x2284); break; 

                                    case 'sube': ch = String.fromCharCode(0x2286); break; 

                                    case 'supe': ch = String.fromCharCode(0x2287); break; 

                                    case 'oplus': ch = String.fromCharCode(0x2295); break; 

                                    case 'otimes': ch = String.fromCharCode(0x2297); break; 

                                    case 'perp': ch = String.fromCharCode(0x22a5); break; 

                                    case 'sdot': ch = String.fromCharCode(0x22c5); break; 

                                    case 'lceil': ch = String.fromCharCode(0x2308); break; 

                                    case 'rceil': ch = String.fromCharCode(0x2309); break; 

                                    case 'lfloor': ch = String.fromCharCode(0x230a); break; 

                                    case 'rfloor': ch = String.fromCharCode(0x230b); break; 

                                    case 'lang': ch = String.fromCharCode(0x2329); break; 

                                    case 'rang': ch = String.fromCharCode(0x232a); break; 

                                    case 'loz': ch = String.fromCharCode(0x25ca); break; 

                                    case 'spades': ch = String.fromCharCode(0x2660); break; 

                                    case 'clubs': ch = String.fromCharCode(0x2663); break; 

                                    case 'hearts': ch = String.fromCharCode(0x2665); break; 

                                    case 'diams': ch = String.fromCharCode(0x2666); break; 

                                    default: ch = ''; break; 

                              } 

                        } 

                        i = semicolonIndex; 

                  } 

            } 

            

            out += ch; 

      } 

  

      return out; 

      

} 

function stripAccent(str)
{
var s=str;

var rExps=[ /[\xC0-\xC2]/g, /[\xE0-\xE2]/g,
/[\xC8-\xCA]/g, /[\xE8-\xEB]/g,
/[\xCC-\xCE]/g, /[\xEC-\xEE]/g,
/[\xD2-\xD4]/g, /[\xF2-\xF4]/g,
/[\xD9-\xDB]/g, /[\xF9-\xFB]/g ];

var repChar=['A','a','E','e','I','i','O','o','U','u'];

for(var i=0; i<rExps.length; i++)
s=s.replace(rExps[i],repChar[i]);

return s;
}