
// constructor
/**
 *
 * odeslání XMLHttp požadavku 
 * @param function obsluha funkce zajišťující obsluhu při změně stavu požadavku, dostane parametr s XMLHttp objektem a pripadnymy params 
 * @param string method GET|POST|... 
 * @param string url URL požadavku 
 * @param string [content] tělo zprávy 
 * @param array [headers] pole předaných hlaviček ve tvaru { 'hlavička': 'obsah' } 
 * @return bool true v případě úspěchu, false jinak 
 *  
 * USE:
 *     var ajax = new Ajax(vote_obsluha, 'POST', 'forumSpracuj.php?module=post');
 *     ajax.setParams("aj",1,4);		//	parametre sa posielaju obsluhujucej fcii ako 2.parameter
 *     ajax.send();
 *     
 */      
function Ajax(obsluha, method, url, content, headers)
{
  this.obsluha = obsluha;
  this.method = method;
   
	//  do kazdej poziadavky cez ajax pridam $_GET["ajax"]=1, pre osetrenie v php
	if (url) {
		if (url.indexOf('?')!= -1) {
			url += '&ajax=1';
		} else {
			url += '?ajax=1';
		}
	}
	this.url = url;
	
  this.url = url;
  this.content = content;
  this.headers = headers;

  this.setParams = function () {
    this.params = new Array(arguments.length);
    for (var i=0; i<arguments.length; i++)  {
      this.params[i] = arguments[i];
    }      
  }
  
  this.send = function () {
    var xmlhttp = false;
    if (window.XMLHttpRequest)          // if Mozilla, Safari etc
      xmlhttp = new XMLHttpRequest()
    else if (window.ActiveXObject)      // if IE
    { 
      try {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP")
      } 
      catch (e){
      try{
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
      }
      catch (e2){}
      }
    }
  
    if (!xmlhttp || !document.getElementById || !document.createElement) 
    { 
      alert("Váš prehliadač nepodporuje AJAX technológiu"); 
      return false; 
    } 
    xmlhttp.open(this.method, this.url, true); //  true je pre asynchronny chod 
    
    var params = this.params; //  spravil som to takto sedlacky...aspon ze to facha
    if (this.obsluha)
      xmlhttp.onreadystatechange = function() { obsluha(xmlhttp, params);}; 
  // !!!!!!!!JE TU OBSLUHA BEZ THIS. LEBO TO NEVIEM, ALE BOLO BY DOBRE TO OPRAVIT !!!!!!
    if (this.method == 'POST')
      xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  
    if (this.headers) 
    { 
      for (var key in this.headers) 
      { 
        xmlhttp.setRequestHeader(key, headers[key]);
        //alert(key + headers[key])
      } 
    } 

    xmlhttp.send(this.content); 
    return true; 
  } 
}


/**
 *
 * plne objektovy variant triedy Ajax
 * @param object params
 	Polozky objektu params:
 		string method GET|POST|... 
 		string url URL požadavku 
 		string content tělo zprávy 
 		bool mode prenos [asynchronny | synchronny]
 		function[str] onSuccess	nazov fcie, kt sa vola, ak status==200 alebo 'OK' [ak sa nezada, default: eval(xmlhttp.responseText)
 		function[str] on404	nazov fcie, kt sa vola, ak status==404 					default: alert('not found')
 		function[str] onError nazov fcie, kt sa vola, ak status!=404 and status!=200
 		object params objekt nepovinnych [additional] parametrov pre fciu, kt. sa zavola podla daneho statusu
 		object headers objekt předaných hlaviček
 *
 * @return bool true v případě úspěchu, false jinak 
 *  
 * USE:
 *     var ajax = new Ajax2({
 *		'method' : 'GET',
 *		'url' : 'test.php?do=ajaxuj',
 *		'content' : 'a=1&amp;r=test.php',
 *		'onSuccess' : daco,
 *		'headers' : {'Content-Type' : 'application/x-www-form-urlencoded'},
 *		'params' : {'p1' : 'test.php', 'p2': 'fsvp'}
 *		
 *	});
 * 
 *		function daco(xmlhttp, params) {
 *			
 *			alert(params.p2)
 *		}
 *	
 *     
 */    
function Ajax2(params) {

//	osetrenie nutnych parametrov pre spravne fungovanie [url, content[, onSuccess]]
	if (!params.url) {
		alert("Zadaj url");
		return false;
	} else {
		//  do kazdej poziadavky cez ajax pridam $_GET["ajax"]=1, pre osetrenie v php
		if (params.url.indexOf('?')!= -1) {
			params.url += '&ajax=1';
		} else {
			params.url += '?ajax=1';
		}
	}
	
//	content je nepovinny
//	if (!params.content) {
//		alert("Zadaj co sa ma poslat [content]");
//		return false;
//	}
	
//	@param onSuccess som dal nepovinny, defaultne sa vykona eval(xmlhttp.responseText)
//	if (!params.onSuccess) {
//		alert("Zadaj fciu onSuccess");
//		return false;
//	}
	
//	nastavenie premennych triedy
	if (params.method) {
		this.method = params.method;
	} else {
		this.method = "GET";
	}
	
	if (params.mode) {
		this.mode = params.mode;
	} else {
		this.mode = true;
	}
	
//	@params params je tiez typu object
	if (params.params) {
		this.params = params.params;
	}
	
	if (params.onSuccess && typeof(params.onSuccess) == "function") {
		this.onSuccess = params.onSuccess;
	} else {
		this.onSuccess = function(xmlhttp) {if(xmlhttp.responseText) {eval(xmlhttp.responseText)}};
	}
	
//	nastavenie premennej na fciu, kt. sa pusti, ak sa nenajde dana url [this.url]
	if (params.on404 && typeof(params.on404) == "function") {
		this.on404 = params.on404;
	} else {
		this.on404 = function() {alert("Sorry, requested script not found!!")}
	}

//	nastavenie premennej na fciu, kt. sa pusti, ak nastane neocakavana chyba [vsetko okrem kodu 200 a 404]
	if (params.onError && typeof(params.onError) == "function") {
		this.onError = params.onError;
	} else if(params.debug) {
		this.onError = function() {alert('chyba!')};
	}

  	this.url = params.url;
  	this.content = params.content;
  	this.headers = params.headers;

//  this.setParams = function () {
//    this.params = new Array(arguments.length);
//    for (var i=0; i<arguments.length; i++)  {
//      this.params[i] = arguments[i];
//    }      
//  }
  

//	kedze sa to vola z anonymnej fcie, musim este aj THIS predat ako 3.parameter =(
	this.onstatechange = function (xmlhttp, params, obj) {
		if (xmlhttp.readyState == 4)  { 
//			volanie fcie pri uspechu
		    if (xmlhttp.status == 200)  {
		       obj.onSuccess(xmlhttp, params);
//			volanie fcie pri nenajdeni serveroveho skriptu
		    } else if(xmlhttp.status == 404)  {
		       obj.on404();
//			volanie inak..
		    } else {
		       obj.onError();
		    }
		    
//		    na konci uvolnime pamat .. toto je uplny koniec vsetkeho =)
			xmlhttp.onreadystatechange = null;
		    xmlhttp = null;
		}
				
	}

  	this.send = function () {
	    var xmlhttp = false;
	    if (window.XMLHttpRequest)          // if Mozilla, Safari etc
	      xmlhttp = new XMLHttpRequest()
	    else if (window.ActiveXObject)      // if IE
	    { 
	      try {
	        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP")
	      } 
	      catch (e){
	      try{
	        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
	      }
	      catch (e2){}
	      }
	    }
	  
	    if (!xmlhttp || !document.getElementById || !document.createElement) 
	    { 
	      alert("Váš prehliadač nepodporuje AJAX technológiu"); 
	      return false; 
	    } 
	    
	    xmlhttp.open(this.method, this.url, this.mode); //  otvorim spojenie
	    
//	    musim volat anonymnu fciu, aby som mohol predat argumenty, potom vsak nemozem pristupovat k premennym triedy priamo..
		var onstatechange_tmp = this.onstatechange;
		var params = this.params;
		var obj = this;
	    xmlhttp.onreadystatechange = function() {onstatechange_tmp(xmlhttp, params, obj)};
	  
//	    ak pouzijem metodu POST, je treba nastavit prislusnu hlavicku..
	    if (this.method == 'POST')
	      	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	  
	    if (this.headers) 
	    { 
	      for (var key in this.headers) 
	      {
	        xmlhttp.setRequestHeader(key, this.headers[key]);
//	        alert(key + this.headers[key])
	      } 
	    } 
	
	    xmlhttp.send(this.content); 
	    return true; 
  	}

  	//	hned posleme request
  	this.send(); 
  	
  	return true;
}


