/**
 * @filename 		utils.js
 * @description 	This file declares and defines the commonly required utility 
 * 					methods of setting and removing timers, getting the top left bottom right
 * 					corners of the div, centralising stuff and similar small time utilities.
 * @author 			Y.Kamesh Rao
 * @date 			18-Feb-2009 
 */


/**
 * Declaring the Utils JSON object
 */
window.Utils = window.Utils || {};


/**
 * Set and start the timer for animating something or getting statuses
 */
Utils.startTimer = function(timer, callback, interval)
{
	clearTimeout(timer);
	timer = 0; 
	timer = setTimeout(callback,interval);
	return timer;
}


 
/**
 * Stop the timer
 */
Utils.stopTimer = function(timer)
{
	clearTimeout(timer);
	timer=0;
	return timer;
}

/*
* Methods for calculating last Update for channels
*/


Date.prototype.toISO8601String = function (format, offset) 
{
    /* accepted values for the format [1-6]:
     1 Year:
       YYYY (eg 1997)
     2 Year and month:
       YYYY-MM (eg 1997-07)
     3 Complete date:
       YYYY-MM-DD (eg 1997-07-16)
     4 Complete date plus hours and minutes:
       YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
     5 Complete date plus hours, minutes and seconds:
       YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
     6 Complete date plus hours, minutes, seconds and a decimal
       fraction of a second
       YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00)
    */
    if (!format) { var format = 6; }
    if (!offset) 
	{
        var offset = 'Z';
        var date = this;
    } else 
	{
        var d = offset.match(/([-+])([0-9]{2}):([0-9]{2})/);
        var offsetnum = (Number(d[2]) * 60) + Number(d[3]);
        offsetnum *= ((d[1] == '-') ? -1 : 1);
        var date = new Date(Number(Number(this) + (offsetnum * 60000)));
    }
}


Date.prototype.setISO8601 = function (string) 
{
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
        "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
        "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

function checkTimeZone() 
{
   var rightNow = new Date();
   var date1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
   var date2 = new Date(rightNow.getFullYear(), 6, 1, 0, 0, 0, 0);
   var temp = date1.toGMTString();
   var date3 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
   var temp = date2.toGMTString();
   var date4 = new Date(temp.substring(0, temp.lastIndexOf(" ")-1));
   var hoursDiffStdTime = (date1 - date3) / (1000 * 60 * 60);
   var hoursDiffDaylightTime = (date2 - date4) / (1000 * 60 * 60);
   if (hoursDiffDaylightTime == hoursDiffStdTime) {
      
	  
	  //alert("Time zone is GMT " + hoursDiffStdTime + ".\nDaylight Saving Time is NOT observed here.");
	  return("false")
	  
   } else {
     // alert("Time zone is GMT " + hoursDiffStdTime + ".\nDaylight Saving Time is observed here.");
	  return("true")
   }
}
function isDSTOn() {
var dt=new Date();
 var cy=dt.getFullYear();
 var cm=parseInt(dt.getMonth())+1;
 var cd=parseInt(dt.getDate());
 
  //alert(cd+"/"+cm+"/"+cy);
 
 var thisYear, AprilDate, OctoberDate, MarchDateEU, OctoberDateEU, MarchDate, NovemberDate;
 thisYear = Math.round(parseInt(cy));

 AprilDate = (2+6 * thisYear - Math.floor (thisYear / 4) ) % 7 + 1;
 OctoberDate=  (31-( Math.floor (thisYear * 5 / 4) + 1) % 7);
 
 MarchDate = 14 - (Math.floor (1 + thisYear * 5 / 4) % 7);
 NovemberDate = 7 - (Math.floor (1 + thisYear * 5 / 4) % 7);
  
 MarchDateEU =  (31-( Math.floor (thisYear * 5 / 4) + 4) % 7);
 OctoberDateEU =  (31-( Math.floor (thisYear * 5 / 4) + 1) % 7);

var DSTStartMonth,DSTEndMonth;
var DSTStartDay,DSTEndDay;

if(thisYear>2006)
{
	DSTStartMonth=3;
	DSTStartDay=parseInt(MarchDate);	
	
	DSTEndMonth=11;
	DSTEndDay=parseInt(NovemberDate);
}
else
{
	DSTStartMonth=4;
	DSTStartDay=parseInt(AprilDate);	
	
	DSTEndMonth=10;
	DSTEndDay=parseInt(OctoberDate);
}

var answer="false"
if(cm>DSTStartMonth && cm<DSTEndMonth)
{
  	answer="true";
}
else if (cm==DSTStartMonth)
{
	if(cd>=DSTStartDay)answer="true";
}
else if(cm==DSTEndMonth)
{
	if(cd<=DSTEndDay)answer="true"
}
else answer="false";
 
 //alert(DSTStartDay+"/"+DSTStartMonth+"/"+cy);
 //alert(DSTEndDay+"/"+DSTEndMonth+"/"+cy);
 //alert(answer);
 return(answer);
}
function getElapsedTime(qty,oldDate,newDate)
{
	var d1 =oldDate ;
	var d2 =newDate;
	
	var second= 1000;
	var minute= second*60;
	var hour  = minute*60;
	var day   = hour*24;
	var week  = day*7;
	var month = day*30;
	var year  = day*365;
	
	var diff;
	
	if(qty=="second")     diff = Math.floor((d2-d1)/(second));
	else if(qty=="minute")diff = Math.floor((d2-d1)/(minute));
	else if(qty=="hour")  diff = Math.floor((d2-d1)/(hour));
	else if(qty=="day")   diff = Math.floor((d2-d1)/(day));
	else if(qty=="week")  diff = Math.floor((d2-d1)/(week));
	else if(qty=="month") diff = Math.floor((d2-d1)/(month));
	else if(qty=="year")  diff = Math.floor((d2-d1)/(year));
	

	return(diff);
}


function checkDiffrence(qty,serverTimestamp)
{
	var dstOffset=0
	if(checkTimeZone()=="false")
	{
		dstOffset=(1000*60*60);
		//alert(dstOffset);
	}
	if(isDSTOn()=="false")
	{
		dstOffset=0;
	}
	var current=new Date().toString();
	var old = new Date();
	old.setISO8601(serverTimestamp);
		
	
	timestamp1 = parseInt(Date.parse(old))+dstOffset;
    timestamp2 = Date.parse(current);
				
	
	
	var diff=getElapsedTime(qty,timestamp1,timestamp2);
	
	return(diff);
	
}
/*
*  Get the last update of channel by giving parameter "serverTimestamp".
*/
function getAge(serverTimestamp)
{
	var age;
	     if(serverTimestamp==null)
	{
			 age="No Updated Clips.";
	}
	else
	{
		 if(checkDiffrence("year",serverTimestamp)==1)age=checkDiffrence("year",serverTimestamp)+" year ago";
	else if(checkDiffrence("month",serverTimestamp)==1)age=checkDiffrence("month",serverTimestamp)+" month ago";
	else if(checkDiffrence("week",serverTimestamp)==1)age=checkDiffrence("week",serverTimestamp)+" week ago";
	else if(checkDiffrence("day",serverTimestamp)==1)age=checkDiffrence("day",serverTimestamp)+" day ago";
	else if(checkDiffrence("hour",serverTimestamp)==1)age=checkDiffrence("hour",serverTimestamp)+" hour ago";
	else if(checkDiffrence("minute",serverTimestamp)==1)age=checkDiffrence("minute",serverTimestamp)+" minute ago";
	else if(checkDiffrence("second",serverTimestamp)==1)age=checkDiffrence("second",serverTimestamp)+" less than a minute ago";


		 if(checkDiffrence("year",serverTimestamp)>1)age=checkDiffrence("year",serverTimestamp)+" years ago";
	else if(checkDiffrence("month",serverTimestamp)>1)age=checkDiffrence("month",serverTimestamp)+" months ago";
	else if(checkDiffrence("week",serverTimestamp)>1)age=checkDiffrence("week",serverTimestamp)+" weeks ago";
	else if(checkDiffrence("day",serverTimestamp)>1)age=checkDiffrence("day",serverTimestamp)+" days ago";
	else if(checkDiffrence("hour",serverTimestamp)>1)age=checkDiffrence("hour",serverTimestamp)+" hours ago";
	else if(checkDiffrence("minute",serverTimestamp)>1)age=checkDiffrence("minute",serverTimestamp)+" minutes ago";
	else if(checkDiffrence("second",serverTimestamp)>1)age=checkDiffrence("second",serverTimestamp)+" less than a minute ago";
	else if(checkDiffrence("year",serverTimestamp)<0)age="recently";
	}
	
	return(age);
}


function elaborateTimestamp(serverTimestamp)
{

	var dstOffset=0
	if(checkTimeZone()=="false")
	{
		dstOffset=(1000*60*60);
		//alert(dstOffset);
	}
	if(isDSTOn()=="false")
	{
		dstOffset=0;
	}
	var current=new Date().toString();
	var old = new Date();
	old.setISO8601(serverTimestamp);
		
	
	timestamp1 = parseInt(Date.parse(old))+dstOffset;
    var dt=new Date(timestamp1);

	 var cy=dt.getFullYear();
	 var cm=parseInt(dt.getMonth())+1;
	 var cd=parseInt(dt.getDate());
     var ch= parseInt(dt.getHours());
	 var dd=parseInt(dt.getMinutes());
     var ds=parseInt(dt.getSeconds());
	 var newDate=new Date(cy,cm,cd,ch,dd,ds);
	 var month=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec");
	 var monthText="";
	 for(var i=1;i<=12;i++){
		 if(i==cm){
			 //alert("h"+month[i]);
			 //alert(i+":"+cm)
                 monthText=month[i-1];
				}
	 }
	 var ampm="";
	if(ch>12 && dd<60){
       ampm="PM";
	}else
	{
		ampm="AM";
	}

	 var FinalDate="";
	 FinalDate=FinalDate+" "+monthText+" "+cd+", "+" "+cy+" "+ch+":"+dd+" "+ampm;
	//alert(cy+"::"+cm+":::"+cd+"::"+ch+"::"+dd+"::"+ds+"::"+newDate);
	//alert(d.getMonth);
	//alert(FinalDate);
	return(FinalDate);
	
}
