//version javra.AJAX.0.3
//this version has scheduling for the javascript functions i.e we can make choice in the order of functios to be called
//this version has control to check if the server has responded in certain seconds. if not the request is aborted
//this version has AIM class that creates hidden frames for uploading files

var styleArray = ['backgroundColor','width'];
var xhrTimeout;
var javraAJAX = Class.create({
	initialize: function(url,method,options)
	{
		this.URL = url;
		
		if(arguments.length>2) //When options is optional
		{
			this.parameters = options.parameters;
					
			if(options.delayTime!=null)
			   this.delayTime = options.delayTime;
			else
			   this.delayTime =120000;
			
			if(options.synchronous!=null)
				this._sync = options.synchronous;
			else
				this._sync = true;			
		}
		
		this._serverResponse = '';				
	},
	sendData: function()
	{
		    var responseDelayTime = this.delayTime;
			var myAjax = new Ajax.Request(
			this.URL, 
			{
				method: 'post', 
				parameters: this.parameters,
				asynchronous: this._sync,
				onCreate: function(transport){  								
					xhrTimeout=setTimeout( function() { ///to abort the request if the server doesnt respond in certain interval
													
														myAjax.abort();														
														alert("Server could not be reached!");
														},responseDelayTime);												
														
																  
				},
				onComplete: this.handleResponse				
			});
	},
	handleResponse:  function(serverResponse)
	{
		clearTimeout(xhrTimeout);
        //alert(serverResponse.responseText);
		
		this._serverResponse  = serverResponse.responseText;
		var xmlDocument = getXMLDocument(serverResponse);
		
		//var tree = xmlDocument.documentElement;
		//traverse(xmlDocument.documentElement);		
		
		var _tables=xmlDocument.getElementsByTagName("xe-ajax");
		var totalNodes = _tables[0].childNodes.length
		
		for(var i=0;i<totalNodes;i++)
		{
			
			var _responseNodeName = _tables[0].childNodes[i].nodeName;
			switch(_responseNodeName)
			{
				case 'attrib':
					//handeling attributes//
					handleAttrib(_tables);					
					break;
				case 'result':
					//handeling results	
					handleResult(_tables);					
					break;
				case 'messages':
					//handeling messages		
					handleMessages(_tables);					
					break;
				case 'actions':
					//handeling actions
					handleAction(_tables);					
					break;
			}
		}
		
	
	},
	/**
	* This method will allow you to lazy load javascript source files for on-demand javascript processing
	* Just pass in the url of the javascript file you wish to pull in and you're all set, its not ajaxified so you 
	* can pull in scripts from any URL you want! You can also use this function to remove scripts from the DOM as well
	* Just pass in 'remove' as the 2nd parameter with the 1st parameter being the file you want to remove
	* Removal is good for memory heavy desktop type apps you might be creating
	*@param string The URL of the script you wish to load
	*@param string OPTIONAL If you wish to remove a javascript file from the DOM then just pass in 'remove' as the 2nd parameter
	*/
	loadScript:function(url, remove) {
		try{
			// lets check to see if the script is already loaded, if so lets remove it and add a new one
			var scripts = document.getElementsByTagName('script');
			s_len = scripts.length;
			for(var i=0;i<s_len;i++){
				var reg = new RegExp(url+"$");
				if (reg.test(scripts[i].src)) {
					var p2 = scripts[i];
					p2.parentNode.removeChild(p2);
					break;
				}	
			}
			if(remove != 'remove') {
				newScript = document.createElement("script");
				newScript.setAttribute("type", "text/javascript");
				newScript.setAttribute("src", url);
				document.getElementsByTagName('head')[0].appendChild(newScript);
			}
		} catch(e) {
			this.showDebug("MyBIC - loadScript failed URL: "+url+" ErrName: "+e.name+" Msg: "+e.message);	
		}

	},
	/**
	* This method will allow you to lazy load stylesheet source files for on-demand css
	* Just pass in the url of the css file you wish to pull in and you're all set, its not ajaxified so you 
	* can pull in scripts from any URL you want. 
	*@param string The URL of the css file you wish to load /lib/css/myfile.css
	*/
	loadCSS:function(url)
	{
		try{
			// lets check to see if the script is already loaded, if so lets remove it and add a new one
			var scripts = document.getElementsByTagName('link');
			s_len = scripts.length;
			if(s_len > 0) {
				for(var i=0;i<s_len;i++){
					var reg = new RegExp(url+"$");
					if (reg.test(scripts[i].href)) {
						var p2 = scripts[i];
						p2.parentNode.removeChild(p2);
						break;
					}	
				}
			}
				newScript = document.createElement("link");
				newScript.setAttribute("type", "text/css");
				newScript.setAttribute("rel", "stylesheet");
				newScript.setAttribute("href", url);
				document.getElementsByTagName('head')[0].appendChild(newScript);
			                                                 
		} catch(e) {
			if(this.debug==1) {this.showDebug("MyBIC - loadCSS failed URL: "+url+" ErrName: "+e.name+" Msg: "+e.message)};	
		}

	},
	/**
	* This method will allow you to get all your form fields in ONE magical step!
	* right before your ajaxObj.call statement all you have to do is: var form_vars = ajaxObj.getForm('formid');
	* that will loop through the form id you pass, and put all the form variables into your query string!
	*@param string The ID of the form you wish to submit
	*@return string An encoded query string, ready to send to the server
	*/

	getForm:function(formid) {
		var formobj = document.getElementById(formid);
		var fields = new Array();
		var form_len = formobj.elements.length;
		for (var x = 0; x < form_len; x++) {
		switch(formobj.elements[x].type) {
		   case 'select-one':
	
			fields.push(encodeURIComponent(formobj.elements[x].name)+'='+encodeURIComponent(formobj.elements[x].options[formobj.elements[x].selectedIndex].value));
			break;
			case 'select-multiple':
			var obj = formobj.elements[x];
				for(var y=0; y < formobj.elements[x].options.length; y++) {
				   if(formobj.elements[x].options[y].selected) {
							if(formobj.elements[x].options[y].value == ''){
								fields.push(encodeURIComponent(formobj.elements[x].name)+'='+encodeURIComponent(formobj.elements[x].options[y].text));
							} else {
								fields.push(encodeURIComponent(formobj.elements[x].name)+'='+encodeURIComponent(formobj.elements[x].options[y].value));
							}
				   }
				}
			break;
			case 'radio':
				   if(formobj.elements[x].checked) {
						   fields.push(encodeURIComponent(formobj.elements[x].name)+'='+encodeURIComponent(formobj.elements[x].value));
				   }
	        break;
			case 'checkbox':
				if(formobj.elements[x].checked) {
					fields.push(encodeURIComponent(formobj.elements[x].name)+'='+encodeURIComponent(formobj.elements[x].value));
				}
			break;
			default:
			// text, password, textarea, etc
			fields.push(encodeURIComponent(formobj.elements[x].name)+'='+encodeURIComponent(formobj.elements[x].value));
			break;
		}
		}
		var new_qstring = '&' + fields.join('&');
		return new_qstring;
	},
	action: function()
	{
		alert("just testing!!!");
	}
	
});
function getXMLDocument(originalRequest)
{
		var xmlDocument ;
		// code for IE
	    if (window.ActiveXObject)
			{	
					xmlDocument = new ActiveXObject('Microsoft.XMLDOM');
					xmlDocument.async = false;
					var wellFormedMarkup = originalRequest.responseText;					
					var loaded = xmlDocument.loadXML(wellFormedMarkup);							
			}
						  //CODE FOR FIREFOX
			else
			{
					var parser=new DOMParser();
					var xmlDocument=parser.parseFromString(originalRequest.responseText,"text/xml");							
			}	
			return xmlDocument;	
}

//Add Element on Combo
function addOption(selectbox,text,value,ttitle )
{
		var optn = document.createElement("OPTION");
		optn.text = text;
		optn.value = value;
		optn.title = ttitle;
		selectbox.options.add(optn);
}

//Clear Combo
function clearOption(itemName)
{
		for(var i=$(itemName).options.length-1;i>=0;i--)
		{
			$(itemName).remove(i);
		}
}

//make a table and add rows and columns with the values
function makeTableRows1(objRowItem)
{
	var _rowTR = '<table>';
	for(var j=0; j<objRowItem.length;j++)
	{		
		//alert(objRowItem[j].getAttribute('td1'));
		_rowTR +='<tr>';
		for(var k=0; k<objRowItem[j].childNodes.length;k++)
		{		
			_rowTR +='<td>'+objRowItem[j].childNodes[k].getAttribute('value')+'</td>';
		//_rowTR +='<td>'+objRowItem[j].childNodes.length+'</td>';
		//_rowTR +='<td>'+objRowItem[j].getAttribute('td3')+'</td>';
		//_rowTR +='<td>'+objRowItem[j].getAttribute('td4')+'</td>';
		}
		_rowTR +='</tr>';
	}
	_rowTR += '</table>';
	return _rowTR;	
}

//make a table and add rows and columns with the values
function makeTableRows(objRowItem)
{
	var _rowTR = '<table>';
	for(var j=0; j<objRowItem.length;j++)
	{		
		//alert(objRowItem[j].getAttribute('td1'));
		_rowTR +='<tr>';
		_rowTR +='<td>'+objRowItem[j].getAttribute('td1')+'</td>';
		_rowTR +='<td>'+objRowItem[j].getAttribute('td2')+'</td>';
		//_rowTR +='<td>'+objRowItem[j].getAttribute('td3')+'</td>';
		//_rowTR +='<td>'+objRowItem[j].getAttribute('td4')+'</td>';
		_rowTR +='</tr>';
	}
	_rowTR += '</table>';
	return _rowTR;	
}
/*//////////////////////////////////////////////////
//      XML Data Traversal                      //
//      (c) 2003 Premshree Pillai               //
//      http://www.qiksearch.com                //
//      http://premshree.resource-locator.com   //
//      Email : qiksearch@rediffmail.com        //
//////////////////////////////////////////////////

var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
function loadXML(xmlFile) {
        xmlDoc.async="false";
        xmlDoc.onreadystatechange=verify;
        xmlDoc.load(xmlFile);
}

function verify() { 
        if(xmlDoc.readyState!=4)
                return false; 
}

function traverse(tree) {
        if(tree.hasChildNodes()) {
                document.write('<ul><li>');
                document.write('<b>'+tree.tagName+' : </b>');
                var nodes=tree.childNodes.length;
                for(var i=0; i<tree.childNodes.length; i++)
                        traverse(tree.childNodes(i));
                document.write('</li></ul>');
        }
        else
                document.write(tree.text);
}

function initTraverse(file) {
        loadXML(file);
        var doc=xmlDoc.documentElement;
        traverse(doc);
}*/
function traverse(tree) {
        if(tree.hasChildNodes()) {
             
				if(tree.tagName=='attrib')
				eval(tree.tagName+"()");
                var nodes=tree.childNodes.length;
                for(var i=0; i<tree.childNodes.length; i++)
                        traverse(tree.childNodes(i));
               
        }
     
}

function handleAttrib(_tables){
		var _arrtib = _tables[0].getElementsByTagName("attrib");
		var _attriblen = _arrtib.length;	
		
		if(_attriblen>0)
		{
			var _attribRow = _arrtib[0].getElementsByTagName("widget");
			
						 if(_attribRow.length>0){
							
   					     for (var i = 0; i < _attribRow.length; i++) {							 
										
											    var widgetName = _attribRow[i].getAttribute('xwidc');												
												var code = _attribRow[i].getAttribute('attri');
												code = code.camelize();
												var _values = _attribRow[i].getAttribute('value');
												
												if(styleArray.indexOf(code)>-1)
												{
													 if($(widgetName))
													 eval("$(widgetName).setStyle({ "+code+": _values })");
												}
												
								}
						 }	
	
		}
}
function handleResult(_tables)
{			
			var _result = _tables[0].getElementsByTagName("result");
		if(_result.length>0){
			
			var _resultRow = _result[0].getElementsByTagName("widget");
			
			
			for (var i = 0; i < _resultRow.length; i++) {	
			
				try{
			
						var widgetName = _resultRow[i].getAttribute('xwidc');
						
						var selectedVal = _resultRow[i].getAttribute('value');
						
						var widgetType = '';
						if(widgetName!='')
							widgetType = $(widgetName).tagName;

						
						var itemType = '';
						
						if(_resultRow[i].childNodes[0]!=null)
							itemType = _resultRow[i].childNodes[0].nodeName;
						
						var _selectedVal = -1;  
						
						//if the widget is a combo box then we will populate the combo
						if($(widgetName)){
							
							if(widgetType=="SELECT"&&_resultRow[i].hasChildNodes())
							{
								
								var _listitem = _resultRow[i].getElementsByTagName("listitem");
								clearOption($(widgetName));
								for(var j=0; j<_listitem.length;j++)
								{   
									if(_listitem[j].getAttribute('value')==selectedVal)
									{
										//alert(selectedVal);
										_selectedVal = j;
										//alert(_selectedVal);
									}
									//this is the function that populates the combo.
									this.addOption($(widgetName),_listitem[j].getAttribute('screenvalue'),_listitem[j].getAttribute('value'),'');
								}
								/* if(_selectedVal!=0)
								{ $(widgetName).selectedIndex =  _selectedVal + 1; }
							   else
								{$(widgetName).selectedIndex =  _selectedVal;} */
								
						  		$(widgetName).selectedIndex =  _selectedVal;
							}
							else if(widgetType=="SELECT"&&!_resultRow[i].hasChildNodes())//Select ComboValue --Yuvraj 12/03/2009 -- Later updated Yuvraj 21/07/2009
							{
								for(var j=0;j<$(widgetName).options.length;j++)$(widgetName).options[j].selected=false;
								var arrVals=selectedVal.split(",");
								if(arrVals.length==1){
									$(widgetName).value=selectedVal;
								}else{
									for(var j=0;j<$(widgetName).options.length;j++){
										if(arrVals.include($(widgetName).options[j].value))$(widgetName).options[j].selected=true;
									}
								}
							}
							//if it is a input type we will just insert the value
							else if(widgetType=="INPUT")
							{
								//alert(widgetName+"-->");
								if($(widgetName).type=="checkbox"){
									//alert();
									if(_resultRow[i].getAttribute('value')=="checked")
										$(widgetName).checked=true;
									else
										$(widgetName).checked=false;
								}else
									$(widgetName).value =  _resultRow[i].getAttribute('value');
								
							}
							else if(widgetType=="DIV"||itemType=="TD")
							{
								if(itemType=="rowitem")
								{
									var _rowitem = _resultRow[i].getElementsByTagName("rowitem");
									//alert(_rowitem.length);
									var tableData = this.makeTableRows1(_rowitem);
									//alert(widgetName+"---"+tableData);
									$(widgetName).innerHTML = tableData;
									
								}
								else
								{
									
									$(widgetName).innerHTML =  _resultRow[i].getAttribute('value');
									
								}
								
							}
							else if(widgetType=="SPAN"||widgetType=="TEXTAREA") //Yuvraj 12/12/2008
							{
								$(widgetName).innerHTML =  _resultRow[i].getAttribute('value');
								
							}
							
						}
						
				}catch(ex){}						
			}
			
		}
}
function handleMessages(_tables){
		//handeling the message part
		var _message = _tables[0].getElementsByTagName("xerror");
		 if(_message.length>0){
			for (var i = 0; i < _message.length; i++) {	
			
						var _dispMessage = _message[i].getAttribute('message');						
						var _type = _message[i].getAttribute('type');;	
						alert(_dispMessage);
					/*	Dialog.alert(_dispMessage, 
						 {width:200, height:60, okLabel: "Ok", 
						  ok:function(win) { return true; }}); */
						}						
									
		}	
		//ends here
}
var functionCompleted = false;
var timer1=0;
function handleAction(_tables){
		
		//action starts here
		var _action = _tables[0].getElementsByTagName("actions");		
		var arrFunctions =[];		
		
		var arrFuctionSeq =  new Array();
	    if(_action.length>0){
			
			for (var i = 0; i < _action.length; i++) {	
			
				var _functionCnt = _action[i].childNodes.length;
				if(navigator.appName=="Netscape")
				{
					_functionCnt =  _action[i].getElementsByTagName('function').length;
				}
				for (var j = 0; j < _functionCnt; j++) {
					
					var objFunction = _action[i].childNodes[j];
					
					if(navigator.appName=="Netscape")
					{
						objFunction =_action[i].getElementsByTagName('function')[j];
					}		
						var xmlFuncName = objFunction.getAttribute('name');					
						
					    arrFuctionSeq.push(objFunction.getAttribute('nseq')+"-"+xmlFuncName);				
				}

			}						
									
		}
		
		arrFuctionSeq = arrFuctionSeq.sortBy(function(s) { return parseInt(s); });
		
		var sequence = function(funcArray,paramArray) {
		   (function() {
					
			 (funcArray.length != 0) &&
			   funcArray.shift()(arguments.callee,paramArray[funcArray.length].indexOf('(')>-1?(paramArray[funcArray.length].replace('(','')).replace(')',''):'');
		  })();
		};
	    
		var arrParams = [];
		arrFuctionSeq.each(function(item) {
								
								    var myTT =item.split("-");
									
									var _arraFunc =  myTT[1].split('(');
									
									var _funcName =  _arraFunc[0];
									if((myTT[1].indexOf('(')>-1)&&(myTT[1].indexOf(')')>-1))
									{ 
										var indexF = myTT[1].indexOf('(');
										var indexL = myTT[1].indexOf(')');
										var param = myTT[1].substring(indexF,indexL+1);											
									}
									else
										var param = '';										
									
									arrParams.push(param);
									arrFunctions.push(eval(_funcName));	
									
									});									
		arrParams = arrParams.reverse();	
		//alert(arrFunctions);
		sequence(arrFunctions,arrParams);//calling functions in sequence
	
		
}
///for file uploading..using hidden frames
AIM = {

	frame : function(c) {

		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		document.body.appendChild(d);

		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}

		return n;
	},

	form : function(f, name) {
		f.setAttribute('target', name);
	},

	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},

	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}

		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}

}
//this is the function that aborts the AJAX request
		Ajax.Request.prototype.abort = function() {
			//alert("closing request");
			// prevent and state change callbacks from being issued
			this.transport.onreadystatechange = Prototype.emptyFunction;
			// abort the XHR
			this.transport.abort();
			// update the request counter			
			Ajax.activeRequestCount--;//it keeps track of the total requests.
			//alert(Ajax.activeRequestCount);
		};
