/* --------------------------------------------------------------------------------------------------------------
*	API:			JSMX (JavaScript MX) - This is a ColdFusion api for AJAX.	
*	AUTHOR: 		Todd Kingham
*	EMAIL: 			todd@lalabird.com
*	CREATED:		8.21.2005
*	VERSION:		2.4.0
*	DESCRIPTION:	This API uses XMLHttpRequest to post/get data from a ColdFusion interface.
*					The CFC's/CFM's will return a string representation of a JS variable: response_param.
*					The "onreadystatechange event handler" will eval() the string into a JS variable 
*					and pass the value back to the "return function". To Download a full copy of the sample 
*					application visit: http://www.lalabird.com/JSMX/?fa=JSMX.downloads
*
*	HISTORY:		2.0.0:	Scripted Out Original Version
*					2.1.0:	Modified for Download
*					2.2.0:	Modified the firstWord() function to be backward compatable with
*							CF5 and to be more stable all-around.
*					2.3.0:	Added "wait div" functionality
*					2.4.0:	XML!!!! Now JSMX will allow you to pass XML Documents to the API in
*							addition to the original JavaScript method.
*
*
*	LICENSE:		THIS IS A OPEN SOURCE API. YOU ARE FREE TO USE THIS API IN ANY APPLICATION,
*               	TO COPY IT OR MODIFY THE FUNCTIONS FOR YOUR OWN NEEDS, AS LONG THIS HEADER INFORMATION
*              	 	REMAINS IN TACT AND YOU DON'T CHARGE ANY MONEY FOR IT. USE THIS API AT YOUR OWN
*               	RISK. NO WARRANTY IS EXPRESSED OR IMPLIED, AND NO LIABILITY ASSUMED FOR THE RESULT OF
*               	USING THIS API.
*
*               	THIS API IS LICENSED UNDER THE CREATIVE COMMONS ATTRIBUTION-SHAREALIKE LICENSE.
*               	FOR THE FULL LICENSE TEXT PLEASE VISIT: http://creativecommons.org/licenses/by-sa/2.5/
*
-----------------------------------------------------------------------------------------------------------------*/
/* UNCOMMENT THE FOLLOWING LINE IF YOU WILL BE RETURNING QUERY OBJECTS. (note: you may need to point the SRC to an alerternate location.*/
//document.writeln('<SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript" SRC="/CFIDE/scripts/wddx.js"></SCRIPT >');

// perform the XMLHttpRequest();
function http(verb,urlpath,rm,qry) {
    //reference our arguments
	callback = rm;
	if(!qry) 
		qryStr = '';
	else
		qryStr = "?"+toQueryString(qry);
	var url = urlpath + qryStr;
	try{
	    if (window.XMLHttpRequest)
	        req = new XMLHttpRequest();
		else if (window.ActiveXObject) 
	        req = new ActiveXObject("Microsoft.XMLHTTP");
			
	    req.onreadystatechange = processReqChange;
	    req.open(verb.toUpperCase(), noCache(url), true);
		if(verb.toLowerCase() == 'post')	
			req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	    req.send(null);
	}
	catch(e){
		alert("There was a problem retrieving the data: The browser not equiped to handle XMLHttp");
	}//The browser not equiped to handle XMLHttp
}

// handle onreadystatechange event of req object
function processReqChange(){
	var cfbug	= '<META NAME="ColdFusionMXEdition" CONTENT="ColdFusion DevNet Edition - Not for Production Use.">';
 	switch(req.readyState){
		case 0: alert("Uninitialized"); break;
		case 1: popWait(); break;
		case 2: break; //alert("Loaded"); 
		case 3: break; //alert("Interactive"); 
		case 4:
			killWait();
			//alert("Complete");
			//alert(req.status);
			//alert(req.responseText);
			if ( req.status == 200 ){// only if "OK"
				try{ 
					//alert(isXML());
					if(isXML())
						rObj = req.responseXML 
					else{
						rObj = response2Obj(req.responseText.replace(cfbug,'')) ;
						callback( rObj )
					}
				}
				catch(e){ 
					rObj = req.responseText.replace(cfbug,'') ;
					callback( rObj )
				}
			}else{ 
				alert("There was a problem retrieving the data:\n" + req.statusText);
			}
	        break;
	}
}

function isXML(){ return req.getResponseHeader("Content-Type").split(';')[0] == 'text/xml'; }

// HELPER FUNCTIONS
function response2Obj(str){
	eval(str);
	var r = eval(str.split('=')[0].replace(/\s/g,''));
	return r;
}

function toQueryString(obj){
	//determine the variable type
	if(typeof(obj) == 'string')
		return obj;
	if(typeof(obj) == 'object'){
		if(typeof(obj.elements) == 'undefined')//It's an Object()!
			return object2queryString(obj);
		else //It's a form!
			return form2queryString(obj);
	}	
}

function object2queryString(obj){
	var ar = new Array();
	for(x in obj) ar[ar.length] = x+'='+obj[x];
	return ar.join('&');
}

function form2queryString(form){
	var obj = new Object();
	var ar = new Array();
	for(var i=0;i<form.elements.length;i++){
		try {
			elm = form.elements[i];
			nm = elm.name;
			if(nm != ''){
				switch(elm.type.split('-')[0]){
					case "select":
						for(var s=0;s<elm.options.length;s++){
							if(elm.options[s].selected){
								if(typeof(obj[nm]) == 'undefined') obj[nm] = new Array();
								obj[nm][obj[nm].length] = escape(elm.options[s].value);
							}	
						}
						break;
					
					case "radio":
						if(elm.checked){
							if(typeof(obj[nm]) == 'undefined') obj[nm] = new Array();
							obj[nm][obj[nm].length] = escape(elm.value);
						}	
						break;
					
					case "checkbox":
						if(elm.checked){
							if(typeof(obj[nm]) == 'undefined') obj[nm] = new Array();
							obj[nm][obj[nm].length] = escape(elm.value);
						}	
						break;
					
					default:
						if(typeof(obj[nm]) == 'undefined') obj[nm] = new Array();
						obj[nm][obj[nm].length] = escape(elm.value);
						break;
				}
			}
		}catch(e){}
	}
	for(x in obj) ar[ar.length] = x+'='+obj[x].join(',');
return ar.join('&');
}



//IE likes to cache so we will fix it's wagon!
function noCache(url){
	var qs = new Array();
	var arr = url.split('?');
	var scr = arr[0];
	if(arr[1]) qs = arr[1].split('&');
	qs[qs.length]='nocache='+new Date().getTime();
return scr+'?'+qs.join('&');
}

function popWait(){ 
	proc = document.getElementById("JSMX_loading");
	
	if( proc == null ){
		var p = document.createElement("div");
		p.id = "JSMX_loading";
		document.body.appendChild(p);
	}
}
function killWait(){
	proc = document.getElementById("JSMX_loading");
	if( proc != null ) document.body.removeChild(proc);
}