function Calendar(){
	
	/**
	 *
	 *	Kalender functie voor de Brakke Grond
	 *	© Copyright Magnatron Amsterdam (http://www.magnatron.nl/)
	 *	
	 **/
	
	this.xmlString = "";
	this.docID = "";
	if($('kalender_datum')&&$('kalender_datum').down()&&$('kalender_datum').down().innerHTML){
		var d = String($('kalender_datum').down().innerHTML).split('/');
		if(d.length&&d.length==3){
			var mnths = {jan:0,feb:1,mrt:2,apr:3,mei:4,jun:5,jul:6,aug:7,sep:8,okt:9,nov:10,dec:11};
			if(mnths[d[1]]){
				this.now = new Date(d[2],mnths[d[1]],d[0]);
			}
		}
	}
	if(!this.now)this.now = new Date();
	this.cache = new Object();
	this.initiated = new Object();
	this.headerImages = new Array();
	
	this.init = function(){
		$(this.docID).innerHTML = "";
		for(var c=1;c<=12;c++){
			var tmp = new Image();
			tmp.src = "/newcalender/"+c+".gif";
			this.headerImages.push(tmp);
		}
		this.header = document.createElement('div');
		this.header.setAttribute("id","KalenderHeader");
		$(this.docID).appendChild(this.header);
		this.list = document.createElement('div');
		this.list.setAttribute("id","KalenderItems");
		$(this.docID).appendChild(this.list);
		this.displayHeader()
		this.getCalendarXML();
	}
	
	this.nextMonth = function(){
		$('KalenderItems').scrollTop=0;
		this.now.setMonth(this.now.getMonth()+1);
		this.displayHeader();
		this.getCalendarXML();
	}
	
	this.prevMonth = function(){
		$('KalenderItems').scrollTop=0;
		this.now.setMonth(this.now.getMonth()-1);
		this.displayHeader();
		this.getCalendarXML();
	}
	
	this.getCalendarXML = function(){
			var mnth = this.now.getMonth()+1;
			mnth = mnth < 10 ? "0"+mnth : ""+mnth;
			var yr = this.now.getFullYear();
			yr = yr < 10 ? "0"+yr : ""+yr;
		
		calendar.query = '/Kalender.aspx?'+'month='+mnth+'&year='+yr;
		
		if(!calendar.initiated[calendar.query]){
			calendar.initiated[calendar.query] = true;
			this.loadCalendarXML(calendar.query);
		}
		if(!calendar.cache[calendar.query]){
			this.displayLoading();
		}else{
			calendar.xml = calendar.parseXML(calendar.cache[calendar.query]);
			calendar.displayView();
		}
	}
	
	this.loadCalendarXML = function(url){	
		new Ajax.Request(url,{
			asynchronous:true,
			onComplete:function(o){
				
				calendar.cache[o.request.url] = calendar.cleanXMLString(o.responseText);
				if(String(o.request.url)==(calendar.query)){
					calendar.xml = calendar.parseXML(calendar.cache[calendar.query]);
					calendar.displayView();
				}
			}
		})
	}
	this.cleanXMLString = function(str){
		str = str.split("&uuml;").join("ü")
		str = str.split("&").join("&amp;")
		str = str.split("&amp;amp;").join("&amp;")
		return str;
	}
	this.preloadNextMonth = function(){
		var tmp = new Date();
		tmp.setTime(this.now.getTime());
		tmp.setMonth(tmp.getMonth()+1);
		var mnth = tmp.getMonth()+1;
		mnth = mnth < 10 ? "0"+mnth : ""+mnth;
		var yr = tmp.getFullYear();
		yr = yr < 10 ? "0"+yr : ""+yr;
		var nextMonthQuery = '/Kalender.aspx?'+'month='+mnth+'&year='+yr;
		if(!this.initiated[nextMonthQuery]){
			this.loadCalendarXML(nextMonthQuery);
		}
	}
	
	this.displayLoading = function(){
		this.list.innerHTML = '';
		var l = document.createElement('p');
		l.appendChild(document.createTextNode("Kalender laden..."));
		this.list.appendChild(l);
	}
	
	this.displayHeader = function(){
		this.header.innerHTML = "";
		
		var prevLink = document.createElement('a');
		prevLink.setAttribute('href','#');
		prevLink.onclick = function(){calendar.prevMonth();return false;};
		var prevLinkImage = document.createElement('img');
		prevLinkImage.setAttribute('border','0');
		prevLinkImage.src = "/newcalender/previous.gif";
		prevLink.appendChild(prevLinkImage);
		this.header.appendChild(prevLink);
		
		var monthImage = document.createElement('img');
		monthImage.setAttribute('border','0');
		monthImage.src = this.headerImages[this.now.getMonth()].src;
		this.header.appendChild(monthImage);
		
		var nextLink = document.createElement('a');
		nextLink.setAttribute('href','#');
		nextLink.onclick = function(){calendar.nextMonth();return false;};
		var nextLinkImage = document.createElement('img');
		nextLinkImage.setAttribute('border','0');
		nextLinkImage.src = "/newcalender/next.gif";
		nextLink.appendChild(nextLinkImage);
		this.header.appendChild(nextLink);
	}
	
	this.displayView = function(){
		this.list.innerHTML = "";
		
		var xdoc = calendar.xml.documentElement;
		var items = xdoc.childNodes;
		var dispItems = new Object();
		for(var c=0;c<items.length;c++){
			if(items[c].childNodes[1]){
				var pTitle = items[c].childNodes[1].hasChildNodes() ? items[c].childNodes[1].childNodes[0].nodeValue : "";
				var tDate = items[c].childNodes[0].childNodes[0] ? String(items[c].childNodes[0].childNodes[0].nodeValue).split("-") : "";
				var pDate = new Date();
				pDate.setFullYear(tDate[0],tDate[1]-1,tDate[2]);
				if(!dispItems[pTitle]){
					var pGenre = items[c].childNodes.length>6 && items[c].childNodes[6].hasChildNodes() ? items[c].childNodes[6].childNodes[0].nodeValue : '';
					pGenre = pGenre.split('<![CDATA[').join(']]>').split("<br>").join(", ").split("<BR>").join(", ").split("&amp;").join("&");
					dispItems[pTitle] = {
						title: pTitle,
						company: items[c].childNodes[5]&&items[c].childNodes[5].hasChildNodes() ? items[c].childNodes[5].childNodes[0].nodeValue : '',
						location: items[c].childNodes[2]&&items[c].childNodes[2].hasChildNodes() ? items[c].childNodes[2].childNodes[0].nodeValue : '',
						genre:pGenre,
						link:items[c].childNodes[7]&&items[c].childNodes[7].hasChildNodes() ? items[c].childNodes[7].childNodes[0].nodeValue : '',
						preview:items[c].childNodes[9]&&items[c].childNodes[9].hasChildNodes() ? items[c].childNodes[9].childNodes[0].nodeValue : '',
						firstDate:new Date(),
						lastDate:new Date()
					}
					dispItems[pTitle].firstDate.setFullYear(2899);
					dispItems[pTitle].lastDate.setFullYear(1970);
				}
				
				if(dispItems[pTitle].firstDate > pDate)dispItems[pTitle].firstDate = pDate
				if(dispItems[pTitle].lastDate < pDate)dispItems[pTitle].lastDate = pDate
			}
		}
		dispArray = [];
		for(var c in dispItems){
			dispArray.push(dispItems[c]);
		}
		dispArray.sort(this.firstdate_compare);
		this.list.innerHTML = "";
		var counter = -1;
		for(var c=0;c<dispArray.length;c++){
			counter++;
			if(this.list.hasChildNodes()){
				var tmpHr = document.createElement('img');
				this.list.appendChild(tmpHr);
				tmpHr.setAttribute('id','ruler_'+counter);
				tmpHr.src = '/newcalender/spacing.gif';
				$('ruler_'+counter).addClassName('ruler')
			}
			
			var d=document.createElement('div');
			d.setAttribute('id','item_'+counter);
			var hd=document.createElement('h1')
			if(dispArray[c].firstDate.getDate()!=dispArray[c].lastDate.getDate()){
				var dStr = dispArray[c].firstDate.getDate() + " - " + dispArray[c].lastDate.getDate();
			}else{
				var dStr = dispArray[c].firstDate.getDate();
			}
			
			hd.appendChild(document.createTextNode(dStr));
			d.appendChild(hd);
			var h=document.createElement('h2');
			var tmp = dispArray[c].title
			if(tmp.indexOf(" ")>20||(tmp.indexOf(" ")==-1&&tmp.length>20))tmp = tmp.substr(0,18)+"- "+tmp.substr(18)
			var t = document.createTextNode(' '+tmp);
			h.appendChild(t)
			d.appendChild(h)
			
			if(dispArray[c].company!=''){
				var h=document.createElement('h3');
				h.appendChild(document.createTextNode(dispArray[c].company));
				d.appendChild(h);
			}
			
			var g = document.createElement('p');
			g.appendChild(document.createTextNode(dispArray[c].genre));
			d.appendChild(g);
			
			this.list.appendChild(d);
			$('item_'+counter).setAttribute('rel','/'+dispArray[c].link);
			$('item_'+counter).onclick = function(){document.location = this.getAttribute("rel")};
			$('item_'+counter).onmouseover = function(){$(this.id).addClassName('mouseover')};
			$('item_'+counter).onmouseout = function(){$(this.id).removeClassName('mouseover')};
		}
		this.preloadNextMonth();
	}
	
	this.firstdate_compare = function(a,b){
		return a.firstDate.getTime() - b.firstDate.getTime();
	}
	
	this.parseXML = function(xmlStr){
		if(!xmlStr||xmlStr=='')return false;
		xml = xmlStr.split('& ').join('&amp; ');
		if (window.ActiveXObject){
		  var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		  xmlDoc.preserveWhiteSpace = false;
		  xmlDoc.loadXML(xml);
		}else{
		  var parser=new DOMParser();
		  var xmlDoc = parser.parseFromString(xml,"text/xml");
		}
		return xmlDoc;
	}
	
	this.stitch = function(divid){
		this.docID = divid;
		this.init();
	}
	
}

Event.observe(window,'load',function(){
	calendar = new Calendar();
	calendar.stitch('kalender');
})
// GET /Kalender.aspx?month=04&year=2008 HTTP/1.1
