var ACJS = new Object();

/*
##############################################################
###############     ACJS ajax - START     ####################
###############       wersja 1.0.0        ####################
##############################################################
*/

ACJS.ajax = function (komponent, url, metoda, parametry)
{
  this.komponent = komponent;   // obiekt komponentu
  this.url = url;               // url który na który ma zostać wysłane rządanie
  this.metoda = metoda;         // POST/GET
  this.parametry = parametry; 
  
  // sprawdzanie poprawnosci
  if (!(this.metoda == 'POST' || this.metoda == 'GET'))
    this.metoda = 'POST';
    
  // tworzenie obiektu XMLHTTPRequest
  this.req = null;
  if (window.XMLHttpRequest)
    this.req = new window.XMLHttpRequest;
  else if (window.ActiveXObject)  
    this.req = new window.ActiveXObject('Microsoft.XMLHTTP');
  
  if (this.req)
  {
    var aktualnyThis = this;
    this.req.onreadystatechange = function ()
    {
      aktualnyThis.odbierzDane.call(aktualnyThis);
    }      
  }
} 

ACJS.ajax.prototype.wyslij = function () // wysyłanie zapytania
{
  if (this.req)
  {
    this.req.open(this.metoda, this.url,true);
    this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    this.req.send(this.parametry);
    return true;
  }
  return false;
}

ACJS.ajax.prototype.odbierzDane = function ()
{
  if (this.req.readyState == 4)
  {
    if (this.req.status == 200 || this.req.status == 0) // dobra funkcja
    {      
      this.komponent.ajaxOk(this);      
    }    
    else  // funkcja bledu
    {
      this.komponent.ajaxBlad(this);
    }
  }
}

/*
##############################################################
##########     ACJS obslugaZdarzen - START     ###############
###############       wersja 1.0.0        ####################
##############################################################
*/

ACJS.obslugaZdarzen = function(event, object) // event - nazwa zdarzenie np. onclick, object - obiekt HTML
{    
  this.thisObj = this;  
  if (object.events && object.events[event]) // jest juz obiekt obslugujacy to zdarzenie
  {
    this.thisObj = object.events[event];    
  }
  else // w przeciwnym razie konieczne jest utworzenie nowego obiektu
  {
    this.event = event;
    this.object = object;  
    this.functionList = new Array(); // list funkcji do wywolania w momenci zajscia zdarzenia

    if (!this.object.events) // gdy nie ma jescze tablicy przypisanej do elementu
    {
      this.object.events = new Array(); // tablica do rozrozniania roznych rodzajow zdzarzen
    }
  
    this.object.events[event] = this;
    
    this.object[event] = this.on;      
  }
}

ACJS.obslugaZdarzen.prototype.dodajFunkcje = function (e) // dodanie zdarzenia do listy
{
  this.thisObj.functionList[this.thisObj.functionList.length] = e;  
}

ACJS.obslugaZdarzen.prototype.on = function (event) // funkcja przypisywana do faktycznego wywolania po zajsciu zdarzenia  
{ // this = element DOM
  var e = event || window.event;
  
  var eventsArray = this.events; // this odnosi sie do elementu DOM!!
  var eventObject = eventsArray["on"+e.type];
  
  eventObject.wykonaj(e, eventObject, this);  
}

ACJS.obslugaZdarzen.prototype.wykonaj = function(e, eventObject, DOMObject) // wykonuje przypisane zdzarzenia
{
  for (var i = 0; i < this.thisObj.functionList.length; i++)    
    (this.thisObj.functionList[i]).call(DOMObject, e, eventObject);
    // w funkcji wywolywanej dostają się następujące parametry:
    // this -> DOMObject
    // 0 -> e
    // 1 -> eventObject
}


// Do obiektu zostaje dodana tablica events[] ;
// Do tej tablicy przypisywany jest obiekt ACJS.obslugaZdarzen 
// indeksem jest nazwa zdarzenia np. click 



