AJAXTOKEN=null;
function initRequest() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		isIE = true;
		return new ActiveXObject("Microsoft.XMLHTTP");
	}
}

function doCompletion(url,data,id) {
	if(data instanceof Array ){	
		var tmpStr = "";
		var extraData=data[data.length-1];
		for(i=0;i<data.length;i++ )
			tmpStr+="data"+i+"="+data[i]+"&";
		url=url+'?'+tmpStr.substr(0,(tmpStr.length-1));
	}
	else{
		url=url+'?data='+data;
	} 
	url+="&function="+id;
	var req = initRequest();
		req.onreadystatechange = function() {	
		
			if (req.readyState == 4) {
				if (req.status == 200) {
					if(id.substr(0,13)!="BOTH_INTERNAL")
						ownFunctionAJAX(req.responseText,id);
					else
						internalAJAXFunction(req,id,extraData);
				} else if (req.status == 204){
//					alert("error");
				}
				 else if (req.status == 404){
					 if(id.substr(0,13)!="BOTH_INTERNAL")
						ownFunctionAJAX('error',id);
					else
						internalAJAXFunction('error',id,extraData);
					 }
				else {
					alert("AjaxError: Error Ineserado "+req.status);	
				}
			}
		};
		try{
			req.open("POST", url, true);
			req.send(null);
		}
		catch (e){}
}

function dbExists(tabla,campo,valor) {
	var prefix=".php";
	doCompletion(SystemPath+"servlets/ajaxGeneric"+prefix,[tabla,campo,valor],"BOTH_INTERNAL_EXISTS");	
}
function internalAJAXFunction(val,id,datas) {
	if(typeof(val)=="string"&&val=="error") {
		alert("Error, no se puede conectar con el servlet");
	}
	else{ //alert(val.responseText);
		switch(id){
			case "BOTH_INTERNAL_EXISTS":
				val=val.responseText;
				AJAXTOKEN=val;
				if(window.ownContinue)ownContinue();
				else if(validateStandard(document.forms[1],'error'))
					if(window.ownOnExist) 
						doCompletion(SystemPath+"servlets/ajaxGeneric.php",["usuarios","username",document.forms[1].username.value],"BOTH_INTERNAL_EXISTS2");
					else
						document.forms[1].submit();
				break;
			case "BOTH_INTERNAL_EXISTS2":
				val=val.responseText;
				if(window.ownOnExist)ownOnExist(val);
			case "BOTH_INTERNAL_GETTABLE":
				val=val.responseXML;
				if(datas instanceof Object &&datas.parse2Many!=null)
					datas.parse2Many(val);
				break;
			case "BOTH_INTERNAL_GETITEM":
				val=val.responseXML;
				if(datas instanceof Object&&datas.setXML!=null)
				datas.setXML(val);
				break;	
			
		}
	}
}

//-------------------------------------------------------
// Auto complete foms class, One instance for each from |
//-------------------------------------------------------
function AutoCompleteForm (formu) {
	this.formu=formu;
	this.MANY2N=0;
	this.MANYCOUNTER=0;
	this.XML=false;
	this.startFormCheck = function () {
		var items=this.formu.elements;
		var config=0;
		for(var i=0;i<items.length;i++){
			if(!items[i].name) continue;
			if(items[i].name=="config:table")config++;
			else if(items[i].name=="config:action")config++;
			else if(items[i].name.substr(0,9)=="config:id")config++;
			if(items[i].name.substr(0,9)=="config:id"&&items["config:action"]=="new")items[i].value=0;
		}
		if(config!=3)
			this.inform("Faltan Campos de configuracion!");
		else
			this.requestData();
	}
	
	this.inform = function (mgs){
		alert ("AutoCompleteForm: "+mgs);
	}
		
	this.requestData = function (){
		var items=this.formu.elements;
		var idField;
		var valorField;
		for(var i=0;i<items.length;i++){			
			if(items[i].name&&(items[i].name.substr(0,4)=="O2M:"||items[i].name.substr(0,4)=="M2M")&&items[i].tagName.toLowerCase()=="select" ){
				var tableName=(items[i].name.split(":"))[1];
				this.MANY2N++;
				
				var criteria=(items[i].getAttribute("criteria"))?items[i].getAttribute("criteria"):"";
				var orderBy =(items[i].getAttribute("order"))?items[i].getAttribute("order"):items[i].getAttribute("show");
				doCompletion(SystemPath+"servlets/ajaxGeneric.php",[tableName," "+criteria+" 1=1 order by "+orderBy+" ",this],"BOTH_INTERNAL_GETTABLE");
			}
			if(items[i].name&&items[i].name.substr(0,9)=="config:id"){
				idField=(items[i].name.split(":"))[2];
				valorField=items[i].value;
			}
			
		}
		if(items["config:action"].value=="modify")
				doCompletion(SystemPath+"servlets/ajaxGeneric.php",[items["config:table"].value,idField,valorField,this],"BOTH_INTERNAL_GETITEM");
	}
	this.setXML=function(XMLl) {
		this.XML=XMLl;
		this.checkForContent();
	}
	this.parseContent = function() {
		val=this.XML;
		var items=this.formu.elements;
		for(var i=0;i<items.length;i++){
			if(items[i].tagName.toLowerCase()=="input"||items[i].tagName.toLowerCase()=="select"||items[i].tagName.toLowerCase()=="textarea"){
				switch(items[i].tagName.toLowerCase()){
					case "input":
						switch(items[i].type.toLowerCase()){
							case "text":
								try{
								if(items[i].name.split(":")[0]=="datetime"){
									var datetimeMysql = val.getElementsByTagName(items[i].name.split(":")[1].toUpperCase())[0].firstChild.nodeValue
									datetimeMysql=datetimeMysql.substr(0,10);
									datetimeMysql=datetimeMysql.split("-");
									items[i].value=datetimeMysql[2]+"/"+datetimeMysql[1]+"/"+datetimeMysql[0];
								}
								else{
									if((items[i].name.split(":")[0])!="exclude")							
										items[i].value=val.getElementsByTagName(items[i].name.toUpperCase())[0].firstChild.nodeValue;
									else {
										if(items[i].getAttribute("equals"))items[i].value=val.getElementsByTagName(items[i].getAttribute("equals").toUpperCase())[0].firstChild.nodeValue;
									}
								}
								} catch(e){}
								break;
							case "password":
								try{
									if((items[i].name.split(":")[0])!="exclude")							
										items[i].value=val.getElementsByTagName(items[i].name.toUpperCase())[0].firstChild.nodeValue;
									else {
										if(items[i].getAttribute("equals"))items[i].value=val.getElementsByTagName(items[i].getAttribute("equals").toUpperCase())[0].firstChild.nodeValue;
									}
								} catch(e){}
								break;
							case "hidden":
								try{
								if((items[i].name.split(":")[0])!="exclude")							
										items[i].value=val.getElementsByTagName(items[i].name.toUpperCase())[0].firstChild.nodeValue;
									else {
										if(items[i].getAttribute("equals"))items[i].value=val.getElementsByTagName(items[i].getAttribute("equals").toUpperCase())[0].firstChild.nodeValue;
									}
								} catch(e){}
								break;
							case "radio":
								var radioB=items[i];
								try{
								var value=val.getElementsByTagName(items[i].name.toUpperCase())[0].firstChild.nodeValue;
								} catch(e){}
										radioB.checked=(radioB.value==value);
								break;
							case "checkbox":
								if((items[i].name.split(":")[0])!="exclude") {
									try{
									var value=val.getElementsByTagName(items[i].name.toUpperCase())[0].firstChild.nodeValue;
									} catch(e){}
									items[i].checked=(items[i].value==value);
								}
								break;
						}
						break;
					case "select" :
						if(items[i].name.split(":")[0]=="datetime"){
							
							if(val.getElementsByTagName(items[i].name.split(":")[1].toUpperCase())[0].firstChild){
							var datetimeMysql = val.getElementsByTagName(items[i].name.split(":")[1].toUpperCase())[0].firstChild.nodeValue
							datetimeMysqlD=datetimeMysql.substr(0,10);
							datetimeMysqlD=datetimeMysqlD.split("-");
							datetimeMysqlH=datetimeMysql.substr(11);
							datetimeMysqlH=datetimeMysqlH.split(":");
							switch(items[i].name.split(":")[2]){
								case "dia":
									this.selectValue(items[i],new Number(datetimeMysqlD[2]));
									break;
								case "mes":
									this.selectValue(items[i],new Number(datetimeMysqlD[1]));
									break;
								case "ano":
									this.selectValue(items[i],new Number(datetimeMysqlD[0]));
									break;
								case "hor":
									this.selectValue(items[i],new Number(datetimeMysqlH[0]));
									break;
								case "min":
									this.selectValue(items[i],new Number(datetimeMysqlH[1]));
									break;
								case "seg":
									this.selectValue(items[i],new Number(datetimeMysqlH[2]));
									break;
							}
							}
						}
						else {
							var nameField=(items[i].name.substr(1,3)=="2M:"?items[i].name.split(":")[2]:items[i].name)
							try{
							this.selectValue(items[i],val.getElementsByTagName(nameField.toUpperCase())[0].firstChild.nodeValue);
							} catch(e){}
						}
						break;
					case "textarea":
						try{
						items[i].value=val.getElementsByTagName(items[i].name.toUpperCase())[0].firstChild.nodeValue;
						if(items[i].getAttribute("extra")=="tiny_mce"){
							items[i].value=stripslashes(items[i].value);
							tinyMCE.get(items[i].id).load();
						}
						} catch(e){}
						break;

				}
			}
		}
		if(window.onFinishAutoComplete)window.onFinishAutoComplete(this.formu);
	}
	this.checkForContent = function() {
		if(this.XML&&this.MANYCOUNTER==this.MANY2N)
			this.parseContent();
	}
	this.selectValue= function (sel,val) {
		if(sel.tagName.toLowerCase()=="select"){
			for(var i=0;i<sel.length;i++){
				var opt=sel[i];
				var tmpVal=((opt.value.length>0)?opt.value:opt.text);
				if(tmpVal==val){
					opt.selected=true;
					if(!sel.multipe)
						break;
				}
			}
		}
	}
	
	this.parse2Many = function (val){
		var datas=this.formu.getElementsByTagName("SELECT");
		for(var i=0;i<datas.length;i++)
			if(datas[i].name.split(":")[1]==val.getElementsByTagName("table")[0].getAttribute("NAME")){
				datas=datas[i];
				break;
			}
		this.MANYCOUNTER++;
		if(datas.form&&datas.tagName.toLowerCase()=="select"){
			var rows= val.getElementsByTagName("ROW");

			for(var i=0;i<rows.length;i++){
				var option=document.createElement("option");
				var idField=datas.name.split(":")[2].toUpperCase();
				option.value=rows[i].getElementsByTagName(idField)[0].childNodes[0].nodeValue;
				
				if(datas.getAttribute("show")) {
					try {
						option.text=rows[i].getElementsByTagName(datas.getAttribute("show").toUpperCase())[0].childNodes[0].nodeValue;
					} catch (e){}
					if(datas.getAttribute("concat")){
						var con=datas.getAttribute("concat").split(",");
						for(wc=0;wc<con.length;wc++){
							try {
								option.text+=" "+rows[i].getElementsByTagName(con[wc].toUpperCase())[0].childNodes[0].nodeValue;}
							catch (e){};
						}
					}
				}
				else
					option.value=rows[i].getElementsByTagName(idField)[0].childNodes[0].nodeValue;
				try {
					datas.add(option);
				}
				catch (e){
					datas.add(option,null);
				}
							
			}
			this.checkForContent();				
		}
	}
	
	this.startFormCheck();
}


function Suggest (textbox) {
	this.box=textbox;
	this.isIE=(window.event!=null);
	this.boxTop=(this.isIE?findTop(this.box)+3:textbox.offsetTop+3);
	this.boxLeft=(this.isIE?findLeft(this.box):textbox.offsetLeft);
	this.form=textbox.form;
	this.show=textbox.getAttribute("show");
	this.tabla=textbox.getAttribute("tabla");
	this.div=document.createElement("DIV");
	this.ifrm=document.createElement("IFRAME")
	this.menuClass=textbox.getAttribute("sclass");
	this.selPos=0;
	this.oLen=0;
	this.begin = function (){
		var div=this.div;
		this.div.style.display="none";
		div.className=this.menuClass;
		div.id=this.box.id+"AjaxBothmediaMENU";
		this.ifrm.id=this.box.id+"AjaxBothmediaIFRM";
		div.style.width=this.box.clientWidth+"px";
		div.style.position="absolute";
		div.style.top=(this.boxTop+this.box.clientHeight)+"px";
		div.style.left=(this.boxLeft)+"px";
		if(this.isIE){
			
			this.ifrm.style.display="none";
			this.ifrm.style.top=(this.boxTop+this.box.clientHeight)+"px";
			this.ifrm.style.left=(this.boxLeft)+"px";
			this.ifrm.style.position="absolute";
			this.ifrm.scrolling="no";
			this.ifrm.style.width=this.box.clientWidth+"px";
			this.ifrm.style.height="0px";
			document.body.appendChild(this.ifrm);
		}

		this.box.belongs =this;
		if(this.isIE){
			this.box.onfocusout=function () {
				this.belongs.clear();
				};
		} else {
			this.box.onblur=function () {
				this.belongs.clear();
				};
			}
			
		this.box.onkeydown=function(e){
			var kc = getKeyCode(e);
			if(kc==13){
				if(this.belongs.div.style.display=="block"){
					this.belongs.showResult();
				}
				return false;
				}
			return true;
		}
		this.box.onkeyup=function(e){
				var kc = getKeyCode(e);
				switch (kc) {
					case 27: // escape
						this.belongs.clear();
						return false;
						break;
					case 38: // up arrow
						this.belongs.prev();
						return false;
						break;
					case 40: // down arrow
						this.belongs.next();						
						return false;
						break;
					default:
						this.belongs.clear();
						if (this.value.length>0)this.belongs.consult();
					}
				return false;
			}
		var ol=document.createElement("OL");
		div.appendChild(ol);
		div.setAttribute("countItem",0);
		if(this.isIE){
		document.body.appendChild(div);
		}
		else
			this.form.appendChild(div);
		
	};
	
	this.addSugg = function (text){
		var li = document.createElement("LI");
		li.style.overflow="hidden";
		li.belongs =this;
		li.onmouseover=function(){
			if(this.belongs.selPos>0)
				document.getElementById(this.belongs.div.id+"Li"+(this.belongs.selPos-1)).className="";
			this.className=this.belongs.menuClass+"liOver";
			this.belongs.selPos=this.getAttribute("indx")*1+1;
		}
		
		li.onmousedown=function (){
			this.belongs.box.value=""+this.firstChild.nodeValue;
		}
		
		text=document.createTextNode(text);
		li.id=this.div.id+"Li"+(this.div.getAttribute("countItem")*1);
		li.appendChild(text);
		li.setAttribute("indx",this.div.getAttribute("countItem")*1);
		this.div.setAttribute("countItem",(this.div.getAttribute("countItem")*1)+1);
		this.div.getElementsByTagName("OL")[0].appendChild(li);
	};
	
	this.consult = function () {
		var val = this.box.value;
		this.oLen=this.box.value.length;
		doCompletion("servlets/ajaxGeneric.php",[this.tabla,urlencode(this.show+" like \'"+val+"%\' or "+this.show+" like \'% "+val+"%\' limit 10"),this],"BOTH_INTERNAL_GETTABLE");
	}
	
	this.parse2Many = function(val){
		
		this.boxTop=(this.isIE?findTop(this.box)+3:this.box.offsetTop+3);
		this.boxLeft=(this.isIE?findLeft(this.box):this.box.offsetLeft);
		var div=this.div;
		div.style.width=this.box.clientWidth+"px";
		div.style.top=(this.boxTop+this.box.clientHeight)+"px";
		div.style.left=(this.boxLeft)+"px";
		
		if(this.isIE){
			this.ifrm.style.top=div.style.top;
			this.ifrm.style.left=div.style.left;
			this.ifrm.style.width=div.style.width;
		}
		
		var datas = this.box;
		var rows= val.getElementsByTagName("ROW");
		if(rows.length>0)this.clear();
			for(var i=0;i<rows.length;i++){
				if(this.div.style.display=="none"){
					this.div.style.display="block";
					if(this.isIE){
						this.ifrm.style.display="block";
					}
				}
				var option=document.createElement("option");
				if(datas.getAttribute("show"))
					this.addSugg(rows[i].getElementsByTagName(datas.getAttribute("show").toUpperCase())[0].childNodes[0].nodeValue);
				else
					this.addSugg(option.value=rows[i].getElementsByTagName(idField)[0].childNodes[0].nodeValue);
				this.ifrm.style.height=this.div.clientHeight+"px";			
			}
	}
	
	this.clear=function (){
		if(this.isIE)this.ifrm.style.display="none";
		this.div.style.display="none";
		if(this.div.firstChild)this.div.removeChild(this.div.firstChild);
		var ol=document.createElement("OL");
		this.div.appendChild(ol);
		this.div.setAttribute("countItem",0);
		this.selPos=0;
	}
	this.next=function(){
		if(this.div.getAttribute("countItem")>0&&this.div.getAttribute("countItem")!=this.selPos){
			if(this.selPos>0) document.getElementById(this.div.id+"Li"+(this.selPos-1)).className="";
			document.getElementById(this.div.id+"Li"+this.selPos).className=this.menuClass+"liOver";
			this.selPos++;
			this.showResult();
		}
	};
	
	this.prev=function(){
		if(this.div.getAttribute("countItem")>0&&this.selPos!=0){
			this.selPos--;
			document.getElementById(this.div.id+"Li"+(this.selPos)).className="";
			if(this.selPos>0)document.getElementById(this.div.id+"Li"+(this.selPos-1)).className=this.menuClass+"liOver";
			this.showResult();
		}
	};
	
	this.showResult=function(){
		var result=document.getElementById(this.div.id+"Li"+(this.selPos-1)).firstChild.nodeValue;
		this.box.value = result;
			if (this.box.createTextRange) {
				var r = this.box.createTextRange();
					r.moveStart('character', this.oLen);
					r.moveEnd('character', this.box.value.length);
					r.select();
				}
				else if (this.box.setSelectionRange){
					this.box.setSelectionRange(this.oLen,this.box.value.length);
					this.box.focus();
				}
	};
	
	this.begin();
}


function getKeyCode(e) {
if (document.layers)
return e.which;
else if (document.all) 
return event.keyCode;
else if (document.getElementById)
return e.keyCode; 
return 0; 
}

function urlencode(ch) {
    ch = ch.replace(/[ ]/g,"+") 
    return escape(ch) 
}

function findTop(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return (curtop);
}


function findLeft(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return (curleft);
}


function addslashes(str) {
	str=str.replace(/\'/,'\\\'');
	str=str.replace(/\"/,'\\"');
	str=str.replace(/\\/,'\\\\');
	str=str.replace(/\0/,'\\0');
	return str;
}

function stripslashes(str) {
	str=str.replace(/\\'/,'\'');
	str=str.replace(/\\"/,'"');
	str=str.replace(/\\\\/,'\\');
	str=str.replace(/\\0/,'\0');
	return str;
}