

(function() {

  window.liftAjax = {
    lift_ajaxQueue: [],
    lift_ajaxInProcess: null,
    lift_ajaxShowing: false,
    lift_ajaxRetryCount: 3,

    lift_ajaxHandler: function(theData, theSuccess, theFailure, responseType){
	  var toSend = {retryCnt: 0};
	  toSend.when = (new Date()).getTime();
	  toSend.theData = theData;
	  toSend.onSuccess = theSuccess;
	  toSend.onFailure = theFailure;
	  toSend.responseType = responseType;

	  liftAjax.lift_ajaxQueue.push(toSend);
	  liftAjax.lift_ajaxQueueSort();
	  liftAjax.lift_doAjaxCycle();
	  return false; // buttons in forms don't trigger the form

    },

    lift_ajaxQueueSort: function() {
      liftAjax.lift_ajaxQueue.sort(function (a, b) {return a.when - b.when;});
    },

    lift_defaultFailure: function() {
      alert("The server cannot be contacted at this time");
    },

    lift_startAjax: function() {
      liftAjax.lift_ajaxShowing = true;
      jQuery('#'+"ajax-loader").show();
    },

    lift_endAjax: function() {
      liftAjax.lift_ajaxShowing = false;
      jQuery('#'+"ajax-loader").hide();
    },

    lift_testAndShowAjax: function() {
      if (liftAjax.lift_ajaxShowing && liftAjax.lift_ajaxQueue.length == 0 && liftAjax.lift_ajaxInProcess == null) {
        liftAjax.lift_endAjax();
      } else if (!liftAjax.lift_ajaxShowing && (liftAjax.lift_ajaxQueue.length > 0 || liftAjax.lift_ajaxInProcess != null)) {
        liftAjax.lift_startAjax();
      }
    },

    lift_traverseAndCall: function(node, func) {
      if (node.nodeType == 1) func(node);
      var i = 0;
      var cn = node.childNodes;

      for (i = 0; i < cn.length; i++) {
        liftAjax.lift_traverseAndCall(cn.item(i), func);
      }
    },

    lift_successRegisterGC: function() {
      setTimeout("liftAjax.lift_registerGC()", 75000);
    },

    lift_failRegisterGC: function() {
      setTimeout("liftAjax.lift_registerGC()", 15000);
    },

    lift_registerGC: function() {
      var data = "__lift__GC=_"
      jQuery.ajax({ url : liftAjax.addPageName("/ajax_request/;jsessionid=10dkppgwa4z0m"), data : data, type : "POST", dataType : "script", timeout : 5000, cache : false, success : liftAjax.lift_successRegisterGC, error : liftAjax.lift_failRegisterGC });
    },

    lift_doAjaxCycle: function() {
      var queue = liftAjax.lift_ajaxQueue;
      if (queue.length > 0) {
        var now = (new Date()).getTime();
        if (liftAjax.lift_ajaxInProcess == null && queue[0].when <= now) {
          var aboutToSend = queue.shift();

          lift_ajaxInProcess = aboutToSend;

          var successFunc = function(data) {
            liftAjax.lift_ajaxInProcess = null;
            if (aboutToSend.onSuccess) {
              aboutToSend.onSuccess(data);
            }
            liftAjax.lift_doAjaxCycle();
          };

          var failureFunc = function() {
            liftAjax.lift_ajaxInProcess = null;
            var cnt = aboutToSend.retryCnt;
            if (cnt < liftAjax.lift_ajaxRetryCount) {
	          aboutToSend.retryCnt = cnt + 1;
              var now = (new Date()).getTime();
              aboutToSend.when = now + (1000 * Math.pow(2, cnt));
              queue.push(aboutToSend);
              liftAjax.lift_ajaxQueueSort();
            } else {
              if (aboutToSend.onFailure) {
                aboutToSend.onFailure();
              } else {
                liftAjax.lift_defaultFailure();
              }
            }
            liftAjax.lift_doAjaxCycle();
          };

          if (aboutToSend.responseType != undefined &&
              aboutToSend.responseType != null &&
              aboutToSend.responseType.toLowerCase() === "json") {
            liftAjax.lift_actualJSONCall(aboutToSend.theData, successFunc, failureFunc);
          } else {
            liftAjax.lift_actualAjaxCall(aboutToSend.theData, successFunc, failureFunc);
          }
         }
      }

      liftAjax.lift_testAndShowAjax();
      setTimeout("liftAjax.lift_doAjaxCycle();", 200);
    },

    addPageName: function(url) {
      return url.replace('ajax_request', 'ajax_request/'+lift_page);
    },

    lift_actualAjaxCall: function(data, onSuccess, onFailure) {
      jQuery.ajax({ url : liftAjax.addPageName("/ajax_request/;jsessionid=10dkppgwa4z0m"), data : data, type : "POST", dataType : "script", timeout : 5000, cache : false, success : onSuccess, error : onFailure });
    },

    lift_actualJSONCall: function(data, onSuccess, onFailure) {
      jQuery.ajax({ url : liftAjax.addPageName("/ajax_request/;jsessionid=10dkppgwa4z0m"), data : data, type : "POST", dataType : "json", timeout : 5000, cache : false, success : onSuccess, error : onFailure });
    }
  };

  window.liftUtils = {
    lift_blurIfReturn: function(e) {
      var code;
      if (!e) var e = window.event;
      if (e.keyCode) code = e.keyCode;
      else if (e.which) code = e.which;

      var targ;

      if (e.target) targ = e.target;
      else if (e.srcElement) targ = e.srcElement;
      if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;
      if (code == 13) {targ.blur(); return false;} else {return true;};
    }
  };


})();
jQuery(document).ready(function() {liftAjax.lift_doAjaxCycle()});