CM = {};
CM.Calender = Ext.extend(Ext.Component,{
	monthNames : ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'],
	dayNames : ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
	constructor : function(config) {
		CM.Calender.superclass.constructor.call(this,config);
		
		this.addEvents({
			'select' : true
		});
	},
	render : function() {
		this.getDateObject();

		this.layer = new Ext.Layer({shadow:'sides'});		
		this.layer.update(this.getHTML());
		this.layer.alignTo(this.alignTo,'tr-br');
		this.registerEvents();
	},
	getHTML : function() {
		var date = this.getDateObject();
		var m = date.getMonth() + 1;
		var y = date.getFullYear();
		
		var mn=this.monthNames;
		var dim=[31,0,31,30,31,30,31,31,30,31,30,31];

		var oD = new Date(y, m-1, 1); //DD replaced line to fix date bug when current day is 31st
		oD.od = oD.getDay(); //DD replaced line to fix date bug when current day is 31st

		var todaydate = new Date() //DD added
		var scanfortoday = (y==todaydate.getFullYear() && m==todaydate.getMonth()+1)? todaydate.getDate() : 0 //DD added

		dim[1]=(((oD.getFullYear()%100!=0)&&(oD.getFullYear()%4==0))||(oD.getFullYear()%400==0))?29:28;

		
		var t='<div class="date-sel"><table class="date-sel" cols="7" cellpadding="0" border="0" cellspacing="0"><tr align="center">';
		t+='<td class="date-hd"><a href="javascript:void(0);" class="month-btn-left">&laquo;<a/></td><td colspan="5" class="date-hd">'+mn[m-1]+' - '+y+'</td><td class="date-hd"><a href="javascript:void(0);" class="month-btn-right">&raquo;<a/></td></tr><tr align="center">';
		
		for(var s=1;s<7;s++) {
			t+='<td class="date-cell">'+this.dayNames[s].substr(0,1)+'</td>';
		}
		t+='<td class="date-cell">'+this.dayNames[0].substr(0,1)+'</td>';
		t+='</tr><tr>';
		
		var x;
		var so = [];
		for(var i=1;i<=42;i++){
			x = ((i-oD.od>=0)&&(i-oD.od<dim[oD.getMonth()]))? i-oD.od+1 : null;
			
			if (x == scanfortoday) {//DD added
				t += '<td class="date-cell day current-day"><span>'+x+'</span></td>';
			} else {
				if(x != null) {
					t += '<td class="date-cell day"><span>'+x+'</span></td>';
				} else {
					t += '<td class="date-cell day"></td>';
				}
			}
			if(((i)%7==0) && (i<36)) {
				t+='</tr><tr>';
			}
		}
		return t+='</tr></table><div class="today"><a href="javascript:void(0)">I dag</a></div></div>';
	},
	update : function() {
		this.unregisterEvents();
		this.layer.update(this.getHTML());
		this.registerEvents();
	},
	registerEvents : function() {
		this.dayElements = this.layer.select('.date-cell span');
		this.dayElements.on('click',this.onDayClick,this);
		this.dayElements.addClassOnOver('over');
		this.layer.child('.today a').on('click',this.onTodayClick,this);
		
		this.monthRightEl = this.layer.child('.month-btn-right');
		this.monthRightEl.on('click',this.onMonthChangeUpClick,this);
		
		this.monthLeftEl = this.layer.child('.month-btn-left');
		this.monthLeftEl.on('click',this.onMonthChangeDownClick,this);
		
		Ext.getDoc().on('mousedown',this.onDocMouseDown,this);
		Ext.EventManager.onWindowResize(this.onWindowResize,this);
	},
	unregisterEvents : function() {
		this.dayElements.un('click',this.onDayClick);
		this.dayElements.removeAllListeners();
		this.dayElements = null;
		if(this.monthLeftEl) {
			this.monthLeftEl.un('click',this.onMonthChangeUpClick);
		}
		if(this.monthRightEl) {
			this.monthRightEl.un('click',this.onMonthChangeDownClick);
		}
		Ext.getDoc().un('mousedown',this.onDocMouseDown,this);
		Ext.EventManager.removeResizeListener(this.onWindowResize,this);
	},
	onWindowResize : function() {
		this.show();
	},
	onDocMouseDown : function(e) {
		if(e.getTarget('.date-sel')) {
			return;
		}
		if(this.layer.isVisible()) {
			this.hide();
		}
	},
	onTodayClick : function() {
		this.date = new Date();
		this.update();
		this.fireEvent('select',this,this.date, this.alignTo);
	},
	onDayClick : function(e) {
		this.date.setDate(e.getTarget().innerHTML);
		this.fireEvent('select',this,this.date, this.alignTo);
	},
	onMonthChangeDownClick : function(e) {
		var d = this.getDateObject();
		d.setMonth(d.getMonth()-1);
		this.update();
	},
	onMonthChangeUpClick : function(e) {
		var d = this.getDateObject();
		d.setMonth(d.getMonth()+1);
		this.update();
	},
	getDateObject : function() {
		if(!this.date) {
			this.date = new Date();
		}
		return this.date;
	},
	show : function() {
		if(!this.layer) {
			this.render();
		}
		this.layer.alignTo(this.alignTo,'tr-br');
		this.layer.show();
	},
	hide : function() {
		this.layer.hide();
	},
	setValue: function(s) {
		if(s.length) {
			var d = s.split('-');
			this.date = new Date(d[2]*1,[1]*1-1,d[0]*1);
		}
	}
});
Ext.onReady(function() {
	var els;
	if(els = Ext.getBody().select('.date-select')) {
		els.each(function(el) {
			var target = el.child('img');
			var d = new CM.Calender({
				alignTo : target
			});
			d.on('select',function(cal,date, el){
				var monthNames = Array('','Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December');
				var d = date.getDate() < 10 ? '0'+date.getDate() : date.getDate();
				var m = date.getMonth()+1;
		//		var m = m < 10 ? '0'+m : m;
				el.up('.date-select').down('input').dom.value = d+' '+monthNames[m]+' '+date.getFullYear();
				cal.hide();
			},this)
			target.on('click',function() {
				d.show();
			},this);
		})
	}
})