﻿// * JS Calendar (version 2.2)
// * 
// * Modified 2008/10 by Dynamicweb/Johannes Findorf
// * modified 2008/11 by Region Midtjylland/Bo Nedergaard
// * Originally adapted from 
// * http://www.dhtmlgoodies.com/index.html?page=calendarScripts
//
// <CONFIGURATION> 

function JSCalendar(XmlSource,showWeekNumber,languageCode,randomizeAccessMode){
  
  //var languageCode = 'da';	// Possible values: 	en,ge,no,nl,es,pt-br,fr	
  // en = english, ge = german, no = norwegian,nl = dutch, es = spanish, pt-br = portuguese, fr = french, da = danish, hu = hungarian(Use UTF-8 doctype for hungarian)
  
  //var showWeekNumber=true;
  var CellPadding="0";
  var CellSpacing="2";
  
  this.GoBackHTML = "&lt;&lt;"
  this.GoForwardHTML = "&gt;&gt;"
  this.ClassPrefix="jscalendar";
  
  //var XmlSource = "/kalender/events1.xml";
  
  var showEventDayInfo=false;
  var showCurrentDateOnStart=true;
  
  //Not used in this version:
  var calendar_display_time = false;
  // </CONFIGURATION> 
  								
  // Format of current day at the bottom of the calendar
  // [todayString] = the value of todayString
  // [dayString] = day of week (examle: mon, tue, wed...)
  // [UCFdayString] = day of week (examle: Mon, Tue, Wed...) ( First letter in uppercase)
  // [day] = Day of month, 1..31
  // [monthString] = Name of current month
  // [year] = Current year							
  var todayStringFormat = '[todayString] [UCFdayString]. [day]. [monthString] [year]';						
  
  var speedOfSelectBoxSliding = 200;	// Milliseconds between changing year and hour when holding mouse over "-" and "+" - lower value = faster
  var intervalSelectBox_minutes = 5;	// Minute select box - interval between each option (5 = default)
  
  var calendar_offsetTop = 0;		// Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype
  var calendar_offsetLeft = 0;	// Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype
  var calendarDiv = "";//false;
  
  var MSIE = false;
  var Opera = false;
  if(navigator.userAgent.indexOf('MSIE')>=0 && navigator.userAgent.indexOf('Opera')<0)MSIE=true;
  if(navigator.userAgent.indexOf('Opera')>=0)Opera=true;
  
  switch(languageCode){
  	case "en":	/* English */
  		var monthArray = ['January','February','March','April','May','June','July','August','September','October','November','December'];
  		var monthArrayShort = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  		var dayArray = ['M','T','W','T','F','S','S'];
  		var weekString = 'Week';
  		var todayString = '';
  		break;
  	case "ge":	/* German */
  		var monthArray = ['Januar','Februar','M㱺','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'];
  		var monthArrayShort = ['Jan','Feb','Mar','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];
  		var dayArray = ['Mon','Die','Mit','Don','Fre','Sam','Son'];	
  		var weekString = 'Woche';
  		var todayString = 'Heute';		
  		break;
  	case "no":	/* Norwegian */
  		var monthArray = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember'];
  		var monthArrayShort = ['Jan','Feb','Mar','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Des'];
  		var dayArray = ['Man','Tir','Ons','Tor','Fre','L&oslash;r','S&oslash;n'];	
  		var weekString = 'Uke';
  		var todayString = 'Dagen i dag er';
  		break;	
  	case "nl":	/* Dutch */
  		var monthArray = ['Januari','Februari','Maart','April','Mei','Juni','Juli','Augustus','September','Oktober','November','December'];
  		var monthArrayShort = ['Jan','Feb','Mar','Apr','Mei','Jun','Jul','Aug','Sep','Okt','Nov','Dec'];
  		var dayArray = ['Ma','Di','Wo','Do','Vr','Za','Zo'];
  		var weekString = 'Week';
  		var todayString = 'Vandaag';
  		break;	
  	case "es": /* Spanish */
  		var monthArray = ['Enero','Febrero','Marzo','April','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
  		var monthArrayShort =['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'];
  		var dayArray = ['Lun','Mar','Mie','Jue','Vie','Sab','Dom'];
  		var weekString = 'Semana';
  		var todayString = 'Hoy es';
  		break; 	
  	case "pt-br":  /* Brazilian portuguese (pt-br) */
  		var monthArray = ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'];
  		var monthArrayShort = ['Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago','Set','Out','Nov','Dez'];
  		var dayArray = ['Seg','Ter','Qua','Qui','Sex','S&aacute;b','Dom'];
  		var weekString = 'Sem.';
  		var todayString = 'Hoje &eacute;';
  		break;
  	case "fr":      /* French */
  		var monthArray = ['Janvier','F赲ier','Mars','Avril','Mai','Juin','Juillet','Ao�Septembre','Octobre','Novembre','D袥mbre'];		
  		var monthArrayShort = ['Jan','Fev','Mar','Avr','Mai','Jun','Jul','Aou','Sep','Oct','Nov','Dec'];
  		var dayArray = ['Lun','Mar','Mer','Jeu','Ven','Sam','Dim'];
  		var weekString = 'Sem';
  		var todayString = "Aujourd'hui";
  		break; 	
  	case "da": /*Danish*/
  		var monthArray = ['januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december'];
  		var monthArrayShort = ['jan','feb','mar','apr','maj','jun','jul','aug','sep','okt','nov','dec'];
  		var dayArray = ['m','t','o','t','f','l','s'];
  		var weekString = 'Uge';
  		var todayString = 'I dag er den';
  		break;	
  	case "hu":	/* Hungarian  - Remember to use UTF-8 encoding, i.e. the <meta> tag */
  		var monthArray = ['Január','Február','Március','prilis','Május','Június','Július','Augusztus','Szeptember','Október','November','December'];
  		var monthArrayShort = ['Jan','Feb','Márc','pr','Máj','Jún','Júl','Aug','Szep','Okt','Nov','Dec'];
  		var dayArray = ['Hé','Ke','Sze','Cs','Pé','Szo','Vas'];
  		var weekString = 'Hét';
  		var todayString = 'Mai nap';	
  		break;
  	case "it":	/* Italian*/
  		var monthArray = ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];
  		var monthArrayShort = ['Gen','Feb','Mar','Apr','Mag','Giu','Lugl','Ago','Set','Ott','Nov','Dic'];
  		var dayArray = ['Lun',';Mar','Mer','Gio','Ven','Sab','Dom'];
  		var weekString = 'Settimana';
  		var todayString = 'Oggi &egrave; il';
  		break;		
  	case "sv":	/* Swedish */
  		var monthArray = ['Januari','Februari','Mars','April','Maj','Juni','Juli','Augusti','September','Oktober','November','December'];
  		var monthArrayShort = ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'];
  		var dayArray = ['M&aring;n','Tis','Ons','Tor','Fre','L&ouml;r','S&ouml;n'];
  		var weekString = 'Vecka';
  		var todayString = 'Idag &auml;r det den';
  		break;	
		}
	  var daysInMonthArray = [31,28,31,30,31,30,31,31,30,31,30,31];
    var currentMonth;
    var currentYear;
    var currentHour;
    var currentMinute;
    
    var calendarContentDiv;
    var returnDateTo;
    var returnFormat;
    var activeSelectBoxMonth;
    var activeSelectBoxYear;
    var activeSelectBoxHour;
    var activeSelectBoxMinute;
    
    var showEventsDiv;
    
    var xmlHttp;
    var d;
    var oEventDom;
    var maanedDiv;
    var yearDiv;
    
    
    //********* PRINTCALENDARDHTML *********//
    this.PrintCalendarHtml = function(calendarDivId,eventsDivId,initDate){
  
      calendarDiv = document.getElementById(calendarDivId);
      showEventsDiv =document.getElementById(eventsDivId);
      d = initDate;
    	currentMonth = d.getMonth();
    	currentYear = d.getFullYear();
    	currentHour = '08';
    	currentMinute = '00';
    	tmpDay = d.getDate();
    	
    	inputYear = currentYear;
    	inputMonth = currentMonth;
    	inputDay = tmpDay/1;
    
    	//Get data
    	var currentObject= this;
    	
    	xmlHttp = CreateRequester();
    	xmlHttp.onreadystatechange=function(){

      		if(xmlHttp.readyState==4){
    			oEventDom= CreateDom(xmlHttp.responseText);
    			
    			//Create UI
    			currentObject.writeTopBar();
    			currentObject.writeCalendarContent();
    		
    		  //Show current date
    			if (showCurrentDateOnStart) currentObject.showEvents(d.getDate(),currentMonth,currentYear);
    		}
      
      
      };  	
      
      var finalXmlSource=XmlSource;
      if (randomizeAccessMode > 0){
        var date = new Date();
        finalXmlSource += (XmlSource.indexOf("?") == -1) ? "?" : "&" ;
        finalXmlSource += "nocache=" + date.getYear() + date.getMonth() + date.getDate() + date.getHours();
        if (randomizeAccessMode == 1){ 
          finalXmlSource += date.getMinutes();
          finalXmlSource += date.getSeconds();
        }
        if (randomizeAccessMode == 2){ 
          finalXmlSource += date.getMinutes();
        }
      }
      
    	xmlHttp.open("GET",finalXmlSource,true);
    	xmlHttp.send(null);
     
    }


    //********* WRITETOPBAR *********//
    this.writeTopBar = function(){
    
      currentObject=this;
      
    	var topBar = document.createElement('div');
    	topBar.className = this.ClassPrefix + 'topbar';
    	calendarDiv.appendChild(topBar);
    	
    	
    	// Left arrow
    	var leftDiv = document.createElement('div');
    	leftDiv.className= this.ClassPrefix + "goback"
    	leftDiv.innerHTML=this.GoBackHTML;
    	leftDiv.onclick = function() {currentObject.monthBack()};
    	topBar.appendChild(leftDiv);
    
    	//Month
    	maanedDiv = document.createElement('div');
    	maanedDiv.className=this.ClassPrefix + "month";
    	topBar.appendChild(maanedDiv);
    	this.updateMonth();
    
    	//Year
    	yearDiv = document.createElement('div');
    	yearDiv.className = this.ClassPrefix + "year";
    	topBar.appendChild(yearDiv);
    	this.updateYear();
    
    	// Right arrow
    	var rightDiv = document.createElement('div');
    	rightDiv.className= this.ClassPrefix + "goforward";
    	rightDiv.innerHTML=this.GoForwardHTML;
    	rightDiv.onclick = function() {currentObject.monthForward()}; 
    	topBar.appendChild(rightDiv);
    	
    	// clear
    	var clearDiv = document.createElement('div');
    	clearDiv.className=this.ClassPrefix + "clear";
    	clearDiv.innerHTML="<!---->";
    	topBar.appendChild(clearDiv);
    	 
    }


    //********* ISLEAPYEAR *********//
    this.isLeapYear=function(inputYear)
    {
    	if(inputYear%400==0||(inputYear%4==0&&inputYear%100!=0)) return true;
    	return false;	
    	
    }

    //********* ONMONTHCHANGE *********//
    //Called when month is changed by user
    this.onMonthChange=function(newMonth,newYear) {
        showEventsDiv.innerHTML="";
    }


    //********* DAYRENDER *********//
    //Called when a day is drawn
    this.dayRender=function(day,month,year) {
    	var dayDiv = document.createElement('div');
    	var events = xPath(oEventDom,"/events/event[month=" + (month+1) + " and day=" + day + " and year=" + year + "]");
    	if (events.length > 0){
    	  dayDiv.className =  this.ClassPrefix +"day " + this.ClassPrefix+"dayevent";
    	  currentObject=this;
		var monthprint = month + 1;
		var linkNode = events[0].selectSingleNode("popuplink");
		var link= (linkNode != null)? ((linkNode.childNodes.length > 0)?linkNode.firstChild.nodeValue:""):"";
    		link = link.replace("kalender=1&","");
	dayDiv.onclick = function(){ window.location = link+"&day=" + day + "&month=" + monthprint + "&year=" + year;}
	// dayDiv.onclick = function(){ currentObject.showEvents(day, month, year);}

    	 } else {
          dayDiv.className =  this.ClassPrefix+"day";
       }
       
       dayDiv.innerHTML = day;

    	 return dayDiv;
    
    }
    
    
    //********* SHOWEVENTS *********//
    this.showEvents=function(day,month,year){
    
    	var result;
    	
    	var events = xPath(oEventDom,"/events/event[month=" + (month+1) + " and day=" + day + " and year=" + year + "]");
    
    	if (events.length == 0) {
    		result = "Ingen aktiviteter " + day + ". " + monthArray[month] + " "+ year;
    	} else {
    		result = (showEventDayInfo) ? "Aktiviteter " + day + ". " + monthArray[month] + " "+ year + "<br/>":""  ;
    		result +="<ul class=\"" + this.ClassPrefix + "eventlist\">";
    		for (var i=0;i<events.length;i++) {
          var linkNode = events[i].selectSingleNode("popuplink");
          var textNode = events[i].selectSingleNode("title");
          var headingNode = events[i].selectSingleNode("subheading");
          var startNode = events[i].selectSingleNode("startdatetime");
          var locationNode = events[i].selectSingleNode("location");
          var link= (linkNode != null)? ((linkNode.childNodes.length > 0)?linkNode.firstChild.nodeValue:""):"";
          var text= (textNode != null)? ((textNode.childNodes.length > 0)?textNode.firstChild.nodeValue:""):"";
          var heading= (headingNode != null)? ((headingNode.childNodes.length > 0)?headingNode.firstChild.nodeValue:""):"";
          var start= (startNode != null)? ((startNode.childNodes.length > 0)?startNode.firstChild.nodeValue:""):"";
          var _location = (locationNode != null)? ((locationNode.childNodes.length > 0)?locationNode.firstChild.nodeValue:""):"";
          result+= (text!="" && link !="")?"<div class=\"cItem\"><a href=\"" + link + "\"><h3>" + text + "</h3>"+heading+"<span class=\"locationField\">Sted: "+_location+"</span><span class=\"dateField\">Start: "+start+"</span></a></div>":"";
    		} 
    		result += "</ul>";	
    	}
    	showEventsDiv.innerHTML = result;
    }

    //********* WRITECALENDARCONTENT *********//
    this.writeCalendarContent=function()
    {
      
    	var calendarContentDivExists = true;
    	if(!calendarContentDiv){
    		calendarContentDiv = document.createElement('div');
    		calendarDiv.appendChild(calendarContentDiv);
    		calendarContentDivExists = false;
    	}
    	currentMonth = currentMonth/1;
    	var d = new Date();
    	
    	d.setFullYear(currentYear);		
    	d.setDate(1);		
    	d.setMonth(currentMonth);
    	
    	var dayStartOfMonth = d.getDay();
    	if(dayStartOfMonth==0)dayStartOfMonth=7;
    	dayStartOfMonth--;
    	
    
    	
    	var existingTable = calendarContentDiv.getElementsByTagName('table');
    	if(existingTable.length>0){
    		calendarContentDiv.removeChild(existingTable[0]);
    	}
    	
    	var calTable = document.createElement('table');
    	calTable.cellSpacing = CellSpacing;
    	calTable.cellPadding = CellPadding;
    	calendarContentDiv.appendChild(calTable);
    	
    	var calTBody = document.createElement('tbody');
    	calTable.appendChild(calTBody);
    
    
    	/*FIRST ROW*/
    
    	var row = calTBody.insertRow(-1);
    	row.className = this.ClassPrefix + 'calendar_week_row';
    	if (showWeekNumber) {
    		var cell = row.insertCell(-1);
    		cell.innerHTML = weekString;
    		cell.className = this.ClassPrefix + 'calendar_week_column';
    	}
    	
    	for(var no=0;no<dayArray.length;no++){
    		var cell = row.insertCell(-1);
    		cell.innerHTML = dayArray[no]; 
    		cell.className=this.ClassPrefix + 'weekday'
    	}

    	var row = calTBody.insertRow(-1);

    	if (showWeekNumber) {
    			var cell = row.insertCell(-1);
    			cell.className = this.ClassPrefix + 'calendar_week_column';
    			var week = this.getWeek(currentYear,currentMonth,1);	
    			cell.innerHTML = week;		// Week
    	}

    	for(var no=0;no<dayStartOfMonth;no++){
    			var cell = row.insertCell(-1);
    			cell.innerHTML = '&nbsp;';
    	}

    	var colCounter = dayStartOfMonth;
      var daysInMonth = daysInMonthArray[currentMonth];
      if(daysInMonth==28){
      	if(this.isLeapYear(currentYear))daysInMonth=29;
      }
    	
    	/*DAYS IN MONTH*/
    	for(var no=1;no<=daysInMonth;no++){
    		d.setDate(no-1);
    		if(colCounter>0 && colCounter%7==0){
    			/*WEEK NUMBER*/
    			var row = calTBody.insertRow(-1);
    			if (showWeekNumber) {
    				var cell = row.insertCell(-1);
    				cell.className = this.ClassPrefix + "calendar_week_column";
    				var week = this.getWeek(currentYear,currentMonth,no);
    				cell.innerHTML = week;		// Week			
    			}
    		}
    		var cell = row.insertCell(-1);
    		if(currentYear==inputYear && currentMonth == inputMonth && no==inputDay){
    			cell.className=this.ClassPrefix +"activeday " + this.ClassPrefix + "daycell";	
    		} else {
    			cell.className=this.ClassPrefix + "daycell";	
    		}
    		cell.appendChild(this.dayRender(no,currentMonth,currentYear));
    		colCounter++;
    	}
    	
    }

    //********* UPDATEMONTH *********//
    this.updateMonth=function(){
    
    	maanedDiv.innerHTML = monthArray[currentMonth];
    	
    }
    
    //********* UPDATEYEAR *********//
    this.updateYear=function(){
    
    	yearDiv.innerHTML = currentYear
    	
    }
    
    
    //********* GETWEEK *********//
    // This function is from http://www.codeproject.com/csharp/gregorianwknum.asp
    // Only changed the month add
    this.getWeek=function(year,month,day){
    	day = day/1;
    	year = year /1;
        month = month/1 + 1; //use 1-12
        var a = Math.floor((14-(month))/12);
        var y = year+4800-a;
        var m = (month)+(12*a)-3;
        var jd = day + Math.floor(((153*m)+2)/5) + 
                     (365*y) + Math.floor(y/4) - Math.floor(y/100) + 
                     Math.floor(y/400) - 32045;      // (gregorian calendar)
        var d4 = (jd+31741-(jd%7))%146097%36524%1461;
        var L = Math.floor(d4/1460);
        var d1 = ((d4-L)%365)+L;
        NumberOfWeek = Math.floor(d1/7) + 1;
        return NumberOfWeek;        
    }
    
    
    //********* MONTHBACK *********//
    this.monthBack = function(){
     	currentMonth=currentMonth-1;;
    	if(currentMonth<0){
    			currentMonth=11;
    			currentYear=currentYear-1;
    		}
    		this.switchMonth();
    }
    
    
    //********* MONTHFORWARD *********//
    this.monthForward = function(){
      currentMonth=currentMonth+1;;
    	if(currentMonth>11){
    	   currentMonth=0;
    	   currentYear=currentYear/1+1;
      } 	
      this.switchMonth();
    }
    
    
    //********* SWITCHMONTH *********//
    this.switchMonth=function()
    {
    	this.updateMonth();
    	this.updateYear();
    	this.writeCalendarContent();	
    	
    	this.onMonthChange(currentMonth,currentYear);
    }
    
    
    //********* PICKDATE *********//
    this.pickDate=function(e,inputDay)
    {
    	alert(e);
    	return null;	
    }
}

