
/**
 * Ajax.js
 *
 * Collection of Scripts to allow in page communication from browser to (struts) server
 * ie can reload part instead of full page
 *
 * How to use
 * ==========
 * 1) Call retrieveURL from the relevant event on the HTML page (e.g. onclick)
 * 2) Pass the url to contact (e.g. Struts Action) and the name of the HTML form to post
 * 3) When the server responds ...
 *		 - the script loops through the response , looking for <span id="name">newContent</span>
 * 		 - each <span> tag in the *existing* document will be replaced with newContent
 *
 * NOTE: <span id="name"> is case sensitive. Name *must* follow the first quote mark and end in a quote
 *		 Everything after the first '>' mark until </span> is considered content.
 *		 Empty Sections should be in the format <span id="name"></span>
 */

//global variables
var req;
var which;
var url;
var toValiField;
var formName;
/**
   *?Validate one Field
   * url - to get content from (e.g. /struts-ajax/sampleajax.do?ask=COMMAND_NAME_1) 
   * nameOfFormToPost - which form values will be posted up to the server as part 
   *					of the request (can be null)   
   * fieldOfFormToPost - the field of form to be validated.The paramter "AJAX_VALIDATION_KEY"
   *					is the key word used to tell server what the field it want to validate.
   *                    The server validate String will display in the "<span>" element,the elemnt's
   *					name must be field's name plus "_error".If multiple form appera in one page, and
   *					they have the same name column,it will try to use field's name + '_error' + '_' + formname
   */
function ajaxVali(myurl, nameOfFormToPost, fieldOfFormToPost) {
	url=myurl;
    if (url.indexOf("?") < 0) {
        url = url + "?";
    }
    url = url + "&AJAX_VALIDATION_KEY=" + fieldOfFormToPost.name + getFormAsString(nameOfFormToPost);
    formName=nameOfFormToPost;
    toValiField=fieldOfFormToPost.name+"_error";
    setCallBack("ajaxValiCallBack");
}

/**
*/
function ajaxValiCallBack(){
    if (req.readyState == 4) { // Complete
        if (req.status == 200) { // OK response
        	try{
            	document.getElementById(toValiField).innerHTML = req.responseText;
            }catch(e){
            	document.getElementById(toValiField+'_'+formName).innerHTML = req.responseText;
            }	
        } else {
            alert("\u548c\u670d\u52a1\u5668\u901a\u8baf\u65f6\u4ea7\u751f\u5982\u4e0b\u9519\u8bef\uff1a\n" + req.statusText);
        }
    }
}
/**
* Set the ajax callback method
* callBackMethod - callback method name
*/
function setCallBack(callBackMethod) {
   //Do the Ajax call
    if (window.XMLHttpRequest) { // Non-IE browsers
        req = new XMLHttpRequest();
        eval("req.onreadystatechange =" + callBackMethod);
        try {
            req.open("GET", url, true); //was get
        }
        catch (e) {
            alert("\u548c\u670d\u52a1\u5668\u901a\u8baf\u65f6\u4ea7\u751f\u5982\u4e0b\u9519\u8bef\uff1a\n" + e);
        }
        req.send(null);
    } else {
        if (window.ActiveXObject) { // IE
            req = new ActiveXObject("Microsoft.XMLHTTP");
            if (req) {
                eval("req.onreadystatechange =" + callBackMethod);
                req.open("GET", url, true);
                req.send();
            }
        }
    }
}
/**
   * Get the contents of the URL via an Ajax call
   * url - to get content from (e.g. /struts-ajax/sampleajax.do?ask=COMMAND_NAME_1) 
   * nodeToOverWrite - when callback is made
   * nameOfFormToPost - which form values will be posted up to the server as part 
   *					of the request (can be null)
   */
function retrieveURL(myurl, nameOfFormToPost) {
    url=myurl;
    //get the (form based) params to push up as part of the get request
    if (url.indexOf("?") < 0) {
        url = url + "?";
    }
    url = url + getFormAsString(nameOfFormToPost);
    //Do the Ajax call
    setCallBack("processStateChange");
}
/*
   * Set as the callback method for when XmlHttpRequest State Changes 
   * used by retrieveUrl
  */
function processStateChange() {
    if (req.readyState == 4) { // Complete
        if (req.status == 200) { // OK response
        
        ///alert("Ajax response:"+req.responseText);
        
        //Split the text response into Span elements
            spanElements = splitTextIntoSpan(req.responseText);
        
        //Use these span elements to update the page
            replaceExistingWithNewHtml(spanElements);
        } else {
            alert("\u548c\u670d\u52a1\u5668\u901a\u8baf\u65f6\u4ea7\u751f\u5982\u4e0b\u9519\u8bef\uff1a\n" + req.statusText);
        }
    }
}
/**
  * gets the contents of the form as a URL encoded String
  * suitable for appending to a url
  * @param formName to encode
  * @return string with encoded form values , beings with &
  */
function getFormAsString(formName) {
 	
 	//Setup the return String
    returnString = "";
 	
  	//Get the form values
    formElements = document.forms[formName].elements;
 	
 	//loop through the array , building up the url
 	//in the form /strutsaction.do&name=value
    for (var i = formElements.length - 1; i >= 0; --i) {
 		//we escape (encode) each value
        returnString = returnString + "&" + formElements[i].name + "=" + EncodeUtf8(formElements[i].value);
    }
 	
 	//return the values
    return returnString;
}
/**
 * Splits the text into <span> elements
 * @param the text to be parsed
 * @return array of <span> elements - this array can contain nulls
 */
function splitTextIntoSpan(textToSplit) {
 
  	//Split the document
    returnElements = textToSplit.split("</span>");
 	
 	//Process each of the elements 	
    for (var i = returnElements.length - 1; i >= 0; --i) {
 		
 		//Remove everything before the 1st span
        spanPos = returnElements[i].indexOf("<span");		
 		
 		//if we find a match , take out everything before the span
        if (spanPos > 0) {
            subString = returnElements[i].substring(spanPos);
            returnElements[i] = subString;
        }
    }
    return returnElements;
}
/*
  * Replace html elements in the existing (ie viewable document)
  * with new elements (from the ajax requested document)
  * WHERE they have the same name AND are <span> elements
  * @param newTextElements (output of splitTextIntoSpan)
  *					in the format <span id=name>texttoupdate
  */
function replaceExistingWithNewHtml(newTextElements) {
 
 	//loop through newTextElements
    for (var i = newTextElements.length - 1; i >= 0; --i) {
  
 		//check that this begins with <span
        if (newTextElements[i].indexOf("<span") > -1) {
 			
 			//get the name - between the 1st and 2nd quote mark
            startNamePos = newTextElements[i].indexOf("\"") + 1;
            endNamePos = newTextElements[i].indexOf("\"", startNamePos);
            name = newTextElements[i].substring(startNamePos, endNamePos);
 			
 			//get the content - everything after the first > mark
            startContentPos = newTextElements[i].indexOf(">") + 1;
            content = newTextElements[i].substring(startContentPos);
 			
 			//Now update the existing Document with this element
 			
	 			//check that this element exists in the document
            if (document.getElementById(name)) {
	 			
	 				//alert("Replacing Element:"+name);
                document.getElementById(name).innerHTML = content;
            } else {
	 				//alert("Element:"+name+"not found in existing document");
            }
        }
    }
}

//change the chinese to UTF-8 encode
function EncodeUtf8(s1)
  {
      var s = escape(s1);
      var sa = s.split("%");
      var retV ="";
      if(sa[0] != "")
      {
         retV = sa[0];
      }
      for(var i = 1; i < sa.length; i ++)
      {
           if(sa[i].substring(0,1) == "u")
           {
               retV += Hex2Utf8(Str2Hex(sa[i].substring(1,5)));
               
           }
           else retV += "%" + sa[i];
      }
      
      return retV;
  }
  function Str2Hex(s)
  {
      var c = "";
      var n;
      var ss = "0123456789ABCDEF";
      var digS = "";
      for(var i = 0; i < s.length; i ++)
      {
         c = s.charAt(i);
         n = ss.indexOf(c);
         digS += Dec2Dig(eval(n));
           
      }
      //return value;
      return digS;
  }
  function Dec2Dig(n1)
  {
      var s = "";
      var n2 = 0;
      for(var i = 0; i < 4; i++)
      {
         n2 = Math.pow(2,3 - i);
         if(n1 >= n2)
         {
            s += '1';
            n1 = n1 - n2;
          }
         else
          s += '0';
          
      }
      return s;
      
  }
  function Dig2Dec(s)
  {
      var retV = 0;
      if(s.length == 4)
      {
          for(var i = 0; i < 4; i ++)
          {
              retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
          }
          return retV;
      }
      return -1;
  } 
  function Hex2Utf8(s)
  {
     var retS = "";
     var tempS = "";
     var ss = "";
     if(s.length == 16)
     {
         tempS = "1110" + s.substring(0, 4);
         tempS += "10" +  s.substring(4, 10); 
         tempS += "10" + s.substring(10,16); 
         var sss = "0123456789ABCDEF";
         for(var i = 0; i < 3; i ++)
         {
            retS += "%";
            ss = tempS.substring(i * 8, (eval(i)+1)*8);
            
            
            
            retS += sss.charAt(Dig2Dec(ss.substring(0,4)));
            retS += sss.charAt(Dig2Dec(ss.substring(4,8)));
         }
         return retS;
     }
     return "";
  } 

