function unsetClass(em, cname) {
	em = $(em);
	if(em.className.indexOf(cname)>-1) {
		var cset = em.className.split(" ");
		for(var i=cset.length-1;i>=0;--i) {
			if(cset[i]==cname) cset.splice(i,1);
		}
		em.className = cset.join(" ");
		return true;
	}
	return false;
}
function setClass(em, cname) {
	em = $(em);
	if(em.className.indexOf(cname)==-1) {
		if(em.className) {
			em.className+=" "+cname;
		} else em.className+=cname;
		return true;
	}
	return false;
}





/*

	Calendar class
	
	takes:
	@_retfunc(date): Function to return the selected date.
					 (Gets called with False if user cancels)
					 (If retfunc return is false, the window will not close)
	
	@_parent:	Element to place the calendar in.
	@_month:	Starting month
	@_year:		Starting year
	
	
	Description:
		The calendar class provides an easy to use calendar, where a user
		can navigate to a date and select it.
	

*/
function Calendar(_retfunc,_parent,_month,_year) {
	var month = -1;				// Current displayed month
	var year = -1;					// Current displayed year
	var retfunc = function(date){alert(date);}	// Return function
	var selectedDate = -1;			// Carries the date the user last selected
	var mininterval = undefined;	// If set, require the selected date to be this far ahead of today
	var selectedCell = undefined;	// Carries the element the user last selected
	var dates = [];				// Carries all of the current months dates
	// List of month names
	var monthNames = [
		"Januari",
		"Februari",
		"Mars",
		"April",
		"Maj",
		"Juni",
		"Juli",
		"Augusti",
		"September",
		"Oktober",
		"November",
		"December"
	];
	// Day names for the calendar
	var dayNames = [
		"m",
		"t",
		"o",
		"t",
		"f",
		"l",
		"s"
	];
	
	// A few setup parameters for the parent element
	var parent = -1;
	var parent_left = "34 px";
	var parent_top = "34 px";
	
	
	/*
		
		DrawCalendar
		
		takes: nothing
		returns: nothing
		
		Description:
			Renders the calendar into the parent element
		
	*/
	this.DrawCalendar = function() {
		if(month!=-1 && year!=-1) {
			calculateCalendar(this);
			parent.innerHTML = "";
			parent.appendChild(getCalendar(this));
		}
	}
	
	
	/*
	
		Destroy
		
		takes: nothing
		returns: nothing
		
		Description:
			Destructs the calendar instance
	
	*/
	this.destroy = function() {
		parent.innerHTML = "";
		delink(this);
	}
	var delink = function(_this) { _this=""; }
	
	/*
		
		calculateCalendar (PRIVATE)
		
		takes: reference to self
		returns: nothing
		
		Description:
			creates a new list of day elements for the current month/year,
			and configures them.
		
	*/
	var calculateCalendar = function(_this) {
		if(month!=-1 && year!=-1) {
			var dateset = [];
			var date = new Date();
			date.setFullYear(year,month-1,1);
			var firstDay = date.getDay()-1;
			if(firstDay==-1) firstDay = 6;
			date.setFullYear(year,month,0);
			var monthDays = date.getDate();		
			for(var week = 0; week < 6; ++week) {
				var n = [];
				for(var day = 0; day < 7; ++day) {
					var nday = document.createElement("td");
					var cdate = (((week*7)+day)-firstDay)+1;
					if(cdate<1||cdate>monthDays) cdate = "";
					nday.innerHTML = cdate;
					setClass(nday,"day");
					nday.inWeek = week;
					nday.owner = _this;
					nday.onclick = function() {
						if(this.innerHTML == "") {
							if(this.inWeek<=2) {
								this.owner.setMonth(month-1);
							} else if(this.inWeek>2) {
								this.owner.setMonth(month+1);
							}
						} else {						
							if(selectedCell) unsetClass(selectedCell,"selected");
							if(selectedCell==this) {
								selectedCell = undefined;
								selectedDate = -1;
							} else {
								selectedCell = this;
								selectedDate = this.innerHTML;
								setClass(this,"selected");
							}
						}
					}
					if(nday.innerHTML) {
						nday.onmouseover = function() {setClass(this,"hover"); }
						nday.onmouseout = function() {unsetClass(this,"hover"); }
						setClass(nday,"nonempty");
					} else {
						setClass(nday,"empty");
					}
					if(day==6) setClass(nday,"sund");
					n.push(nday);
				}
				dateset.push(n);
			}
			dates = dateset;
		}
	}
	
	
	/*
		
		getCalendar (PRIVATE)
		
		takes: reference to self
		returns: calendar element
		
		Description:
			creates the rendered calendar in a DOM object, to
			be placed in the parent element.
		
	*/
	var getCalendar = function(_this) {
		var wrap = document.createElement("div");
		var wwrap = document.createElement("div");
		var label = document.createElement("div");
		var labeltxt = document.createElement("span");
		var nextbtn = document.createElement("div");
		var prevbtn = document.createElement("div");
		var btnlist = document.createElement("div");
		var btnOk = document.createElement("input");
		var btnCancel = document.createElement("input");
		
		setClass(btnlist,"datebuttons");
		btnOk.type = btnCancel.type = "button";
		btnOk.value = "Ok";
		btnOk.className = "btnOk"
		btnOk.onclick = function(){
			if(selectedDate!=-1) {
				var d=new Date();
				d.setFullYear(year,month-1,selectedDate);
				if (retfunc(d)) {
					parent.innerHTML = "";
					delete _this;
				}
			} else {
				alert("Du måste först välja ett datum");
			}
		}
		btnCancel.value = "Avbryt";
		btnCancel.className = "btnCancel"
		btnCancel.onclick = function(){
			retfunc(false);
			delete _this;
			parent.innerHTML = "";
		}
		btnlist.appendChild(btnOk);
		btnlist.appendChild(btnCancel);
		
		labeltxt.innerHTML = monthNames[month-1]+" "+year;
		nextbtn.owner = prevbtn.owner = _this;
		nextbtn.onclick = function() {this.owner.setMonth(month+1);}
		prevbtn.onclick = function() {this.owner.setMonth(month-1);}
		
		setClass(nextbtn,"nextdate")
		setClass(prevbtn,"prevdate");
		setClass(label,"datelabel");
		label.appendChild(prevbtn);
		label.appendChild(labeltxt);
		label.appendChild(nextbtn);
		wrap.appendChild(label);
		setClass(wrap,"calendarWrap");
		setClass(wwrap,"calendarWWrap");
		
		var tbl = document.createElement("table");
		var tblb = document.createElement("tbody");
		
		var tblh = document.createElement("thead");
		var row = document.createElement("tr");
		for(var i=0; i<dayNames.length; ++i) {
			var cell = document.createElement("th");
			cell.className = dayNames[i];
			cell.innerHTML = dayNames[i];
			row.appendChild(cell);
		}
		tblh.appendChild(row);
		
		setClass(tbl,"calendar");
		for(var week = 0; week < 6; ++week) {
			var row = document.createElement("tr");
			setClass(row,"row");
			for(var day = 0; day < 7; ++day) {
				var cell = dates[week][day];
				row.appendChild(cell);
			}
			tblb.appendChild(row);
		}
		tbl.appendChild(tblh);
		tbl.appendChild(tblb);
		wrap.appendChild(tbl);
		wrap.appendChild(btnlist);
		wwrap.appendChild(wrap);
		return wwrap;
	}
	var Calendar = function(_retfunc,_parent,_month,_year,_this) {
		if(_retfunc!=undefined) retfunc = _retfunc;
		if(_month!=undefined) month = _month;
		if(_year!=undefined)  year = _year;
		if(_parent!=undefined) {
			parent = $(_parent);
		} else {
			var container = document.createElement("div");
			parent = container;
			container.style.position = "absolute";
			container.style.top = parent_top;
			container.style.left = parent_left;
			document.body.appendChild(container);
		}
		_this.DrawCalendar();
	}
	this.moveParent = function(_top,_left) {
		parent_left = _left+" px";
		parent_top = _top+" px";
		parent.style.left = parent_left;
		parent.style.top = parent_top;
	}
	this.setYear = function(_year) {
		year = _year;
		this.DrawCalendar();
	}
	this.setMonth = function(_month) {
		if(_month<1) {_month = 12; year--; }
		if(_month>12) {_month = 1; year++; }
		month = _month;
		selectedDate = -1;
		this.DrawCalendar();
	}
	this.setDay = function(_date) {
		selectedDate = _date.getDate();
		var nd = new Date(); nd.setFullYear(_date.getFullYear(),_date.getMonth(),01);
		var wastedDays = nd.getDay();
		
		if(selectedCell) unsetClass(selectedCell,"selected");
		var _day = ((selectedDate+wastedDays)-2);

		selectedCell = dates[Math.floor(_day/7)][_day%7];
		selectedDate = selectedCell.innerHTML;
		setClass(selectedCell,"selected");
	}
	this.setMinimumInterval = function(_interval) {mininterval = _interval;}
	this.setToDate = function(_date) {
		var ndate = new Date(_date); ndate.setDate(ndate.getDate());
		if(_date<ndate) _date = ndate;		
		this.setYear(_date.getFullYear());
		this.setMonth(_date.getMonth()+1);
		this.setDay(_date);
	}
	this.nextMonth = function() { this.selectedDate = -1; this.setMonth(_month+1); }
	this.prevMonth = function() { this.selectedDate = -1; this.setMonth(_month-1); }
	Calendar(_retfunc,_parent,_month,_year,this);
}