var ajax = {
	_objPool: [],
	_getInstance: function () {
		for (var i = 0; i < this._objPool.length; i ++) {
			if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4) return this._objPool[i];
		}
		this._objPool[this._objPool.length] = this._createObj();
		return this._objPool[this._objPool.length - 1];
	},
	_createObj: function () {
		if (window.XMLHttpRequest) var objXMLHttp = new XMLHttpRequest();
		else if (window.ActiveXObject) var objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
		return objXMLHttp;
	},
	send: function (url, callback) {
		var objXMLHttp = this._getInstance();
		with(objXMLHttp) {
			try {
				if (url.indexOf("?") > -1)  url += "&randnum=" + Math.random();
				else url += "?randnum=" + Math.random();
				open('GET', url, true);
				send('');
				onreadystatechange = function () {
					if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304)) {
						if(callback=='' || callback==null) new JSON(objXMLHttp);
						else callback(objXMLHttp);
					}
				}
			} catch(e) {
				alert(e);
			}
		}
	}
};
function combo(p) {
	
	var callback = p.callback ? p.callback : false;	
	//create text input
	var inp = document.createElement('input');
	if(p.disabled == 'yes'){inp.disabled = true;}
	inp.value = p.defaultValue ? p.defaultValue : '';
	inp.name = p.id;
	inp.id = p.id;
	inp.type = 'text';
	inp.autocomplete ='OFF'; //disable the browser feature of remembering.
	inp.onclick = function(){}
	if(p.selectWidth){
		inp.style.width = p.selectWidth;
	}
	//alert(p.parent);
	document.getElementById(p.parent).appendChild(inp);
	
	//create checkbox 
	var check = document.createElement('input');
	check.type = 'checkbox';
	check.name = 'txtchk';
	check.id = 'txtchk';
	check.className = 'transparent';
	document.getElementById(p.parent).appendChild(check);
	
	//create frame
	var optionvalue = p.list ? p.list : [];
	var x = inp.offsetLeft;	
    var y = inp.offsetTop + inp.offsetHeight;
	var d = document.createElement('div');	
	document.body.appendChild(d);
	d.style.width = p.selectWidth + 'px';
	d.style.zIndex = 10000;
	d.className = 'frame';
	d.style.position = 'absolute';
	d.style.display = 'none';
	var url = p.url ? p.url : false;
	
	inp.onkeyup = function(event) {
		var e = event ? event : window.event;
		if(e.keyCode==40) setSelectedSpan(1);
		else if(e.keyCode==38) setSelectedSpan(0);
		else if(e.keyCode==13) select();
		else {
			if(escape(inp.value) == ""){
				document.getElementById(p.vId).value = p.firstValue ? p.firstValue : '';
				if(callback) callback();
				clean();
			}else{
				sendurl = url + escape(inp.value);
				if(typeof p.ext=='object') {
					for(var i in p.ext) {
						if(p.ext[i]=='') {
							sendurl += '&'+i+'='+ escape(document.getElementById(i).value);
						} else if(p.ext[i]=='checked') {
							if(document.getElementById(i).checked) {
								sendurl += '&'+i+'='+document.getElementById(i).value;
							}
						}
					}
				}
				if(check.checked == true){
					sendurl = sendurl + "&check=true";
				}
				if(sendurl) {
					ajax.send(sendurl, setA);
					clean();
				} else {
					clean();
					search();
				}
			}
		}
	}

	inp.onblur = function() {
		var selected_index = document.getElementById(p.vId).selectedIndex;
		if(selected_index>=0){
			var selected_text = document.getElementById(p.vId).options[selected_index].text;
			inp.value = document.getElementById(p.vId).value == ""?"":selected_text;
		}
		clean();
	}
	function setA(s) {
		optionvalue = eval('('+ s.responseText +')');
		if(optionvalue['num']==0) optionvalue = [];
		else search();
	}
	function search() {
		r = getAbsolutePos(inp);
      	d.style.left = r.x + 1 + "px";
      	d.style.top = r.y + 2 + inp.offsetHeight; + "px";
		for(i in optionvalue) {
			var c = document.createElement('div');
			d.appendChild(c);
			c.innerHTML = optionvalue[i];
			c.value = i;
			c.className = 'out';
			c.onmousedown = function() {
				inp.value = this.innerHTML;
				document.getElementById(p.vId).value = this.value;
				if(callback) callback();
			}
			c.onmouseover = highlightResult;
			c.onmouseout = unhighlightResult;
		}
		if(d.childNodes.length>0) {
			d.style.display = 'block';
			d.childNodes[0].className = 'over';
		}
	}
	getAbsolutePos = function(el) {
		var SL = 0, ST = 0;
		var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
		if (el.offsetParent) {
			var tmp = this.getAbsolutePos(el.offsetParent);
			r.x += tmp.x;
			r.y += tmp.y;
		}
		return r;
	}
	function highlightResult()
	{
	  _highlightResult(this);
	}
	
	function _highlightResult(item)
	{
	  item.className="over";
	}
	
	function unhighlightResult()
	{
	  _unhighlightResult(this);
	}
	
	function _unhighlightResult(item)
	{
	  item.className="out";
	}
	
	function setSelectedSpan(v) {
		var nums = d.childNodes.length;
		for(var i=0; i<nums; i++) {
			if(d.childNodes[i].className == 'over') {
				d.childNodes[i].className = 'out';
				if(v==1) var j = i + 1 == nums ? 0 : i+1;
				else var j = i - 1 < 0 ? nums-1 : i-1;
				d.childNodes[j].className = 'over';
				return;
			}
		}
	}
	function select() {
		for(var i=0; i<d.childNodes.length; i++) {
			if(d.childNodes[i].className == 'over') {
				document.getElementById(p.vId).value = d.childNodes[i].value;
				var selected_index = document.getElementById(p.vId).selectedIndex;
				var selected_text = document.getElementById(p.vId).options[selected_index].text;
				inp.value = document.getElementById(p.vId).value == ""?"":selected_text;
				clean();
				if(callback) callback();
				return;
			}
		}
	}
	function clean() {
		for(var i=d.childNodes.length-1; i>=0; i--) {
			c = d.childNodes[i];
			d.removeChild(c);
		}
		d.style.display = 'none';
	}
}
function changedropdownlist(dropdownlist_id,ajax_id,dropdownlist_type,txtkey,vId) {
	if(document.getElementById(dropdownlist_id).style.display == 'none') {
		document.getElementById(dropdownlist_id).style.display = 'block';
		document.getElementById(ajax_id).style.display = 'none';
		document.getElementById(dropdownlist_type).value = "SUGGEST";
	} else {
		document.getElementById(dropdownlist_id).style.display = 'none';
		document.getElementById(ajax_id).style.display = 'block';
		document.getElementById(dropdownlist_type).value = "DROPDOWNLIST";
	}
	if(txtkey != "undefined" && vId != "undefined"){
		txtkeyObj = document.getElementById(txtkey);
		vIdObj = document.getElementById(vId);
		if(vIdObj.type == "select-one"){
			var selected_index = vIdObj.selectedIndex;
			txtkeyObj.value = vIdObj.value == ""?"":vIdObj.options[selected_index].text;
		}
	}
}
