/*--------------------------------------------------------------------------
--
--   @(#) Datei   : [item]
--   @(#) Version : [version]
--   @(#) Status  : [state]
--   @(#) Datum   : [modtime]
--   @(#) Pfad    : [viewpath]
--   @(#) Package : [package]
--
----------------------------------------------------------------------------
--
--   Aenderungen:
--
--   LNR  Datum       Name/Firma        SCR/Beschreibung
--
--   000  01.03.2008  Koetter/cdb       Erstellung
--   001  20.05.2008  Koetter/cdb       SCR06956: Stoppen des keepalive, wenn Statuscode != 2xx
--   002  02.06.2008  Koetter/cdb       SCR06956: Stoppen des keepalive, wenn Statuscode != 2xx#
--   003  01.09.2008  Koetter/cdb       SCR06956: Keepalive auch ohne AjaxRequest moeglich
--
--------------------------------------------------------------------------*/

/**
 * @projectDescription CCF
 *
 * @author  Andres Koetter andres.koetter@comdirect.de
 * @version @() [version]
 * @since   @() [crtime]
 */

/**
* jQuery-Plugin zum senden eines keepalive &uuml;ber einen ajaxcall
* <p>
* Beispiel:<br>
* $('#blah').keepalive({url:'/tx/somewhere/keepalive.gif',interval:300,onError:'continue'});<br>
* $('#blah').keepalive({multi:[{url:'/tx/somewhere/keepalive.gif',interval:300,onError:'continue'},<br>
*                              {url:'/tx/somewhere/keepalive2.gif',interval:500,onError:'stopAll'}]});<br>
* <p>
* Beispiel mit ccf:<br>
* {keepalive:{url:'/tx/somewhere/keepalive.gif',interval:300}}<br>
* {keepalive:{multi:[{url:'/tx/somewhere/keepalive.gif',interval:300,onError:'continue'},<br>
*                    {url:'/tx/somewhere/keepalive2.gif',interval:500,onError:'stopAll'}]}}<br>
*
* @param {Array} multi Diese Option kann verwendet werden, wenn mehrer voneinander abhaengige
*              Keepalives gesendet werden. Interessant mit der Option 'onError:stopAll'. <br>
*              'multi' klammert mehrer Keepalive-Requests in einem Array zusammen
* @param {String} url Aufzurufenden URL (default '/tx/somewhere/keepalive.gif')
* @param {int} interval Interval in denen Keepalive-Requests gesendet werden in Sekunden (default 600 = 10min)
* @param {boolean} ajaxRequest Art des Requests, ajaxRequests werden nur innerhalb der SameOriginPolcy ausgefuhert (default: true)
* @param {String} onError Moegliche Werte sind stop, stopAll, continue (default:continue) <br>
*                 Jeder andere String wird wie 'continue' behandelt. <br>
*          stop: ist die Antwort des Servers != 2xx, dann wird kein weiterer Keepalive-Request
*                an DIESEN Server gesendet<br>
*          stopAll: Nur relevant wenn 'multi'-Parameter verwendet wird. Keepalive-Requests
*                   an ALLE Server werden gestoppt bei einer Antwort != 200<br>
*          continue: keepalive-Request ignorieren Serverantwort und senden immer weiter
* @return {jQueryObject} Das jQuery-Objekt wird nicht veraendert durch die Funktion,
*         es wird jedoch wieder zurueckgegeben, da jedes Plugin das Objekt zurueckgeben soll,
*         damit die jQuery-Verkettung (chainability) weiterhin gegeben ist.
*/
jQuery.fn.keepalive = function(options) {
  var defaults = {
    url:'blank.gif',
    interval:600,
    onError:'continue',
    ajaxRequest:true
  };
  var intervalArray = [];
  var optionsArray  = [];

  options.multi ? optionsArray = options.multi : optionsArray = [options];

  for(var i = 0; i < optionsArray.length; i++) {
    // Object-Initialiser, erzeugt JEDES Mal ein NEUES Object
    var theClone = {};
    // Call by Reference
    var reference = jQuery.extend(defaults, optionsArray[i]);
    // JS bietet keine clone-Funktion fuer Objects, eventuell mal rausziehen in Util-Plugin
    for (i in reference) {
        theClone[i] = reference[i];
    }
    optionsArray[i] = theClone;
  }

  /* Function-Factory unter Verwendung von Closures
   * Eine Function-Factory ist notwendig, da einem setInterval/setTimeout immer nur
   * eine Funktion uebergeben werden kann, jedoch keine Parameter.
   * Durch das Erzeugen der Closures in der Function-Factory bleiben die Variabeln
   * ueber den Aufruf der Funktion hinaus persistent. Es wird somit eine Funktion
   * erzeugt der die persistenten Variabeln injiziert werden.
   */
  function keepAliveFactory(opts, numberOfInterval) {
    var opts = opts;
    var numberOfInterval;

    function processKeepAlive(){
     if(opts.ajaxRequest == false) {
    	 var img = new Image()
         img.src = opts.url + '?_=' + new Date().getTime();
    	 img.onerror = errorProcess;
     }
     else
     {
      jQuery.ajax({
        url: opts.url,
        cache: false,
        error: errorProcess
      });
    }

	 function errorProcess(){
	     opts.onError == 'stop' ? clearInterval(intervalArray[numberOfInterval]) : true;
	     if(opts.onError == 'stopAll'){
	         for(var i=0;i<intervalArray.length;i++) {
	             clearInterval(intervalArray[i]);
	         }
	     }
	 }     
     
    }
    return function (){
      processKeepAlive();
      intervalArray[numberOfInterval] = setInterval(processKeepAlive,(opts.interval * 1000));
    };
  }


  return this.each(function(){
    if (defaultRegistry.getTimesDomChanged() == 0) {
        for (var i = 0; i < optionsArray.length; i++) {
            var keepAlive = keepAliveFactory(optionsArray[i], i);
            keepAlive();
        }
    }
  });
};                                

jQuery(document).ready(function() {defaultRegistry.addEntry("keepalive","keepalive")});