/*
 * hacks from google suggest
 * this is the multi-inputfiled version
 * without the unknown iframe
 * Shang Wenbin<wbshang>
 */

// Input 0
var submit_type=""; //what is this???
var stopSuggest=false;

/**
 * inputField_input_value changes its value when we input something in inputField
 *  or when we press the up or down arrow, the value of inputField_input_value is changed to 
 *  the old value + the selectionRange, then inputField_input_value_backup2 is used to restore 
 *  the old value
 * inputField_input_value_backup refershed its value when do HttpRequest
 * inputField_input_value_backup2 refershed its value when do_suggest 
 */
var inputField_input_value=""; 
var inputField_input_value_backup="";
var inputField_input_value_backup2="";

var suggest_list_current_index=-1;
var suggest_list_current_item=null;
var suggest_length=-1;
var suggest_items=null;
var suggest_length2=5;
var document_title="";
var form=null;
var inputField=null;
var completeDiv=null;
var fn=null;
var lang=null;
var press_arrow_up_down=false;
var focus_back_from_arrow=false;
var resultCache=new Object();
var left_right_border_width=1; var top_bottom_border_width=1;

var isNotCJK=null; var va=false; var isCJK=false; var is_cjk=false;

var pressedKeycode=-1;
var inputedKeycode="";
var last_req_time=(new Date()).getTime();
var has_reqobj=false;
var reqObj=null;
var query_uri=null;var baseuri=null;
//var completionFrame=null;
var inputField_value=null;
var Ua=false;
var suggest_item_layout=60;
var notShowSuggestInfo=null;
var interval_weighing=0;
var hb=null;var ma=null;var oa=null;
var Ea=false;
var inputField_is_focus=false;

var inittedFields = new Array();
var attrName="";
var num=5;
var isIE=navigator.userAgent.toLowerCase().indexOf("msie")!=-1; 

InstallAC=function(uri,frm,language,notShowDetail,sub_type,ufn) {
	baseuri = uri;
	form=frm;
	//initalize onfocus handler for all text fields
	for(var i=0; i<form.elements.length; i++) {
		var e=form.elements[i];
		if(e.type=='text') {
			if(useGoogleSuggest)
				e.onfocus=onfocusHandler;
			else {
				e.onblur=function(e) {
					form_text_input_validate(this); 
				};
			}
		}
	}
	//do not use Google Suggest, this can be set in preferences, tts#1117
	if(!useGoogleSuggest)
		return false;

	//query_uri=baseuri+"?hl="+lang;
	query_uri=baseuri+"?menuaction=contactmgr.ui.suggest_values";
	var cjk="zh|zh-CN|zh-TW|ja|ko|";
	if(!language||language.length<1) 
		language="en";
	lang=encodeuri(language);
	if(cjk.indexOf(lang+"|")==-1) { //not in CJK
		isNotCJK=true;isCJK=false;va=false;is_cjk=false;
	} else {
		isNotCJK=false;isCJK=true;is_cjk=true;
		if(lang.indexOf("zh")==0) 
			va=false;
	}
	if(!notShowDetail) 
		notShowDetail=false;
	notShowSuggestInfo=notShowDetail;
	if(!sub_type) 
		sub_type="query";
	submit_type=sub_type;
	fn=ufn;
	init();
};

function isInitted(field) {
	for(var i=0; i<inittedFields.length; i++)
		if(field == inittedFields[i])
			return true;
	return false;
}

//added by Shang Wenbin to init a input field handler
function initField(fld) {
	inputField=fld;
	attrName=inputField.name;
	if(inittedFields.length==0)
		set_css_rules(completeDiv);

	if(!isInitted(inputField)) {
		inittedFields[inittedFields.length] = inputField;
		form.onsubmit=onsubmitHandlerWrap;

		inputField.autocomplete="off";
		inputField.onblur=onblurHandler;
		//inputField.onfocus=onfocusHandler;
		if(inputField.createTextRange) //seems only supported by M$IE
			inputField.onkeyup=new Function("return onkeyupHandler(event); ");
		else 
			inputField.onkeyup=onkeyupHandler;
		inputField.onsubmit=onsubmitHandlerWrap;

		inputField_input_value=inputField.value;
		inputField_input_value_backup=inputField_input_value;
		if(is_cjk) { //if in CJK
			setTimeout("process_cjk()",10);
			if(inputField.attachEvent) { //only IE support attachEvent
				inputField.attachEvent("onpropertychange",onpropertychangeHandler)
			}
		}
	}
	set_completeDiv_position();
}

function init() {
	if(get_reqObj()) {
		has_reqobj=true;
	} else {
		has_reqobj=false;
	}
	if(!has_reqobj) {
		set_cookie("qu","",0,baseuri,null,null);
	}

	/*
	form.onsubmit=onsubmitHandlerWrap;
	//alert(inputField.autocomplete);

	inputField.autocomplete="off";
	inputField.onblur=onblurHandler;
	inputField.onfocus=onfocusHandler;
	//alert(inputField.createTextRange);
	if(inputField.createTextRange) //seems only supported by M$IE
		inputField.onkeyup=new Function("return onkeyupHandler(event); ");
	else 
		inputField.onkeyup=onkeyupHandler;
	inputField.onsubmit=onsubmitHandlerWrap;

	inputField_input_value=inputField.value;
	inputField_input_value_backup=inputField_input_value;
	*/

	left_right_border_width=1;
	top_bottom_border_width=1;

	//create the complete Div element
	completeDiv=document.createElement("DIV");
	completeDiv.id="completeDiv";
	completeDiv.style.borderRight="black "+left_right_border_width+"px solid";
	completeDiv.style.borderLeft="black "+left_right_border_width+"px solid";
	completeDiv.style.borderTop="black "+top_bottom_border_width+"px solid";
	completeDiv.style.borderBottom="black "+top_bottom_border_width+"px solid";
	completeDiv.style.zIndex="1";
	completeDiv.style.paddingRight="0px";
	completeDiv.style.paddingLeft="0px";
	completeDiv.style.paddingTop="0px";
	completeDiv.style.paddingBottom="0px";
	completeDiv.style.visibility="hidden";
	completeDiv.style.position="absolute";
	completeDiv.style.backgroundColor="white";
	//set_completeDiv_position();
	document.body.appendChild(completeDiv);
	//cacheResults("",new Array(),new Array());
	//set_css_rules(completeDiv);

	//create the iframe
	/* currently I don't know what's the use of creating a iframe here and only hooking
	 * completeDiv on it, I can't find any further use of this iframe
	 * hope some day I can understand this
	 * Shang Wenbin<wbshang>
	 */
	/*
	//disuse completionFrame
	var t=document.createElement("DIV");
	t.style.visibility="hidden";
	t.style.position="absolute";
	t.style.left="-10000px";
	t.style.top="-10000px";
	t.style.width="0px";
	t.style.height="0px";
	var L=document.createElement("IFRAME");
	L.completeDiv=completeDiv;
	L.name="completionFrame";
	L.id="completionFrame";
	//L.src=query_uri;
	//L.src="http://www.google.com/complete/search?hl=en";
	L.src="http://test/trick.html";
	t.appendChild(L);
	document.body.appendChild(t);

	if(frames && (frames["completionFrame"] && frames["completionFrame"].frameElement)) 
		completionFrame=frames["completionFrame"].frameElement;
	else 
		completionFrame=document.getElementById("completionFrame");
	*/
	if(submit_type=="url") {
		resize_inputField();
		set_completeDiv_position()
	}
	window.onresize=onresizeHandler;
	//onkeydownHandler only process the Backspace key
	document.onkeydown=onkeydownHandler;
	emulate_keydown_event_on_IE();
	/*
	if(is_cjk) { //if in CJK
		setTimeout("process_cjk()",10);
		if(inputField.attachEvent) { //only IE support attachEvent
			inputField.attachEvent("onpropertychange",onpropertychangeHandler)
		}
	}
	*/
}

function arrow_up_down() {
	press_arrow_up_down=true;
	focus_back_from_arrow=true;
	inputField.blur();
	setTimeout("focus_inputField();",10);
	return;
}

function emulate_keydown_event_on_IE() {
	//only IE support createEventObject
	if(document.createEventObject) {
		var Ka=document.createEventObject();
		Ka.ctrlKey=true;
		Ka.keyCode=70;
		document.fireEvent("onkeydown",Ka);
	}
}

function onkeydownHandler(e) {
	if(!inputField)
		return true;
	if(!e && window.event) 
		e=window.event;
	if(e) 
		pressedKeycode=e.keyCode;
	if(e && e.keyCode==8) {  //8:Backspace;
		if(isNotCJK && (inputField.createTextRange && (e.srcElement==inputField && (get_selection_start(inputField)==0 && get_selection_length(inputField)==0)))) {
			cancel_selection(inputField);
			e.cancelBubble=true;
			e.returnValue=false;
			return false;
		}
	}
	//from here we handle the Enter key, wbshang
	else if(e && e.keyCode==13) {  //press Enter
		if(isIE && e.srcElement==inputField) {
			cancel_selection(inputField);
			e.cancelBubble=true;
			e.returnValue=false;
			inputField.blur();
			return false;
		}
		else if(e.target==inputField) {
			cancel_selection(inputField);
			e.stopPropagation();
			e.preventDefault();
			inputField.blur();
		}
	}
}

function onresizeHandler() { 
	if(submit_type=="url") {
		resize_inputField();
	}
	set_completeDiv_position();
}

function set_completeDiv_position() {
	if(completeDiv && inputField) {
		completeDiv.style.left=get_offsetLeft(inputField)+"px";
		completeDiv.style.top=get_offsetTop(inputField)+inputField.offsetHeight-1+"px";
		completeDiv.style.width=calculate_completeDiv_width()+"px"
	}
}

function calculate_completeDiv_width() {
	if(navigator && navigator.userAgent.toLowerCase().indexOf("msie")==-1) 
		return inputField.offsetWidth-left_right_border_width*2;
	else 
		return inputField.offsetWidth;
}

function onfocusHandler(e) { 
	if(!focus_back_from_arrow)
		initField(this);
	inputField_is_focus=true;
	focus_back_from_arrow=false;
}

function onblurHandler(e) {
	inputField_is_focus=false;
	if(!press_arrow_up_down) {
		//here add your own blur Handler
		//the following line is only used for contactmgr, added by wbshang
		form_text_input_validate(this); 

		hide_completeDiv();
		if(pressedKeycode==9) {  //Escape??
			pressedKeycode=-1;
		}
	}
	press_arrow_up_down=false;
}

onkeyupHandler=function(e) {
	if(!Ea) {
		Ea=true;
	}
	inputedKeycode=e.keyCode;
	inputField_value=inputField.value;
	process_keyup();
};

focus_inputField=function(){ 
	inputField.focus() 
};

function replace_linebreak(str) {
	for(var c=0,wa="",Ib="\n\r";c<str.length;c++)
		if(Ib.indexOf(str.charAt(c))==-1) 
			wa+=str.charAt(c);
		else 
			wa+=" ";
	return wa;
}

function get_value_of_cssclass(suggest_item,cssclassname) {
	var spans=suggest_item.getElementsByTagName("span");
	if(spans) {
		for(var c=0;c<spans.length;++c) {
			if(spans[c].className==cssclassname) {
				var s_value=spans[c].innerHTML;
				if(s_value=="&nbsp;")
					return "";
				else 
					return replace_linebreak(s_value);
			}
		}
	}
	else {
		return "";
	}
}

function get_suggest_value(s_item) {
	if(!s_item) 
		return null;
	return get_value_of_cssclass(s_item,"cAutoComplete");
}

//to rename
function get_suggest_value_info(s_item) {
	if(!s_item) 
		return null;
	return get_value_of_cssclass(s_item,"dAutoComplete");
}

function hide_completeDiv() {
	document.getElementById("completeDiv").style.visibility="hidden";
}

function show_completeDiv() {
	document.getElementById("completeDiv").style.visibility="visible";
	set_completeDiv_position();
}

function cacheResults(is,cs,ds,pr) {
	if(typeof resultCache[attrName] == 'undefined')
		resultCache[attrName] = new Object();
	resultCache[attrName][is]=new Array(cs,ds,pr);
}

//// We get the following javascript code dynamically returned from google:
// sendRPCDone(frameElement, "fast bug", new Array("fast bug track", "fast bugs", "fast bug", "fast bugtrack"), new Array("793,000 results", "2,040,000 results", "6,000,000 results", "7,910 results"), new Array("")); 
/**
 * This function is used to draw completeDiv
 * This function has been modified to disuse completionFrame, wbshang
 * is: inputString
 * cs: completeStrings
 * ds: displayStrings
 * pr: prefixStrings
 */
sendRPCDone=function(is,cs,ds,pr) {
	if(interval_weighing>0) 
		interval_weighing--;
	cacheResults(is,cs,ds,pr);
	//completeDiv.completeStrings=cs;
	//completeDiv.displayStrings=ds;
	completeDiv.prefixStrings=pr;
	displaySuggestedList(completeDiv,cs,ds);
	do_suggest(completeDiv,get_suggest_value);
	if(suggest_length2>0) 
		completeDiv.height=16*suggest_length2+4;
	else 
		hide_completeDiv();
};

function process_keyup() {
	if(inputedKeycode==40 || inputedKeycode==38) //38:Up Arrow; 40:Down Arrow
		arrow_up_down();
	var selection_length=get_selection_length(inputField); 
	var selection_start=get_selection_start(inputField);
	var iF_input_value=inputField.value;
	if(isNotCJK && inputedKeycode!=0) {
		if(selection_length>0 && selection_start!=-1) 
			iF_input_value=iF_input_value.substring(0,selection_start);
		if(inputedKeycode==13 || inputedKeycode==3) { //13:Enter; 3:???
			cancel_selection(inputField);
			hide_completeDiv();
		} else {
			if(inputField.value!=iF_input_value)
				set_inputField_value(iF_input_value);
		}
	}
	inputField_input_value=iF_input_value;
	if(check_key(inputedKeycode) && inputedKeycode!=0) 
		do_suggest(completeDiv,get_suggest_value);
}

function onsubmitHandlerWrap() { 
	return onsubmitHandler(submit_type);
}

function onsubmitHandler(type) {
	stopSuggest=true;
	if(!has_reqobj) {
		set_cookie("qu","",0,baseuri,null,null)
	}
	hide_completeDiv();
	if(type=="url") {
		var Q="";
		if(suggest_list_current_index!=-1 && suggest_list_current_item) 
			Q=get_suggest_value(suggest_list_current_item);
		if(Q=="") 
			Q=inputField.value;
		if(document_title=="") 
			document.title=Q;
		else 
			document.title=document_title;
		var dc="window.frames['"+fn+"'].location = \""+Q+'";';
		setTimeout(dc,10);
		return false
	} 
	else if(type=="query") {
		form.submit();
		return true;
	}
}

newwin=function() { 
	window.open(inputField.value);
	hide_completeDiv();
	return false;
};

process_cjk=function(e) {
	if(is_cjk) {
		if(inputField_is_focus) 
			eb();
		var db=inputField.value;
		if(db!=inputField_value) { 
			inputedKeycode=0;
			process_keyup();
		}
		inputField_value=db;
		setTimeout("process_cjk()",10)
	}
};

function encodeuri(Va) {
	if(encodeURIComponent)
		return encodeURIComponent(Va);
	if(escape)
		return escape(Va)
}

function calculate_Interval(Ub) {
	var I=100;
	for(var p=1;p<=(Ub-2)/2;p++) {
		I*=2;
	}
	I+=50;
	return I;
}

function getCacheResult(is) {
	if(resultCache[attrName])
		return resultCache[attrName][is];
	return false;
}

check_input_periodic=function() {
	if(inputField_input_value && inputField_input_value_backup!=inputField_input_value) {
		if(!stopSuggest) {
			var query_str=encodeuri(inputField_input_value);
			var ta=getCacheResult(inputField_input_value);
			if(ta) {
				last_req_time=-1;
				//sendRPCDone(completionFrame,inputField_input_value,ta[0],ta[1],completionFrame.completeDiv.prefixStrings);
				sendRPCDone(inputField_input_value,ta[0],ta[1],ta[2]);
			} else {
				interval_weighing++;
				last_req_time=(new Date()).getTime();
				if(has_reqobj) 
					do_httpReq(query_str);
				else {
					set_cookie("qu",query_str,null,baseuri,null,null);
					//frames["completionFrame"].document.location.reload(true);
				}
			}
			inputField.focus();
		}
		stopSuggest=false;
	}
	inputField_input_value_backup=inputField_input_value;
	setTimeout("check_input_periodic()",calculate_Interval(interval_weighing));
	return true;
};

setTimeout("check_input_periodic()",10);

//onmousedown: submit this query
var sug_onmousedownHandler=function() {
	set_inputField_value(get_suggest_value(this));
	document_title=get_suggest_value_info(this);
	//stopSuggest=true;
	//onsubmitHandlerWrap();
};

var sug_onmouseoverHandler=function() {
	if(suggest_list_current_item) 
		adjust_css_style(suggest_list_current_item,"aAutoComplete");
	adjust_css_style(this,"bAutoComplete")
};

var sug_onmouseoutHandler=function() {
	adjust_css_style(this,"aAutoComplete")
};

function change_current_suggest_item(item_index) {
	//restore the inputField_input_value to prevent to do HttpRequest because when the
	//second time we press up or down arrow the value of inputField_input_value is changed
	inputField_input_value=inputField_input_value_backup2;
	set_inputField_value(inputField_input_value_backup2);
	document_title=inputField_input_value_backup2;
	if(!suggest_items || suggest_length<=0) 
		return;
	show_completeDiv();
	if(item_index>=suggest_length) {
		item_index=suggest_length-1
	}
	if(suggest_list_current_index!=-1 && item_index!=suggest_list_current_index) 
		adjust_css_style(suggest_list_current_item,"aAutoComplete");
	if(item_index<0) {
		suggest_list_current_index=-1;
		inputField.focus();
		return;
	}
	suggest_list_current_index=item_index;
	suggest_list_current_item=suggest_items.item(item_index);
	adjust_css_style(suggest_list_current_item,"bAutoComplete");
	//inputField_input_value=inputField_input_value_backup2;
	document_title=get_suggest_value_info(suggest_list_current_item);
	set_inputField_value(get_suggest_value(suggest_list_current_item))
}

function check_key(pa) {
	if(pa==40) { //is Down Arrow
		change_current_suggest_item(suggest_list_current_index+1);
		return false;
	}
	else if(pa==38) {  //is Up Arrow
		change_current_suggest_item(suggest_list_current_index-1);
		return false;
	}
	else if(pa==13||pa==3) {  //13:Enter; 3:???
		return false;
	}
	return true;
}

/*
 * param ele the comleteDiv element
 * param func_get_suggest_value a function to get the suggest value
 * when user input a new character, this function will find the first matching item from 
 * the old suggested list and  marked it as selcted
 */
function do_suggest(ele,func_get_suggest_value) {
	var f=inputField;
	var flag=false;
	suggest_list_current_index=-1;
	var divs=ele.getElementsByTagName("div");
	var div_len=divs.length;
	suggest_length=div_len;
	suggest_items=divs;
	suggest_length2=div_len;
	inputField_input_value_backup2=inputField_input_value;
	if(inputField_input_value==""||div_len==0) { 
		hide_completeDiv() 
	}
	else {
		show_completeDiv();
	}
	if(inputField_input_value.length>0) {
		var p;
		for(var c=0;c<div_len;c++) {
			//refer to http://linuxjunkies.in/ptopic470.html
			//the use of ele.prefixStrings
			// when compare the inputed value with the suggested values, the prefix strings in ele.prefixStrings is ignored
			// in our case, prefixStrings is always a empty string: [""]
			for(p=0;p<ele.prefixStrings.length;p++) {
				var cb=ele.prefixStrings[p]+inputField_input_value;
				if(va || (!isCJK && func_get_suggest_value(divs.item(c)).toUpperCase().indexOf(cb.toUpperCase())==0 || isCJK && (c==0&&func_get_suggest_value(divs.item(c)).toUpperCase()==cb.toUpperCase()))) {
					flag=true;
					break;
				}
			}
			if(flag)
				break;
		}
	}
	if(flag) 
		suggest_list_current_index=c;
	for(var c=0;c<div_len;c++) 
		adjust_css_style(divs.item(c),"aAutoComplete");
	if(flag) {
		suggest_list_current_item=divs.item(suggest_list_current_index);
		document_title=get_suggest_value_info(suggest_list_current_item)
	} else {
		document_title=inputField_input_value;
		suggest_list_current_index=-1;
		suggest_list_current_item=null;
	}
	var mb=false;
	switch(inputedKeycode) {
		case 8:   //Backspace
		case 33:  //Page Up
		case 34:  //Page Down
		case 35:  //End
		case 36:  //Home
		case 37:  //Left Arrow
		case 39:  //Right Arrow
		case 45:  //???
		case 46:  //Delete
			mb=true;
			break;
		default:
			break
	}
	if(!mb && suggest_list_current_item) {
		var iF_input_value=inputField_input_value;
		adjust_css_style(suggest_list_current_item,"bAutoComplete");
		var A;
		if(flag) 
			A=func_get_suggest_value(suggest_list_current_item).substr(ele.prefixStrings[p].length);
		else 
			A=iF_input_value;
		if(A!=f.value) {
			//here we set the selectionRange
			if(f.value!=inputField_input_value) //when will this condition appear???
				return;
			if(isNotCJK) {
				if(f.createTextRange||f.setSelectionRange) 
					set_inputField_value(A);
				if(f.createTextRange) {
					var u=f.createTextRange();
					u.moveStart("character",iF_input_value.length);
					u.select()
				}
				else if(f.setSelectionRange) {
					f.setSelectionRange(iF_input_value.length,f.value.length)
				}
			}
		}
	}
	else {
		suggest_list_current_index=-1;
		document_title=inputField_input_value;
	}
}

function get_offsetLeft(ele) { 
	return calculate_offset(ele,"offsetLeft");
}

function get_offsetTop(s) { 
	return calculate_offset(s,"offsetTop");
}

function calculate_offset(ele,attr) {
	var offset=0;
	while(ele) {
		offset+=ele[attr];
		ele=ele.offsetParent;
	}
	return offset;
}

function set_cookie(name,value,expire,path,domain,secure) {
	var cookie_value=name+"="+value+(expire?"; expires="+expire.toGMTString():"")+(path?"; path="+path:"")+(domain?"; domain="+domain:"")+(secure?"; secure":"");
	document.cookie=cookie_value;
}

function resize_inputField() { 
	var Ga=document.body.scrollWidth-220;
	Ga=0.73*Ga;
	inputField.size=Math.floor(Ga/6.18)
}

//get the length of selected text
//for more details, see http://www.webreference.com/programming/javascript/ncz/
function get_selection_length(o) {
	var M=-1;
	if(o.createTextRange) { //is IE
		var ha=document.selection.createRange().duplicate();
		M=ha.text.length;
	}
	else if(o.setSelectionRange) {  //is Mozilla
		M=o.selectionEnd-o.selectionStart;
	}
	return M;
}

function get_selection_start(o) {
	var w=0;
	//more details about the selection object on IE: 
	// http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/obj_selection.asp
	//more details about the TextRange object on IE: 
	// http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/obj_textrange.asp
	if(o.createTextRange) {
		var ha=document.selection.createRange().duplicate();
		ha.moveEnd("textedit",1);
		w=o.value.length-ha.text.length;
	}
	//about the Textbox object on Mozilla:
	// http://xulplanet.com/references/elemref/ref_textboxMozillaAutoComplete.html
	else if(o.setSelectionRange) 
		w=o.selectionStart;
	else
		w=-1;
	return w;
}

function cancel_selection(ele){
	if(ele.createTextRange){
		var u=ele.createTextRange();
		u.moveStart("character",ele.value.length);
		u.select();
	}
	else if(ele.setSelectionRange){
		ele.setSelectionRange(ele.value.length,ele.value.length);
	}
}

/*
 * d: the element to adjust
 * cssclassname: the css class apply to this element
 */
function adjust_css_style(d,cssclassname){
	calculate_suggest_item_layout();
	d.className=cssclassname;
	if(Ua)
		return;
	switch(cssclassname.charAt(0)){
		case "m":
			d.style.fontSize="13px";
			d.style.fontFamily="arial,sans-serif";
			d.style.wordWrap="break-word";
			break;
		case "l":
			d.style.display="block";
			d.style.paddingLeft="3px";
			d.style.paddingRight="3px";
			d.style.height="16px";
			d.style.overflow="hidden";
			break;
		case "a":
			d.style.backgroundColor="white";
			d.style.color="black";
			if(d.displaySpan){
				d.displaySpan.style.color="green"
			}
			break;
		case "b":
			d.style.backgroundColor="#3366cc";
			d.style.color="white";
			if(d.displaySpan){
				d.displaySpan.style.color="white"
			}
			break;
		case "c":
			d.style.width=suggest_item_layout+"%";
			d.style.cssFloat="left";
			//to prevent line break, wbshang
			//d.style.wordWrap="normal";
			d.style.whiteSpace="nowrap";
			d.style.overflow="hidden";
			break;
		case "d":
			d.style.cssFloat="right";
			d.style.width=100-suggest_item_layout+"%";
			if(submit_type=="query"){
				d.style.fontSize="10px";
				d.style.textAlign="right";
				d.style.color="green";
				d.style.paddingTop="3px"
			}
			else{
				d.style.color="#696969"
			}
			break
	}
}

function calculate_suggest_item_layout() {
	suggest_item_layout=65;
	if(submit_type=="query") {
		/*
		var bb=calculate_completeDiv_width();
		suggest_item_layout=(bb-110)/bb*100;
		*/
		//I use 87 here, wbshang
		suggest_item_layout=87
	} else
		suggest_item_layout=65
	if(notShowSuggestInfo)
		suggest_item_layout=99.99
}

function set_css_rules(ele){
	calculate_suggest_item_layout();
	var ec="font-size: 13px; font-family: arial,sans-serif; word-wrap:break-word;";
	var gc="display: block; padding-left: 3px; padding-right: 3px; height: 16px; overflow: hidden;";
	var mc="background-color: white;";
	var Bb="background-color: #3366cc; color: white ! important;";
	var Eb="display: block; margin-left: 0%; width: "+suggest_item_layout+"%; float: left;";
	var Ra="display: block; margin-left: "+suggest_item_layout+"%;";
	if(submit_type=="query")
		Ra+="font-size: 10px; text-align: right; color: green; padding-top: 3px;"
	else
		Ra+="color: #696969;"
	insert_css_rule(".mAutoComplete",ec);
	insert_css_rule(".lAutoComplete",gc);
	insert_css_rule(".aAutoComplete *",mc);
	insert_css_rule(".bAutoComplete *",Bb);
	insert_css_rule(".cAutoComplete",Eb);
	insert_css_rule(".dAutoComplete",Ra);

	adjust_css_style(ele,"mAutoComplete")
}

function insert_css_rule(name,rule){
	if(Ua){
		var J=document.styleSheets[0];
		if(J.addRule){
			J.addRule(name,rule)
		}else if(J.insertRule){
			J.insertRule(name+" { "+rule+" }",J.cssRules.length)
		}
	}
}

function displaySuggestedList(ele,cs,ds) {
	while(ele.childNodes.length>0)
		ele.removeChild(ele.childNodes[0]);
	for(var c=0;c<cs.length;++c){
		var v=document.createElement("DIV");
		adjust_css_style(v,"aAutoComplete");
		v.onmousedown=sug_onmousedownHandler;
		v.onmouseover=sug_onmouseoverHandler;
		v.onmouseout=sug_onmouseoutHandler;
		var span=document.createElement("SPAN");
		adjust_css_style(span,"lAutoComplete");
		var span1=document.createElement("SPAN");
		//span1.innerHTML=cs[c];
		span1.appendChild(document.createTextNode(cs[c]));
		adjust_css_style(span1,"cAutoComplete");
		var span2=document.createElement("SPAN");
		adjust_css_style(span2,"dAutoComplete");
		v.displaySpan=span2;
		if(!notShowSuggestInfo) 
			span2.innerHTML=ds[c];
		span.appendChild(span1);
		span.appendChild(span2);
		v.appendChild(span);
		ele.appendChild(v);
	}
}

function get_reqObj(){
	var C=null;
	try{
		C=new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e){
		try{
			C=new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(sc){
			C=null;
		}
	}
	if(!C && typeof XMLHttpRequest!="undefined") {
		C=new XMLHttpRequest();
	}
	return C;
}


/*
 * This function uses the xmlHttp object to send a message back to google...
 * This is the primary function that dynamically communicates with google.
 * This is the call:
 * http://www.google.com/complete/search?hl=en&js=true&qu=fast%20bug
 * And we get back:
 * sendRPCDone(frameElement, "fast bug", new Array("fast bug track", "fast bugs", "fast bug", "fast bugtrack"), new Array("793,000 results", "2,040,000 results", "6,000,000 results", "7,910 results"), new Array("")); 
 */
function do_httpReq(str){
	//more detail about XMLHttpRequest:
	// http://www-128.ibm.com/developerworks/cn/xml/wa-ajaxintro3/
	if(reqObj && reqObj.readyState!=0){
		reqObj.abort()
	}
	reqObj=get_reqObj();
	if(reqObj){
		//reqObj.open("GET",query_uri+"&js=true&qu="+str,true);
		reqObj.open("GET",query_uri+"&attr_name="+attrName+"&number="+num+"&qu="+str,true);
		reqObj.onreadystatechange=function() {
			if(reqObj.readyState==4 && reqObj.responseText) {
				if(reqObj.status == 200) {
					//alert(reqObj.responseText);
					if(reqObj.responseText.charAt(0)=="<")
						interval_weighing--;
					else
						eval(reqObj.responseText);
				}
			}
		};
		reqObj.send(null);
	}
}

function set_inputField_value(value){
	inputField.value=value;
	inputField_value=value;
}

//used only for IE
function onpropertychangeHandler(h){
	if(!h&&window.event)
		h=window.event;
	if(!Ea && (inputField_is_focus && h.propertyName=="value")){
		if(fc()){
			eb();
			setTimeout("ba("+ma+", "+oa+");",30)
		}
	}
}
//used only for IE
function fc(){
	var ic=inputField.value;
	var La=get_selection_start(inputField);
	var Ja=get_selection_length(inputField);
	return La==ma&&(Ja==oa&&ic==hb)
}

function eb(){
	hb=inputField.value;
	ma=get_selection_start(inputField);
	oa=get_selection_length(inputField);
}

//used only for IE
ba=function(La,Ja){
	if(La==ma && Ja==oa)
		bc();
};

//used only for IE
function bc(){
	arrow_up_down();
	change_current_suggest_item(suggest_list_current_index+1)
}


