// include necessary libraries
function include(script_filename) {
    document.write('<' + 'script');
    document.write(' type="text/javascript"');
    document.write(' src="' + script_filename + '">');
    document.write('</' + 'script' + '>');
}
include('/assets/common/javascript/yui/2.6.0/build/yahoo/yahoo-min.js');
include('/assets/common/javascript/yui/2.6.0/build/event/event-min.js');
include('/assets/common/javascript/yui/2.6.0/build/connection/connection-min.js');
include('/cfide/scripts/wddx.js');

// main proxy function
// c=cfc id, m=cfc method, a=cfc arguments, scb=onsuccess callback, ecb=onerror callback, to=timeout, tocb=ontimeout callback 
function TS_AJX(c,m,a,scb,ecb,to,tocb) {
	var ajxparams = { 'ajx_c':c, 'ajx_m':m, 'ajx_a':a };
	
	// we serialize ajxParams so we can send one big wddx string
	var mySer = new WddxSerializer;
	var myWDDXPacket = mySer.serialize(ajxparams);

	var thisRequest = '';
	var verb = '';
	var postdata = '';
	
	// default url
	var default_ajaxurl = '';
	if (window.ajaxAppInstanceID)
		default_ajaxurl = '/index.cfm?event=cms.showResource&resID=' + window.ajaxAppInstanceID + '&mode=stream';
	else
		default_ajaxurl = '/index.cfm?pg=ajax&mode=stream';
	var url = default_ajaxurl;
	if (window.ajaxurl) url = window.ajaxurl;

	// intercept functions
	var ts_scb = function(r) { 
		try {
			if (typeof(scb)=="function") scb(TS_AJX_parseResponse(r));
		} catch(e) { 
			if (typeof(ecb)=="function") ecb(r,e.message,e.description);
		}
	};
	var ts_ecb = function(r) { 
		var isTimeOut = (r.status==-1) ? true : false;
		if (isTimeOut && typeof(tocb)=="function") tocb(r);
		else if (typeof(ecb)=="function") ecb(r);
	};
	var callback = { success:ts_scb, failure:ts_ecb, timeout:to, cache:false };

	verb = 'POST';
	postdata = 'ajx_data=' + escape(myWDDXPacket);

	var thisRequest = { cb:callback, xhr:YAHOO.util.Connect.asyncRequest(verb,url,callback,postdata) };
	return thisRequest;
}

// main cancel function. pass in the request
function TS_AJX_Cancel(r,cb) {
	YAHOO.util.Connect.abort(r,cb);
}



/* RESPONSE PARSING FUNCTIONS FROM JSMX */
function TS_AJX_parseResponse(r) {
	var str = TS_AJX_cleanString(r.responseText);
	var xml = r.responseXML;
	//FIRST TRY IT AS XML
	if(xml != null && xml.childNodes.length) return xml;
	//NEXT TRY IT AS WDDX
	if(str.indexOf("<wddxPacket") == 0) return _parseWDDX(str);
	//NEXT TRY IT AS JSON
	try{ return eval('('+str+')'); }
	//NEXT TRY IT AS JavaScript
	catch(e){ return TS_AJX_parseJS(str); }
}
function TS_AJX_cleanString(str) {
	var rex = /\S/i;
	str = str.substring(str.search(rex),str.length);
	var i = str.indexOf("HTTP/1");
	if (i > -1) {
		str = str.substring(i, str.length);
		i = str.indexOf(String.fromCharCode(13, 10, 13, 10));
		if (i > -1) { str = str.substring(i + 2, str.length); }
	}
	return str;	
}
function TS_AJX_parseJS(str) { 
	eval(str);
	var r = eval(str.split('=')[0].replace(/\s/g,''));
	return r;
}
function _parseWDDX(str){ var wddx = xmlStr2Doc(str); var data = wddx.getElementsByTagName("data"); return _parseWDDXnode(data[0].firstChild); } function xmlStr2Doc(str){ var xml; if(typeof(DOMParser) == 'undefined'){ xml=new ActiveXObject("Microsoft.XMLDOM"); xml.async="false"; xml.loadXML(str); }else{ var domParser = new DOMParser(); xml = domParser.parseFromString(str, 'application/xml'); } return xml; } function _parseWDDXnode(n){ var val; switch(n.tagName){ case 'string': val = _parseWDDXstring(n); break; case 'number': val = parseFloat(n.firstChild.data); break; case 'boolean': val = n.getAttribute('value'); break; case 'dateTime': val = Date(n.firstChild.data); break; case 'array': val = _parseWDDXarray(n); break; case 'struct': val = _parseWDDXstruct(n); break; case 'recordset': val = _parseWDDXrecordset(n); break; case 'binary': val = n.firstChild.data; break; case 'char': val = _parseWDDXchar(n);; break; case 'null': val = ''; break; default: val = n.tagName; break; } return val; } function _parseWDDXstring(node){ var items = node.childNodes; var str = ''; for(var x=0;x < items.length;x++){ if(typeof(items[x].data) != 'undefined') str += items[x].data; else str += _parseWDDXnode(items[x]); } return str; } function _parseWDDXchar(node){ switch(node.getAttribute('code')){ case '0d': return '\r'; case '0c': return '\f'; case '0a': return '\n'; case '09': return '\t'; } } function _parseWDDXarray(node){ var items = node.childNodes; var arr = new Array(); for(var i=0;i < items.length;i++){ arr[i] = _parseWDDXnode(items[i]); } return arr; } function _parseWDDXstruct(node){ var items = node.childNodes; var obj = new Object(); for(var i=0;i < items.length;i++){ obj[items[i].getAttribute('name').toLowerCase()] = _parseWDDXnode(items[i].childNodes[0]); } return obj; } function _parseWDDXrecordset(node){ var qry = new Object(); var fields = node.getElementsByTagName("field"); var items; var dataType; var values; for(var x = 0; x < fields.length; x++){ items = fields[x].childNodes; values = new Array(); for(var i = 0; i < items.length; i++){ values[values.length] = _parseWDDXnode(items[i]); } qry[fields[x].getAttribute('name').toLowerCase()] = values; } return qry; }

