/**
##
## If the return response is in XML, this is used to retrieve the AJAX 
## response.
##
*/
function parseMessage() {
    var message = req.responseXML.getElementsByTagName("message")[0];
    setMessage(message.childNodes[0].nodeValue);
}

function dumpNameValues(n)
{
}

/**
##
## The return value of the AJAX call is set in JSON format.
## This is to retrieve the html element names of the response.
##
*/
function getHtmlElmtValue(nameValuesArray, name)
{
  for (var i=0; i<nameValuesArray.length; i++)
  {
	if (nameValuesArray[i]['Name'] == name) 
	{
	   return nameValuesArray[i]['Value'];
	}
  }
  return null;
}

/**
##
## Change some of the html fileds values based on the AJAX call
## response. Note the response value must be in JSON format.
## And the format should be 
## ["ELEMENT_VALUES": [ {Name: "elmt_name1", Value: "1"},
##					    {Name: "elmt_name2", Value: "two"}, ...]]
## 						
*/
// values is the json obj in associative array format
function setFieldValues(theForm, values)
{
   var elmtArr = theForm.elements;
   var htmlNameValues = values['ELEMENT_VALUES'];
   for(var i = 0; i < elmtArr.length; i++) {
      var elmt = elmtArr[i];
      if (elmt.type == "radio" || elmt.type == "checkbox") {
        elmt = theForm[elmt.name];
        // The group name object missess the following property.
        elmt.name = elmtArr[i].name; elmt.type = elmtArr[i].type;
      }
	  if (elmt.name) {
   	    var val = getHtmlElmtValue( htmlNameValues, elmt.name);
		if (val)
  		  elmt.value = val;
      }
   }
}

function onClickHandler(e, key, targetUrl, targetElmts) 
{
}

// e: the element has this handler
// key: the name of the lookup key
// targetUrl: the request url
// targetElmts: the affected elements that change their value based on the response.  
function onChangeHandler(e, key, targetUrl, targetElmts)
{
    var f = e.form;
	var onC = function(responseText, responseXML){
		resetErrProperties(f);
/*
		myLogger.log("::onChangeHandler");
		myLogger.log("::onChangeHandler XML [ "  + responseXML );
		myLogger.log("::onChangeHandler TXT [ "  + responseText);		
*/
 		var resp = new Function("return " + responseText + ";")();		
        if (null == resp || "" == resp)
		   warnInvalid(e, "Invalid Input!");
		else {
		  //myLogger.log("::onChangeHandler got response " + resp['ELEMENT_VALUES']);		
		  setFieldValues(f, resp);
	    }
	}
	var myReqObj = new XmlHttpReqObj();
	myReqObj.onComplete = onC;
	var url = targetUrl; 
    url += "?" + key + "=" + escape(e.value) + "&";	   
	if (targetElmts && targetElmts.length > 0) {
	   for (var i=0; i<targetElmts.length;i++) {
	     url += "id" + i + "=" + escape(targetElmts[i]) + "&";
	   }
	}
//	myLogger.log("::onChangeHandler url ["+url+"]");
	myReqObj.submit(url);
}

function onAsynCallHandler(targetUrl, onCompleteFunct)
{
	var myReqObj = new XmlHttpReqObj();
	myReqObj.onComplete = onCompleteFunct;
//	myLogger.log("::onAsynCallHandler url ["+targetUrl+"]");
	myReqObj.submit(targetUrl);
}


function onFocusHandler(e)
{
}
function onSelectHandler(e)
{
}

function onBlurHandler(e)
{
  onChangeHandler(e);
}

function addAsynchronousHandler(e, handlerName, handler) {
          e.onchange = onChangeHandler(e);
}

/**
##
## The TransitionChecker class
##
*/
function TransitionChecker(url, progressBar) {
  // target url to send to the request
  this.url = url;
  // the timer 
  this.timer = null;
  // the current state of the transition
  this.tranState = 0;
  this.progressBar = progressBar;
}
TransitionChecker.TRANSITION_COMPLETE = 100;
TransitionChecker.TRANSITION_PENDING  = 200;
TransitionChecker.TRANSITION_ERROR    = 300;
// 2 secs
TransitionChecker.TIMEOUT = 2000; 
