﻿/*
* jQuery jclock - Clock plugin - v 2.2.0
* http://plugins.jquery.com/project/jclock
*
* Copyright (c) 2007-2009 Doug Sparling <http://www.dougsparling.com>
* Licensed under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*/
(function($) {

	$.fn.jclock = function(options) {
		var version = '2.2.0';

		// options
		var opts = $.extend({}, $.fn.jclock.defaults, options);

		return this.each(function() {
			$this = $(this);
			$this.timerID = null;
			$this.running = false;

			// Record keeping for seeded clock
			$this.increment = 0;
			$this.lastCalled = new Date().getTime();

			var o = $.meta ? $.extend({}, opts, $this.data()) : opts;

			$this.format = o.format;
			$this.utc = o.utc;
			// deprecate utc_offset (v 2.2.0)
			$this.utcOffset = (o.utc_offset != null) ? o.utc_offset : o.utcOffset;
			$this.seedTime = o.seedTime;
			$this.timeout = o.timeout;

			$this.css({
				fontFamily: o.fontFamily,
				fontSize: o.fontSize,
				backgroundColor: o.background,
				color: o.foreground
			});

			// %a
			$this.daysAbbrvNames = new Array(7);
			$this.daysAbbrvNames[0] = "Sun";
			$this.daysAbbrvNames[1] = "Mon";
			$this.daysAbbrvNames[2] = "Tue";
			$this.daysAbbrvNames[3] = "Wed";
			$this.daysAbbrvNames[4] = "Thu";
			$this.daysAbbrvNames[5] = "Fri";
			$this.daysAbbrvNames[6] = "Sat";

			// %A
			$this.daysFullNames = new Array(7);
			$this.daysFullNames[0] = "Sunday";
			$this.daysFullNames[1] = "Monday";
			$this.daysFullNames[2] = "Tuesday";
			$this.daysFullNames[3] = "Wednesday";
			$this.daysFullNames[4] = "Thursday";
			$this.daysFullNames[5] = "Friday";
			$this.daysFullNames[6] = "Saturday";

			// %b
			$this.monthsAbbrvNames = new Array(12);
			$this.monthsAbbrvNames[0] = "Jan";
			$this.monthsAbbrvNames[1] = "Feb";
			$this.monthsAbbrvNames[2] = "Mar";
			$this.monthsAbbrvNames[3] = "Apr";
			$this.monthsAbbrvNames[4] = "May";
			$this.monthsAbbrvNames[5] = "Jun";
			$this.monthsAbbrvNames[6] = "Jul";
			$this.monthsAbbrvNames[7] = "Aug";
			$this.monthsAbbrvNames[8] = "Sep";
			$this.monthsAbbrvNames[9] = "Oct";
			$this.monthsAbbrvNames[10] = "Nov";
			$this.monthsAbbrvNames[11] = "Dec";

			// %B
			$this.monthsFullNames = new Array(12);
			$this.monthsFullNames[0] = "January";
			$this.monthsFullNames[1] = "February";
			$this.monthsFullNames[2] = "March";
			$this.monthsFullNames[3] = "April";
			$this.monthsFullNames[4] = "May";
			$this.monthsFullNames[5] = "June";
			$this.monthsFullNames[6] = "July";
			$this.monthsFullNames[7] = "August";
			$this.monthsFullNames[8] = "September";
			$this.monthsFullNames[9] = "October";
			$this.monthsFullNames[10] = "November";
			$this.monthsFullNames[11] = "December";

			$.fn.jclock.startClock($this);

		});
	};

	$.fn.jclock.startClock = function(el) {
		$.fn.jclock.stopClock(el);
		$.fn.jclock.displayTime(el);
	}

	$.fn.jclock.stopClock = function(el) {
		if (el.running) {
			clearTimeout(el.timerID);
		}
		el.running = false;
	}

	$.fn.jclock.displayTime = function(el) {
		var time = $.fn.jclock.getTime(el);
		el.html(time);
		el.timerID = setTimeout(function() { $.fn.jclock.displayTime(el) }, el.timeout);
	}

	$.fn.jclock.getTime = function(el) {
		if (typeof (el.seedTime) == 'undefined') {
			// Seed time not being used, use current time
			var now = new Date();
		} else {
			// Otherwise, use seed time with increment
			el.increment += new Date().getTime() - el.lastCalled;
			var now = new Date(el.seedTime + el.increment);
			el.lastCalled = new Date().getTime();
		}

		if (el.utc == true) {
			var localTime = now.getTime();
			var localOffset = now.getTimezoneOffset() * 60000;
			var utc = localTime + localOffset;
			var utcTime = utc + (3600000 * el.utcOffset);
			now = new Date(utcTime);
		}

		var timeNow = "";
		var i = 0;
		var index = 0;
		while ((index = el.format.indexOf("%", i)) != -1) {
			timeNow += el.format.substring(i, index);
			index++;

			// modifier flag
			//switch (el.format.charAt(index++)) {
			//}

			var property = $.fn.jclock.getProperty(now, el, el.format.charAt(index));
			index++;

			//switch (switchCase) {
			//}

			timeNow += property;
			i = index
		}

		timeNow += el.format.substring(i);
		return timeNow;
	};

	$.fn.jclock.getProperty = function(dateObject, el, property) {

		switch (property) {
			case "a": // abbrv day names
				return (el.daysAbbrvNames[dateObject.getDay()]);
			case "A": // full day names
				return (el.daysFullNames[dateObject.getDay()]);
			case "b": // abbrv month names
				return (el.monthsAbbrvNames[dateObject.getMonth()]);
			case "B": // full month names
				return (el.monthsFullNames[dateObject.getMonth()]);
			case "d": // day 01-31
				return ((dateObject.getDate() < 10) ? "0" : "") + dateObject.getDate();
			case "H": // hour as a decimal number using a 24-hour clock (range 00 to 23)
				return ((dateObject.getHours() < 10) ? "0" : "") + dateObject.getHours();
			case "I": // hour as a decimal number using a 12-hour clock (range 01 to 12)
				var hours = (dateObject.getHours() % 12 || 12);
				return ((hours < 10) ? "0" : "") + hours;
			case "m": // month number
				return ((dateObject.getMonth() < 10) ? "0" : "") + (dateObject.getMonth() + 1);
			case "M": // minute as a decimal number
				return ((dateObject.getMinutes() < 10) ? "0" : "") + dateObject.getMinutes();
			case "p": // either `am' or `pm' according to the given time value,
				// or the corresponding strings for the current locale
				return (dateObject.getHours() < 12 ? "am" : "pm");
			case "P": // either `AM' or `PM' according to the given time value,
				return (dateObject.getHours() < 12 ? "AM" : "PM");
			case "S": // second as a decimal number
				return ((dateObject.getSeconds() < 10) ? "0" : "") + dateObject.getSeconds();
			case "y": // two-digit year
				return dateObject.getFullYear().toString().substring(2);
			case "Y": // full year
				return (dateObject.getFullYear());
			case "%":
				return "%";
		}

	}

	// plugin defaults (24-hour)
	$.fn.jclock.defaults = {
		format: '%H:%M:%S',
		utcOffset: 0,
		utc: false,
		fontFamily: '',
		fontSize: '',
		foreground: '',
		background: '',
		seedTime: undefined,
		timeout: 1000 // 1000 = one second, 60000 = one minute
	};

})(jQuery);
