/**
 * @author Hugo Wetterberg, Good Old
 */
dojo.provide("goodold.date");
dojo.require("dojo.date.common");
dojo.require("dojo.date.format");
dojo.require("dojo.date.serialize");
dojo.require("goodold.*");

dojo.date.months=["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"];
dojo.date.shortMonths=["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"];
dojo.date.days=["S\u00f6ndag","M\u00e5ndag","Tisdag","Onsdag","Torsdag","Fredag","L\u00f6rdag"];
dojo.date.shortDays=["s\u00f6n","m\u00e5n","tis","ons","tor","fre","l\u00f6r"];

goodold.date.weekdayToInt={mon:1,tue:2,wed:3,thu:4,fri:5,sat:6,sun:0};

goodold.date.millMinute=1000*60;
goodold.date.millHour=goodold.date.millMinute*60;
goodold.date.millDay=goodold.date.millHour*24;
goodold.date.millWeek=goodold.date.millDay*7;

goodold.date.firstDayOfWeek=1;

goodold.date.justDate = function(date)
{
    var jd=new Date();
		if(date)
    	jd.setTime(date.getTime());
    jd.setHours(0,0,0,0);
    return jd;
};

goodold.date.sameDay = function(a,b)
{
    return a.getYear()==b.getYear() && a.getMonth()==b.getMonth() && a.getDate()==b.getDate();
};

goodold.date.justDate = function(date)
{
	var d = new Date();
	d.setTime(date.getTime());
	d.setHours(0,0,0,0);
	return d;
};

goodold.date.dateAdd = function(date,value,type)
{
    var factor=false;
    switch(type)
    {
        case "day": case "days":
            factor=goodold.date.millDay;
            break;
        case "minute": case "minutes":
            factor=goodold.date.millMinute;
            break;
        case "second": case "seconds":
            factor=1000;
            break;
        case "hour": case "hours":
            factor=goodold.date.millHour;
            break;
        case "week": case "weeks":
            factor=goodold.date.millWeek;
            break;
        case "millisecond": case "milliseconds":
        case "milli": case "msek":
        case null:
            factor=1;
            break;
    }

    if(factor)
    {
        date.setTime(date.getTime()+(value*factor));
        return true;
    }
    else
        return false;
};

goodold.date.nextWeekday = function(date,day)
{
    if(!dojo.lang.isNumber(day))
        day=goodold.date.weekdayToInt[day];

    while(day!=date.getDay())
        goodold.date.dateAdd(date,1,"day");

    return true;
};

goodold.date.isoDateTime=function(date)
{
    var seconds=goodold.padNumber(date.getSeconds(),2);

    return goodold.date.isoDate(date) + " " + goodold.date.isoTime(date);
};

goodold.date.shortIsoDateTime=function(date)
{
    return goodold.date.isoDate(date) + " " + goodold.date.shortIsoTime(date);
};

goodold.date.shortIsoTime=function(date)
{
    var hours=goodold.padNumber(date.getHours(),2);
    var minutes=goodold.padNumber(date.getMinutes(),2);

    return hours + ":" + minutes;
};

goodold.date.isoTime=function(date)
{
	var seconds=goodold.padNumber(date.getSeconds(),2);
    return goodold.date.shortIsoTime(date) + ":" + seconds;
};

goodold.date.isoDate=function(date)
{
    var year=date.getFullYear();
    var month=goodold.padNumber(date.getMonth()+1,2);
    var day=goodold.padNumber(date.getDate(),2);

    return year + "-" + month + "-" + day;
};

goodold.date.parseIsoDateTime=function(str, assumeEnd)
{
    return dojo.date.fromIso8601(str);
}

goodold.date.dateTime_svSE=function(date,showYear)
{
    return goodold.date.date_svSE(date,showYear) + " " + goodold.date.shortTime_svSE(date);
}

goodold.date.shortDate_svSE=function(date)
{
    return dojo.date.shortDays[date.getDay()] + " " + 
        date.getDate() + " " + 
        dojo.date.shortMonths[date.getMonth()];
}

goodold.date.shortDateTime_svSE=function(date)
{
    return goodold.date.shortDate_svSE(date) + " " +
        goodold.date.shortTime_svSE(date);
}

goodold.date.date_svSE=function(date,showYear,kwArgs)
{
    var day=date.getDate();
    if(!kwArgs || !kwArgs["noPadding"])
        day=goodold.padNumber(day,2)
    return (showYear?date.getFullYear():"") + day + " " + dojo.date.months[date.getMonth()];
}

goodold.date.shortTime_svSE=function(date)
{
    var hours=goodold.padNumber(date.getHours(),2);
    var minutes=goodold.padNumber(date.getMinutes(),2);
    return hours + "." + minutes;
}

goodold.date.dateRegex=/^\s*?(\d{4}-\d{2}-\d{2})\s*?$/;
goodold.date.timeRegex=/^\s*?(\d{2}:\d{2}(:\d{2})?)\s*?$/;

goodold.date.validTime=function(time_string)
{
	return goodold.date.timeRegex.test(time_string);
}

goodold.date.validDate=function(date_string)
{
	return goodold.date.dateRegex.test(date_string);
}

goodold.date.TimeFieldValidator=function(obj)
{
	return goodold.date.validTime(obj.domNode.value);
}

goodold.date.TimeField=
{
	tag: "input",
	attributes: {
		type: "text",
		value: "TT:MM",
		size: 5
	},
	events: [["onclick","_tf_onclick"],["onblur","_tf_onblur"]],
	validation: {
		validators: [goodold.date.TimeFieldValidator],
		successStyle: {backgroundColor: null},
		failureStyle: {backgroundColor: "#FFAAAA"}
	},
	_tf_onclick: function(evt)
	{
		if(!this._valueSet)
		{
			this.domNode.value="";
			this._valueSet=true;
		}
	},
	_tf_onblur: function(evt)
	{
		if(!this.isValid())
		{
			this._valueSet=false;
			this.domNode.value="TT:MM";
		}
	},
	value: function()
	{
		if(this.isValid())
			return this.domNode.value;
		else
			return null;
	}
}


