var m_ajax_req_os=false;
var m_http;
var m_ajax_responsehandler;
var m_ajax_errorhandler;
var m_ajax_error=0;
var m_ajax_post_return_msgid;		//id of element to put return message into
//////////////////////////////////////
//	 ajax_req	
//////////////////////////////////////
function ajax_req(url,postmsg,responsehandler,errhandler){
	


//    NB:  each part of postmsg needs to be encoded using encodeURIComponent

      if (m_ajax_req_os) {alert("Waiting for server"); return;}
	  
//	send a posted field to show from ajax in case want to restrict to that
	  if (postmsg !="") postmsg +="&ajax=true";
	  else postmsg="ajax=true";
	  

      m_http=AJAX();
      if (!m_http) {alert("Your browser does not support AJAX");return;}
      m_ajax_responsehandler=responsehandler;
	  m_ajax_errorhandler=errhandler;
      m_http.onreadystatechange=ajax_StateChange;
      m_http.open("POST", url, true); 
      m_http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	    
      m_http.send(postmsg); 
      m_ajax_req_os=true;
}


///////////////////////////////
//		AJAX
///////////////////////////////

function AJAX()
  {
  var xmlHttp;
  try
    {
    // Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
    }
  catch (e)
    {
    // Internet Explorer
    try
      {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      }
    catch (e)
      {
      try
        {
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
      catch (e)
        {
        return false;
        }
      }
    }
   return xmlHttp;
}







function ajax_StateChange(){  /////magic number = 9362
	
	
		
	if (m_http.readyState !=4)  return;	
	


	m_ajax_req_os=false;				//reset req_os flag
	
		
	var responsetext=m_http.responseText;	
	  

	var i=responsetext.substr(0,10).indexOf("9362");


	if (i==-1) {  //response does not contain 9362 so it's an error
		m_ajax_errorhandler(responsetext);
		return;
	}
	

        
	var response=responsetext.substr(i+4);
	
	
	m_ajax_responsehandler(response);
	
	


}

function write_msg(msg){
	var win=window.open();
	win.document.write(msg);
}


///////////////////////////////////////////
//		unserialize
//////////////////////////////////////////

function unserialize ( inp ) {
    // http://kevin.vanzonneveld.net
 

    m_ajax_error=0;
    if (inp == "" || inp.length < 2) {
        m_ajax_error = "01 input is too short";
        return 0;
    }
    var val, kret, vret, cval;
    var type = inp.charAt(0);
    var cont = inp.substring(2);
    var size = 0, divpos = 0, endcont = 0, rest = "", next = "";
 
    switch (type) {
    case "N": // null
        if (inp.charAt(1) != ";") {
            m_ajax_error = "12 missing ; for null";
			return 0;
        }
        // leave val undefined
        rest = cont;
        break;
    case "b": // boolean
        if (!/[01];/.test(cont.substring(0,2))) {
            m_ajax_error = "223 value not 0 or 1, or missing ; for boolean";
			return 0;
        }
        val = (cont.charAt(0) == "1");
        rest = cont.substring(2);  //changed...
        break;
    case "s": // string
        val = "";
        divpos = cont.indexOf(":");
        if (divpos == -1) {
            m_ajax_error = "87 missing : for string";
			return 0;
           
        }
        size = parseInt(cont.substring(0, divpos));
        if (size == 0) {
            if (cont.length - divpos < 4) {
                m_ajax_error = "340 string is too short";
                return 0;
            }
            rest = cont.substring(divpos + 4);
            break;
        }
        if ((cont.length - divpos - size) < 4) {
            m_ajax_error = "745 string is too short";
            return 0;
        }
        if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\";") {
            m_ajax_error = "string is too long, or missing \";";
			return 0;
        }
        val = cont.substring(divpos + 2, divpos + 2 + size);
        rest = cont.substring(divpos + 4 + size);
        break;
    case "i": // integer
    case "d": // float
        endcont=-1;
        for (var i = 0; i < cont.length; i++) {
            if (cont.charAt(i)==";") {
				endcont=i;
				break;
			}
        }
        if (endcont==-1){
            m_ajax_error = "885 missing or invalid value, or missing ; for int/float";
			return 0;
        }
        val = cont.substring(0, endcont);
        val = (type == "i" ? parseInt(val) : parseFloat(val));
        rest = cont.substring(endcont + 1);
		break;
    case "a": // array
        if (cont.length < 4) {
            m_ajax_error = "943 array is too short";
            return 0;
        }
        divpos = cont.indexOf(":", 1);
        if (divpos == -1) {
            m_ajax_error = "239 missing : for array";
            return 0;
        }
        size = parseInt(cont.substring(1*divpos, 0));  //changed...
        cont = cont.substring(divpos + 2);
        val = new Array();
        if (cont.length < 1) {
            m_ajax_error = "347 array is too short";
            return 0;
        }
        for (var i = 0; i + 1 < size * 2; i += 2) {
            kret = unserialize(cont, 1);
            if (m_ajax_error || kret[0] == undefined || kret[1] == "") {
                m_ajax_error = "8820 missing or invalid key, or missing value for array";
                return; 0
            }
            vret = unserialize(kret[1], 1);
            if (m_ajax_error) return 0;
			
            val[kret[0]] = vret[0];
            cont = vret[1];
        }
        if (cont.charAt(0) != "}") {
            m_ajax_error = "174 missing ending }, or too many values for array";
            return 0;
        }
        rest = cont.substring(1);
        break;
    case "O": // object
        divpos = cont.indexOf(":");
        if (divpos == -1) {
            m_ajax_error = "2234 missing : for object";
            return 0;
        }
        size = parseInt(cont.substring(0, divpos));
        var objname = cont.substring(divpos + 2, divpos + 2 + size);
        if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\":") {
            m_ajax_error = "901 object name is too long, or missing \":";
            return 0 ;
        }
        var objprops = unserialize("a:" + cont.substring(divpos + 4 + size), 1);
        if (error) {
            m_ajax_error = "2230 invalid object properties";
            return 0 ;
        }
        rest = objprops[1];
        var objout = "function " + objname + "(){";
        for (key in objprops[0]) {
            objout += "" + key + "=objprops[0]['" + key + "'];";
        }
        objout += "}val=new " + objname + "();";
        eval(objout);
        break;
    default:
        m_ajax_error = "999 invalid input type (="+type+")";
		return 0;
    }
    return (arguments.length == 1 ? val : [val, rest]);
}

/////////////////////////////
//		ajax_form_msg
/////////////////////////////
function ajax_form_msg(formid,extramsg){
	
	if (formid){
		var container=document.getElementById(formid);
		if (!container) {alert("Cannot find post data container"); return 0;}
		var list1=container.getElementsByTagName("INPUT");
		var list2=container.getElementsByTagName("TEXTAREA");
		var list3=container.getElementsByTagName("SELECT");	
	}	
	else{
		var list1=document.getElementsByTagName("INPUT");
		var list2=document.getElementsByTagName("TEXTAREA");
		var list3=document.getElementsByTagName("SELECT");	
	}
	
	var msg="ajax=true";
	var j=0;
	var elt;
	for (j=0;j<list1.length;j++){
		elt=list1[j];
		if (elt.getAttribute("notblank")){
			if (!elt.value) {alert(elt.id + " must not be empty"); return 0;}
		}
		
		if ((elt.type=="checkbox") || (elt.type=="radio")){
			var val=(elt.checked)?1:0;
			msg +="&"+elt.id+"="+val;
		}
		else msg +="&"+elt.id+"="+encodeURIComponent(elt.value);
	}
	for (j=0;j<list2.length;j++){
		elt=list2[j];
		if (elt.getAttribute("notblank")){
			if (elt.value=="") {alert(elt.id + " must not be empty"); return 0;}
		}
		msg +="&"+elt.id+"="+encodeURIComponent(elt.value);
	}
	for (j=0;j<list3.length;j++){
		elt=list3[j];
		msg +="&"+elt.id+"="+encodeURIComponent(elt.value);
	}	

	if (extramsg) msg += "&"+extramsg;
	
	
	
	return msg;
	
	
}
	

/////////////////////////////////
//			post_data
//////////////////////////////////
function ajax_post(url,msgid,containerid,extramsg,presubmit){
	
	if (presubmit) {
		if (!presubmit()) return;
	}
	
	m_ajax_post_return_msgid=msgid;
	
	var msg=ajax_form_msg(containerid,extramsg);
	if (!msg) return 0;
		
	ajax_req(url,msg,ajax_post_ret,server_error);
}


function ajax_post_ret(s){
	var elt=document.getElementById(m_ajax_post_return_msgid);
	if (!elt) return;
	
	if (s.match(/\</)) elt.innerHTML=s;
	else alert(s);
}

