// ===================================================================
// Author: Matt Kruse <matt@ajaxtoolbox.com>
// WWW: http://www.AjaxToolbox.com/
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. You may
// remove this notice from your final code if you wish, however it is
// appreciated by the author if at least my web site address is kept.
//
// You may *NOT* re-distribute this code in any way except through its
// use. That means, you can include it in your product, or your web
// site, or any other form where the code is actually being used. You
// may not put the plain javascript up on your site for download or
// include it in your javascript libraries for download. 
// If you wish to share this code with others, please just point them
// to the URL instead.
// Please DO NOT link directly to my .js files from your site. Copy
// the files to your server and use them there. Thank you.
// ===================================================================

function AjaxRequest(){var req =new Object();
req.timeout =null;
req.generateUniqueUrl =true;
req.url =window.location.href;
req.method ="GET";
req.async =true;
req.hasError=false;
req.username =null;
req.password =null;
req.parameters =new Object();
req.requestIndex =AjaxRequest.numAjaxRequests++;
req.responseReceived =false;
req.groupName =null;
req.queryString ="";
req.responseText =null;
req.responseXML =null;
req.status =null;
req.statusText =null;
req.aborted =false;
req.xmlHttpRequest =null;
req.onTimeout=null;
req.onLoading=null;
req.onLoaded=null;
req.onInteractive=null;
req.onComplete=null;
req.onSuccess=null;
req.onError=null;
req.onGroupBegin=null;
req.onGroupEnd=null;
req.xmlHttpRequest =AjaxRequest.getXmlHttpRequest();
if(req.xmlHttpRequest==null){return null;}req.xmlHttpRequest.onreadystatechange =
function(){if(req==null || req.xmlHttpRequest==null){return;}if(req.xmlHttpRequest.readyState==1){req.onLoadingInternal(req);}if(req.xmlHttpRequest.readyState==2){req.onLoadedInternal(req);}if(req.xmlHttpRequest.readyState==3){req.onInteractiveInternal(req);}if(req.xmlHttpRequest.readyState==4){req.onCompleteInternal(req);}};
req.onLoadingInternalHandled=false;
req.onLoadedInternalHandled=false;
req.onInteractiveInternalHandled=false;
req.onCompleteInternalHandled=false;
req.onLoadingInternal=
function(){if(req.onLoadingInternalHandled){return;}AjaxRequest.numActiveAjaxRequests++;
if(AjaxRequest.numActiveAjaxRequests==1 && typeof(window['AjaxRequestBegin'])=="function"){AjaxRequestBegin();}if(req.groupName!=null){if(typeof(AjaxRequest.numActiveAjaxGroupRequests[req.groupName])=="undefined"){AjaxRequest.numActiveAjaxGroupRequests[req.groupName] =0;}AjaxRequest.numActiveAjaxGroupRequests[req.groupName]++;
if(AjaxRequest.numActiveAjaxGroupRequests[req.groupName]==1 && typeof(req.onGroupBegin)=="function"){req.onGroupBegin(req.groupName);}}if(typeof(req.onLoading)=="function"){req.onLoading(req);}req.onLoadingInternalHandled=true;};
req.onLoadedInternal=
function(){if(req.onLoadedInternalHandled){return;}if(typeof(req.onLoaded)=="function"){req.onLoaded(req);}req.onLoadedInternalHandled=true;};
req.onInteractiveInternal=
function(){if(req.onInteractiveInternalHandled){return;}if(typeof(req.onInteractive)=="function"){req.onInteractive(req);}req.onInteractiveInternalHandled=true;};
req.onCompleteInternal=
function(){if(req.onCompleteInternalHandled || req.aborted){return;}req.onCompleteInternalHandled=true;
AjaxRequest.numActiveAjaxRequests--;
if(AjaxRequest.numActiveAjaxRequests==0 && typeof(window['AjaxRequestEnd'])=="function"){AjaxRequestEnd(req.groupName);}if(req.groupName!=null){AjaxRequest.numActiveAjaxGroupRequests[req.groupName]--;
if(AjaxRequest.numActiveAjaxGroupRequests[req.groupName]==0 && typeof(req.onGroupEnd)=="function"){req.onGroupEnd(req.groupName);}}req.responseReceived =true;
req.status =req.xmlHttpRequest.status;
req.statusText =req.xmlHttpRequest.statusText;
req.responseText =req.xmlHttpRequest.responseText;
req.responseXML =req.xmlHttpRequest.responseXML;
if(typeof(req.onComplete)=="function"){req.onComplete(req);}if(req.xmlHttpRequest.status==200 && typeof(req.onSuccess)=="function"){req.onSuccess(req);}else if(typeof(req.onError)=="function"){req.onError(req);}delete req.xmlHttpRequest['onreadystatechange'];
req.xmlHttpRequest =null;};
req.onTimeoutInternal=
function(){if(req!=null && req.xmlHttpRequest!=null && !req.onCompleteInternalHandled){req.aborted =true;
req.xmlHttpRequest.abort();
AjaxRequest.numActiveAjaxRequests--;
if(AjaxRequest.numActiveAjaxRequests==0 && typeof(window['AjaxRequestEnd'])=="function"){AjaxRequestEnd(req.groupName);}if(req.groupName!=null){AjaxRequest.numActiveAjaxGroupRequests[req.groupName]--;
if(AjaxRequest.numActiveAjaxGroupRequests[req.groupName]==0 && typeof(req.onGroupEnd)=="function"){req.onGroupEnd(req.groupName);}}if(typeof(req.onTimeout)=="function"){req.onTimeout(req);}delete req.xmlHttpRequest['onreadystatechange'];
req.xmlHttpRequest =null;}};
req.process =
function(){if(req.xmlHttpRequest!=null){
	
	if(req.generateUniqueUrl && req.method=="GET"){
		req.parameters["AjaxRequestUniqueId"] =new Date().getTime() + "" + req.requestIndex;
	} 
	var content =null;
	
	for(var i in req.parameters){
		if(req.queryString.length>0){req.queryString +="&";}
		req.queryString +=encodeURIComponent(i) + "=" + encodeURIComponent(req.parameters[i]);
	}
	if(req.method=="GET"){
		if(req.queryString.length>0){
			req.url +=((req.url.indexOf("?")>-1)?"&":"?") + req.queryString;
		}
	}
	req.xmlHttpRequest.open(req.method,req.url,req.async,req.username,req.password);
        if(req.method=="POST"){
        	if(typeof(req.xmlHttpRequest.setRequestHeader)!="undefined"){
        		req.xmlHttpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
        	}
        	
        	content =req.queryString;
        	//alert(content);
        }
        
        if(req.timeout>0){setTimeout(req.onTimeoutInternal,req.timeout);}
        
        req.xmlHttpRequest.send(content);
   }
};
req.handleArguments =
function(args){for(var i in args){if(typeof(req[i])=="undefined"){req.parameters[i] =args[i];}else{req[i] =args[i];}}};
req.getAllResponseHeaders =
function(){if(req.xmlHttpRequest!=null){if(req.responseReceived){return req.xmlHttpRequest.getAllResponseHeaders();}alert("Cannot getAllResponseHeaders because a response has not yet been received");}};
req.getResponseHeader =
function(headerName){if(req.xmlHttpRequest!=null){if(req.responseReceived){return req.xmlHttpRequest.getResponseHeader(headerName);}alert("Cannot getResponseHeader because a response has not yet been received");}};
return req;}AjaxRequest.getXmlHttpRequest =function(){if(window.XMLHttpRequest){return new XMLHttpRequest();}else if(window.ActiveXObject){/*@cc_on @*/
/*@if(@_jscript_version >=5)
try{return new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(E){return null;}}@end @*/}else{return null;}};
AjaxRequest.isActive =function(){return(AjaxRequest.numActiveAjaxRequests>0);};
AjaxRequest.get =function(args){AjaxRequest.doRequest("GET",args);};
AjaxRequest.post =function(args){AjaxRequest.doRequest("POST",args);};
AjaxRequest.doRequest =function(method,args){if(typeof(args)!="undefined" && args!=null){var myRequest =new AjaxRequest();
myRequest.method =method;
myRequest.handleArguments(args);
myRequest.process();}};
AjaxRequest.submit =function(theform, args){var myRequest =new AjaxRequest();
if(myRequest==null){return false;}var serializedForm =AjaxRequest.serializeForm(theform);
myRequest.method =theform.method.toUpperCase();
myRequest.url =theform.action;
myRequest.handleArguments(args);
myRequest.queryString =serializedForm;
myRequest.process();
return true;};
AjaxRequest.serializeForm =function(theform){var els =theform.elements;
var len =els.length;
var queryString ="";
this.addField =
function(name,value){if(queryString.length>0){queryString +="&";}queryString +=escape(name) + "=" + escape(value);};
for(var i=0;i<len;i++){var el =els[i];
if(!el.disabled){switch(el.type){case 'text': case 'password': case 'hidden': case 'textarea':
this.addField(el.name,el.value);
break;
case 'select-one':
if(el.selectedIndex>=0){this.addField(el.name,el.options[el.selectedIndex].value);}break;
case 'select-multiple':
for(var j=0;j<el.options.length;j++){if(el.options[j].selected){this.addField(el.name,el.options[j].value);}}break;
case 'checkbox': case 'radio':
if(el.checked){this.addField(el.name,el.value);}break;}}}return queryString;};
AjaxRequest.numActiveAjaxRequests =0;
AjaxRequest.numActiveAjaxGroupRequests =new Object();
AjaxRequest.numAjaxRequests =0;



var Try = {
  these: function() {
    var returnValue;
    for (var i = 0; i < arguments.length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }
    return returnValue;
  }
}

function processResults(frm, req)	{
      var htmlEl;
      
      if(!req.responseXML) frm.submit();

      var response = req.responseXML.getElementsByTagName("elements");
      
      if (response == null || response.length == 0) {
      	frm.submit();
      	return;      			      
      }
      
      var xmlResponseElements=response[0].childNodes;
      for ( var i = 0 ; i < xmlResponseElements.length ; i++ ) {
         var responseElement = xmlResponseElements[i];
         if ( responseElement.nodeType != 1 )
            continue;
         
         var responseId   = responseElement.getAttribute("id");
         
         if ( (htmlEl = document.getElementById(responseId)) ) {
         	hasError=false;	
         	var str=getContentAsString(responseElement);   
         	str=decodeURIComponent(str); 
         	var re=/\+/g;   
         	var str=str.replace(re,' ');      	
         		//var onch=getOnChange(htmlEl)
			var attr=getChildrenAttr(htmlEl);
			htmlEl.innerHTML = "<select "+attr+" >"+str+"</select>";	
			//setOnChange(htmlEl,onch);		
	 }
      }
      
      prinError(req);
}

function showMessage(req,str){
	 prinError(req);
	 if(req.hasError) return;	 
	 var erel=document.getElementById("errorMessage");
	 if (erel)  erel.innerHTML='<a><b>'+str+'</b></a>';
}

function prinError(req){      
      
      var erel=document.getElementById("errorMessage");
      if ( !req.responseXML ) {
      	req.hasError=true;
      	if (erel)  erel.innerHTML='<a><b>Error processing request</b></a>';
      }
      var xerr = req.responseXML.getElementsByTagName("error");      
      if ( xerr==null || xerr.length == 0) {     
      	if (erel)  erel.innerHTML='<a><b></b></a>';	
      	req.hasError=false;
      	return false;      			      
      }
      
      req.hasError=true;
      var perr=xerr[0];
      if (perr == null)  return false;  
      var str=getContentAsString(perr);   
      str=decodeURIComponent(str); 
      var re=/\+/g;   
      var rstr=str.replace(re,' ');    	
      
      
      if ( erel) {
      	erel.innerHTML=rstr;
      }
      else {
      	alert(rstr);
      }
      
      return true;      
}

function getContentAsString( parentNode ) {
      return parentNode.xml != undefined ? 
         getContentAsStringIE(parentNode) :
         getContentAsStringMozilla(parentNode);
   }
   function getContentAsStringIE(parentNode) {
      var contentStr = "";
      for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )
         contentStr += parentNode.childNodes[i].xml;
      return contentStr;
   }
  function getContentAsStringMozilla(parentNode) {
      var xmlSerializer = new XMLSerializer();
      var contentStr = "";
      for ( var i = 0 ; i < parentNode.childNodes.length ; i++ )
         contentStr += xmlSerializer.serializeToString(parentNode.childNodes[i]);
      return contentStr;
   }

function getChildrenAttr(el){
	var oColl=el.childNodes;
	var attr=" ";
	var onch=" ";
	for(x=0;x<oColl.length;x++){
		if ( el.childNodes[x].tagName == "SELECT" ) {
			attr=attr+"name='"+el.childNodes[x].name +"'";	
			attr+=attr+" class='" + el.childNodes[x].className + "'";
			if (el.childNodes[x].onchange) {
				onch=onch+el.childNodes[x].onchange;
				var bb=onch.indexOf('{');
				var ee=onch.indexOf('}');				
				attr=attr+" onchange='"+onch.substring(bb+1,ee-1)+"'";	
				//alert(attr);
			}					
			break;
		}
		
	}
	return attr;
}

function getOnChange(el){
	var oColl=el.childNodes;
	for(x=0;x<oColl.length;x++){
		if ( el.childNodes[x].tagName == "SELECT" ) {
			if (el.childNodes[x].onchange) {
				return el.childNodes[x].onchange;
			}		
			break;
		}
		
	}
	return null;
}

function setOnChange(el,onch){
	var oColl=el.childNodes;
	for(x=0;x<oColl.length;x++){
		if ( el.childNodes[x].tagName == "SELECT" ) {
			if (el.childNodes[x].onchange) {
				alert(onch);
				el.childNodes[x].onchange=onch;
			}		
			break;
		}
		
	}
	return null;
}

function getOptValue(el){
	var val=null;	
	val=el.options[el.selectedIndex].value;
 	if (!val) val=el.options[el.selectedIndex].innerText;
 	return val;
}

function getHome(){
	return contextPath;
}

function showProgress(el){
	var pel=document.getElementById('pbar');
  	if (pel) {
  		pel.style.visibility="visible";
  	}
}
function hideProgress(el){
	var pel=document.getElementById('pbar');
  	if (pel) {
  		pel.style.visibility="hidden";
  	}
}
function useajax(el,_class,_id){
 
 /*@if(@_jscript_version >=5) jsver=1.5;@end @*/
 if (!jsver) {
 	el.form.submit();
 	return;
 }
  
  var pel=document.getElementById("pbar");
  if (pel) {
  	pel.style.visibility="visible";
  }
   
  var callMethod=false;  
  var theForm=el.form;
  var query="class="+_class+"&id="+_id+"&method=setNoError";  
  if(theForm.ch && theForm.ch.value)
    query+="&ch="+theForm.ch.value;    
  var colSel=theForm.getElementsByTagName("select");  
  for(var i=0;i<colSel.length;i++){
     query=query+"&"+colSel[i].name+"="+escape(getOptValue(colSel[i]));
     if (callMethod==false && colSel[i].name == el.name) callMethod=true;
     if(callMethod==true) query+="&method="+colSel[i].parentNode.id;    
 }
 /*var hm=getHome()+"/invoke";
 alert(hm);*/
 AjaxRequest.post(
  {
    'url':getHome()+"/invoke"
    ,'queryString':query
    ,'onSuccess':function(req) {  processResults(el.form, req); }
    ,'onError':function(req) { alert("Error:"+req.status); }
  }
 ) ;
 
 setTimeout("hideProgress('pbar')",1000);
}





