/**
*
* AJAX Framework.
* Controls requests to server made using ajax.
*
* @package kjr
* @subpackage js
* @author Karolis Risovas <karolis@karolis.ws>
* @version 1.2.2
* @copyright Copyright (C) Karolis Risovas 2007-2008
*
*/

/**
*
* Constructor.
* Creates xmlhttp object to be used in requests.
*
* @return (object) xmlhttp object
*/
function getxmlhttp(){
 var xmlhttp=false;

 try{xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");}
  catch(e){
   try{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
	  catch(e){xmlhttp=false;}}

 if(!xmlhttp && typeof XMLHttpRequest != 'undefined'){
  xmlhttp=new XMLHttpRequest();}

 return xmlhttp;
}

/**
*
* Processor.
* Sends request to server and puts the response into container.
*
* @param serverPage (string) address (local or remote) to server page
* @param objId      (string) id of DOM element that will contain server response
* @param str        (string) formatted POST string to be sent to server
* @return void
*/
function processajax(serverPage,objId,str){
 xmlhttp=getxmlhttp();
 xmlhttp.open("POST",serverPage,true);
 xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
 xmlhttp.onreadystatechange=function(){
  if(xmlhttp.readyState==4 && xmlhttp.status==200){
   clearTimeout(xmlhttpTimeout);
   document.getElementById(objId).innerHTML=xmlhttp.responseText;}}
   xmlhttp.send(str);
   var xmlhttpTimeout=setTimeout("ajaxTimeout();",5000); // Timeout. 5000ms=5s
}

/**
*
* Timeout monitor.
* Aborts request after timeout is reached.
*
* @return void
*/
function ajaxTimeout(){
   xmlhttp.abort();
   alert('Request Timed Out. Please Try Again.');
}

/**
*
* Pause simulator.
* Halts further code execution for given time period.
*
* @param millis (int) time period to pause in milliseconds 
* @return void
*/
function pausecomp(millis){
 var date = new Date();
 var curDate = null;

 do{
  curDate=new Date();}
 while(curDate-date < millis);
}

/**
*
* Loader.
* Executes server request.
*
* @param objId (string) id of DOM element that makes the request
* @param cntId (string) id of DOM element that will contain server response
* @return void
*/
function loadId(objId,contId){
 //Server page to request. Default: request.php
 var page='request.php';
 var cnt=document.getElementById(cntId);
 
 //Time to wait in milliseconds before sending request. Default: 0
 pausecomp(2000);

 //Text to show while waiting and/or processing. Text or html <img/> tag. Default: empty string
 cnt.innerHTML='loading...';
 processajax(page,cntId,'id='+objId);
}

/**
*
* Form processor.
* Retrieves data from form elements and generates a POST format string.
*
* @param frmId (string) id of DOM form element
* @return (string) POST format string consisting of all form values
*/
function getFormVals(frmId){
 var frm=document.getElementById(frmId);
 var str='';
 
 for(var i=0;i<frm.length;i++){
  var type=frm.elements[i].type;
  var val=encodeURIComponent(frm.elements[i].value);
  var name=frm.elements[i].name;
  var tag=frm.elements[i].tagName;

  switch(tag){
   default:
   case 'INPUT':
    switch(type){
     case 'text':
     case 'password':
     case 'hidden':
      str+=name+'='+val+'&';
     break;
   
     case 'radio':
     case 'checkbox':
      if(frm.elements[i].checked){str+=name+'='+val+'&';}
     break;

     default:
     break;
    }
   break;

   case 'TEXTAREA':
    str+=name+'='+val+'&';
   break;

   case 'SELECT':
    str+=name+'='+val+'&';
   break;

  }
 }

 return str;
}

/**
*
* Random string generator.
* Generates a random sequence of alphanumeric characters.
*
* @param length (int) length of string (in characters) to be generated
* @return (string) random character string
*/
function randomStr(length){
 chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
 str="";
 for(x=0;x<length;x++){
  i=Math.floor(Math.random()*62);
  str+=chars.charAt(i);}
  return str;
}

/**
*
* Form submitter.
* Submits the form to server page and puts response in container.
*
* @param frmId (string) id of DOM form element that makes the request
* @param cntId (string) id of DOM element that will contain server response
* @return void
*/
function submitForm(frmId,cntId){
 //Server page to request. Default: request.php
 var page='request.php';

 var frm=document.getElementById(frmId);
 var cnt=document.getElementById(cntId);
 var str='';

 page+='?x='+randomStr(10);
 str=getFormVals(frmId);
 str=str+'id='+frm.action;

 processajax(page,cntId,str);

}
