/// <reference path="dhtmlxcommon.js"/>
/// <reference path="dhtmlxgrid.js"/>

/// <reference path="dhtmlxgridcell.js"/>
/// <reference path="dhtmlxtabbar.js"/>

/// <reference path="dhtmlxtabbar_start.js"/>
/// <reference path="mn_tab.js"/>
/// <reference path="scheda.htm"/>
/// <reference path="aa_var.js"/>
/// <reference path="mn_xmlhttp.js"/>
/// <reference path="frm_scheda.js"/>



//================================================
//  attacca evento
//================================================
function COMMON_Event(el, event, handler) {
    if (el.addEventListener)
        el.addEventListener(event, handler, false);

    else if (el.attachEvent)
        el.attachEvent("on" + event, handler);
}






//================================================
// Ritorna o setta il valore dell'ogg. select
//================================================
function COMMON_selectSetText(oSelect,txt){
	for(var i=0;i<oSelect.options.length;i++){
		var ov=isie2?oSelect.options[i].innerText:oSelect.options[i].value
		if(txt==ov){
			oSelect.selectedIndex=i
			break
		}
	}
}




//================================================
// Ritorna il testo del select (per firefox e IE)
//================================================
function COMMON_getSelectObjectText(oSelect){
	if(isie2){
		return(oSelect.options(oSelect.selectedIndex).innerText)
	}else{
		return(oSelect.options(oSelect.selectedIndex).value)
	}
}



//================================================
// Ritorna una stringa senza gli spazi e caratteri
// speciali
//================================================
String.prototype.trimWhiteChar=function(){
	//return this.replace(/&nbsp;/g, " ").replace(/(^[ \t]*)|([ \t]*$)/g, "");
	var re=/(\W)/g
	return this.replace(re,"")
}


//================================================
// Posiziona l'oggetto
//================================================
function COMMON_PositionObject(obj,x,y,w,h,absolute,overflow){
	try{
		with(obj){
		style.top=y+"px"
		style.left=x+"px"
		style.width=w+"px"
		style.height=h+"px"
		if (absolute) { style.position = "absolute" }
		if (overflow) { style.overflow = overflow }
		}
	}catch(e){}
}




//================================================
// Previene il reload della pagina con F5
//================================================
function COMMON_preventReload(docx){
docx.onkeydown =function(){
	if(window.event && window.event .keyCode == 116){
		// Capture and remap F5
		window.event.keyCode = 505;
	}

	if(window.event && window.event .keyCode == 505){
		// New action for F5
		return false;
		// Must return false or the browser will refresh anyway
	}}
}





//---------------------------------------------------
//		Validazione complessit� password
//		ritorna da 1 a 4 (4=complessa)
//---------------------------------------------------
function COMMON_validatePasswordSecurity(pw){
		var compl=0
		if(pw.toString().match(/\d/g)){compl+=1} // test numeri
		if(pw.toString().toLowerCase()!=pw.toString()){compl+=1}	// minuscole e maiuscole
		if(pw.toString().match(/\W/g)){compl+=1}		// caratteri speciali
		return(compl)
}


//---------------------------------------------------
//		Validazione della mail ritorna true se valida
//---------------------------------------------------
function COMMON_validatemail(str) {

		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
		if (str.indexOf(at)==-1){return false}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){return false}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){return false}

		 if (str.indexOf(at,(lat+1))!=-1){return false}

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){return false}

		 if (str.indexOf(dot,(lat+2))==-1){return false}
		
		 if (str.indexOf(" ")!=-1){return false}
 		 return true					
	}



/*
	Entra un font del tipo : normal 8pt arial ed esce
	una matrice con i valori normal,8pt,arial
*/
function COMMON_retFontArray(font){
			var rta=new Array()
			var v=font.split(" ");
			if(v.length>2){
				rta[0]=v[0];
				rta[1]=v[1];
				rta[2]=v[2];
			}else{
				rta[0]="normal";
				rta[1]="10pt";
				rta[2]="arial";
			}
			return(rta);
}



/*
	Calcola la lunghezza di una stringa
*/
function COMMON_stringPixelLength(str,font){
			var s=document.getElementById("spanlength");
			if(!s){
				s=document.createElement("span");
				var v=COMMON_retFontArray(font)
				s.style.font=v[0]+" "+v[1]+" "+v[2];
				s.id="spanlength";
				s.style.position="absolute";
				s.style.whiteSpace="nowrap";
				s.style.visibility="hidden";
				document.body.appendChild(s);
			}
			innerTextEx(s,str);
			return(s.offsetWidth);
}



// Mette la hand in funzione del browser
function COMMON_putHandOnControl(nameObj){
		var o=document.getElementById(nameObj)
		if(isie2){o.style.cursor="hand"}else{o.style.cursor="pointer"};
}






// check date
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function COMMON_isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function COMMON_stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function COMMON_daysInFebruary(year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function COMMON_DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function COMMON_isDate(dtStr){
	var daysInMonth = COMMON_DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		alert("The date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>COMMON_daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || COMMON_isInteger(COMMON_stripCharsInBag(dtStr, dtCh))==false){
		alert("Please enter a valid date")
		return false
	}
return true
}





               // Gestione client/wait finestra di attesa programmabile
               function COMMON_waitShow(textwait) {
						//alert("wait")
						var create=0
						var oDivWait=document.getElementById("oDivWait")
               	if (!oDivWait) {
               		oDivWait = document.createElement("Div")
               		create=1
               	}
               	oDivWait.style.position = "absolute"
               	oDivWait.style.backgroundColor="gray"
               	if(isIE2){
							oDivWait.style.filter="progid:DXImageTransform.Microsoft.Alpha(opacity=50)"
						}else{
							oDivWait.style.MozOpacity=0.5
						}
						oDivWait.style.left="10px"
						oDivWait.style.top="10px"
						oDivWait.style.width=(window.screen.availWidth-10).toString()+"px"
						oDivWait.style.left=(window.screen.availHeight-10).toString()+"px"
						//alert(oDivWait.style.width)
						oDivWait.style.display="block"
						if(create==1){document.body.appendChild(oDivWait)}
               }

					function COMMON_waitHide() {
						try{
							var oDivWait=document.getElementById("oDivWait")
							oDivWait.style.display="none"
						}
						catch(e){
						
						}
					}

					var isie2=isIE2()
					
					//var SEP_OR=String.fromCharCode(9)  //"�" //
					//var SEP_VT=String.fromCharCode(11)   //"�"  //



					function isIE2(){
						if(navigator.appName.indexOf("Microsoft")!=-1)
							  if (navigator.userAgent.indexOf('Opera') == -1)
    							return true;
						return false;
					}	

					function COMMON_formatprezzo(prezzo,decimali,valuta) {
						if(!prezzo){return}
						prezzo=prezzo.toString()
						var np,ch,ndopozero,faidopozero,zeri,novirgola
						zeri="";np="";ndopozero=0;novirgola=true
						for (var c=0; c<prezzo.length; c++) {
							ch=prezzo.substr(c,1)
							//alert("ch="+ch)
							if (faidopozero==true) {ndopozero++}
							if(decimali){ if(ndopozero>decimali) break;}  
							if (ch=="." || ch==",") {np=np+",";faidopozero=true;novirgola=false} else {np=np+ch}
						}
						if (novirgola==true) {zeri=".00";ndopozero=10}
						if (ndopozero<2) {for (var i=0; i<2-ndopozero; i++) {zeri=zeri+"0"}}
						np=np+zeri
						//alert("npo="+np+" zeri="+zeri+" ndopozero="+ndopozero)
						if(valuta){np=valuta+"   "+np}
						return np
					}


/*
		COMMON_sapo come budget metto apostrofo doppi
    ' Ritorna una stringa con due apostrofi se ce n� uno
    ' es:  Sha'ron >> Sha''ron
    ' per evitare errori nelle SQL
*/

function COMMON_sapo(text){
	if(text){
		var vdoppie=String.fromCharCode(96,96);
		var s=new String()
		s=text.replace(/\'/,vdoppie);
		return s
		var samper="&&"
		s=s.replace("&",samper)
		return s
	}else{
		return ""
	}
}


//****************************************************************
//		GESTIONE DEBUG DA IMPO 
//****************************************************************

var NO_ICONS=true
var NO_SKIN=true
var DEBUG=true//false//true//
// setta la variabile debug in funzione del valore 
// nella tabella general
function COMMON_set_var_debug(){
		var q="select debug from gen where id=1"
		var rs=sendhttp_sync(q)
		rs=rs.split(SEP_VT)
		DEBUG=false
		if (rs[0]!=0) {DEBUG=true}
}

// save debug
function COMMON_savedebug(obj) {
		var mode,md
		if (obj.selectedIndex==0) {md="0"}else{md="1"}
		var q="update gen set debug="+md+" where id=1"
		var rs=sendhttp_sync(q)
}


//****************************************************************
//		COMPATIBILITA' MERDA DI FIREFOX 
//****************************************************************

var _isIE=isie2

function innerTextEx(obj,text){
	if(!obj) return
	if(_isIE){
		obj.innerText=text
	}else{
		obj.textContent=text
	}
}
function innerTextExRead(obj){
	if(!obj) return
	if(_isIE){
		return obj.innerText
	}else{
		return obj.textContent
	}
}
function COMMON_setmousepointer(o){
	if (_isIE){o.style.cursor="hand"}else{o.style.cursor="pointer"}
}


//****************************************************************
//		AGGIUNGE CARATTERI O SPAZI A SINISTRA O A DESTRA 
//****************************************************************

function COMMON_addchars(text,schar,lengthtot,right) {

		//return this.replace(/(^\s*)|(\s*$)/g, "");


		var tt="",i
		lengthtot=lengthtot-text.length
		if (right) {
			for (i=0; i<lengthtot; i++){
					text=text+schar
			}
		} else {
			for (i=0; i<lengthtot; i++){
					text=schar+text
			}
		}
		return(text)
}

String.prototype.trim = function()

{

    // Use a regular expression to replace leading and trailing 

    // spaces with the empty string

    return this.replace(/(^\s*)|(\s*$)/g, "");

}


//****************************************************************
//		CONVERTE LA VIRGOLA IN PUNTO 
//****************************************************************

function COMMON_parseFloatEx(invalue) {
				var x=""; var t="";exv=""
				x=invalue.toString()
				for (var i=0; i<x.length; i++) {
						t=x.substr(i,1)
						if (t==",") {
							exv=exv+"."
						} else {
							exv=exv+t
						}
				}
				return(parseFloat(exv))
}



//****************************************************************
//		alert_debug DEBUG
//****************************************************************

function alert_debug(msg){
	if (DEBUG==true) {alert(msg)}
}



//****************************************************************
//		OGGETTO CHE SPOSTA IL MOUSE SUI TX
//****************************************************************


//  Da finire xche' necessica di componenti esterni com+ o com o active X
function COMMON_movemousefromme(e) {
		if(_isIE){e=window.event}
		var obj=_isIE?e.srcElement:e.target
		var tn=obj.tagName.toLowerCase()
		var tp=obj.type.toLowerCase()
		if (tn=="input" && tp=="text") {
				
		}
}





//------------------------------------------------------------
// suppress all error messages and do nothing with them:
//
//------------------------------------------------------------

function noErrorMessages () { return true; }
window.onerror = noErrorMessages;

//------------------------------------------------------------
// advanced: a full error handler
//------------------------------------------------------------
function handleError (err, url, line) {
    if (err.indexOf('is not defined') != -1) {
      alert_debug('Oops, something is not defined.\\n' +
             err + '\n' + url + '\nline no: ' + line);
      return true; // error is handled
    }
    else
      return false; // let the browser handle the error
  }

//window.defaultOnError = window.onerror; // store default handler
//window.onerror = handleError; // assign own handler


function setonerror_f() {
			//noErrorMessages
			window.defaultOnError = window.onerror; // store default handler
			window.onerror = handleError; // assign own handler

}


//****************************************************************
//		DECODIFICA DEL CAMPO DELLE IMPOSTAZIONI DA DB : settings
//****************************************************************

 
function getsetting(allsettings,key) {  
								
								key=key.toLowerCase()
								var vsett=allsettings.split("|")
								for (var i=0; i<vsett.length; i++) {
									var vs=vsett[i].split(":")
									if (vs[0].toLowerCase()==key) {
										if (vs.length>0) {
											return vs[1]
										}							
									}
								}
								return ""
}



function savesetting(allsettings,key,value) {
			if (!allsettings) {return}
			if (!key) {return}
			//alert_debug("savesetting "+key+"  "+value)
			var asett=new Array()
			key=key.toLowerCase()
			var vsett=allsettings.split("|")
			for (var i=0; i<vsett.length; i++) {
				asett[i]=vsett[i]
				var vs=vsett[i].split(":")
				if (vs[0].toLowerCase()==key) {
					// key trovata cambio valore
					asett[i]=vs[0]+":"+value
				}
			}
			var allsettnew=""
			var x=""
			for (i=0; i<vsett.length; i++) {
				allsettnew=allsettnew+x+asett[i]
				x="|"
			}
			// Salvo i nuovi setting nel db
			if (g_userhash) {
				var q="update users set settings='"+allsettnew+"' where hash="+g_userhash
				sendhttp(q,0,0,0)
			} else {
				alert_debug("Hash code missing.")
			}
}




//*******************************************
// FUNZIONI VARIE
//******************************************



//  Ritorna la lista delle cartelle nelle folder data
function COMMON_ShowFolderList(folderspec)
{
					var arrFolder=new Array()
					var fso, f, fc, s;
					fso = new ActiveXObject("Scripting.FileSystemObject");
					f = fso.GetFolder(folderspec);
					fc = new Enumerator(f.SubFolders);
					s = "";i=0
					for (; !fc.atEnd(); fc.moveNext())
					{
						i+=1;
						s += fc.item();
						s += ",";
					  arrFolder[i-1]=fc.item()
					}
					return(arrFolder);
}




//  Ritorna la lista dei files nelle folder data
function COMMON_ShowFolderFileList(folderspec)
{
			folderspec=COMMON_double_backslash_for_folder_java(folderspec)
			var arrFiles=new Array()
			var fso, f, fc, s;
			var i=0
			fso = new ActiveXObject("Scripting.FileSystemObject");
			f = fso.GetFolder(folderspec);  //  "d:\\inetpub\\wwwroot\\contatti"
			fc = new Enumerator(f.files);
			s = "";
			for (; !fc.atEnd(); fc.moveNext())
			{
				s = fc.item().Name;
				arrFiles[i]=s
				i+=1
			}
			return(arrFiles);
}


//			Rimuove la path e lascia solo il file
function COMMON_remove_path(path_file) {
				var sfile="";var pt=-1
				var cs=String.fromCharCode(92)
				var s=path_file
				for (var i=s.length-1; i>-1; i--) {
							if (s.substr(i,1)==cs) {
									pt=i
									break;	
							}
				}
				if (pt>-1) {
						s=s.substr(pt+1)
				}
				return(s)
}



//  Raddoppia i control slash '\' per la ricerca folder se non quello normale non lo prende

function COMMON_double_backslash_for_folder_java(folderspec) {
				var s=folderspec;lastx=0;tmp=""
				var cs=String.fromCharCode(92)
				//cs=cs.substr(1)
				for (var i=0; i<s.length; i++) {
								var tmp=s.substr(i,1)
								if (tmp==String.fromCharCode(92)) { 
										s=s.substring(0,i)+cs+s.substr(i)
										lastx=i+1
										i+=1
								}
				}
				s=s.substr(0,s.length-1)
				return(s)
}







//		Mette la prima lettera maiuscola
function COMMON_firstletter_uppercase(text) {
							if (text) {
										if (text.length>0) {
													text=text.substr(0,1).toUpperCase()+text.substr(1)
										}
							}
							return text
}




//			Nasconde il  wait
function hidewait() {imgwait.style.visibility="hidden"}


// Tronca la stringa degli spazi
function COMMON_trim(sstring) {
	if(!sstring) return
   var res="";
   var t="";
   var pass=false
   for (var i=0; i<sstring.length; i++) {
      t=sstring.substr(i,1)
      if (t==" " && pass==false) {
         // noaction
        } else { 
            res=res+t
            pass=true
        }
   }
   sstring=res
   var nspright=0
   pass=false
   for (i=sstring.length-1; i>-1; i--) {
      t=sstring.substr(i,1)
      if (t==" " && pass==false) {
         nspright+=1
        } else {pass=true}
   }   
   res=sstring.substr(0,sstring.length-nspright)
   return res
}

// Tronca la stringa degli spazi e dei caratteri code
function COMMON_trimex(sstring) {
	if(!sstring) return
   var res="";
   var t="";
   var pass=false
   for (var i=0; i<sstring.length; i++) {
      t=sstring.substr(i,1)
      if (t.charCodeAt(0)<33 && pass==false) {
         // noaction
        } else { 
            res=res+t
            pass=true
        }
   }
   sstring=res
   var nspright=0
   pass=false
   for (i=sstring.length-1; i>-1; i--) {
      t=sstring.substr(i,1)
      if (t==" " && pass==false) {
         nspright+=1
        } else {pass=true}
   }   
   res=sstring.substr(0,sstring.length-nspright)
   return res
}


// split fatto in casa che a volte non funziona

function COMMON_splitex(text,sep) {

							var aret=new Array()
							var apunta=new Array()
							var fai=1
							apunta[0]=0
							while (fai!=0) {
							
									fai=text.indexOf(sep,fai+1)
									if (fai==0) break;
									apunta[i+1]=fai
							}
							for (var i=0; i<apunta.length; i++) {
									aret[i]=text.substring(apunta[i],apunta[i+1])
							}
							return aret
}



//**************************************************
// Gestione per simulare il doEvents di VB
//**************************************************

var fDoEvents
var nevents=0;var nevdone=0
//setInterval("doevents()",50)
function doevents() {
   nevents=nevents+1
   if (fDoEvents) {nevdone=nevdone+1;fw()}
}



function tmshowwait() {
   imgwait.style.visibility="visible"
   imgwait.setActive()
   var tw=window.setTimeout("tmhidewait()",400)
}
function tmhidewait() {
   imgwait.style.visibility="hidden"
}



//*******************************************
// check user and inactivity
//******************************************

var IDMULT=2718

function decode_id(idcript) {
   // dall'id dato (stringa mandata da index criptata)
   // ritorna l'hash code sul db
   if (idcript) {
      var d=new Date()
      var iddate=((d.getHours()*3600)+32)*IDMULT//  ((d.getMinutes()*60))271314//21//2128   
      //alert_debug("Dacode date="+iddate+" decode id="+id+" decode resule hash="+(parseInt(id)-parseInt(iddate)))
      return (parseInt(idcript)-parseInt(iddate))
   }
}




// Dall'id del database ritorna l'id criptato
function encode_id(userid,hash) {
      var id=parseInt(userid)
      var d=new Date()
      var iddate=((d.getHours()*3600)+32)*IDMULT  //((d.getMinutes()*60))
      var idenc=parseInt(iddate)+parseInt(hash)
      //alert_debug("hash "+hash+","+idenc)
      return(idenc)
}


// Time out dell'user inattivit�
var globalInactivity=60
var INACTIVITY=globalInactivity
function timeout() {
      
      var d=new Date()
      var idnow=((d.getHours()*3600)+((d.getMinutes()*60))+d.getSeconds())*IDMULT//31421
      var pq=new COMMON_PageQuery(document.location.search)
      var idinit=pq.getValue("user")
      
      //sbarstatus.innerText=idinit +"  timeout - "+idnow
      INACTIVITY-=1
      //sbarstatus.innerText=INACTIVITY
      
      if (INACTIVITY<=0)  //((idnow/314)-(idinit/314)>(10*60)) 
         {
				ml_addlog("Log-off")
				alert("Session END. return to index page.")
				window.open("logon.htm","_self")
         } else {
            //sbarstatus.innerText="INACTIVITY="+INACTIVITY
         }
}




//*****************************************************
// Retrive QueryString
//*****************************************************

function COMMON_PageQuery(q) {
if(q.length > 1) this.q = q.substring(1, q.length);
else this.q = null;
this.keyValuePairs = new Array();
if(q) {
for(var i=0; i < this.q.split("&").length; i++) {
this.keyValuePairs[i] = this.q.split("&")[i];
}
}
this.getKeyValuePairs = function() { return this.keyValuePairs; }
this.getValue = function(s) {
for(var j=0; j < this.keyValuePairs.length; j++) {
if(this.keyValuePairs[j].split("=")[0] == s)
return this.keyValuePairs[j].split("=")[1];
}
return false;
}
this.getParameters = function() {
var a = new Array(this.getLength());
for(var j=0; j < this.keyValuePairs.length; j++) {
a[j] = this.keyValuePairs[j].split("=")[0];
}
return a;
}
this.getLength = function() { return this.keyValuePairs.length; } 
}
function queryString(key){
var page = new COMMON_PageQuery(window.location.search); 
return unescape(page.getValue(key)); 
}
function displayItem(key){
if(queryString(key)=='false') 
{
document.write("you didn't enter a ?name=value querystring item.");
}else{
document.write(queryString(key));
}
}


COMMON_createRequestObject()
function COMMON_createRequestObject() {
  FORM_DATA = new Object();
    // The Object ("Array") where our data will be stored.
  separator = ',';
    // The token used to separate data from multi-select inputs
  query = '' + this.location;
  qu = query
    // Get the current URL so we can parse out the data.
    // Adding a null-string '' forces an implicit type cast
    // from property to string, for NS2 compatibility.
  query = query.substring((query.indexOf('?')) + 1);
    // Keep everything after the question mark '?'.
  if (query.length < 1) { return false; }  // Perhaps we got some bad data?
  keypairs = new Object();
  numKP = 1;
    // Local vars used to store and keep track of name/value pairs
    // as we parse them back into a usable form.
  while (query.indexOf('&') > -1) {
    keypairs[numKP] = query.substring(0,query.indexOf('&'));
    query = query.substring((query.indexOf('&')) + 1);
    numKP++;
      // Split the query string at each '&', storing the left-hand side
      // of the split in a new keypairs[] holder, and chopping the query
      // so that it gets the value of the right-hand string.
  }
  keypairs[numKP] = query;
    // Store what's left in the query string as the final keypairs[] data.<
  for (i in keypairs) {
    keyName = keypairs[i].substring(0,keypairs[i].indexOf('='));
      // Left of '=' is name.
    keyValue = keypairs[i].substring((keypairs[i].indexOf('=')) + 1);
      // Right of '=' is value.
    while (keyValue.indexOf('+') > -1) {
      keyValue = keyValue.substring(0,keyValue.indexOf('+')) + ' ' + keyValue.substring(keyValue.indexOf('+') + 1);
        // Replace each '+' in data string with a space.
    }
    keyValue = unescape(keyValue);
      // URLDecode non-alphanumerics
    if (FORM_DATA[keyName]) {
      FORM_DATA[keyName] = FORM_DATA[keyName] + separator + keyValue;
        // Object already exists, it is probably a multi-select input,
        // and we need to generate a separator-delimited string
        // by appending to what we already have stored.
    } else {
      FORM_DATA[keyName] = keyValue;
        // Normal case: name gets value.
    }
  }
  return FORM_DATA;
}
FORM_DATA = COMMON_createRequestObject();




