/*    Caret Functions     */
function getCaretEnd(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 getCaretStart(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 setCaret(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();
	}
}
/* ----------------- */

/* Netfile functions */

function removeToken(s, t) {
	/*
	**  Remove all occurrences of a token in a string
	**    s  string to be processed
	**    t  token to be removed
	**  returns new string
	*/
	i = s.indexOf(t);
	r = "";
	if (i == -1) return s;
	r += s.substring(0,i) + removeToken(s.substring(i + t.length), t);
	return r;
}

function VerifyLookups(aForm,IgnoreFieldSuffix) {
	if (aForm != null) {
		var baseFieldName = '';
		var textFieldName = '';
		var textFieldValue = '';
		var hiddenFieldvalue = '';
		var hiddenField = null;
		for (var i = 0; i<aForm.elements.length; i++) {
			if ((aForm.elements[i].type == 'text')) {	
				textFieldName = aForm.elements[i].name;
				textFieldValue = aForm.elements[i].value;
				//alert(textFieldName + '=' + textFieldValue);
				if (textFieldValue != '') {
					baseFieldName = removeToken(textFieldName,IgnoreFieldSuffix);
					//alert(baseFieldName);
					hiddenField = aForm.elements[baseFieldName+'_O'];
					if (hiddenField != null) {
						//alert('Found a hidden field! ' + hiddenField.name + ' ' + hiddenField.value);
						if (hiddenField.value.length == '') {
							alert('A lookup field was filled with an invalid name.\n Please make sure all lookup fields use only values from the available lists!\n The incorrect value was ' + textFieldValue);
							aForm.elements[i].focus();							
							return false;
						}
					}
				}
			}
		}
		//This for loop will disable the submit buttons and change their text to Working while the server is processing the form submittal.
		for (var j = 0; j<aForm.elements.length; j++){
        		if (aForm.elements[j].type == 'submit'){
				aForm.elements[j].disabled=true
				aForm.elements[j].value="Working"}
		}
        	return true;
	}
	else
	{
		alert('Please inform support that the form was nil, which should never happen.');
		return false;
	}
}

/*    Escape function   */
String.prototype.addslashes = function(){
	return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
}
String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
}; 


function actb(form,obj,evt,ca){
	/* ---- Variables ---- */
	var actb_timeOut = -1; // Autocomplete Timeout in ms (-1: autocomplete never time out)
	var actb_lim = 10;    // Number of elements autocomplete can show (-1: no limit)
	var actb_firstText = false; // should the auto complete be limited to the beginning of keyword?
	var actb_mouse = true; // Enable Mouse Support
	var actb_delimiter = new Array(';',',');  // Delimiter for multiple autocomplete. Set it to empty array for single autocomplete
	var actb_namevaluedelim = '=';
	var actb_ignorefield = '_IGNORE';
	/* ---- Variables ---- */

	/* --- Styles --- */
	var actb_bgColor = '#5275C6';
	var actb_textColor = '#FFFFFF';
	var actb_hColor = '#9CAEC6';
	var actb_fFamily = 'sans-serif';
	var actb_fSize = '90%';
	var actb_hStyle = 'span-weight="900"';
	var actb_cellSpacing = '2px';
	var actb_cellPadding = '3px';	
	var actb_spanFamily = 'arial narrow';
	/* --- Styles --- */

	/* ---- Don't touch :P---- */
	var actb_parentform = null;	
	var actb_delimwords = new Array();
	var actb_cdelimword = 0;
	var actb_delimchar = new Array();
	var actb_keywords = new Array();
	var actb_display = false;
	var actb_pos = 0;
	var actb_total = 0;
	var actb_curr = null;
	var actb_rangeu = 0;
	var actb_ranged = 0;
	var actb_bool = new Array();
	var actb_pre = 0;
	var actb_toid;
	var actb_tomake = false;
	var actb_getpre = "";
	var actb_mouse_on_list = true;
	var actb_kwcount = 0;
	var actb_caretmove = false;
	/* ---- "Constants" ---- */

	
	actb_keywords = ca;
	actb_curr = obj;
	actb_parentform = form;
	//added by chris for tabbing
		
	var oldkeydownhandler = document.onkeydown;
	var oldblurhandler = obj.onblur;
	var oldkeypresshandler = obj.onkeypress;

	document.onkeydown = actb_checkkey;
	obj.onblur = actb_clear;
	obj.onkeypress = actb_keypress;
	
	
	function actb_clear(evt){
		if (!evt) evt = event;
		document.onkeydown = oldkeydownhandler;
		actb_curr.onblur = oldblurhandler;
		actb_curr.onkeypress = oldkeypresshandler;
		actb_removedisp();
	}
	function actb_parse(n){
		if (actb_delimiter.length > 0){
			var t = actb_delimwords[actb_cdelimword].trim().addslashes();
			var plen = actb_delimwords[actb_cdelimword].trim().length;
		}else{
			var t = actb_curr.value.addslashes();
			var plen = actb_curr.value.length;
		}
		var tobuild = '';
		var i;

		if (actb_firstText){
			var re = new RegExp("^" + t, "i");
		}else{
			var re = new RegExp(t, "i");
		}
		
		var p = n.search(re);
		var isNameValueDelim = false;
						
		for (i=0;i<p;i++){
			if (n.substr(i,1) == actb_namevaluedelim)  {isNameValueDelim=true;}
			if (!isNameValueDelim) {
				tobuild += n.substr(i,1);
			}
		}
		tobuild += "<span style='"+(actb_hStyle)+"'>"
		for (i=p;i<plen+p;i++){
			if (n.substr(i,1) == actb_namevaluedelim)  {isNameValueDelim=true;}
			if (!isNameValueDelim) {
				tobuild += n.substr(i,1);
			}
		}
		tobuild += "</span>";
		for (i=plen+p;i<n.length;i++){
			if (n.substr(i,1) == actb_namevaluedelim)  {isNameValueDelim=true;}
			if (!isNameValueDelim) {
				tobuild += n.substr(i,1);
			}
		}
		return tobuild;
	}
	function curTop(){
		actb_toreturn = 0;
		obj = actb_curr;
		while(obj){
			actb_toreturn += obj.offsetTop;
			obj = obj.offsetParent;
		}
		return actb_toreturn;
	}
	function curLeft(){
		actb_toreturn = 0;
		obj = actb_curr;
		while(obj){
			actb_toreturn += obj.offsetLeft;
			obj = obj.offsetParent;
		}
		return actb_toreturn;
	}
	function actb_generate(){
		if (document.getElementById('tat_table')){ actb_display = false;document.body.removeChild(document.getElementById('tat_table')); } 
		if (actb_kwcount == 0){
			actb_display = false;
			return;
		}
		a = document.createElement('table');
		a.cellSpacing=actb_cellSpacing;
		a.cellPadding=actb_cellPadding;
		a.style.position='absolute';
		a.style.top = eval(curTop() + actb_curr.offsetHeight) + "px";
		a.style.left = curLeft() + "px";
		a.style.backgroundColor=actb_bgColor;
		a.id = 'tat_table';
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (actb_mouse){
			a.onmouseout= actb_table_unfocus;
			a.onmouseover=actb_table_focus;
		}
		var counter = 0;
		for (i=0;i<actb_keywords.length;i++){
			if (actb_bool[i]){
				counter++;
				r = a.insertRow(-1);
				if (first && !actb_tomake){
					r.style.backgroundColor = actb_hColor;
					first = false;
					actb_pos = counter;
				}else if(actb_pre == i){
					r.style.backgroundColor = actb_hColor;
					first = false;
					actb_pos = counter;
				}else{
					r.style.backgroundColor = actb_bgColor;
				}
				r.id = 'tat_tr'+(j);
				c = r.insertCell(-1);
				c.style.color = actb_textColor;
				c.style.spanFamily = actb_fFamily;
				c.style.spanSize = actb_fSize;
				c.innerHTML = actb_parse(actb_keywords[i]);
				c.id = 'tat_td'+(j);
				c.setAttribute('pos',j);
				if (actb_mouse){
					c.onclick=actb_mouseclick;
					c.onmouseover = actb_table_highlight;
				}
				j++;
			}
			if (j - 1 == actb_lim && j < actb_total){
				r = a.insertRow(-1);
				r.style.backgroundColor = actb_bgColor;
				c = r.insertCell(-1);
				c.style.color = actb_textColor;
				c.style.spanFamily = actb_spanFamily;
				c.style.spanSize = actb_fSize;
				c.align='center';
				c.innerHTML = '\\/';
				if (actb_mouse){
					c.onclick = actb_mouse_down;
				}
				break;
			}
		}
		actb_rangeu = 1;
		actb_ranged = j-1;
		actb_display = true;
		if (actb_pos <= 0) actb_pos = 1;
	}
	function actb_remake(){
		document.body.removeChild(document.getElementById('tat_table'));
		a = document.createElement('table');
		a.cellSpacing=cellSpacing;
		a.cellPadding=cellPadding;
		a.style.position='absolute';
		a.style.top = eval(curTop() + actb_curr.offsetHeight) + "px";
		a.style.left = curLeft() + "px";
		a.style.backgroundColor=actb_bgColor;
		a.id = 'tat_table';
		if (actb_mouse){
			a.onmouseout= actb_table_unfocus;
			a.onmouseover=actb_table_focus;
		}
		document.body.appendChild(a);
		var i;
		var first = true;
		var j = 1;
		if (actb_rangeu > 1){
			r = a.insertRow(-1);
			r.style.backgroundColor = actb_bgColor;
			c = r.insertCell(-1);
			c.style.color = actb_textColor;
			c.style.spanFamily = actb_spanFamily;
			c.style.spanSize = actb_fSize;
			c.align='center';
			c.innerHTML = '/\\';
			if (actb_mouse){
				c.onclick = actb_mouse_up;
			}
		}
		for (i=0;i<actb_keywords.length;i++){
			if (actb_bool[i]){
				if (j >= actb_rangeu && j <= actb_ranged){
					r = a.insertRow(-1);
					r.style.backgroundColor = actb_bgColor;
					r.id = 'tat_tr'+(j);
					c = r.insertCell(-1);
					c.style.color = actb_textColor;
					c.style.spanFamily = actb_fFamily;
					c.style.spanSize = actb_fSize;
					c.innerHTML = actb_parse(actb_keywords[i]);
					c.id = 'tat_td'+(j);
					c.setAttribute('pos',j);
					if (actb_mouse){
						c.onclick=actb_mouseclick;
						c.onmouseover = actb_table_highlight;
					}
					j++;
				}else{
					j++;
				}
			}
			if (j > actb_ranged) break;
		}
		if (j-1 < actb_total){
			r = a.insertRow(-1);
			r.style.backgroundColor = actb_bgColor;
			c = r.insertCell(-1);
			c.style.color = actb_textColor;
			c.style.spanFamily = actb_spanFamily;
			c.style.spanSize = actb_fSize;
			c.align='center';
			c.innerHTML = '\\/';
			if (actb_mouse){
				c.onclick = actb_mouse_down;
			}
		}
	}
	function actb_goup(){
		if (!actb_display) return;
		if (actb_pos == 1) return;
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
		actb_pos--;
		if (actb_pos < actb_rangeu) actb_moveup();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
	}
	function actb_godown(){
		if (!actb_display) return;
		if (actb_pos == actb_total) return;
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
		actb_pos++;
		if (actb_pos > actb_ranged) actb_movedown();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
	}
	function actb_movedown(){
		actb_rangeu++;
		actb_ranged++;
		actb_remake();
	}
	function actb_moveup(){
		actb_rangeu--;
		actb_ranged--;
		actb_remake();
	}

	/* Mouse */
	function actb_mouse_down(){
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
		actb_pos++;
		actb_movedown();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
		actb_curr.focus();
		actb_moue_on_list = 0;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
	}
	function actb_mouse_up(evt){
		if (!evt) evt = event;
		if (evt.stopPropagation){
			evt.stopPropagation();
		}else{
			evt.cancelBubble = true;
		}
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
		actb_pos--;
		actb_moveup();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
		actb_curr.focus();
		actb_moue_on_list = 0;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list=0;actb_removedisp();},actb_timeOut);
	}
	function actb_mouseclick(evt){
		if (!evt) evt = event;
		if (!actb_display) return;
		actb_mouse_on_list = 0;
		actb_pos = this.getAttribute('pos');
		actb_penter();
	}
	function actb_table_focus(){
		actb_mouse_on_list = 1;
	}
	function actb_table_unfocus(){
		actb_mouse_on_list = 0;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_timeOut);
	}
	function actb_table_highlight(){
		actb_mouse_on_list = 1;
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_bgColor;
		actb_pos = this.getAttribute('pos');
		while (actb_pos < actb_rangeu) actb_moveup();
		while (actb_pos > actb_ranged) actb_mousedown();
		document.getElementById('tat_tr'+actb_pos).style.backgroundColor = actb_hColor;
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_timeOut);
	}
	/* ---- */

	function actb_insertword(a){
		if (actb_delimiter.length > 0){
			str = '';
			l=0;
			for (i=0;i<actb_delimwords.length;i++){
				if (actb_cdelimword == i){
					str += a;
					l = str.length;
				}else{
					str += actb_delimwords[i];
				}
				if (i != actb_delimwords.length - 1){
					str += actb_delimchar[i];
				}
			}
			var isNameValueDelim = false;
			var toBuild = '';
			var lookupValue='';
			for (i=0;i<str.length;i++){
				if (str.substr(i,1) == actb_namevaluedelim)  {isNameValueDelim=true;}
				if (isNameValueDelim) {
					/*Build value here*/
					if (str.substr(i,1) != actb_namevaluedelim) {
						lookupValue += str.substr(i,1);
					}
				}
				else 
				{
					toBuild += str.substr(i,1);
				}
			}
			actb_curr.value = toBuild;
			
			// Set the hidden input field. Get name from current field
			var hiddenFieldName = removeToken(actb_curr.name,actb_ignorefield) + '_O';			
			var hiddenField = actb_parentform.elements[hiddenFieldName];
			if (hiddenField != null) {
				hiddenField.value = lookupValue;
			}
			else {
				alert('Could not find the field ' + hiddenFieldName + '. Please inform support');
			}
			setCaret(actb_curr,l);
		}else{
			actb_curr.value = a;
		}
		actb_mouse_on_list = 0;
		actb_removedisp();
	}

	function actb_penter(){
		if (!actb_display) return;
		actb_display = false;
		var word = '';
		var c = 0;
		for (var i=0;i<=actb_keywords.length;i++){
			if (actb_bool[i]) c++;
			if (c == actb_pos){
				word = actb_keywords[i];
				break;
			}
		}
		actb_insertword(word);
	}
	function actb_removedisp(){
		if (!actb_mouse_on_list){
			actb_display = false;
			if (document.getElementById('tat_table')){ document.body.removeChild(document.getElementById('tat_table')); }
			if (actb_toid) clearTimeout(actb_toid);
		}
	}
	function actb_keypress(){
		return !actb_caretmove;
	}
	
	function actb_checkkey(evt){
		if (!evt) evt = event;
		a = evt.keyCode;
		caret_pos_start = getCaretStart(actb_curr);
		actb_caretmove = 0;
		switch (a){
			case 38:
				actb_goup();
				actb_caretmove = 1;
				return false;
				break;
			case 40:
				actb_godown();
				actb_caretmove = 1;
				return false;
				break;
			case 9:
				actb_penter();
				actb_caretmove = 0;
				return true;
				break;				
			case 13:
				actb_penter();
				actb_caretmove = 1;
				return false;
				break;
			default:
				setTimeout(function(){actb_tocomplete(a)},50);
				break;
		}
	}

	function actb_tocomplete(kc){
		if (kc == 38 || kc == 40 || kc == 13) return;
		var i;
		if (actb_display){ 
			var word = 0;
			var c = 0;
			for (var i=0;i<=actb_keywords.length;i++){
				if (actb_bool[i]) c++;
				if (c == actb_pos){
					word = i;
					break;
				}
			}
			actb_pre = word;
		}else{ actb_pre = -1};
		
		if (actb_curr.value == ''){
			actb_mouse_on_list = 0;
			actb_removedisp();
			return;
		}
		if (actb_delimiter.length > 0){
			caret_pos_start = getCaretStart(actb_curr);
			caret_pos_end = getCaretEnd(actb_curr);
			
			delim_split = '';
			for (i=0;i<actb_delimiter.length;i++){
				delim_split += actb_delimiter[i];
			}
			delim_split = delim_split.addslashes();
			delim_split_rx = new RegExp("(["+delim_split+"])");
			c = 0;
			actb_delimwords = new Array();
			actb_delimwords[0] = '';
			for (i=0,j=actb_curr.value.length;i<actb_curr.value.length;i++,j--){
				if (actb_curr.value.substr(i,j).search(delim_split_rx) == 0){
					ma = actb_curr.value.substr(i,j).match(delim_split_rx);
					actb_delimchar[c] = ma[1];
					c++;
					actb_delimwords[c] = '';
				}else{
					actb_delimwords[c] += actb_curr.value.charAt(i);
				}
			}

			var l = 0;
			actb_cdelimword = -1;
			for (i=0;i<actb_delimwords.length;i++){
				if (caret_pos_end >= l && caret_pos_end <= l + actb_delimwords[i].length){
					actb_cdelimword = i;
				}
				l+=actb_delimwords[i].length + 1;
			}
			var t = actb_delimwords[actb_cdelimword].addslashes().trim();
		}else{
			var t = actb_curr.value.addslashes();
		}
		if (actb_firstText){
			var re = new RegExp("^" + t, "i");
		}else{
			var re = new RegExp(t, "i");
		}
		
		actb_total = 0;
		actb_tomake = false;
		actb_kwcount = 0;
		for (i=0;i<actb_keywords.length;i++){
			actb_bool[i] = false;
			if (re.test(actb_keywords[i])){
				actb_total++;
				actb_bool[i] = true;
				actb_kwcount++;
				if (actb_pre == i) actb_tomake = true;
			}
		}
		if (actb_toid) clearTimeout(actb_toid);
		if (actb_timeOut > 0) actb_toid = setTimeout(function(){actb_mouse_on_list = 0;actb_removedisp();},actb_timeOut);
		actb_generate();
	}
}