﻿/**
* jCountr
* Creates a countdown timer from a jQuery object. 
*
* $(<selector>).counter({params});
*
* @author agentor@gmx.de
* @version 1.2 [2009-05-06]
*/

jQuery.fn.counter = function(params) {
	var self = this;

	self.display = jQuery(this);
	self.hour = params.hour ? params.hour : "0";
	self.min = params.min ? params.min : "0";
	self.sec = params.sec ? params.sec : "0";
	self.hour_end = params.hour_end ? params.hour_end : "0";
	self.min_end = params.min_end ? params.min_end : "0";
	self.sec_end = params.sec_end ? params.sec_end : "0";
	self.message = params.message ? params.message : "FINISHED";
	self.delimiter = params.delimiter ? params.delimiter : ":";
	self.return_url = params.return_url ? params.return_url : "";
	self.finish_function = params.finish_function ? params.finish_function : "";
	self.interval = params.interval ? params.interval * 1000 : "1000";
	self.iteration = params.iteration ? params.iteration : "1";
	self.direction = params.direction ? params.direction : "down";

	self.timestamp = (self.hour * 60 * 60) + (self.min * 60) + (self.sec * 1);
	self.timestamp_end = (self.hour_end * 60 * 60) + (self.min_end * 60) + (self.sec_end * 1);

	self.onTick = params.onTick ? params.onTick : function() { return true; };
	self.onFinish = params.onFinish ? params.onFinish : function() { return true; };


	/** update the countdown while running **/
	self._updateCounter = function(params) {
		self.change_hour = params.change_hour ? params.change_hour : "0";
		self.change_min = params.change_min ? params.change_min : "0";
		self.change_sec = params.change_sec ? params.change_sec : "0";
		self.change_direction = params.change_direction ? params.change_direction : "up";
		self.hour = params.hour ? params.hour : self.hour;
		self.min = params.min ? params.min : self.min;
		self.sec = params.sec ? params.sec : self.sec;
		self.hour_end = params.hour_end ? params.hour_end : self.hour_end;
		self.min_end = params.min_end ? params.min_end : self.min_end;
		self.sec_end = params.sec_end ? params.sec_end : self.sec_end;
		self.message = params.message ? params.message : self.message;
		self.delimiter = params.delimiter ? params.delimiter : self.delimiter;
		self.return_url = params.return_url ? params.return_url : self.return_url;
		self.finish_function = params.finish_function ? params.finish_function : self.finish_function;
		self.interval = params.interval ? params.interval * 1000 : self.interval;
		self.iteration = params.iteration ? params.iteration : self.iteration;
		self.direction = params.direction ? params.direction : self.direction;

		self.timestamp_end = (self.hour_end * 60 * 60) + (self.min_end * 60) + (self.sec_end * 1);

		/** if we want to change the current countdown, there a two ways **/
		if (self.change_hour != 0 || self.change_min != 0 || self.change_sec != 0) {

			/** first, we can change the countdown with an specific time **/
			var temp_timestamp = self._createTimestamp(self.change_hour, self.change_min, self.change_sec);
			if (self.change_direction.match(/up/)) {
				self.timestamp += temp_timestamp;
			} else if (self.change_direction.match(/down/)) {
				self.timestamp -= temp_timestamp;
			} else {
				return;
			}
		} else {

			/** or we change the countdown to a specific time **/
			self.timestamp = (self.hour * 60 * 60) + (self.min * 60) + (self.sec * 1);
		}
		return;

	};


	self._createTimestamp = function(hour, min, sec) {
		return (hour * 60 * 60) + (min * 60) + (sec * 1)
	}

	/** get a counter from an timestamp **/
	self._getCounterFromTimestamp = function(t) {
		if (t > 0) {
			hours = Math.floor(t / 3600)
			minutes = Math.floor((t / 3600 - hours) * 60)
			seconds = Math.round((((t / 3600 - hours) * 60) - minutes) * 60)
		} else {
			hours = 0;
			minutes = 0;
			seconds = 0;
		}

		if (seconds == 60) {
			seconds = 0;
		}

		if (seconds == 0) {
			if (hours != 0) {
				minutes = minutes / 1 + 1;
			}
		}

		if (minutes < 10) {
			if (minutes < 0) {
				minutes = 0;
			}
			minutes = '0' + minutes;
		}
		if (seconds < 10) {
			if (seconds < 0) {
				seconds = 0;
			}
			seconds = '0' + seconds;
		}

		if (hours < 10) {
			if (hours < 0) {
				hours = 0;
			}
			hours = '0' + hours;
		}

//		if (hours > 0) {
			return hours + self.delimiter + minutes + self.delimiter + seconds;
//		} else {
//			return minutes + self.delimiter + seconds;
//		}
	};

	/** update the text for the countdown timer **/
	self._tick = function() {

		if (self.timestamp > 0 && self.timestamp != self.timestamp_end) {
			var counter = self._getCounterFromTimestamp(self.timestamp);

			/** show the current time **/
			self.display.html(counter);

			if (self.direction == "down") {
				self.timestamp = self.timestamp * 1 - self.iteration * 1;
			} else if (self.direction == "up") {
				self.timestamp = self.timestamp * 1 + self.iteration * 1;
			} else {
				return;
			}
		} else {
			window.clearInterval(self._interval);
			if (!self.onFinish(self.display)) {
				return;
			}

			/** display the finish message **/
			self.display.html(self.message);

			/** if there is a function to call, call it **/
			if (self.finish_function != "") {
				eval(self.finish_function);
			}

			/** if there is a return url, go there **/
			if (self.return_url != "") {
				window.location.href = self.return_url;
			}
			return;
		}
	};


	/** do it **/
	self._tick();
	self._interval = window.setInterval(
        self._tick,
        self.interval
        );

	return this;
};
