// ajax.js

var req;

var focused;

function saveFocus(elem){
   focused = elem;
}

/**
 * Calendar komponens hasznalja
 */
function postDay( day ) {
	form = document.getElementById("chooseDayForm");
	//alert(form);
	hidden = document.getElementById("dayHidden");
	hidden.value = day;
	form.submit();
}

function postTime( time ) {
	form = document.getElementById("postTimeForm");
	//alert(form);
	hidden = document.getElementById("timeValue");
	hidden.value = time;
	form.submit();
}

function changeHtml( id, data ) {
	//alert('data: '+data);
	var object = document.getElementById(id);
	object.innerHTML = data;
}

function cl() {
	alert("cl");
}

var isRunning = false;
var _url = '';
var _componentId = '';
var _callType = '';
var _delay = 0;

var DELAYS = new Array();

function addDelay( componentId, propArray ) {
   for ( i = 0; i<DELAYS.length; i++ ) {
      // ezt az array-t frissiteni...
      if ( DELAYS[i][2] == componentId ) {
         DELAYS[i] = propArray;
	 return;
      }
   }
   // nem talált, betenni a végére...
   DELAYS[ DELAYS.length ] = propArray;
}

function restartDelay( componentId ) {
   for ( i = 0; i<DELAYS.length; i++ ) {
      // ezt az array-t frissiteni...
      if ( DELAYS[i][2] == componentId ) {
	 // newestRequest for this object
         DELAYS[i][4] = true;
	 return;
      }
   }
}

/**
 * megkeresi a DELAYS tömbben, hogy van-e ilyen componentId-jü
 * várakozás.
 */
function isDelayRunning(componentId) {
   for ( i = 0; i<DELAYS.length; i++ ) {
      // ezt az array-t frissiteni...
      if ( DELAYS[i][2] == componentId ) {
	 return true;
      }
   }
   return false;
}

function removeDelay(componentId) {
   for ( i = 0; i<DELAYS.length; i++ ) {
      // ezt az array-t frissiteni...
      if ( DELAYS[i][2] == componentId ) {
	  array1 = DELAYS.slice(0, i);
	  array2 = array1.concat( DELAYS.slice(i+1) );
	  DELAYS = array2;
      }
   }
}

function isNewestRequest(componentId) {
   for ( i = 0; i<DELAYS.length; i++ ) {
      // ezt az array-t frissiteni...
      if ( DELAYS[i][2] == componentId ) {
	  // visszaadjuk hogy volt-e a delay alatt
 	  // ujabb frissitesi keres...
	  return DELAYS[i][4];
      }
   }
}

function isNewestRequest(componentId) {
   for ( i = 0; i<DELAYS.length; i++ ) {
      // ezt az array-t frissiteni...
      if ( DELAYS[i][2] == componentId ) {
	  // visszaadjuk hogy volt-e a delay alatt
 	  // ujabb frissitesi keres...
	  return DELAYS[i][4];
      }
   }
}

/**
 * Késleltetett ajax frissites...
 */ 
function loadXMLDocDelayed( delay, url, componentId, callType ) {
	// elkésziteni a leiro tombot...
	arr = new Array();
	arr[0] = delay;
	arr[1] = url;
	arr[2] = componentId;
        arr[3] = callType;
	arr[4] = false;

     if (isDelayRunning(componentId)  ) {
	arr = getDelayFor(componentId);
	arr[0] = delay;
	arr[1] = url;
	arr[2] = componentId;
        arr[3] = callType;
	arr[4] = true;
//	restartDelay(componentId);
     }
     else  
     { 
	addDelay( componentId, arr );        
        setTimeout('delayed(\''+componentId+'\')', delay);	
     }
}

function getDelayFor(componentId) {
   for ( i = 0; i<DELAYS.length; i++ ) {
      // ezt az array-t frissiteni...
      if ( DELAYS[i][2] == componentId ) {
	  // visszaadjuk hogy volt-e a delay alatt
 	  // ujabb frissitesi keres...
	  return DELAYS[i];
      }
   }
}

/**
 * componentId komponent ellenorzese, hogy a delay
 * alatt jott-e ujabb keres neki, ha nem akkor
 * ajax request elkuldese, ha jott, akkor a delay
 * ujrainditasa...
 */
function delayed(componentId){
//    alert('delayed(\''+componentId+'\')');
    arr = getDelayFor(componentId);
    if ( arr[4] ) {
	//alert('varakozas ujrainditasa...');
	arr[4] = false;
	// ujrainditani a varakozast...
        setTimeout('delayed(\''+componentId+'\')', arr[0]);	
    }
    else {
	removeDelay(componentId);
	//alert('load...');
        loadXMLDoc(arr[1], arr[2], arr[3]);
    }
}

function loadXMLDoc( url, componentId, callType, additionalValues ) {
    //alert('URL='+url+', componentId='+componentId+', callType='+callType);
	isRunning = true;
	req = false;
    // branch for native XMLHttpRequest object
    //alert(callType);
    if(window.XMLHttpRequest) {
    	try {
			req = new XMLHttpRequest();
        } catch(e) {
			req = false;
        }
	// branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req = false;
        	}
		}
    }
	if(req) {
		req.onreadystatechange = processReqChange;
		req.open('POST', url, true);
		req.setRequestHeader("Content-type", "application/x-www-form-urlencoded;encoding:UTF-8");
		req.setRequestHeader("Content-length", 3);
		req.setRequestHeader("Connection", "close");
		
		// az [_AND_]-okat megtegeljük spec-cel
		callType = replaceCharacterToCode(callType, '&', "_AND_");
		callType = replaceCharacterToCode(callType, '\\+', "_PLUS_");
		callType = replaceCharacterToCode(callType, '\\<', "_TAGO_");
		callType = replaceCharacterToCode(callType, '\\>', "_TAGC_");
		
		//alert(callType);
		//alert('callType='+callType);
		req.send('ajaxRequest=true&'+
				 'componentId='+componentId+'&'+
				 'callType='+callType+additionalValues
				);
	}
}


  var REQUESTS_FINISHED = Array();
  var REQUEST_STR_RESULTS = Array();

  function ajax_load( url ) {
        //alert('URL='+url+', componentId='+componentId+', callType='+callType);
      isRunning = true;
      req = false;
      // branch for native XMLHttpRequest object
      //alert(callType);
      if(window.XMLHttpRequest) {
          try {
                          req = new XMLHttpRequest();
          } catch(e) {
                          req = false;
          }
          // branch for IE/Windows ActiveX version
      } else if(window.ActiveXObject) {
          try {
                  req = new ActiveXObject("Msxml2.XMLHTTP");
          } catch(e) {
                  try {
                          req = new ActiveXObject("Microsoft.XMLHTTP");
                  } catch(e) {
                          req = false;
                  }
                  }
      }
          if(req) {
                  req.onreadystatechange = loadContent();
                  req.open('POST', url, true);
                  req.setRequestHeader("Content-type", "application/x-www-form-urlencoded;encoding:UTF-8");
                  req.setRequestHeader("Content-length", 3);
                  req.setRequestHeader("Connection", "close");

                  // az [_AND_]-okat megtegeljük spec-cel
                  callType = replaceCharacterToCode(callType, '&', "_AND_");
                  callType = replaceCharacterToCode(callType, '\\+', "_PLUS_");
                  callType = replaceCharacterToCode(callType, '\\<', "_TAGO_");
                  callType = replaceCharacterToCode(callType, '\\>', "_TAGC_");

                  //alert(callType);
                  //alert('callType='+callType);
                  actReqIndex = req_index;
                  REQUESTS_FINISHED[actReqIndex] = false;
                  
                  req.send('ajaxRequest=true&'+
                                   'componentId='+componentId+'&'+
                                   'callType='+callType
                                  );
          }
  }

  function ajax_protect(what) {
      what = replaceCharacterToCode(what, '&', "_AND_");
      what = replaceCharacterToCode(what, '\\+', "_PLUS_");
      what = replaceCharacterToCode(what, '\\<', "_TAGO_");
      what = replaceCharacterToCode(what, '\\>', "_TAGC_");
      what = replaceCharacterToCode(what, ' ', "+");
      return what;
  }
  
  function loadContent(to) {
	    if (req.readyState == 4) {
	        // only if "OK"
	        if (req.status == 200) {
	        	var xmlError;
                        //var objDom = new XMLDoc(req.responseText, xmlError);
                        //find the first TAG1 node
                        //var domTree = objDom.docNode;
                        var text = req.responseText;
                        //alert(req.responseText);
                        var lastDataEnd = 0;
                        var lastCallbackEnd = 0;
                        var i = 0;
                        while ( (req.responseText.indexOf("<data_data>", lastDataEnd) >= 0) &&
                                lastDataEnd >= 0 ) { 
                            dataStart = req.responseText.indexOf("<data_data>", lastDataEnd)+11;
                            dataEnd = req.responseText.indexOf("</data_data>", lastDataEnd+11);
                            lastDataEnd = dataEnd;

                            callbackStart = req.responseText.indexOf("<callback>", lastCallbackEnd)+10;
                            callbackEnd = req.responseText.indexOf("</callback>", lastCallbackEnd+10);
                            lastCallbackEnd = callbackEnd;

                            data = req.responseText.substr(dataStart, dataEnd-dataStart);
                            //alert(data);
                            callFunc = req.responseText.substr(callbackStart, callbackEnd-callbackStart);
                            //alert('callFunc:'+callFunc);
                                  i++;
                            //alert(i+'=>'+lastDataEnd+'=>'+callFunc+'='+data);
                           if(callFunc.length>0){
                           //alert(callFunc);
                           eval(callFunc);
                       }

                        }

                        //var start = req.responseText.indexOf("<array>")+11;
                        //var end = req.responseText.indexOf("</array>");

                        //var data = req.responseText.substr(start, end-start);
                        //var data = domTree.getElements("data")[0].;
                        //alert(start+","+end+", "+req.responseText.length+", "+data);

                        //var callFunc = domTree.getElements("callback")[0];
                        //eval(callFunc.getText());
                        isRunning = false;
//				alert('NA');
                        reset_focus();
	        } else {
	            alert("There was a problem retrieving the XML data:\n" +
	                req.statusText);
	        }
     }
  }
  
	function replaceCharacterToCode(str, what, to) {
		//var regex2_rep1 = /(.*)&(.*)/;
		var regex2_rep1 = new RegExp("(.*)"+what+"(.*)");
		var result = str;
		//alert('beleptem, what='+what+";to="+to);
		var start = str.length;
		var before = start;
		// first step: change '_AND_'-s to '_AND__SPEC_'.
		while ((start = result.lastIndexOf(to, before))!=-1 && start != before){
			result = result.substr(0, start)+to+"_SPEC_"+result.substr(start+to.length);
			start--;
			before = start;
		}
		
		// second step: change '&' chars to '_AND_'
		while ( result.match(regex2_rep1)) {
			result = result.replace(regex2_rep1, "$1"+to+"$2");
		}
		//alert('kileptem, what='+what+";to="+to);
		return result;
	}

	function processReqChange() {
	    // only if req shows "loaded"
	    if (req.readyState == 4) {
	        // only if "OK"
	        if (req.status == 200) {
	            //alert('ANSWER!');
	        	var xmlError;
				//var objDom = new XMLDoc(req.responseText, xmlError);
				//find the first TAG1 node
				//var domTree = objDom.docNode;
				var text = req.responseText;
                //alert(req.responseText);
				var lastDataEnd = 0;
				var lastCallbackEnd = 0;
				var i = 0;
				while ( (req.responseText.indexOf("<data_data>", lastDataEnd) >= 0) &&
					lastDataEnd >= 0 ) { 
				    dataStart = req.responseText.indexOf("<data_data>", lastDataEnd)+11;
				    dataEnd = req.responseText.indexOf("</data_data>", lastDataEnd+11);
				    lastDataEnd = dataEnd;

				    callbackStart = req.responseText.indexOf("<callback>", lastCallbackEnd)+10;
				    callbackEnd = req.responseText.indexOf("</callback>", lastCallbackEnd+10);
				    lastCallbackEnd = callbackEnd;

				    data = req.responseText.substr(dataStart, dataEnd-dataStart);
				    //alert(data);
				    callFunc = req.responseText.substr(callbackStart, callbackEnd-callbackStart);
				    //alert('callFunc:'+callFunc);
					  i++;
				    //alert(i+'=>'+lastDataEnd+'=>'+callFunc+'='+data);
				   if(callFunc.length>0){
			           //alert(callFunc);
			           eval(callFunc);
			       }
					
				}

				//var start = req.responseText.indexOf("<array>")+11;
				//var end = req.responseText.indexOf("</array>");

				//var data = req.responseText.substr(start, end-start);
				//var data = domTree.getElements("data")[0].;
				//alert(start+","+end+", "+req.responseText.length+", "+data);
				
				//var callFunc = domTree.getElements("callback")[0];
				//eval(callFunc.getText());
				isRunning = false;
//				alert('NA');
				reset_focus();
	        } else {
	            alert("There was a problem retrieving the XML data:\n" +
	                req.statusText);
	        }
     }
}

function reset_focus(){
	focusedObject = document.getElementById(focused);
	    if (focusedObject!=null) {
	  	bool = focusedObject.focus();
		if (!bool) focusedObject.focus();
//		if (focusedObject.value)
//			focusedObject.value = focusedObject.value;
	    }
	    else {
	    	     //alert('missing:'+focused);
	}
}






