/*****************************
  * Author: Steve Hardie
  * Created:  2008-05-03
  * Description:
  *   This file will add extra functionality to the Date Prototype, including 
  *   formatting and date/time calculations
  *   
  *   Date Methods:			Date.addTime			(start_time,duration)
  *   						Date.calculateDuration	(start_time,end_time)
  *   						Date.cDate				(mydate)
  *   						Date.DateAdd			(timeU,byMany,dateObj)
  *   						Date.DaysDiff			(Date1,Date2)
  *   						Date.decimalToTime		(val)
  *   						Date.formatTime			(time)
  *   						Date.getTimeSince		(lowTime,highTime)
  *   						
  *   Date Prototype:		dateObj.formatString	(format)
  *   						dateObj.getDayOfYear	()
  *   
  *   Global:				monthname[int]
  *   						weekday[int]
  *
  *
  * CHANGE HISTORY:
  * Date       Changed By        Description
  * ---------- ----------------- -----------------------------------------------
  * 2008-06-05 Steve Hardie		 Updeated cDate function.
  * 2008-08-21 Steve Hardie		 Added new functions:
  * 								- dateObj.getDayOfYear
  * 								- Date.getTimeSince
  ******************************************************************************/

var Date_DefaultFormat="%Y-%m-%d";
var weekday=new Array(6);
weekday[0]="Sunday";
weekday[1]="Monday";
weekday[2]="Tuesday";
weekday[3]="Wednesday";
weekday[4]="Thursday";
weekday[5]="Friday";
weekday[6]="Saturday";
var monthname=new Array(11);
monthname[0]="January";
monthname[1]="February";
monthname[2]="March";
monthname[3]="April";
monthname[4]="May";
monthname[5]="June";
monthname[6]="July";
monthname[7]="August";
monthname[8]="September";
monthname[9]="October";
monthname[10]="November";
monthname[11]="December";


// Converts String Date to Date Object
Date.cDate=function(mydate){
    // Must be in format YYYY-MM-DD
    var d=new Date();
    var i,j;
    var dDay,dMonth,dYear;
    
    d.setHours(0,0,0,0);
    
    //Get Year
    i=mydate.indexOf('-',0);
    dYear=mydate.slice(0,i)
    
    // Get Month
    j=mydate.indexOf('-',i+1);
    dMonth=parseInt(mydate.slice(i+1,j)-1);
    
    // GetDay
    dDay=mydate.slice(j+1,j+3)
    
	d.setDate(1);
    d.setFullYear(dYear);
    d.setMonth(dMonth);
	d.setDate(dDay)

    return d;
}

Date.prototype.formatString=function(format){
    if (format!=null){
        return this.print(format);
    }else{
        return this.print(Date_DefaultFormat);
    }
}
// Add days/time to date
Date.DateAdd= function(timeU,byMany,dateObj) {
	var millisecond=1;
	var second=millisecond*1000;
	var minute=second*60;
	var hour=minute*60;
	var day=hour*24;
	var year=day*365;

	var newDate;
	var dVal=dateObj.valueOf();
	switch(timeU) {
		case "ms": newDate=new Date(dVal+millisecond*byMany); break;
		case "s": newDate=new Date(dVal+second*byMany); break;
		case "mi": newDate=new Date(dVal+minute*byMany); break;
		case "h": newDate=new Date(dVal+hour*byMany); break;
		case "d": newDate=new Date(dVal+day*byMany); break;
		case "y": newDate=new Date(dVal+year*byMany); break;
	}
	return newDate;
}

// Difference between two dates
Date.DaysDiff=function(Date1,Date2){
    var days;
    var one_day=1000*60*60*24;
    days=Math.ceil((Date1.getTime()-Date2.getTime())/(one_day));
    return days;
}

// Convert Decimal to Time
Date.decimalToTime=function(val) {
    var resp='';
    if (val) {
        // Hours
        resp=parseInt(val)+'';
        if (resp<10) resp='0' + resp;
        if (resp=='0') resp='00';
        
        // Minutes
        val -= parseInt(val); val *= 60;
        if (parseInt(val)<10) {resp+='0'+parseInt(val);}else{resp += parseInt(val)+'';}
   }
   return resp;
}

// Formats 0900 to 9:00a
Date.formatTime=function(time){
    try{
        var hrs = time.substring(0,2);
        var mins = time.substring(2,5);
        var am_pm = "a";

        if (eval(hrs) > 11){
            am_pm = "p";
            hrs = eval(hrs +"-12");
            if (hrs == "0"){ hrs = "12"; }
        }
 
        if (mins.length == 1){ mins = "0"+mins; }
        return (hrs +":"+mins+am_pm);
    }catch(e){
        //alert("Time Format Error: "+e.description);
    }
 }
 
 // Calculate Duration
 Date.calculateDuration=function(start_time,end_time){
    var sHour,sMinute,eHour,eMinute,dHour,dMinute;
		//sHor=String(start_time).substring(0,2);
		sHour=Mid(start_time,0,2);
        
		//sMinute=String(start_time).substring(2,2);
		sMinute=Mid(start_time,2,2);
		
        //eHour=String(end_time).substring(0,2);
		eHour=Mid(end_time,0,2);
		
        //eMinute=String(end_time).substring(2,2);
		eMinute=Mid(end_time,2,2);
		 
    var d1=new Date();var d2=new Date();
        d1.setHours(sHour,sMinute,0,0)
        d2.setHours(eHour,eMinute,0,0)
		
	var mins;
    var one_min=1000*60;
    mins=Math.ceil((d2.getTime()-d1.getTime())/(one_min));
	return mins;
 }
 Date.addTime=function(start_time,duration){
    var sHour,sMinute;
        sHour=parseFloat(Mid(start_time,0,2));
        sMinute=parseFloat(Mid(start_time,2,2));
    
    sMinute=sMinute+(parseFloat(duration)*1)
    while (sMinute>=60){
        sMinute=sMinute-60
        sHour=sHour+1
    }
    if (sHour<10) sHour='0'+sHour;
    if (sMinute<10) sMinute='0'+sMinute;
    
    return sHour+''+sMinute;
 }
 Date.prototype.getDayOfYear=function(){
	var onejan=new Date(this.getFullYear(),0,1);
	var dayOfYear= Math.round(((this-onejan) / 1000 / 60 / 60 / 24) +.5,0);
	
	return dayOfYear;
 }
 Date.getTimeSince=function(lowDate,highDate){
		// Calculated as Years, Weeks, Days, Hours, Minutes, Seconds
		//
		// 	i.e: 5 years, 6 weeks, 32 days, 4 hours, 18 minutes, 23 seconds
		//
		var difYears,difWeeks,difDays;
		var difHours,difMins,difSecs;
				
		// Years Weeks Days
		difYears=(highDate.getYear()-lowDate.getYear());
		difWeeks=0
		difDays=(highDate.getDayOfYear()-lowDate.getDayOfYear());
		
		while (difDays>=7){
			difWeeks ++;
			difDays=difDays-7;
		}
		
		// Hours Mins Seconds
		difHours=(highDate.getHours()-lowDate.getHours());
		difMins=(highDate.getMinutes()-lowDate.getMinutes());
		difSecs=(highDate.getSeconds()-lowDate.getSeconds());

		return {years:difYears,weeks:difWeeks,days:difDays,hours:difHours,minutes:difMins,seconds:difSecs};
	}