// jQuery - Countdown

$.fn.countdown = function(options){
	
	// Define default local time string
		var date = new Date();
		var year = date.getFullYear();
		var month = date.getMonth() + 1; if(month < 10){ month = '0'+month; }
		var day = date.getDate(); if(day < 10){ day = '0'+day; }
		var hours = date.getHours(); if(hours < 10){ hours = '0'+hours; }
		var minutes = date.getMinutes(); if(minutes < 10){ minutes = '0'+minutes; }
		var seconds = date.getSeconds(); if(seconds < 10){ seconds = '0'+seconds; }
		var localTimeStr = year+'-'+month+'-'+day+' '+hours+':'+minutes+':'+seconds;
	
	// Define Default Options
		var defaults = {
			localTime: localTimeStr,
			targetTime: '',
			formatCallback: $.fn.countdown.defaultFormatCallback,
			updateInterval: 1000
		};
	
	// Extend default options with 'options' variable
		var opts = $.extend(defaults, options);
		
	// Local unixtime
		$.fn.countdown.localUnixtime = $.fn.countdown.strToUnixtime(opts.localTime);
	
	// Make sure updateInterval is an integer
		opts.updateInterval = $.fn.countdown.stripLeadingZeroes(opts.updateInterval);
		
	// Sync with server time every 10 secs
		$.fn.countdown.sync();
		setInterval($.fn.countdown.sync, 1000 * 20);
	
	return this.each(function(i){
		
		var countdown_target;
		if(typeof(opts.targetTime) == 'string' && opts.targetTime != ''){
			countdown_target = $.fn.countdown.strToUnixtime(opts.targetTime);
		}
		else{
			var html = $(this).html();
			countdown_target = $.fn.countdown.strToUnixtime(html);
			if(!countdown_target){
				return;
			}
		}
		
		var $this = $(this);
		
		var remaining = countdown_target - $.fn.countdown.currentTime();
//console.log(countdown_target);
//console.log($.fn.countdown.currentTime());
//console.log(remaining);
//console.log('==========');
		var remaining_split = $.fn.countdown.splitRemaining(remaining);
		var timer = opts.formatCallback(remaining_split.days, remaining_split.hours, remaining_split.minutes, remaining_split.seconds);
		$this.html(timer);
		
		setInterval(function(){
			var remaining = countdown_target - $.fn.countdown.currentTime();
			var remaining_split = $.fn.countdown.splitRemaining(remaining);
			var timer = opts.formatCallback(remaining_split.days, remaining_split.hours, remaining_split.minutes, remaining_split.seconds);
			$this.html(timer);
		}, opts.updateInterval);
	});
}

$.fn.countdown.sync = function(){
	clearTimeout($.fn.countdown.syncTimeout);
	$.fn.countdown.syncTimeout = setTimeout(function(){
		var start = new Date();
		var ts = new Date().getTime();
		$.ajax({
			url: '/acms/modules/auction/countdown/sync.php?ts='+ts,
			success: function(timestamp){
				var end = new Date();
				var diff = Math.round(   ((end.getTime() - start.getTime()) / 1000) / 2   );
				timestamp = parseInt(timestamp) + diff;
				$.fn.countdown.localUnixtime = timestamp;
				$.fn.countdown.startTime = new Date();
			}
		});
	}, 500);
}

$.fn.countdown.defaultFormatCallback = function(days, hours, minutes, seconds){
	if(days < 0){
		return 'Finished';
	}
	else{
		if(days == 0 && hours == 0 && minutes == 0){
			return '&lt;1m';
		}
		else{
			var out = new Array();
			if(days > 0){ out[out.length] = days + 'd'; }
			if(hours > 0){ out[out.length] = hours + 'h'; }
			if(minutes > 0){ out[out.length] = minutes + 'm'; }
			var outStr = out.join(' ');
			
			if(hours == 0){
				return '<span style="color: #ff0000;">' + outStr + '</span>';
			}
			else{
				return outStr;
			}
			
		}
	}
	
}

$.fn.countdown.splitRemaining = function(seconds){
	seconds = parseInt(seconds);

	var minutes = Math.floor(seconds / 60);
	seconds -= minutes * 60;
	
	var hours = Math.floor(minutes / 60);
	minutes -= hours * 60;
	
	var days = Math.floor(hours / 24);
	hours -= days * 24;

	return {days: days, hours: hours, minutes: minutes, seconds: seconds};
}

$.fn.countdown.currentTime = function(num){
	return $.fn.countdown.localUnixtime + $.fn.countdown.elapsed();
}

$.fn.countdown.stripLeadingZeroes = function(num){
	if(typeof(num_str) == 'string'){
		return parseInt(num.replace(/^0+/,''));
	}
	else{
		return num;
	}
}

$.fn.countdown.elapsed = function(){
	var now = new Date();
	var start = $.fn.countdown.startTime;
	var elapsed = Math.round((now.getTime() - start.getTime()) / 1000);
	return elapsed;
}

$.fn.countdown.strToUnixtime = function(mysql_time){
	var regex = new RegExp('([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})');
	
	if(!regex.test(mysql_time)){ return false; }
	
	var split_time = regex.exec(mysql_time);
	
	var year = $.fn.countdown.stripLeadingZeroes(split_time[1]);
	var month = $.fn.countdown.stripLeadingZeroes(split_time[2]);
	var day = $.fn.countdown.stripLeadingZeroes(split_time[3]);
	
	var hours = $.fn.countdown.stripLeadingZeroes(split_time[4]);
	var minutes = $.fn.countdown.stripLeadingZeroes(split_time[5]);
	var seconds = $.fn.countdown.stripLeadingZeroes(split_time[6]);

	unixtime = mktime(hours, minutes, seconds, month, day, year);
	
	return unixtime;
}

function mktime() {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: baris ozdil
    // +      input by: gabriel paderni
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: FGFEmperor
    // +      input by: Yannoo
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: jakes
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Marc Palau
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: 3D-GRAF
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Chris
    // +    revised by: Theriault
    // %        note 1: The return values of the following examples are
    // %        note 1: received only if your system's timezone is UTC.
    // *     example 1: mktime(14, 10, 2, 2, 1, 2008);
    // *     returns 1: 1201875002
    // *     example 2: mktime(0, 0, 0, 0, 1, 2008);
    // *     returns 2: 1196467200
    // *     example 3: make = mktime();
    // *     example 3: td = new Date();
    // *     example 3: real = Math.floor(td.getTime() / 1000);
    // *     example 3: diff = (real - make);
    // *     results 3: diff < 5
    // *     example 4: mktime(0, 0, 0, 13, 1, 1997)
    // *     returns 4: 883612800 
    // *     example 5: mktime(0, 0, 0, 1, 1, 1998)
    // *     returns 5: 883612800 
    // *     example 6: mktime(0, 0, 0, 1, 1, 98)
    // *     returns 6: 883612800 
    // *     example 7: mktime(23, 59, 59, 13, 0, 2010)
    // *     returns 7: 1293839999
    // *     example 8: mktime(0, 0, -1, 1, 1, 1970)
    // *     returns 8: -1
    var d = new Date(), r = arguments, i = 0,
        e = ['Hours', 'Minutes', 'Seconds', 'Month', 'Date', 'FullYear'];

    for (i = 0; i < e.length; i++) {
        if (typeof r[i] === 'undefined') {
            r[i] = d['get' + e[i]]();
            r[i] += (i === 3); // +1 to fix JS months.
        } else {
            r[i] = parseInt(r[i], 10);
            if (isNaN(r[i])) {
                return false;
            }
        }
    }
    
    // Map years 0-69 to 2000-2069 and years 70-100 to 1970-2000.
    r[5] += (r[5] >= 0 ? (r[5] <= 69 ? 2e3 : (r[5] <= 100 ? 1900 : 0)) : 0);
    
    // Set year, month (-1 to fix JS months), and date.
    // !This must come before the call to setHours!
    d.setFullYear(r[5], r[3] - 1, r[4]);
    
    // Set hours, minutes, and seconds.
    d.setHours(r[0], r[1], r[2]);

    // Divide milliseconds by 1000 to return seconds and drop decimal.
    // Add 1 second if negative or it'll be off from PHP by 1 second.
    return (d.getTime() / 1e3 >> 0) - (d.getTime() < 0);
}

$(document).ready(function(){
	$.fn.countdown.startTime = new Date();
});
