//<![CDATA[
/*************** ajax library *******************************
    // msie does not recognize "this" keyword for objects
***********************************************************************/
var value_sep = String.fromCharCode(0x4);
var fld_sep=String.fromCharCode(0x1);
var row_sep=String.fromCharCode(0x2);
var line_sep=String.fromCharCode(0x3);
var dquote_sep=String.fromCharCode(0x5);
var squote_sep=String.fromCharCode(0x6);

function getXmlHttpObj () {
    var xmlHttp = null;
    try {
        xmlHttp = new XMLHttpRequest();
    }
    catch (ex) {
        // update this list as msie mutates
        var activex_id_list = new Array ("MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");
        var found_xml = false;
        for (var x=0; x<activex_id_list.length; x++) {
            try {
                xmlHttp = new ActiveXObject(activex_id_list[x]);
                found_xml = true;
            }
            catch (ex) {
                ;
            }
        }    
        if (!found_xml) {
            throw new Error ("Unable to create XMLHttpRequest");
            return (null);
        }
    }
    return xmlHttp;
}
function execProgram (XmlObj, func, url_server_prog, params, method_form) {
    // func is the javascript function xmlobj executes when it returns
    //      do not enclose in quotes
    // usrl_server_prog is the application xmlobj calls on the server
    var form_method = "POST";
    var DEBUG_AJAX = true;
    if (method_form)
	form_method=method_form;
    try {
	XmlObj.open (form_method, url_server_prog, true);
	XmlObj.onreadystatechange = func; 
	XmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	if (params)
	    XmlObj.send (params);
	else
	    XmlObj.send();
    }
    catch (ex) {
	if (DEBUG_AJAX)
	    alert("ERROR from execProgram(): "+ex);
    }
}
function ajaxCall (program, params, return_program, form_method) {
    var rprog = return_program;
    var AjaxCallObj = getXmlHttpObj();
    // put link to object in return program as <return javascript function name>+".xobj"
    var cmd = rprog+".xobj = AjaxCallObj";
    eval(cmd);
    
    try { 
        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
    }
    catch (ex) {
        ;
    }
    
    try {
	if (form_method)
	    execProgram (AjaxCallObj, eval(rprog), program, params, form_method); 
        else
	    execProgram (AjaxCallObj, eval(rprog), program, params); 
    }
    catch (ex) {
        alert ("[ajaxCall] "+ex);
    }
}

function ajaxReturn () {
    // returns responseText in an alert statement
    if (ajaxReturn.xobj!=null && ajaxReturn.xobj.readyState==4){
        if (ajaxReturn.xobj.status == 200) {
            alert (ajaxReturn.xobj.responseText);
        }
        else {
            alert (ajaxReturn.xobj.responseText);
        }
        ajaxReturn.xobj=null;
    }
}    

/*
	URL ESCAPE CODES

     CHAR     ESC
     ------   ----
     SPACE    %20
     #        %23
     $        %24
     %        %25
     &        %26
     /        %2F
     :        %3A
     ;        %3B
     <        %3C
     =        %3D
     >        %3E
     ?        %3F
     @        %40
     [        %5B
     \        %5C
     ]        %5D
     ^        %5E
     `        %60
     {        %7B
     |        %7C
     }        %7D
     ~        %7E

*/


function escapeParam (s) {
    var retval = "";
    for (var x=0; x<s.length; x++) {
	if (s.charAt(x)=="&") {
	    retval += "%26";
	}
	else if (s.charAt(x)=="%")
	    retval += "%25";
	/*
	else if (s.charAt(x)=="'")
	    retval += "%27";
	*/
	else if (s.charAt(x)=="?")
	    retval += "%3F";
	else
	    retval += s.charAt(x);
    }
    return (retval);
}

function unescapeParam (s) {
    var t = s;
    t.replace (/%26/g,"&");
    t.replace (/%25/g,"%");
    //t.replace (/%27/g,"'");
    t.replace (/%3F/g,"?");
    return (t);
}


function assembleFormParameter2 (form) {
    return assembleFormParameter(form);
}

function assembleFormParameter (form) {
    var param="";
    for (var x=0; x<form.elements.length; x++) {
        tag_name = form.elements[x].tagName.toLowerCase();
	if (form.elements[x].type)
	    elem_type = form.elements[x].type.toLowerCase();
        if (elem_type && tag_name=="input") {
            if (elem_type=="text" || elem_type=="hidden" || elem_type=="password") {
                param = param + "&"+form.elements[x].name+"="+escapeParam(form.elements[x].value);
            }
            else if (elem_type=="radio") {
		if (form.elements[x].checked)
		    param = param + "&"+form.elements[x].name+"="+escapeParam(form.elements[x].value);
	    }
            else if (elem_type=="checkbox") {
		if (form.elements[x].checked) {
		    v = form.elements[x].value;
		    if (v=='')
			v='ON';
		    param = param + "&"+form.elements[x].name+"="+escapeParam(v);
		}
	    }
	    else if (elem_type=="button") {
		;
	    }
	    else {
		if (form.elements[x].name != "")
		    param = param + "&"+form.elements[x].name+"="+escapeParam(form.elements[x].value);
	    }
        }
        else if (tag_name=="hidden") {
            param = param + "&"+form.elements[x].name+"="+escapeParam(form.elements[x].value);
        }
        else if (tag_name=="textarea") {
            param = param + "&"+form.elements[x].name+"="+escapeParam(form.elements[x].value);
        }
        else if (tag_name=="select") {
            try {
                var t = form.elements[x];
                if (t.id.toLowerCase()!="diag_record") {
                    var ndx = (t.selectedIndex>-1?t.selectedIndex:-1);
                    param = param + "&"+t.name+"="+(ndx>-1?escapeParam(t.options[ndx].value):"ERROR");
                }
            }
            catch (ex) {
                alert ("select field: "+t.id+"\n"+ex);
            }
        }
	else if (tag_name=="button") {
	    ;
	}
        else {
            param = param + "&"+form.elements[x].name+"="+form.elements[x].value;
        }
    }
    return (param.substring(1));  // drop leading ampersand
}


/*************** SAMPLE RECEIVING PROGRAM FOR USE WITH ajaxCall **
        // javascript call 
    function getList (action, div_id) {
	getListReturn.action = action.toUpperCase();
	getListReturn.dest_div = div_id;
	//var param = "session_token="+getCookie("mpda_session_token")+"&action=SAMPLE"+"&"+ assembleFormParameter(form);
	var param = "action="+action.toUpperCase();
	ajaxCall("http://www.mpda.umd.edu:8181/download.jsp",param,"getListReturn");
    }
    // return function 
    function getListReturn () {
	if (getListReturn.xobj!=null && getListReturn.xobj.readyState==4){
	    if (getListReturn.xobj.status == 200) {
		var d = document.getElementById(getListReturn.dest_div);
		if (d) {
		    // if (action=="")
		    d.innerHTML = getListReturn.xobj.responseText;
		}
	    }
	    else {
		alert (getListReturn.xobj.responseText);
	    }
	    getListReturn.xobj=null;
	}
    }
*/

function getColIndex (field_name_list, field_name) {
    for (var x=0; x<field_name_list.length; x++) {
        if (String(trim(field_name_list[x])).toUpperCase() == String(trim(field_name)).toUpperCase()) 
            return (x);
    }
    return (-1);
}
function makeAssocArray (str) {
    // assumes first line is the command, second line the field names
    var line="";
    try {
        var ar = str.split(String.fromCharCode(0x10));
        var fld=chomp(String(ar[1])).split(String.fromCharCode(0x1));
        for (var x=2; x<ar.length; x++) {
            var o = new Object();
            line = chomp(String(ar[x])).split(String.fromCharCode(0x1));
            for (y=0; y<fld.length; y++) {
                var fld_y = (fld[y]==null?"":String(fld[y]));
                var line_y = (line[y]==null?"":trim(String(line[y])));
                var t = "o."+fld_y + "=\"" + line_y + "\"";
                eval(t);
            }
            ar[x] = o;
        }
        return (ar);
    }
    catch (ex) {
        alert("makeAssocArray()[1]: \n"+ex);
        alert("makeAssocArray()[2]: \n"+line);
        return null;
    }
}

function webStats(java_path) {
    try {
	var param = "page_called="+window.location;
	ajaxCall(java_path+"/web_stats.jsp",param,"webStatsReturn");
    }
    catch (ex) {
	;
    }
}
function webStatsReturn() {
    if (String(webStatsReturn.xobj.responseText).indexOf("ERROR::")==0)
	alert (webStatsReturn.xobj.responseText);
}


function readFile (file_name, dest_div, java_file_name, return_function, strip_html) {
    readFileReturn.file_name = file_name;
    readFileReturn.dest_div = dest_div;
    if (strip_html)
	readFileReturn.strip = strip_html;
    else
	readFileReturn.strip = true;
    var param = "file_name="+file_name+"&dest_div="+dest_div;
    var return_f = "readFileReturn";
    if (return_function && return_function != null)
	return_f = return_function;
    var java_fname = "http://lymantria2.umd.edu/js/readFile.jsp";
    if (java_file_name)
	java_fname = java_file_name;
    ajaxCall(java_fname, param, return_f);
}

function readFileReturn () {
    if (readFileReturn.xobj!=null && readFileReturn.xobj.readyState==4){
	var d = document.getElementById(readFileReturn.dest_div);
	if (readFileReturn.xobj.status == 200) {
	    if (d) {
		if (readFileReturn.strip) {
		    var a = readFileReturn.xobj.responseText.toLowerCase().indexOf("<body");
		    var b = readFileReturn.xobj.responseText.toLowerCase().indexOf("</body>");
		    if (a==-1 && b==-1)
			d.innerHTML = readFileReturn.xobj.responseText;
		    else if (a>=0 && b>=0) {
			a = readFileReturn.xobj.responseText.toLowerCase().indexOf(">",a);
			d.innerHTML = readFileReturn.xobj.responseText.substring(a+1,b);
		    }
		    else
			d.innerHTML = "ERROR::1: UNKNOWN ERROR\n"+(a)+"\n"+(b);
		}
		else
		    d.innerHTML = readFileReturn.xobj.responseText;
	    }
	}
	else {
	    if (d)
		d.innerHTML = readFileReturn.xobj.responseText;
	    alert (readFileReturn.xobj.responseText);
	}
	readFileReturn.xobj=null;
    }
}

function writeForm (form, text_file_name, java_file_name) {
    // write raw form to ascii file
    var s = assembleFormParameter(form);
    if (s) {
	return (writeFile (text_file_name,null,java_file_name,s));
    }
    else
	return null;
}
function writeFileNoReturn (java_prog_path, ajax_param) {
	ajaxCall(java_prog_path, ajax_param, "writeFileNoReturn_Return");
}
function writeFileNoReturn_Return () {
	var DEBUG_NR = false;
	if (DEBUG_NR) {
    	if (writeFileNoReturn_Return.xobj!=null && writeFileNoReturn_Return.xobj.readyState==4){
			var d = document.getElementById(writeFileNoReturn_Return.dest_div);
			if (writeFileNoReturn_Return.xobj.status == 200) {
				alert (writeFileNoReturn_Return.response_text);
			}
		}
	}
	return false;
}

function writeFile (file_name, dest_div, java_file_name, char_string) {
    writeFileReturn.file_name = file_name;
    writeFileReturn.dest_div = dest_div;
    var s="";
    for (var x=0; x<char_string.length; x++) {
	if (char_string.charCodeAt(x)==38)
	    s+="::";
	else if (char_string.charCodeAt(x)==13 || char_string.charCodeAt(x)==10)
	    s+=" ";
	else if (char_string.charAt(x)=='\n')
	    s+=" ";
	else
	    s+=char_string.charAt(x);
    }
    var param = "file_name="+file_name+"&dest_div="+dest_div+"&char_string="+s;
    // alert ("fixed-string:"+param);
    ajaxCall(java_file_name,param,"writeFileReturn");
}
function writeFileReturn () {
    if (writeFileReturn.xobj!=null && writeFileReturn.xobj.readyState==4){
	var d = document.getElementById(writeFileReturn.dest_div);
	if (writeFileReturn.xobj.status == 200) {
	    if (writeFileReturn.xobj.responseText.indexOf("ERROR")>0)
		alert (writeFileReturn.xobj.responseText);
	    if (d && d.length()>0) {
		d.innerHTML = writeFileReturn.xobj.responseText;
	    }
	}
	else {
	    if (d)
		d.innerHTML = writeFileReturn.xobj.responseText;
	    alert (writeFileReturn.xobj.responseText);
	}
	writeFileReturn.xobj=null;
    }
}


//]]>


