/**
 * Ez regisztrálja be, hogy minden AJAX lekérés esetén ezek fussanak le!
 *  - loader kép megjelenítése és eltüntetése
 *  - rendszerüzenetek "resetelése", azaz törlése...
 */
Ajax.Responders.register ({
  onCreate    : function() {
                  openLoader();
                  if($('system_msgs')) {
                    $('system_msgs').remove();
                  }
                  if($('errors')) {
                    $('errors').remove();
                  }
                },
  onComplete  : function(transport) {
                  closeLoader();
                }
});

/**
 * Tag név alapján visszaadja az objektumok tömbjét!
 * @param   string tag_name
 * @return  array
 */
function $T(tag_name) {
  return $A(document.getElementsByTagName(tag_name));
}

/**
 * Tag név alapján visszaadja az objektumok tömbjét!
 * @param   string tag_name
 * @return  array
 */
function $C(class_name) {
  return document.getElementsByClassName(class_name);
}

/**
 * Egy rendszerüzenetet jelenít meg a kijelölt azonosítójú "blockban".
 * @param   string  msg_box A doboz azonosítója, amiben szeretnénk az üzenetet megjeleníteni.
 * @param   array   msgs    Az üzenetek tömbje.
 * @return  void
 */
function showMsgs(msg_box, msgs) {
  // A msg_list változót használjuk, ha már létezik az adott blokk!
  msg_list  = '<li>'+msgs.join('</li><li>')+'</li>';
  // Ha nem létezik, akkor nulláról hozzuk létre!
  msg_block = '<ul id='+msg_box+'>'+msg_list+'</ul>';
  // Ha nem létezik a blokk
  if(!$(msg_box)) {
    if($('breadcrumbs')) {
      new Insertion.After('breadcrumbs', msg_block);
    } else {
      new Insertion.Before($T('h1').first(), msg_block);
    }
  // Ha létezik, akkor a tartalmat lecseréli!
  } else {
    $(msg_box).update(msg_list);
  }
}

/**
 * Egy megadott ÉS MÁR LÉTEZŐ dobozba betölti az url tartalmát!
 * @param     string id   A box egyedi azonosítója.
 * @param     string url  Az url amit be kell tölteni.
 * @transport JSON        A 'html' elemet jeleníti meg.
 * @return    void
 */
function openInBox(id, url) {
  new Ajax.Request(url,
    {
      onSuccess:  function(transport){
                    var box = $(id);
                    var response = transport.responseText.replace(/&quot;/gi,'"').unescapeHTML().evalJSON();
                    box.update(response.html)
                    box.showInMiddle($T('body').first());
                    
                    closeLoader();
                    
                    if(response.error.size()>0) {
                      alert(response.error.join("\n"));
                    }
                  },
      onFailure:  function() {
                    alert('Something went wrong...');
                  }
    });
}

function closeBox(id, remove) {
  if(remove) {
    $(id).remove();
  } else {
    $(id).hide();
  }
}

function openBox(url, id, box_class) {
  new Ajax.Request(url,
    {
      onSuccess:  function(transport) {
                    var box = $(document.createElement('div'));
                    box.setAttribute('id', id);
                    box.className = box_class;
                    //box.style.display = 'none';
                    $T('body').first().appendChild(box);
                    
                    // Az ostoba IE az unescapeHTML fv hívas közben NEM váltja vissza az idézőjelet, ezért ezt külön meg kell tenni, ezért van a replace()
                    var response = transport.responseText.replace(/&quot;/gi,'"').unescapeHTML().evalJSON();
                    box.update(response.html);
                    box.showInMiddle($T('body').first());
                    
                    var bd = box.getDimensions()
                    
                    closeLoader();
                    
                    if(response.error.size()>0) {
                      alert(response.error.join("\n"));
                    }
                  },
      onFailure:  function() {
                    alert('Something went wrong...');
                  }
    });
}

function loadTo(url, target, insertion) {
  target = $(target);
  new Ajax.Request(url,
    {
      onSuccess:  function(transport) {
                    // Az ostoba IE az unescapeHTML fv hívas közben NEM váltja vissza az idézőjelet, ezért ezt külön meg kell tenni, ezért van a replace()
                    var response = transport.responseText.replace(/&quot;/gi,'"').unescapeHTML().evalJSON();
                    insertResult(target, insertion, response.html);
                    
                    closeLoader();
                    
                    if(response.error.size()>0) {
                      alert(response.error.join("\n"));
                    }
                  },
      onFailure:  function() {
                    alert('Something went wrong...');
                  }
    });
}

function insertResult(target, insertion, html) {
  target = $(target);
  switch(insertion) {
    case 'before' : new Insertion.Before(target, html);
                    break;
    case 'after'  : new Insertion.After(target, html);
                    break;
    case 'top'    : new Insertion.Top(target, html);
                    break;
    case 'bottom' : new Insertion.Bottom(target, html);
                    break;
    default       : $(target).update(html);
  }
}

var processes = [];

/**
 * Egy új processzt indít.
 * @param   string                          url                 Az URL, amit be kell töltenie a processhez.
 * @param   string                          class               Azt mondja meg, hogy milyen a CSS osztálya annak a div-nek, amiben elindítja a process-t!
 * @param   string                          recallFunctionName  A processz lefutása után ezt a fv-t fogja visszahívni.
 * @param   html [id|element]               target              A célterület, ahova majd az eredményt be kell szúrni.
 * @param   [inner|top|bottom|before|after] insertion           Azt mondja meg, hogy a célterülethez képest hova kell majd az eredményt beszúrni. Inner, az cseréli az egész tartalmat, a többi meg az Insertion osztály metódusa.
 * @return  void
 */
function openProcess(url, process_class, target, insertion) {
  var i   = $C(process_class).size();
  var id  = "ajax_process_"+i;
  processes.push($H({id: id, target: $(target), insertion: insertion}));
  openBox(url, id, process_class);
}

function endProcess(form, response) {
  begin   = [];
  target  = false;
  form    = $(form);
  id      = form.up().getAttribute('id');
  processes.each(function(h, index) {
    if(h.id==id) {
      insertResult(h.target, h.insertion, response.html);
      // Kivágjuk az aktuális részt!
      processes = processes.without(h);
      target    = id;
      throw $break;
    }
  })
  if(typeof(target)=='boolean') return false;
  return true;
}

function openLoader() {
  $('loader').showInMiddle($T('body').first()).style.zIndex = 500;
  if(Prototype.Browser.IE && $('loader').next().next().nodeName=='IFRAME') $('loader').next().next().style.zIndex==499;
}

function closeLoader() {
  if(Prototype.Browser.IE && $('loader').next().nodeName=='IFRAME') $('loader').next().remove();
  $('loader').hide();
}

function getWindowSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return $H({width: myWidth, height: myHeight});
}

/** 
* 
*  AJAX IFRAME METHOD (AIM) 
*  http://www.webtoolkit.info/ 
* 
**/  
  
AIM = {  
  
    frame : function(c, f) {  
  
        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+'\', \''+f.getAttribute('id')+'\')"></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);  
        var f_id = $(document.createElement('INPUT'));
        f_id.setAttribute('type', 'hidden');
        f_id.setAttribute('name', '_ajax_request_');
        f_id.setAttribute('value', '1');
        f.appendChild(f_id);
        this.hide(f);
    },  
  
    submit : function(f, c) {
        f = $(f);
        openLoader();
        AIM.form(f, AIM.frame(c, f));  
        if (c && typeof(c.onStart) == 'function') {  
            return c.onStart();  
        } else {  
            return true;  
        }  
    },
    
    // Módosíthatatlanná teszi a form-ot, amíg küldi
    hide : function(f) {
      f = $(f);
      f.hide();
      f.clone().disable();
    },
    
    show : function(f) {
      f.getClone().remove();
      f.show();
    },
  
    loaded : function(id, f) {
        var i = $(id);  
        var f = $(f);
        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;  
        }  
  
                    this.show(f);
                    closeLoader();

                    try {
                      var response = d.body.innerHTML.unescapeHTML().evalJSON();

                      if(response.error.size()>0) {
                        alert(response.error.join("\n"));
                      } else {
                        if(response.system_msgs.size()>0) {
                          // Megjeleníti az üzenetetet az "üzenő ablakban"
                          showMsgs('system_msgs', response.system_msgs);
                          alert(response.system_msgs.join("\n"));
                          // Ha érkezik átirányítás, akkor átirányítja a komplett oldalt.
                          if(response.location!=undefined) {
                            window.location=response.location;
                          } else {
                            // Ha openProcess-szel lett megnyitva a művelet, akkor azt be kell fejezni előtte.
                            endProcess(f, response);
                            this.reset(f);
                          }
                        }
                      }
                    } catch(err) {
                      alert('Hiba lépett fel az eredmény kiértékelésekor!');
                      alert(d.body.innerHTML);
                      alert(err.name);
                    }
        
        if (typeof(i.onComplete) == 'function') {  
            i.onComplete(d.body.innerHTML);  
        }  
    },  
    
    reset : function(f) {
      f = $(f);
      closed_obj = (Prototype.Browser.IE) ? f.up().next() : f.up();
      if(closed_obj.getAttribute('class')=='ajax_box') {
        closed_obj.remove();
      }
    }
}
