/**
* ekko - jQuery Plugin
*
* Version - 0.1.0
*
* Copyright (c) 2009 Terry M. Schmidt
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*
* Based on the work done by John McCollum and the jQuery PeriodicalUpdater plugin.
* 
**/

(function(jQuery) {
	jQuery.fn.ekko = function (options, callback) {

		return this.each(function () {
			
			var elem	= this;
			var $elem	= jQuery(this);
			
			// Initial Settings
			elem.settings = jQuery.extend({
	            url			: '',
	            method		: 'get',
	            sendData	: '',
	            minTimeout	: 1000, // Default 1 second
	            maxTimeout	: ((1000 * 60) * 60), // Default 1 hour
	            multiplier	: 2,
	            type		: 'text'
	        }, options);
			
			elem.settings.ajaxMethod = /post/i.test(elem.settings.method) ? jQuery.post : jQuery.get;
			elem.settings.prevContent = '';
			elem.settings.originalMinTimeout = elem.settings.minTimeout;
			
			start();
			
			function start() {
				elem.settings.ajaxMethod(elem.settings.url, elem.settings.sendData, function (data) {
					if (elem.settings.prevContent != data) {
						elem.settings.prevContent = data;
						if (callback) {
							callback(data)
						}
						// reset minTimeout
						elem.settings.minTimeout = elem.settings.originalMinTimeout;
						elem.settings.periodicalUpdater = setTimeout(start, elem.settings.minTimeout);
					} else {
						if (elem.settings.minTimeout < elem.settings.maxTimeout) {
							elem.settings.minTimeout = elem.settings.minTimeout * elem.settings.multiplier
						}
						
						if (elem.settings.minTimeout > elem.settings.maxTimeout) {
							elem.settings.minTimeout = elem.settings.maxTimeout
						}
						
						elem.settings.periodicalUpdater = setTimeout(start, elem.settings.minTimeout);
					}
				}, elem.settings.type);
			} // start()
		});
		
	}; // jQuery.fn.ekko()
	
	jQuery.fn.ekkoStop = function () {
		return this.each(function () {
			var elem = this;
			clearTimeout(elem.settings.periodicalUpdater)
		});
	} // jQuery.fn.ekkoStop()
})(jQuery);