var CurrentCalenderObject = null;
var isCalenderDisplaying = false;

function calender_checkClick(e){ 
	if(isCalenderDisplaying){
		isCalenderDisplaying = false;
	}else{
		var calObject = calender_getObject();
		if(calObject){
			calObject.style.display = 'none';		
		}
	}
} 
	
function calender_checkParent(t, obj){ 
	while(t.parentNode){ 
		if(t==obj){ 
			return false 
		} 
		t=t.parentNode 
	} 
	return true 
} 

function calender_getObject(){
	return document.getElementById(CurrentCalenderObject);
}

function calender_setValue(D,M,Y){	
	this.ctrlDay.setVal(D);
	this.ctrlMonth.setVal(M);
	this.ctrlYear.setVal(Y);
	this.checkClick();
}

function calender_firstDayOfMonth(y, m, d) {
		var day = new Date(y, m - 1, d).getDay();
		return day == 0 ? 6 : day - 1;
}
function calender_dayOfWeek(when) {
		var date = when;
		var day = new Date(date.y, date.m - 1, date.d).getDay();
		day = day == 0 ? 6 : day - 1;
		return this.days[day];
}
function calender_leap(y) {
		if(y % 4 == 0) {return y % 100 != 0 || y % 100 == 0 && y % 400 == 0 ? 29 : 28;}
		return 28;
}
function calender_getDays(y) {
		return [31, this.leap(y), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
}
function calender_display(inputDay,inputMonth,inputYear,srcElement){		
	CurrentCalenderObject = this.name;
	isCalenderDisplaying = true;
	
	this.ctrlDay = inputDay;
	this.ctrlMonth = inputMonth;
	this.ctrlYear = inputYear;
	
	var d,m,y
	
	if(this.ctrlDay.value != ""){
		d = this.ctrlDay.value;
	}else{
		d = this.today.getDate();
	}

	if(this.ctrlMonth.value != ""){
		m = this.ctrlMonth.value;
		m -= 1;
	}else{
		m = this.today.getMonth();
	}
	
	if(this.ctrlYear.value != ""){
		y = this.ctrlYear.value;
	}else{
		y = this.today.getFullYear();
	}

	m = m+1;
		
	var month = this.months[m - 1];
	var prevM, nextM, prevY, nextY 
	if((m - 1) == 0) {
		prevM = 12 ;
		prevY = y - 1;
	}else{
		prevM = m-1;
		prevY = y;
	}
	if((m + 1) > 12){
		nextM = 1;
		nextY = y + 1;
	}else{
		nextM = m + 1;
		nextY = y;
	}
	var first = this.firstDayOfMonth(y, m, 1);
	var verif = this.getDays(y);
	var insert = '', cur = 0, check = 0;
	var currentDate;
	
	insert += '<div id="calender_nav" style="width:100%; height:18px; margin-bottom:2px">';
	insert += '<div style="float:left; width:10%; height:16px"><a class="calender-prevBtn" href="javascript:void(0)" onClick="' + this.object + '.update('+prevM+','+prevY+')">&nbsp;</a></div>';
	insert += '<div style="float:left; width:80%; height:14px; padding-top:4px" class="calender-captions">' + month + ' ' + y + '</div>';
	insert += '<div style="float:left; width:10%; height:16px"><a class="calender-nextBtn" href="javascript:void(0)" onClick="' + this.object + '.update('+nextM+','+nextY+')">&nbsp;</a></div>';
	insert += '</div>';
	insert += '<div id="calender_header" style="width:100%; height:16px; padding-top:4px; border-top:1px solid #d7d7c8">';
	for(var i = 0, di; di = this.days[i]; i++) {
		insert += '<div style="float:left; width:14%" class="calender-captions">' + di.charAt(0) + '</div>';
	}
	insert += '</div>';

	insert += '<div class="calender-container" align="center">';
	for(var j = 0; j < 6; j++) {
		insert += '<div class="calender-row">';
		for(var k = 0;  k < 7; k++) {
			if(check < first || cur >= verif[m - 1]) {
				insert += '<div>&nbsp;</div>';
			} else {
				cur++;
				currentDate = new Date(y,(m-1),cur);
				if(Math.ceil((currentDate.getTime()-this.today.getTime())/this.one_day)<0){
					insert += '<div class="calender-inactive">' + cur + '</div>'; 
				}else{
					insert += '<div><a href="javascript:void(0)" onclick="' + this.object + '.setValue('+cur+','+m+','+y+')">' + cur + '</a></div>'; 
				}
			}
			check++;
		}
		insert += '</div>';
	}
	insert += '</div>';
	
	var divCal = calender_getObject();
	if(!divCal){
		var divCal = document.createElement('DIV');
		divCal.id = this.name;
		divCal.className = "calender-main";
		divCal.innerHTML = insert;
		document.body.appendChild(divCal);
	}
	divCal.innerHTML = insert;
	divCal.style.display = '';
	
	/*========================= Position the calender ================*/
	scwTargetEle=srcElement;
	 var offsetTop =parseInt(srcElement.offsetTop ,10) + parseInt(srcElement.offsetHeight,10),
		 offsetLeft=parseInt(srcElement.offsetLeft,10);

	 if (!window.opera)
		 {while (srcElement.tagName!='BODY' && srcElement.tagName!='HTML')
			 {offsetTop -=parseInt(srcElement.scrollTop, 10);
			  offsetLeft-=parseInt(srcElement.scrollLeft,10);
			  srcElement=srcElement.parentNode;
			 }
		  srcElement=scwTargetEle;
		 }

	 do {srcElement=srcElement.offsetParent;
		 offsetTop +=parseInt(srcElement.offsetTop, 10);
		 offsetLeft+=parseInt(srcElement.offsetLeft,10);
		}
	 while (srcElement.tagName!='BODY' && srcElement.tagName!='HTML');

	divCal.style.top =offsetTop +'px';
	divCal.style.left=offsetLeft+'px';
	/*================================================================*/
	
	
	if (document.addEventListener){
		divCal.addEventListener('click',this.stopPropagation,false);
	}else{
		divCal.attachEvent('onclick',this.stopPropagation);
	}
}

function calender_update(m, y){
	var month = this.months[m-1];
	var prevM, nextM, prevY, nextY 
	if((m - 1) == 0) {
		prevM = 12 ;
		prevY = y - 1;
	}else{
		prevM = m-1;
		prevY = y;
	}
	if((m + 1) > 12){
		nextM = 1;
		nextY = y + 1;
	}else{
		nextM = m + 1;
		nextY = y;
	}
	var first = this.firstDayOfMonth(y, m, 1);
	var verif = this.getDays(y);
	var insert = '', cur = 0, check = 0;

	insert += '<div id="calender_nav" style="width:100%; height:18px; margin-bottom:2px">';
	insert += '<div style="float:left; width:10%; height:16px"><a class="calender-prevBtn" href="javascript:void(0)" onClick="' + this.object + '.update('+prevM+','+prevY+')">&nbsp;</a></div>';
	insert += '<div style="float:left; width:80%; height:14px; padding-top:4px" class="calender-captions">' + month + ' ' + y + '</div>';
	insert += '<div style="float:left; width:10%; height:16px"><a class="calender-nextBtn" href="javascript:void(0)" onClick="' + this.object + '.update('+nextM+','+nextY+')">&nbsp;</a></div>';
	insert += '</div>';
	insert += '<div id="calender_header" style="width:100%; height:16px; padding-top:4px; border-top:1px solid #d7d7c8">';
	for(var i = 0, di; di = this.days[i]; i++) {
		insert += '<div style="float:left; width:14%" class="calender-captions">' + di.charAt(0) + '</div>';
	}
	insert += '</div>';

	insert += '<div class="calender-container" align="center">';
	for(var j = 0; j < 6; j++) {
		insert += '<div class="calender-row">';
		for(var k = 0;  k < 7; k++) {
			if(check < first || cur >= verif[m - 1]) {
				insert += '<div>&nbsp;</div>';
			} else {
				cur++;
				currentDate = new Date(y,(m-1),cur);
				if(Math.ceil((currentDate.getTime()-this.today.getTime())/this.one_day)<0){
					insert += '<div class="calender-inactive">' + cur + '</div>'; 
				}else{
					insert += '<div><a href="javascript:void(0)" onclick="' + this.object + '.setValue('+cur+','+m+','+y+')">' + cur + '</a></div>'; 
				}
			}
			check++;
		}
		insert += '</div>';
	}
	insert += '</div>';
	
	var divCal = calender_getObject();
	divCal.innerHTML = insert;
}

function calender_StopPropagation(scwEvt){
	if (scwEvt.stopPropagation)
    {scwEvt.stopPropagation();}     // Capture phase
    else   {scwEvt.cancelBubble = true;}   // Bubbling phase
}

function calender(id, obj){
	this.object = obj;
	this.name = id||'1';
	this.name = "cal_" + this.name;
	this.today = new Date();
	this.days = ['MANDAG', 'TIRSDAG',  'ONSDAG',  'TORSDAG',  'FREDAG',  'LØRDAG',  'SØNDAG'];
	this.months= ['JANUAR' , 'FEBRUAR', 'MARS' , 'APRIL', 'MAI', 'JUNI', 'JULI', 'AUGUST', 'SEPTEMBER' , 'OKTOBER', 'NOVEMBER', 'DESEMBER'];
	this.one_day=1000*60*60*24;
	
	this.checkClick = calender_checkClick;
	this.checkParent = calender_checkParent;
	this.firstDayOfMonth = calender_firstDayOfMonth;
	this.dayOfWeek = calender_dayOfWeek;
	this.leap = calender_leap;
	this.getDays = calender_getDays;
	this.display = calender_display;
	this.stopPropagation = calender_StopPropagation;
	this.getObject = calender_getObject;
	this.setValue = calender_setValue;
	this.update = calender_update;
	
	if (document.addEventListener){
		document.addEventListener('click',this.checkClick,false);
	}else{
		document.attachEvent('onclick',this.checkClick);
	}
}