(function($){
	$ = jQuery;
	$.fn.clock = function(dateString, opts){
		var o = $.extend({
			format: '%h:%m:%s',
			interval: 1000
		}, opts || {});
		var date;
		switch (typeof(dateString)) {
			case 'object':
					date = new Date(dateString.year, dateString.month, dateString.date, dateString.hour, 
						dateString.minute, dateString.second);
				break;
			case 'string':
					date = new Date(dateString);
				break;
			case 'number':
					date = new Date(dateString * 1000);
				break;
			default:
				throw 'Invalid Date';
		}
		if (date == 'Invalid Date') throw 'Invalid Date'; 
		var daysFormat = (o.format.indexOf('%d') !== -1);
		var hoursFormat = (o.format.indexOf('%h') !== -1);
		var minutesFormat = (o.format.indexOf('%m') !== -1);
		var secondsFormat = (o.format.indexOf('%s') !== -1);
		function setDate(selector) {
			var now = new Date(), nowSecs = now.getTime(), dateSecs = date.getTime(), 
				dateStr = o.format, years = 0, monthes = 0, days = 0, hours = 0, minutes = 0, seconds = 0;
			if (nowSecs < dateSecs) {
				var diff = Math.round((dateSecs - nowSecs) / 1000);
				if (daysFormat) {
					days = Math.floor(diff / 86400);
					diff -= days * 86400;
				}
				if (hoursFormat) {
					hours = Math.floor(diff / 3600);
					diff -= hours * 3600;
				}
				if (minutesFormat) {
					minutes = Math.floor(diff / 60);
					diff -= minutes * 60;
				}
				if (secondsFormat) {
					seconds = diff;
				}
			}
			dateStr = dateStr.replace('%d', days);
			dateStr = dateStr.replace('%h', format(hours));
			dateStr = dateStr.replace('%m', format(minutes));
			dateStr = dateStr.replace('%s', format(seconds));
			$(selector).text(dateStr);
		}
		function format(string) {
			if (string.toString().length < 2) {
				return '0'+string;
			} else {
				return string;
			}
		}
		return $(this).each(function() {
			var self = $(this);
			setDate(self);
			var iId = setInterval(function() {
				setDate(self);
			}, o.interval);
		});
	};
})(jQuery);

