/*
 * Date prototype extensions. Doesn't depend on any
 * other code. Doens't overwrite existing methods.
 *
 * Adds dayNames, abbrDayNames, monthNames and abbrMonthNames static properties and isLeapYear,
 * isWeekend, isWeekDay, getDaysInMonth, getDayName, getMonthName, getDayOfYear, getWeekOfYear,
 * setDayOfYear, addYears, addMonths, addDays, addHours, addMinutes, addSeconds methods
 *
 * Copyright (c) 2006 JÃ¶rn Zaefferer and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 *
 * Additional methods and properties added by Kelvin Luck: firstDayOfWeek, dateFormat, zeroTime, asString, fromString -
 * I've added my name to these methods so you know who to blame if they are broken!
 * 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */

Date.dayNames=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday']
Date.abbrDayNames=['Sun','Mon','Tue','Wed','Thu','Fri','Sat']
Date.monthNames=['January','February','March','April','May','June','July','August','September','October','November','December']
Date.abbrMonthNames=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
Date.firstDayOfWeek=1
Date.format='dd/mm/yyyy'
Date.fullYearStart='20'+
(function(){
function add(name,method){
if(!Date.prototype[name]){
Date.prototype[name]=method}}
add("isLeapYear",function(){
var y=this.getFullYear()
return(y%4==0&&y%100!=0)|| y%400==0
})
add("isWeekend",function(){
return this.getDay()==0 || this.getDay()==6
})
add("isWeekDay",function(){
return !this.isWeekend()
})
add("getDaysInMonth",function(){
return [31,(this.isLeapYear()? 29:28),31,30,31,30,31,31,30,31,30,31][this.getMonth()]
})
add("getDayName",function(abbreviated){
return abbreviated ? Date.abbrDayNames[this.getDay()] : Date.dayNames[this.getDay()]
})
add("getMonthName",function(abbreviated){
return abbreviated ? Date.abbrMonthNames[this.getMonth()] : Date.monthNames[this.getMonth()]
})
add("getDayOfYear",function(){
var tmpdtm=new Date("1/1/"+this.getFullYear())
return Math.floor((this.getTime()-tmpdtm.getTime())/86400000)
})
add("getWeekOfYear",function(){
return Math.ceil(this.getDayOfYear()/7)
})
add("setDayOfYear",function(day){
this.setMonth(0)
this.setDate(day)
return this
})
add("addYears",function(num){
this.setFullYear(this.getFullYear()+num)
return this
})
add("addMonths",function(num){
var tmpdtm=this.getDate()
this.setMonth(this.getMonth()+num)
if(tmpdtm>this.getDate())
this.addDays(-this.getDate())
return this
})
add("addDays",function(num){
this.setTime(this.getTime()+(num*86400000))
return this
})
add("addHours",function(num){
this.setHours(this.getHours()+num)
return this
})
add("addMinutes",function(num){
this.setMinutes(this.getMinutes()+num)
return this
})
add("addSeconds",function(num){
this.setSeconds(this.getSeconds()+num)
return this
})
add("zeroTime",function(){
this.setMilliseconds(0)
this.setSeconds(0)
this.setMinutes(0)
this.setHours(0)
return this
})
add("asString",function(format){
var r=format || Date.format
return r
.split('yyyy').join(this.getFullYear())
.split('yy').join((this.getFullYear()+'').substring(2))
.split('mmmm').join(this.getMonthName(false))
.split('mmm').join(this.getMonthName(true))
.split('mm').join(_zeroPad(this.getMonth()+1))
.split('dd').join(_zeroPad(this.getDate()))
})
Date.fromString=function(s){
var f=Date.format
var d=new Date('01/01/1977')
var mLength=0
var iM=f.indexOf('mmmm')
if(iM>-1){
for(var i=0;i<Date.monthNames.length;i++){
var mStr=s.substr(iM,Date.monthNames[i].length)
if(Date.monthNames[i]==mStr){
mLength=Date.monthNames[i].length-4
break}}
d.setMonth(i)
}else{
iM=f.indexOf('mmm')
if(iM>-1){
var mStr=s.substr(iM,3)
for(var i=0;i<Date.abbrMonthNames.length;i++){
if(Date.abbrMonthNames[i]==mStr)break}
d.setMonth(i)
}else{
d.setMonth(Number(s.substr(f.indexOf('mm'),2))-1)}}
var iY=f.indexOf('yyyy')
if(iY>-1){
if(iM<iY){
iY+=mLength}
d.setFullYear(Number(s.substr(iY,4)))
}else{
if(iM<iY){
iY+=mLength}
d.setFullYear(Number(Date.fullYearStart+s.substr(f.indexOf('yy'),2)))}
var iD=f.indexOf('dd')
if(iM<iD){
iD+=mLength}
d.setDate(Number(s.substr(iD,2)))
if(isNaN(d.getTime())){
return false}
return d}
var _zeroPad=function(num){
var s='0'+num
return s.substring(s.length-2)}
})()
