// ------------------------------------------ //
// általános AJAX beállítások minden kéréshez //
// ------------------------------------------ //
$.ajaxSetup({
  headers: { Accept : "text/html,application/xhtml+xml,*/*" }
});

// -------------------------------- //
// update JSreq kérés regisztrálása //
// -------------------------------- //
var autoUpdaters = new Array();
requestHandlers['update'] = function(element,data) {
  // ha van autoTime, időzített frissítés
  if (data.autoTime != undefined)
    autoUpdaters[data.elName] = setTimeout(function() {
      updateElement(data);
    }, data.autoTime*1000);

  // ha nincs, frissítés kattintásra
  else element.click(function(event) {
    event.preventDefault();
    updateElement(data);
    return false;
  });
}

// ---------------------------------- //
// DOM servert használó ajax frissítő //
// ---------------------------------- //

// params objektum lehetséges értékei:
//  - elName: az oldal melyik elemét szeretnénk frissíteni? Kötelező megadni.
//  - postParams: a funkció mindenképpen post-ol. Ha szeretnénk paramétereket átadni, itt adhatjuk meg őket.
//  - newUrl: ha egy másik url-t szeretnénk betölteni, nem önmagunkat, adjuk meg. Ha nem adjuk meg, önmagunk kerül frissítésre
//  - animate: ha szeretnénk animációt, adjuk meg annak nevét, vagy állítsuk true-ra az alapértelmezetthez. Más esetben nem lesz.
//  - successFunc: funkció szkóp, amelyet a sikeres frissítés és a runlist futtatása után futtatunk. Nem kötelező.
//  - showOverlay: ha true-ra állítjuk, akkor az ajaxos frissítés ideje alatt egy sötétítő és egy fogaskerék jelenik meg

function updateElement(params) {
  // a korábbi frissítési timeout-ot kikapcsoljuk
  if (autoUpdaters[params.elName] != undefined)
    clearTimeout(autoUpdaters[params.elName]);

  // ====================================== //
  // == LEHETSÉGES ANIMÁCIÓK DEFINIÁLÁSA == //
  // ====================================== //
  var anim = new Array();

  // eltüntetés - majd - megjelenítés effektusok
  var hideAndShow = function(effect,element,newHTML,callback) {
    element.hide(effect, function() {
      element
        .replaceWith(newHTML)
        .hide()
        .show(effect, callback())
    });
  }

  anim['blind'] = function(element,newHTML,callback) { hideAndShow('blind',element,newHTML,callback); }
  anim['drop'] = function(element,newHTML,callback) { hideAndShow('drop',element,newHTML,callback); }
  anim['fade'] = function(element,newHTML,callback) { hideAndShow('fade',element,newHTML,callback); }

  // slider (jobbra / balra lapozás) effektusok
  var slideContent = function(direction,element,newHTML,callback) {
    var oldHTML = element.html();
    var effect = 'swing';
    var time = 400;

    element
      .css('width', element.width())
      .css('height', element.height())
      .css('overflow', 'hidden')
      .empty();

    var relative = $('<div></div>')
      .css('position','relative')
      .css('overflow', 'visible')
      .appendTo(element);

    var oldDOM = $('<div></div>')
      .css('position','absolute')
      .css('width','100%')
      .css('top',0)
      .css('left',0)
      .html(oldHTML)
      .appendTo(relative);

    var newDOM = $('<div></div>')
      .css('position','absolute')
      .css('width','100%')
      .css('top',0)
      .css('left',element.width()*direction)
      .html($(newHTML).html())
      .appendTo(relative);

    element.animate({width: newDOM.width(), height: newDOM.height()}, time, effect);
    oldDOM.animate({left: element.width()*direction*-1}, time, effect)
    newDOM.animate({left: 0}, time, effect, function() {
      element.replaceWith(newHTML);
      callback();
    });
  }

  anim['slideLeft'] = function(element,newHTML,callback) { slideContent(-1,element,newHTML,callback); }
  anim['slideRight'] = function(element,newHTML,callback) { slideContent(+1,element,newHTML,callback); }


  // ====================================== //
  // == PARAMÉTEREK FELDOLGOZÁSA ÉS AJAX == //
  // ====================================== //

  // url beállítása a jelenlegire ha nincs jól megadva
  if (params.newUrl == undefined || params.newUrl == false)
    params.newUrl = env['currentURL'];

  // animáció beállítása az alapértelmezettre ha csak kérve van, de nincs meghatározva
  if (params.animate == true)
    params.animate = 'blind';

  // beállítjuk a html kódba rejtett overlay elemet a megfelelő pozícióba
  var overlay = $('#waitOverlay');
  var waitTime = 0;
  if (params.showOverlay) {
    var waitTime = 400;
    overlay
      .css('top', $("#" + params.elName).offset().top)
      .css('left', $("#" + params.elName).offset().left)
      .css('width', $("#" + params.elName).innerWidth())
      .css('height', $("#" + params.elName).innerHeight());
  }

  // ajax lekérdezés
  setTimeout(function() {
    $.post(
      env['baseURL'] + "/" + params.newUrl + "&baseEl=" + params.elName + "&ajaxMode=true",
      params.postParams,
      function(result) {
        // megváltoztatjuk az URL-t ha kell
        if (params.modifyURL == true) {
          location.hash = '#/'+params.newUrl;
        }

        // miután kész, az overlay elemet eltüntetjük
        overlay
          .css('width',0)
          .css('height',0);

        // ha animálás van kérve, először elrejtjük, majd lecseréljük, megjelenítjük majd végrehajtjuk rá a funkciókat
        if (typeof(params.animate) == 'string') {
          anim[params.animate]($("#" + params.elName), result, function() {
            $.each(updateRunList, function(index, data) {
              if ($.isFunction(data)) data($("#" + params.elName));
            });
            if ($.isFunction(params.successFunc)) params.successFunc(result);
          });
        }

        // egyébként szimplán csak lecseréljük és futtatjuk rá a funkciókat
        else {
          $("#" + params.elName).replaceWith(result);
          $.each(updateRunList, function(index, data) {
            if ($.isFunction(data)) data($("#" + params.elName));
          });
          if ($.isFunction(params.successFunc)) params.successFunc(result);
        }
      }
    );
  }, waitTime);
}
