/**
* Merrcury JQuery Functions to obtain browser time zone and format date times agree with user locale.
*/

var format = null;
var disclaimer = null;
var serverDate = null;
var serverGmtTime = null;
var discrepancy = null;
var browserGmtOffset = null;
var selectors = new Array();

/**
 * Generates a date based on user time zone.
 * @param mixed target 
 * 		1. A jQuery selector to take the text contained into it to be generated an replaced
 * 		   by the process result.
 * 		2. A date or datetime string to be generated
 * 		3. Empty to use the current server datetime to be generated
 * 					
 * @return string For cases 2 and 3 the value generated.
 */
function generateDateInUserTimeZone(target){
	var timeGmt = serverDate;
	if(typeof(target) == 'object') {
		if(target instanceof Date) {
			timeGmt = target;
			target = null;
		} else
			timeGmt = this.getDate($(target).text());
	} else if(typeof(target) == 'string')
		timeGmt = this.getDate(target);

	var timeRender = null;
	var append = ' GMT';
	
	if(!this.validDiscrepancy()){
		timeRender = timeGmt;
	} else {
		append = '*';
		timeRender = new Date(timeGmt.getTime() - (this.browserGmtOffset*60000));
	}
	formatted = dateFormat(timeRender,this.format) + append;
	if(target && typeof(target) == 'object')
		$(target).text(formatted)
	else
		return formatted;
}

function generateFromServerDate(hours){
	if(hours) 
		return generateDateInUserTimeZone(new Date(serverDate.getTime() + hours*3600000));
	else 
		return generateDateInUserTimeZone();
}

function getDate(date){
	date = date.replace(/-/g,"/");
	return new Date(date);
}

/**
* Generates discrepancy calculated in minutes between time server and time browser
*
*
*/
function getDiscrepancy(){
	if(this.discrepancy != null)
		return this.discrepancy;

	var now = new Date();
	this.browserGmtOffset = now.getTimezoneOffset();
	var browserLocalTime = now.getTime();
	this.discrepancy = (((browserLocalTime + (this.browserGmtOffset*60000)) - (this.serverGmtTime)))/60000;
	this.discrepancy = Math.abs(discrepancy);
	var diff = (-1*this.browserGmtOffset)/60;
	diff = diff >= 0 ? '+' + diff:diff;

	if(this.disclaimer != '' && this.validDiscrepancy())
		$('#footerDisclaimer').text(this.disclaimer + diff + ' GMT');

	return this.discrepancy;
}

function setDateFormat(format){
	this.format = format;
}

function setDisclaimer(disclaimer){
	this.disclaimer = disclaimer;
}

function setServerGmtTime(serverTime){
	this.serverDate = new Date(serverTime);
	this.serverGmtTime = this.serverDate.getTime();
}

function setSelector(pSel){
	this.selectors.push(pSel);
}

function validDiscrepancy(){
	var discrepancy = this.getDiscrepancy();
	return discrepancy != null && discrepancy <= 5;
}

function printTimeRun(){
	for (var index in this.selectors) {
		$(this.selectors[index]).each(function(i){
			if($(this).text())
				generateDateInUserTimeZone(this);
		});
	}	
}

$().ready(function(){
	printTimeRun();
});