/**
* PeriodicalUpdater - jQuery plugin for timed, decaying ajax calls
*
* Smokejumper Version by Robert Fischer, Smokejumper IT
* Based on version from http://www.360innovate.co.uk
*
* Copyright (c) 2009 by the following:
* * Robert Fischer (http://smokejumperit.com)
* * 360innovate (http://www.360innovate.co.uk)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Version: 2.0
*/
 
(function($) {
    $.PeriodicalUpdater = function(url, options, callback){
 
        var settings = jQuery.extend(true, {
            url: url, // URL of ajax request
            method: 'get', // method; get or post
            data: '', // array of values to be passed to the page - e.g. {name: "John", greeting: "hello"}
            minTimeout: 1000, // starting value for the timeout in milliseconds
            maxTimeout: 8000, // maximum length of time between requests
            multiplier: 2, // if set to 2, timerInterval will double each time the response hasn't changed (up to maxTimeout)
            type: 'text' // response type - text, xml, json etc
        }, options);
        
        // set some initial values, then begin
        var prevContent = null;
        var timerInterval = settings.minTimeout;
 
// Function to boost the timer (nop unless multiplier > 1)
var boostPeriod = function() { return; };
if(settings.multiplier > 1) {
boostPeriod = function() {
timerInterval = timerInterval * settings.multiplier;
 
if(timerInterval > settings.maxTimeout) {
timerInterval = settings.maxTimeout;
}
};
}
 
var PeriodicalTimer = null; // Getting a handle on this for some reason
 
// Construct the settings for $.ajax based on settings
var ajaxSettings = jQuery.extend(true, {}, settings);
if(settings.type && !ajaxSettings.dataType) ajaxSettings.dataType = settings.type;
if(settings.sendData) ajaxSettings.data = settings.sendData;
ajaxSettings.type = settings.method; // 'type' is used internally for jQuery. Who knew?
ajaxSettings.ifModified = false;
ajaxSettings.cache = false;
ajaxSettings.success = function(data) {
var pData = $.param(data);
if((prevContent || prevContent == "") && prevContent == pData) {
boostPeriod();
} else {
window.console && console.log("Change in data: old data is " + prevContent + " and new data is " + pData);
prevContent = pData;
timerInterval = settings.minTimeout;
if(callback) {
callback(data);
}
}
PeriodicalTimer = setTimeout(getdata, timerInterval);
if(settings.success) { settings.success(data); }
};
ajaxSettings.error = function (XMLHttpRequest, textStatus) {
if(textStatus == "notmodified") {
boostPeriod();
} else {
window.console && console.log("Resetting due to error: " + textStatus);
prevContent = null;
timerInterval = settings.minTimeout;
}
PeriodicalTimer = setTimeout(getdata, timerInterval);
if(settings.error) { settings.error(XMLHttpRequest, textStatus); }
};
 
// Make the first call
        $(function() { getdata(); });
 
function getdata() { $.ajax(ajaxSettings); }
    };
})(jQuery);
