

var asyn_imported = 0;
var asyn_imported_article = 0;
var asyn_imported_journal = 0;
var asyn_imported_cvrs = 0;
var asyn_isIE =  (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) ;
var asyn_srcs = new Array();
var asyn_reportErrors = new Array();
var asyn_reportErrorCheckHandles = new Array();
var asyn_timeouts = new Array();
var asyn_timeoutRems = new Array();
var asyn_errors = new Array();
var asyn_rets = new Array();
var checkPeriod = 100;
var asyn_returnObject = new Array();
var asyn_returnXMLObject = new Array();
var asyn_errorMsgs = new Array();

var user_defined_error = -10240;

function asyn_setSuccess(asynReqId){
	asyn_rets[asynReqId] = true;
}

function asyn_notifyReturn(asynReqId, obj){
	var i = asynReqId;
	var curSrc = asyn_srcs[i];
	var curReportError = asyn_reportErrors[i];
	var curTimeout = asyn_timeouts[i];
	curReportError(asynReqId, curSrc, 0, obj);
}

function asyn_addReturnObject(asynReqId, obj){
	asyn_setSuccess(asynReqId);
	asyn_returnObject[asynReqId] = obj;
	asyn_notifyReturn(asynReqId, obj);
}

function asyn_getReturnObject(asynReqId){
	return asyn_returnObject[asynReqId];
}

function asyn_setError(asynReqId, errorCode, errorMsg){
	asyn_rets[asynReqId] = true;
	asyn_errors[asynReqId] = errorCode;
	asyn_errorMsgs[asynReqId] = errorMsg;
}

//attrs: childNodes(Array),nodeName, nodeValue;innerText
//funs:  getAttribute()
function asyn_getReturnXMLObject(asynReqId){
	return asyn_returnXMLObject[asynReqId];
}

function asyn_clearReturnObject(asynReqId){
	 asyn_returnObject[asynReqId] = null;
} 

function asyn_addReturnXMLObject(asynReqId, xml){
	asyn_setSuccess(asynReqId);
	var root = null;
	if (asyn_isIE){
		var doc=new ActiveXObject("Microsoft.XMLDOM"); 
		doc.async="false"; 
		doc.loadXML(xml); 
		if (doc.childNodes.length >= 1){
			root = doc.childNodes[1];
		}else{
			root = doc.childNodes[0];
		}
		
	}	else{
		var parser = new DOMParser();
		var dom = parser.parseFromString(xml, "text/xml");
		if (dom.documentElement.nodeName == "parsererror"){ // error when parsing
		}
		root = dom.documentElement;
	}
	asyn_returnXMLObject[asynReqId] = root;
	asyn_notifyReturn(asynReqId, root);
/*	alert("root" + root.nodeName);
	for (var i = 0; i <root.childNodes.length; i++){
		alert("n:"+root.childNodes[i].nodeName);
		alert("v:" + root.childNodes[i].nodeValue);
	}
*/
}


function asyn_private_reportErrorProxy(asynReqId){
	var i = asynReqId;
	var curSrc = asyn_srcs[i];
	var curReportError = asyn_reportErrors[i];
	var curTimeout = asyn_timeouts[i];
	asyn_timeoutRems[i] -= checkPeriod;
	if (asyn_rets[i]){
		clearInterval(asyn_reportErrorCheckHandles[i]);
		if (asyn_errors[i] < 0){
			curReportError(asynReqId, curSrc, asyn_errors[i], asyn_errorMsgs[asynReqId]);
		}
	}else if (asyn_timeoutRems[i] <= 0){
		clearInterval(asyn_reportErrorCheckHandles[i]);
		curReportError(asynReqId, curSrc, curTimeout, asyn_errorMsgs[asynReqId]);
	}
}

function asyn_private_import(asynReqId){
	var i = asynReqId;
	//alert(i);
	var s = document.createElement("script");
	var curSrc = asyn_srcs[i];
	var curReportError = asyn_reportErrors[i];
	var curTimeout = asyn_timeouts[i];
	s.setAttribute("src", curSrc);
	//alert(curSrc);
	//alert(curSrc);
	var curreportErrorCheckHandle = setInterval("asyn_private_reportErrorProxy(" + asynReqId+");", checkPeriod);
	asyn_reportErrorCheckHandles[i] = curreportErrorCheckHandle;
	document.body.appendChild(s);
}

//resultHandler --> function (asynReqId, jsSrc, timeoutOrErrorCode, resultObject);

function asyn_import(jsSrc, timeout, resultHandler){
	asyn_imported++;
	//var l = "<script src='" + jsSrc + "'>";
	//var l = jsSrc;
	//var curSrcVar = "asyn_src_"+asyn_imported;
	//eval(curSrcVar + " = \"" + l + "\";");
	//alert(curVar + "=" + l);
	//document.writeln(l));
	var ic = asyn_imported;
	jsSrc += "&edu_calis_asyn_asynReqId=" + ic;
	asyn_srcs[ic] = jsSrc;
	asyn_reportErrors[ic] = resultHandler;
	asyn_timeouts[ic] = 	asyn_timeoutRems[ic] = timeout;
	asyn_rets[ic] = false;
	setTimeout("asyn_private_import(" + ic + ");", 0);
	return ic;
}
function asyn_import_cvrs(jsSrc, timeout, resultHandler){
	//alert("cvrs_rls");
	asyn_imported_cvrs++;
	//var l = "<script src='" + jsSrc + "'>";
	//var l = jsSrc;
	//var curSrcVar = "asyn_src_"+asyn_imported;
	//eval(curSrcVar + " = \"" + l + "\";");
	//alert(curVar + "=" + l);
	//document.writeln(l));
	var ic = 1;
	jsSrc += "&edu_calis_asyn_asynReqId=" + ic;
	asyn_srcs[ic] = jsSrc;
	asyn_reportErrors[ic] = resultHandler;
	asyn_timeouts[ic] = 	asyn_timeoutRems[ic] = timeout;
	asyn_rets[ic] = false;
	setTimeout("asyn_private_import(" + ic + ");", 0);
	return ic;
}
function asyn_import_article(jsSrc, timeout, resultHandler){
	asyn_imported_article++;
	//var l = "<script src='" + jsSrc + "'>";
	//var l = jsSrc;
	//var curSrcVar = "asyn_src_"+asyn_imported;
	//eval(curSrcVar + " = \"" + l + "\";");
	//alert(curVar + "=" + l);
	//document.writeln(l));
	var ic = asyn_imported_article;
	jsSrc += "&edu_calis_asyn_asynReqId=" + ic;
	asyn_srcs[ic] = jsSrc;
	asyn_reportErrors[ic] = resultHandler;
	asyn_timeouts[ic] = 	asyn_timeoutRems[ic] = timeout;
	asyn_rets[ic] = false;
	setTimeout("asyn_private_import(" + ic + ");", 0);
	return ic;
}
function asyn_import_journal(jsSrc, timeout, resultHandler){
	asyn_imported_journal++;
	//var l = "<script src='" + jsSrc + "'>";
	//var l = jsSrc;
	//var curSrcVar = "asyn_src_"+asyn_imported;
	//eval(curSrcVar + " = \"" + l + "\";");
	//alert(curVar + "=" + l);
	//document.writeln(l));
	var ic = asyn_imported_journal;
	jsSrc += "&edu_calis_asyn_asynReqId=" + ic;
	asyn_srcs[ic] = jsSrc;
	asyn_reportErrors[ic] = resultHandler;
	asyn_timeouts[ic] = 	asyn_timeoutRems[ic] = timeout;
	asyn_rets[ic] = false;
	setTimeout("asyn_private_import(" + ic + ");", 0);
	return ic;
}
