var ajaxError = false;

/**
 * Load functions.
 *
 * @copyright Travelsoft
 * @author emmanuel.sammut
 * @version 1.0
 */
(function($){

  /**
   * Function toggleContent.
   * Toggle a target content and if optional pageURL is defined call loadContent method.
   *
   * @param {Object} options
   *   @property {jQuery} elements for toggle action
   *   @property {String} pageURL for loadContent [optional]
   *   @property {String} classWaiting for set loadWaiting, default at "ajaxLoader01" [optional]
   *   @property {Object} optionsWaiting for set loadWaiting, default at "300px"  [optional]
   * @param {Function} callback on complete [optional]
   * @return {Object} jQuery wrapper set
   */
  $.fn.toggleContent = function(options, callback){
    // jQuery Object extend
    options = $.extend({
      elements: $(this).prev("div"),
      targetName: $("strong", this),
      nameOpen: "Ouvrir",
      nameClose: "Fermer",
      classWaiting: "ajaxLoader01",
      optionsWaiting: {height:"300px"}
    },options||{});
    if(options.elements){
      // Defined variables
      var elements = options.elements;
      var name = options.targetName;
      // Get the content of the IDContent is empty
      var sizeContent = elements.children(":visible").size();
      if(sizeContent == 0 && options.pageURL){
        name.text(options.nameClose);
        elements.show()
                .loadWaiting(options.classWaiting, options.optionsWaiting)
                .loadContent(options, callback);
      } else if(!options.pageURL){
        if(elements.is(":visible")){
          name.text(options.nameOpen);
          elements.hide();
        } else {
          name.text(options.nameClose);
          elements.show();
        }
      } else {
        name.text(options.nameOpen);
        elements.hide().empty();
      }
    }
  }

  /**
   * Function loadContent.
   * page with manageAjax plugin
   *
   * @param {Object} options
   *   @property {String} pageURL
   *   @property {jQuery} elements [optional]
   * @param {Function} callback
   * @return {Object} jQuery wrapper set
   */
  $.fn.loadContent = function(options, callback){
    // jQuery Object extend
    options = $.extend({
      elements: this,
      pageURL: "error404.jsp?errorString=pageURL%20parameter%20is%20not%20defined!"
    },options||{});
    // Defined variables
    var elements = options.elements;

    // Call ajax load
    $.ajax({
      url: options.pageURL,
      success: function(data, status){
        elements.html(data);
      },
      error: $.handleAjaxCallError,
      complete: callback
    });
  }

  /**
   * Function appendContent.
   * Recursive calls to append the given urls data into an element.
   *
   * @param {Object} options
   *   @property {String} pageURL
   *   @property {String} classWaiting for set loadWaiting, default at "ajaxLoader01" [optional]
   *   @property {Object} optionsWaiting for set loadWaiting, default at "300px"  [optional]
   * @param {Array} urls
   * @param {int} index. The current iteration index.
   * @return {Object} jQuery wrapper set
   */
  $.fn.appendContent = function(options, urls, callback, index){
    // jQuery Object extend
    options = $.extend({
      elements: this,
      classWaiting: "ajaxLoader01",
      optionsWaiting: {height:"150px"}
    },options||{});

    // Defined variables
    var elements = options.elements;

    var currIndex = 0;
    if (index != null) {
        currIndex = index;
    }
    if (urls != null) {
      if (currIndex < urls.length) {
        if (currIndex == 0) {
            elements.appendWaiting(options.classWaiting, options.optionsWaiting);
        }
        // Call ajax load
        $.ajax({
          url: urls[currIndex],
          success: function(data){
            elements.children(":last").remove(); // remove the waiting span.
            elements.append(data);
            elements.appendWaiting(options.classWaiting, options.optionsWaiting);
            elements.appendContent(options, urls, callback, currIndex + 1);
          },
          error: $.handleAjaxCallError,
          complete: callback
        });
      } else {
         elements.children(":last").remove(); // remove the waiting span.
      }
    }
  }

  /**
   * Plugin getContent.
   * Load page with manageAjax plugin
   *
   * @param {Object} options
   *   @property {String} pageURL
   * @param {Function} callback on complete [optional]
   * @return {String} data into callback function
   */
  $.getContent = function(options, callSuccess, callback){
    // jQuery Object extend
    options = $.extend({
      pageURL: "error404.jsp?errorString=pageURL%20parameter%20is%20not%20defined!"
    },options||{});
    // Call ajax load
    $.ajax({
      url: options.pageURL,
      success: callSuccess,
      error: $.handleAjaxCallError,
      complete: callback
    });
  }

  /**
   * Plugin getMultiContent.
   * Load multi content into only page and  with manageAjax plugin
   *
   * @param {Object} options
   *   @property {String} pageURL
   * @param {Array} elementList Array of jQuery element.
   * @param {Function} callback on complete [optional]
   */
  $.getMultiContent = function(options, elementList, callback){
    // jQuery Object extend
    options = $.extend({
      pageURL: "error404.jsp?errorString=pageURL%20parameter%20is%20not%20defined!"
    },options||{});
    // Call ajax load
    $.ajax({
      url: options.pageURL,
      beforeSend: function(){
        var lengthElementList = elementList.length;
        for (var i = 0; i < lengthElementList; i++) {
          elementList[i].loadWaiting("ajaxLoader01");
        }
      },
      success: function(data){
        var contentList = data.split("<!-- #### -->");
        var lengthElementList = elementList.length;
        for (var i = 0; i < lengthElementList; i++){
          elementList[i].html(contentList[i]);
        };
      },
      error: $.handleAjaxCallError,
      complete: callback
    });
  }

  $.handleAjaxCallError = function (XMLHttpRequest, textStatus, errorThrown) {
      var errorXhrStatus = XMLHttpRequest.status;

      if (errorXhrStatus >= 400 && !ajaxError) {
          ajaxError = true;
          jAlert("Une erreur est survenu durant le chargement.<br/>Veuillez nous excuser et renouveler votre requête dans quelques minutes.<br/>Merci.", "Information", function(r) {
              ajaxError = false;
          });
          return;
      }
      if (errorXhrStatus == 302 && !ajaxError) {
          ajaxError = true;
          top.location.href="/h20.jsp";
      }
      
  }


})(jQuery);
