function isLocal()
{
	var l = document.location + "";
	
	return  ( l.indexOf("localhost") > -1 );
}

function openWindow( path, name, w, h )
{
	win = window.open( path, name, "width=" + w + ",height=" + h +
	",toolbar=no,location=no,directories=no,status=0,resizable=yes,scrollbars=yes,menubar=no");
	win.moveTo(50,50);
}
		

var mcoAgenda;

$(document).ready(

	function()
	{
		if ( document.getElementById("mco-calendar" ) )
		{
			mcoAgenda = McoCalendar()
			mcoAgenda.init();	
		}
	}
);

function ucFirst(s)
{
	s += "";
	var f = s.charAt(0).toUpperCase();
	return f + s.substr(1);
}

(function()
{
	
	/*
		return constructor
	*/
	
	window.McoCalendar = function()
	{
		return new _calendar();
	}
	
	
	/*
		private properties & methods
	*/
	
	var active = "active";				
	var rangeformat = "dd-mm-yyyy";
	var weekformat = "id";
	var rangeDivider = " / ";
	var space = "&nbsp;";
	var modalWindow = false;
	var proxy = "http://localhost:8888/mco-kalender/proxy.php?url=";
	var xStep = 122;	
	var yStep = 48;
	var productie = false;
	var projectCode = "";
	
	// for storing the appointments that have allready been loaded once
	var CACHE = {};
	var small = false;
	var extranet = false;
	
	/*
		constructor
	*/
	
	function _calendar()
	{	
		/*
		*/
		
		var today = new Date( parseInt( $("#timestamp" ).val() ) * 1000 );
		
					
		this._currentDate 	= new Date( today.getFullYear(), today.getMonth(), today.getDate() );
		
		this._currentWeek 	= this._currentDate.getWeek();
		this._currentDay	= this._currentDate.getDate();
		this._currentMonth 	= this._currentDate.getMonth();
		this._currentYear 	= this._currentDate.getFullYear();
		
		
		extranet = $("#extranet").val() == '1' ? true : false;
		
		/*
		*/
		
		this._mco = $("body").hasClass("mco");
		this._kco = $("body").hasClass("mcoe");
		
		/*				
		*/
		
		this._shownDate 	= this._currentDate.clone();	
		
		if ( $("#calendar-view").hasClass("productie") )
		{
			productie = true;
			
			projectCode =  $("#projectcode").val();
			
			var info =  $("#production-select").val();
			
			var parts = info.split("/");
			
			if ( parts.length > 1 )
			{
			
				var dateParts = parts[1].split("-");
				
				var y = dateParts[0];
				var m = getInt( dateParts[1] ) - 1;
				var d = dateParts[2];
				
				/*
					alle producties zijn te selecteren dus ook oudere. We zetten de kalender op een bijbehorende datum ipv vandaag.
				*/
								
				this._shownDate = new Date( y, m, d );
			}
		}
		
		/*
		*/
		
		// this._shownDate 	= this._currentDate.clone();
		
		
		this.extractShownDate();
			
		/*
		*/
		this._navigation = false;
		
		this._ensemble		= $(".ensemble-select").val();
		
	
		if ( $("#calendar-view").hasClass("small") )
		{
			xStep = 81;
			yStep = 32;
			small = true;
		} else {
			yStep = 48;
		}
		
		
		
		/*
		*/
					
		this._oneHour		= 1000 * 60 * 60;
		this._halfDay		= this._oneHour * 12;
		this._oneDay 		= this._oneHour * 24;
		this._oneWeek		= this._oneDay * 7;
		this._sixDays		= this._oneDay * 6;
		
		/*
		*/
		
		this._range			= { start: 0, end: 0 };
		
		this._appointmentLinks = new Array();
		
		this._appointments 	= new Array();
		this._detailData = {};
		
	}
	
		
	/*
		api
	*/
	
	_calendar.prototype = {
	
		init : function()
		{
			this.initNavigation();
			
			this.selectView();
		},

		
		selectView: function()
		{
			if ( this._mco )
			{
				$("h2.agenda-title").html( "Agenda " + this._ensemble );			
			}
			
			if ( this._mco || this._kco )
			{
				var wrapper = $("#calendar-wrapper");
				wrapper.removeClass();
				wrapper.addClass( this._ensemble.toLowerCase() );
			}
			
			this._currentView = $( "#calendar-navigation .tabs li." + active + " a" ).attr("rel");
							
			this.next(0);
			
			if ( productie )
			{
				if ( this._currentView == "agenda" )
				{
					if($(".ui-datepicker-trigger").attr('alt') != 'icaldate') {
						$(".ui-datepicker-trigger").hide();	
					}
					$("#today").hide();			
					$("#previous").hide();			
					$("#next").hide();
					$(".calendar-range").hide();
					
					
				} else {
					$(".ui-datepicker-trigger").show();	
					$("#today").show();			
					$("#previous").show();			
					$("#next").show();
					$(".calendar-range").show();
				}
			}
			
		},
		
		updateView : function()
		{	
			$("#currentview").val( this._currentView );				
			$("#weeknumber").val( this._shownWeek );
			$("#maand").val( monthNames[ this._shownMonth ] );
			
			
			$("#calendar-view").empty();
			
			
			switch( this._currentView )
			{
				case "week":
				
					var view = this.getWeekView();						
					$("#calendar-view").append( view );
					
					view.find(".viewport").scrollTop( 8*yStep );
					
					break;
				case "month":
				
					var view = this.getMonthView();	
					$("#calendar-view").append( view );
					
					break;
				case "agenda":
				
					var view = this.getAgendaView();						
					$("#calendar-view").append( view );
					
					break;						
			}
			
			$("#loader").fadeOut();
			
		},
		
		getAgendaView : function()
		{			
			// remove all listeners from previous view
			this.removeListeners();
			
			var box =  $("<div><\/div>");
			box.addClass('agenda');
			
			this.updateRangeHeader();
			
			var viewport =  $("<div><\/div>");
			viewport.addClass('viewport');
			
			var scroller =  $("<div><\/div>");
			scroller.addClass('scroller');
		
			var dl = $("<dl><\/dl>");
			
			for( var i = 0; i < this._appointments.length; i++ )
			{
				var data = this._appointments[i];
				var prev = this._appointments[i-1]
				
				if ( !prev || data.startDay != prev.startDay )
				{
					var dt = $("<dt><\/dt>");
					
					var midNight = new Date( data.startYear, data.startMonth, data.startDay );
					
					dt.text( ucFirst( midNight.format("dddd id mmmm") ) );
					
					dl.append(dt);
				
				} 
				
				var dd = $("<dd><\/dd>");
				
				if ( i % 2 == 0 ) dd.addClass("odd");
				
				var startTime 	= new Date( data.startYear, data.startMonth, data.startDay, data.startHour, data.startMinutes );
				var endTime 	= new Date( data.endYear, data.endMonth, data.endDay, data.endHour, data.endMinutes );
				
				if ( data.allDayEvent == 1 )
				{
					var times = "";
					
				} else {
				
					var times = "<em>" + startTime.format("h:nn") + " - "+ endTime.format("h:nn") + "<\/em>";
				}			
				
				if ( productie )
				{
					var list = this.getUL( data.title, data.notes, data.conductor, data.venue );
				} else {
					var list = this.getUL( data.title, data.notes, data.conductor, data.venue, data.project );
				}
				
				var works = "";
				var soloists = "";
				var persons = "";
				
				if ( extranet )
				{				
					var works = this.getListByKeys( data.works, ['composer','title'], 'Werken' );
					var soloists = this.getListByKeys( data.soloists, ['name','instrument','notes'], 'Solisten' );
					var persons = this.getListByKeys( data.persons, ['name','func','addressgroup','notes'], 'Personen' );					
				}
				
				var head = this.getList( ' - ', times, data.code, data.text );
				
				if ( list != "" )
				{
					var a = $("<a><\/a>").attr({ href:"#"}).html( head );
				
					dd.append( a );
				
				} else {
					
					var span = $("<span><\/span>").html( head );
					
					dd.append( span );
				}
				
				if ( list != "" || ( extranet && ( works != '' || soloists != '' || persons != '' ) ) )
				{
					a.addClass('expandable');
					
					var content = $("<div><\/div>").addClass('agenda-item');
					
					this.initExpandable( a, content );
					
					content.append( list );
					
					if (  works != '' )
					{
						content.append( works );
					}
					
					if (  soloists != '' )
					{
						content.append( soloists );
					}
					
					if (  persons != '' )
					{
						content.append( persons );
					}
					
					
					if ( data.code != "" && !productie )
					{
						var es = data.startYear +  "-" + decimal( data.startMonth ) + "-" + decimal( data.startDay );
						var ee = data.endYear +  "-" + decimal( data.endMonth ) + "-" + decimal( data.endDay );
					
						var href = "/page/productie/" + data.code;// + "/" + es + "/" + ee;
					
						var a = $("<a><\/a>").attr( { href: href } ).html( "productie details &raquo;" );
											
						var readOn = $("<p><\/p>").addClass("more").append( a );
						
						if ( !this._mco )
						{
							content.append( readOn );
						}
					}
					
					dd.append( content );
				}
				
				dl.append(dd);
				
				
			}
			
			scroller.append(dl);
			
			if ( this._appointments.length == 0 )
			{
				scroller.append("<p>Geen items gevonden</p>");
			}
			
			viewport.append(scroller);
			box.append(viewport);
			
			return box;
			
		},
		
		//http://extranet.mco.nl/page/pdf/RFO/project/1014F1
		
		getListByKeys : function( data, keys, name )
		{
			var l = data.length;
			
			if ( l > 0 )
			{
				var div = $('<div></div>');
				var h3 = $('<h3></h3>').html( name );
				
				var ul = $('<ul></ul>');
				
				
				for( var i = 0; i < l; i++)
				{
					var d = data[i];
					var str = [];
					
					for( var j = 0; j < keys.length; j++ )
					{
						var key = keys[j];
						var v = d[key];
						if ( v != '' )
						{
							str.push( v );
						}
					}
					
					var li = $('<li></li>').html( str.join(' - ') );
					
					ul.append( li );
				}
				
				div.append( h3 );
				div.append( ul );
				
				return div;
			}
			return '';
		},
		
		initExpandable : function( originator, target)
		{
			var collapsed = true;
			
			originator.click(
				
					function(e)
					{
						collapsed = !collapsed;
												
						if ( collapsed )
						{
							target.slideUp('fast');	
							
							$(this).removeClass('expanded');
							
						} else {
							target.slideDown('fast');
							
							$(this).addClass('expanded');
						}
						
						e.preventDefault();
					}
				);
		},
		
		getUL : function()
		{
			var ul = $("<ul><\/ul>");
			
			for( var i = 0; i < arguments.length; i++ )
			{
				if ( arguments[i] != "" )
				{
					var li = $("<li><\/li>").html( arguments[i] );
					
					ul.append(li);
				}
			}
			
			if ( ul.find("li").size() == 0 ) ul = "";
			
			return ul;
		},
		
		isToday: function(d)
		{				
			if (
					d.getFullYear() == this._currentYear &&
					d.getMonth() == this._currentMonth &&
					d.getDate() == this._currentDay 
				)
				{
					return true;						
				} 
				
			return false;
			
		},
		
		getWeekDayAppointmentsView: function()
		{
			var dayAppointments =  $("<div><\/div>");
			dayAppointments.addClass('day-appointments');	
			
			var header = $("<div><\/div>").addClass("week-header");				
			var row = $("<div><\/div>").addClass("row");				
						
			for( var day = 0; day < 7; day++)
			{
				var currDate = new Date( this._range.start.getTime() + this._oneDay * day );
				
				var f = "dddd id mmm"
				if ( small ) f = "ddd id mmm";
				
				var head = $("<div><\/div>").addClass("day").text( currDate.format( f ) );
				
				if ( this.isToday( currDate ) )
				{
					head.addClass( 'current-date' );
				}
				
				row.append( head );
							
			}
			
			header.append( row );		
			
			var row = $("<div><\/div>").addClass("row");	
			
			for( var day = 0; day < 7; day++)
			{
				var currDate = new Date( this._range.start.getTime() + this._oneDay * day );
				
				var app = $("<div><\/div>").addClass('day-appointment');
				
				if ( this.isToday( currDate ) )
				{
					app.addClass( 'current-date' );
				}
				
				for( var i = 0; i < this._appointments.length; i++ )
				{
					var data = this._appointments[i];
					
					var cday = this.getDay( new Date( data.startTime ) );
				
					if ( data.allDayEvent == 1 && ( day == cday ) )
					{
						var a = $("<a><\/a>").attr({href:"#", id: 'index_' + i }).html( this.getList( " - ", data.code, data.title, data.text) );
						
						a.click( mcoAgenda.showDetails  );
						
						this._appointmentLinks.push( a );
					
						app.append( a );
					}
				}
				
				app.append( space )
				row.append( app );
							
			}
					
			header.append(row);
			
			dayAppointments.append(header);
			
			return dayAppointments;
		},
		
		updateRangeHeader : function()
		{
			var v = $("#daterange").val();
			$(".calendar-range").html( v );
		},
		
		getWeekHeaderView: function()
		{
			var v = $("#daterange").val();
			var h3 = $("<h3><\/h3>").append( v );
			
		},
		
		getWeekGridView : function()
		{
			var grid = $("<div><\/div>").addClass("week-grid").css({position:'relative'});				
			
		//	var yStep = 48;
		//	var xStep = 122;
			var hourLabelWidth = 43;
			var vStep = Math.round( yStep / 2 );
			
			for( var hour = 0; hour < 48; hour++)
			{
								
				if ( hour % 2 == 0 )
				{
					var time = $("<h4><\/h4").text( decimal( getInt( hour / 2 ) ) + ".00" );
					
					time.css(
						
						{
							position: 'absolute',
							top: hour * vStep,
							left: 0,
							width: hourLabelWidth - 5 ,
							height: yStep - 1
						}
					
					);
					
					grid.append( time );
				}
				
				for( var day = 0; day < 7; day++)
				{
					var currDate = new Date( this._range.start.getTime() + day * this._oneDay );
			
					var halfhour = $("<div><\/div>").addClass("half-hour").html( space );
					
					halfhour.css(
						
						{
							position: 'absolute',
							top: hour * vStep,
							left: hourLabelWidth + ( day * xStep ),
							width: xStep - 1, 
							height: vStep-1
						}
					
					);
					
					
					if ( hour < 16 || hour > 35 )
					{
						halfhour.addClass( 'free' );
					}
					
					
					if ( this.isToday( currDate ) )
					{
						halfhour.addClass( 'current-date' );
					}
					
					grid.append(halfhour);
				}				
			}
			
			return grid;
		},
		
	
		
		getWeekView : function()
		{			
			// remove all listeners from previous view
			this.removeListeners();
			
			var box =  $("<div><\/div>");
			box.addClass('week');				

			/*
			var h3 = this.getWeekHeaderView();								
			box.append(h3);
			*/
			
			this.updateRangeHeader();
			
			
			var dayAppointments = this.getWeekDayAppointmentsView();		
			box.append(dayAppointments);
			
			var viewport =  $("<div><\/div>");
			viewport.addClass('viewport');
			
			
			
			var scroller =  $("<div><\/div>");
			scroller.addClass('scroller');
			
			scroller.css( { height: 24 * yStep } );
			
			var content =  $("<div><\/div>");
			content.addClass('scroller-content');
								
			var grid = this.getWeekGridView();
			
			// render appointments over the grid
			
			var hourLabelWidth = 43;
			var oneHour = 1000 * 60 * 60;
			
			for( var i = 0; i < this._appointments.length; i++ )
			{
				var data = this._appointments[i];
				
				var midNight 	= new Date( data.startYear, data.startMonth, data.startDay );
				var startTime 	= new Date( data.startYear, data.startMonth, data.startDay, data.startHour, data.startMinutes );
				var endTime 	= new Date( data.endYear, data.endMonth, data.endDay, data.endHour, data.endMinutes );
			
				var dayNum = getDay( startTime );
				
				var start = ( startTime.getTime() - midNight.getTime() ) / oneHour;
				
				if ( data.allDayEvent == 0 )
				{
					var duration = ( endTime.getTime() - startTime.getTime() ) / oneHour;
					
					var h = ( duration * yStep );
					var left = hourLabelWidth + ( dayNum * xStep );
					var top = (start * yStep) - 1;
					
					var app = $("<div><\/div>").addClass('appointment').attr( { id : 'index_' + i } );
					var div = $("<div><\/div>");
					
					
					var code = "<em>" + data.code + "</em>";
					
					var list = this.getList( ' - ', code, data.title, data.text, data.notes, data.project, data.ensemble );
										
					if ( data.withEndEvent == 1 ) 
					{
						var link = $("<a><\/a>").attr( { href:"#", rel: data.id } ).html( startTime.format('h:nn') + ' - ' + endTime.format('h:nn') );
										
					} else {
						
						h = 16;

						var link = $("<a><\/a>").attr( { href:"#", rel: data.id } ).html( startTime.format('h:nn') + " : "  );
					}
					
					var p = $("<p><\/p>").html( list );	
					
					app.click( mcoAgenda.showDetails  );
						
					this._appointmentLinks.push( app );
					
					app.css(
						{
							position: 'absolute',
							left: left,
							top: top,
							zIndex: 400 + i,												
							cursor: 'pointer'
						}
					);
					
					div.css(
						{
							height: h
						}
						
					);
					
					div.append(link);
					
					
					div.append(p);					
					app.append(div);					
					content.append( app );
						
				}
					
			}
			
			content.append(grid);
			scroller.append(content);
			
			content.css(
				{
					height: 24 * yStep
				}
			);
			
			viewport.append(scroller);
			
			box.append( viewport );
			
			viewport.scroll(
				function()
				{
					if ( modalWindow )
					{						
						mcoAgenda.closeWindow();
					}
				}
			);
			return box;				
		},
					
					
		isShownMonth : function(d)
		{
			if( d.getMonth() == this._shownMonth )
			{
				return true;
			}
			return false;
		},
		
		removeListeners : function()
		{
			for( var i = 0; i < this._appointmentLinks.length; i++)
			{
				this._appointmentLinks[i].unbind('click', mcoAgenda.showDetails );
			}
			
			this._appointmentLinks = new Array();
		},
		
		removeHighlight : function()
		{
			for( var i = 0; i < this._appointmentLinks.length; i++)
			{
				this._appointmentLinks[i].removeClass("hilite");
			}			
		},
		
		closeWindow : function(e)
		{
			if ( modalWindow )
			{
				modalWindow.empty();
				modalWindow.remove();
				modalWindow = false;
			}	
			mcoAgenda.removeHighlight();
			
			if (e) e.preventDefault();
		},
		
		
		showDetails : function(e)
		{
			//mcoAgenda.loadDetails( this.rel );
			var i = this.id.split("index_");
			
			mcoAgenda.removeHighlight();
			
			mcoAgenda.closeWindow();
			
			
			
			$(this).addClass("hilite");
			
			if ( i[1] && mcoAgenda._appointments[i[1]] )
			{
			
				var data = mcoAgenda._appointments[i[1]];
				
				modalWindow = $("<div><\/div>").addClass('modalwindow');
								
				//
				
				var closeBox =  $("<p><\/p>").addClass('closer');
				var close = $("<a><\/a>").attr( { href:"#" } ).html("sluiten");
				close.click( mcoAgenda.closeWindow );
				closeBox.append( close );
				modalWindow.append( closeBox );
				
				//
				
				var modalbox = $("<div><\/div>").addClass('modalbox');
				
				//
				
				var h4 = $("<h4><\/h4>").append( mcoAgenda.getList( " - ", data.code, data.title, data.text ) );
				
				modalbox.append( h4 );
				
				//
				
				/*
				http://intranet.mco.nl/page/ical/mo/153a9429731191d7e46c22487dcce8b7
				*/
				
				var dl = $("<dl><\/dl>");
				
				//
				
				if ( data.allDayEvent == 1 )
				{
					var dt = $("<dt><\/dt>").html( "Hele dag.");
					var dd = $("<dd><\/dd>").html( space );
					//dl.append(dt).append(dd);
					
				} else {
					var start = ( new Date( data.startTime ) ).format("h:nn");
					var end = ( new Date( data.endTime ) ).format("h:nn");
					
					var dt = $("<dt><\/dt>").html( "tijd: ");
					var dd = $("<dd><\/dd>").html( start + " - " + end);
					
					dl.append(dt).append(dd);
					
					/*					
					var dt = $("<dt><\/dt>").html( "tot: ");
					var dd = $("<dd><\/dd>").html( end );
					
					dl.append(dt).append(dd);
					*/
				}
				//
				
				if ( data.conductor != "" )
				{
					var dt = $("<dt><\/dt>").html( "dirigent: ");
					var dd = $("<dd><\/dd>").html( data.conductor );
					
					dl.append(dt).append(dd);
				}
				
				if ( data.project != "" )
				{
					var dt = $("<dt><\/dt>").html( "project: ");
					var dd = $("<dd><\/dd>").html( data.project );
					
					dl.append(dt).append(dd);
				}
				
				if ( data.venue != "" )
				{
					var dt = $("<dt><\/dt>").html( "venue: ");
					var dd = $("<dd><\/dd>").html( data.venue );
					
					dl.append(dt).append(dd);
				}
				
				
				if ( data.works.length > 0)
				{	
					var showItem = false;
					var ul = $("<ul></ul>");
					for( var j = 0; j < data.works.length; j++)
					{
						if(jQuery.trim(data.works[j].title) != "dummy" && jQuery.trim(data.works[j].composer) != "dummy" && jQuery.trim(data.works[j].composer) != "componist n.t.b.") {
							if(showItem == false)
								showItem = true;	
							var li = $("<li></li>").html( data.works[j].title + " - " + data.works[j].composer );
							ul.append(li);
						}
					}
					if(showItem == true) {
					
						var dt = $("<dt><\/dt>").html( "werken: ");
									
						var dd = $("<dd><\/dd>").append( ul );
					
						dl.append(dt).append(dd);
					}
				}
				
				modalbox.append(dl);
				
				if ( data.code != "" )
				{
					//var href = "/page/productie/" + data.code;
					
					var es = data.startYear +  "-" + decimal( data.startMonth ) + "-" + decimal( data.startDay );
					var ee = data.endYear +  "-" + decimal( data.endMonth ) + "-" + decimal( data.endDay );
					
					var href = "/page/productie/" + data.code;// + "/" + es + "/" + ee;
						
					
					var a = $("<a><\/a>").attr( { href: href } ).html( "productie details &raquo;" );
					
					var readOn = $("<p><\/p>").addClass("more").append( a );
					
					if ( !mcoAgenda._mco )
					{
						modalbox.append( readOn );
					}
				}
							
				modalWindow.append(modalbox);
			
				$("#calendar-view").append( modalWindow );
			}
			
			e.preventDefault();
		},
			
		getMonthView : function()
		{				
			var numDaysView = this.getNumDaysMonthView();
			var numWeeks = numDaysView / 7;
			var box =  $("<div><\/div>");
			box.addClass("month");
			
			this.removeListeners();
							
			this.updateRangeHeader();
			
			var grid = $("<div><\/div>").addClass('grid');
							
			var row = $("<div><\/div>").addClass('header-row');
			
			this._range.start = new Date( this._range.start.getTime() + this._halfDay );

			for( var day = 0; day < 7; day++)
			{
				var currDate = new Date( this._range.start.getTime() + this._oneDay * day );
				
				var dayname = $("<h4><\/h4>").text( currDate.format( "dddd" ));
				
				row.append( dayname );
							
			}
			
			grid.append(row);
			
			var i = 0;
					
			for( var week = 0; week < numWeeks; week++)
			{
				var row = $("<div><\/div>").addClass('row');
				
				for( var day = 0; day < 7; day++)
				{
					var currDate = new Date( this._range.start.getTime() + i * this._oneDay );
					
					var dayView = $("<div><\/div>").addClass("month-day");
					
					if ( this.isToday( currDate ) )
					{					
						dayView.addClass( 'active' );
					}
					
					if ( this.isShownMonth( currDate ) )
					{
				
						dayView.addClass( 'current' );
						
						var h4 = $("<h4><\/h4>").text( currDate.format(weekformat) );
						
					}  else {
						
						var h4 = $("<h4><\/h4>").text( currDate.format("id mmmm") );
					}
					
					dayView.append( h4 );
					
					var appDiv = $("<div><\/div>").addClass("list");
					
					for( var a = 0; a < this._appointments.length; a++ )
					{
						var data = this._appointments[a];
						
						if ( 
							data.startDay == currDate.getDate() &&
							data.startMonth == currDate.getMonth() &&
							data.startYear == currDate.getFullYear()
							)
							{	
								var code = "";
								if ( data.code != "") var code = "<em>" + data.code + "</em>";
								
								var title = this.getList( " - ", code, data.text );
							
								var link = $("<a><\/a>").attr({ href:"#", id: "index_" + a }).html( title );
								
								if ( parseInt( data.startHour ) == 0 )
								{
									link.addClass('day-appointment');
								}
								
								link.click( mcoAgenda.showDetails );
								
								appDiv.append( $("<p><\/p>").append( link ) );
								
								this._appointmentLinks.push( link );								
							}
							
					}	
						
					dayView.append( appDiv );
					
					row.append( dayView );
					
					i++;
					
				}
				
				grid.append( row );
			}
			
			box.append( grid );
			
			return box;	
		},
		
		getList : function()
		{
			if (arguments.length > 1 )
			{
				var arr = new Array();
				var divider = arguments[0];
				for( var i = 1; i < arguments.length; i++ )
				{
					if ( arguments[i] != "" )
					{
						arr.push( arguments[i] );
					}
				}
				return arr.join( divider );
			}
			return "";
		},
		
		/*
			calendar components
		*/
		
		getAppointmentView : function( d )
		{
			var view = $("<div><\/div>").addClass( this._currentView );
			
			for( var key in d )
			{
				var div = $("<div><\/div>").text( d[key] );
				
				view.append( div );
			}
			
			return view;
		},
		
		
		/*
			range
		*/
		
		getDay : function(d)
		{
			var d = d.getDay() - 1;
			if ( d == -1 ) d = 6;
			return d;
		},
		
		getEndRange : function()
		{
		
		},
					
		getWeekStart : function()
		{
			var ofset = this.getDay( this._shownDate );
			
			var startDate = new Date( this._shownYear, this._shownMonth, this._shownDay - ofset );
			
			return startDate;
		},
		
		/*
		*/
		
		updateRange : function()
		{
			var headformat = "id mmmm yyyy";
			var prefix = "Afspraken van ";
			
			if ( this._currentView == "month")
			{			
				$("#daterange").val( this._shownDate.format( "mmmm yyyy" ) );
				
			} else {
				
				$("#daterange").val( this._range.start.format( headformat ) + " - " + this._range.end.format( headformat ) );
			}
		
			$("#weeknumber").val( this._shownWeek );
		},
		
		setRange : function()
		{
			this.extractShownDate();
			
			switch( this._currentView )
			{
				case "week":						
					this.setWeekRange();											
					break;
				case "month":						
					this.setMonthRange();						
					break;
				case "agenda":						
					// this.setMonthRange();
					this.setAgendaRange();
					break;						
			}
			
			this.updateRange();		
			
			this.loadAppointments();					
		},
		
		/*				
		*/
		
		getCacheKey : function()
		{
			var f = "yyyy_mm_dd";
			var s = this._range.start.format(f);
			var e = this._range.end.format(f);
			
			var key = s + "_" + e + "_" + this._ensemble;
			return key;
		},
		
		saveToCache : function( data )
		{
			var key = this.getCacheKey();			
			
			CACHE[key] = data;
		},
		
		setRangeDates : function( s, e )
		{
			this._range.start = s;
			this._range.end = e;
		},
		
		setWeekRange : function()
		{
			var startDate = this.getWeekStart();
			
			var endDate = new Date( startDate.getTime() + this._sixDays  );
			
			this.setRangeDates( startDate, endDate );
		},
		
		setMonthRange : function()
		{	
			var currMonth = new Date( this._shownYear, this._shownMonth );
		
			var ofset = this.getDay( currMonth );
			
			var numDaysView = this.getNumDaysMonthView() - 1;				
							
			var startDate = ( new Date( this._shownYear, this._shownMonth, 1-ofset ) );
			
			var endDate = new Date( startDate.getTime() + ( numDaysView * this._oneDay ) );
			
			this.setRangeDates( startDate, endDate );
		},
		
		setAgendaRange : function()
		{
			//var startDate = 
			
		//	var ofset = this.getDay( this._shownDate );
			
			var startDate = this._shownDate.clone();
			
			var endDate = startDate.clone();
			endDate.setDate( endDate.getDate() + 13 );
			
			this.setRangeDates( startDate, endDate );
		},
	
		getNumDaysMonthView: function()
		{
			var currMonth = new Date( this._shownYear, this._shownMonth );
		
			var ofset = this.getDay( currMonth );
			
			var numDaysMonth = ( new Date( this._shownYear, this._shownMonth + 1,  0 ) ).getDate();
			
			var totalDays = numDaysMonth + ofset;
			
			var numDaysView = ( Math.ceil( totalDays / 7 ) * 7 );
			
			return numDaysView;
		},			
		
		/*
			extract date variables
		*/
		
		extractShownDate : function()
		{
			this._shownWeek 	= this._shownDate.getWeek();
			this._shownMonth 	= this._shownDate.getMonth();
			this._shownDay	 	= this._shownDate.getDate();
			this._shownYear 	= this._shownDate.getFullYear();
		},
					
		/*
			paging
		*/
		
		nextWeek : function(dir)
		{						
			this._shownDate.setDate( this._shownDate.getDate() + (dir * 7) );							
		},
		
		nextMonth : function(dir)
		{				
			this._shownDate = new Date( this._shownYear, this._shownMonth + dir, 1 );
		},
		
		nextAgenda : function(dir)
		{
			this._shownDate.setDate( this._shownDate.getDate() + (dir * 14) );
		},
		
		next : function( dir )
		{
			switch( this._currentView )
			{
				case "week":						
					this.nextWeek( dir );												
					break;
				case "month":						
					this.nextMonth( dir );						
					break;
				case "agenda":						
					
					this.nextAgenda( dir );
					
					break;						
			}
			
			this.extractShownDate();
			
			this.setRange();
		},
		
		reset: function()
		{
			this._shownDate = this._currentDate.clone();
			
			this.extractShownDate();
			
			this.selectView();
		},
		
		
		gotoDate : function( dateText )
		{
			var parts = dateText.split("-");
						
			var d = getInt( parts[0] );
			var m = getInt( parts[1] ) - 1;
			var y = getInt( parts[2] );
			
			var dt = new Date( y , m, d );
			
			this._shownDate = dt.clone();
			
			this.extractShownDate();
			
			this.selectView();
		},
		
		
		/*
			init buttons
		*/
		
		
		
		initNavigation : function()
		{
			var that = this;
			
			
			$("#tostring").click(
				function(e)
				{
					var html = document.getElementById('wrapper').innerHTML;
					
					alert( html );
					
					e.preventDefault();
				}
			);
			
			
			$("#today").click(
				function(e)
				{
					that.reset();
					e.preventDefault();
				}
			);
			
			$("#previous").click(
				function(e)
				{
					that.next(-1);
					e.preventDefault();
				}
			);
			
			$("#next").click(
				function(e)
				{
					that.next(1);
					e.preventDefault();
				}
			);
			
			function doExport(type)
			{
				var f = "yyyy-mm-dd";
				var s = that._range.start.format(f);
				var e = that._range.end.format(f);
				
				if ( productie )
				{
					var page = "/page/" + type + "/"  + that._ensemble + "/project/" + projectCode;
					
				} else {
					
					var page = "/page/" + type + "/" + that._ensemble + "/" + s + "/" + e;
				
				}				
				openWindow( page, 'print', 800, 700 );
			}
			
			$("#print").click(
				function(e)
				{
					
					doExport('print');
					
					return false;
				}
			);
			$("#pdf").click(
				function(e)
				{
					
					doExport('pdf');
					
					return false;
				}
			);
			
			
			
			$("#daterange").click(
				function(e)
				{
				}
			);
			
			
						
			$(".ensemble-select").change(
				
				function()
				{
					that._ensemble = $(".ensemble-select").val();
					
					that.selectView();
				}
			);
						
			$("#calendar-navigation li").click(
			
				function(e)
				{
					$( "#calendar-navigation li." + active ).removeClass( active );
					
					$(this).addClass( active );
					
					that.selectView();
					
					e.preventDefault();
				}					
			);
			
			if ( $("#calendar-navigation .tabs li").size() == 1 )
			{
				$("#calendar-navigation .tabs").hide();
			}
			
			
			if ( $(".ensemble-select option").size() == 1 )
			{
				$(".ensemble-select").hide();
			}
			
			$("#dateselector").datepicker(
				{
					showOn: "both",
					buttonImage: "/static/images/picker.gif" ,
					duration: "",
					
					onSelect : function( dateText, inst )
					{
						mcoAgenda.gotoDate( dateText );
					}
				}
			);
			
			
		},
		
		
		loadAppointments : function()
		{
			$("#loader").fadeIn();
			
			var key = this.getCacheKey();
			
			if ( CACHE[key] )
			{
				// alert( 'cache!' );
				
				mcoAgenda._appointments = CACHE[key];
				mcoAgenda.updateView();		
			
			} else {
				
				
				
				var f = "yyyy-mm-dd";
				var s = this._range.start.format(f);
				var e = this._range.end.format(f);
			
				if ( productie )
				{
					var domain = "http://intranet.mco.nl/page/opascalendar/" + this._ensemble + "/project/" + projectCode + "/" + s + "/" + e;
				} else {
					var domain = "http://intranet.mco.nl/page/opascalendar/" + this._ensemble + "/" + s + "/" + e;
				}
				
				if ( isLocal() )
				{
					var dataUrl = proxy + domain;
					
				} else {
					
					if ( productie )
					{
						if ( this._currentView == "agenda" )
						{
							dataUrl = "/page/opascalendar/" + this._ensemble + "/project/" + projectCode;// + "/" + s;
						} else {
							dataUrl = "/page/opascalendar/" + this._ensemble + "/project/" + projectCode + "/" + s + "/" + e;
						}
					} else {
						dataUrl = "/page/opascalendar/" + this._ensemble + "/" + s + "/" + e;
					}
					//alert( domain );
				}
			
				
				var that = this;
				
				$.ajax( 		
					{
						type: "GET",
						url: dataUrl,
						dataType: "xml",
						success: that.getEvents
					}
				);
			
			}
		},
		
		getWorks : function( node )
		{
			var xmlWorks = node.find("work");
			var works = new Array();
			
			xmlWorks.each(
			
				function()
				{
					var title1 = $(this).find("title").text();
					var title2 = $(this).find("title2").text();
					var title3 = $(this).find("title3").text();
					
					var title = title1 + " " + title2 + " " + title3;
					
					var duration = $(this).find("duration").text();
					var composer = $(this).find("composer").text();
					
					var obj = { title:title, duration:duration, composer:composer };
					
					works.push( obj );
				}
			);
			
			return works;				
		},
		
		getSoloists : function( node )
		{
			var soloists = node.find("soloists");
			xmlSoloists = soloists.find("soloist");
			
			var solo = new Array();
			
			xmlSoloists.each(
			
				function()
				{
					var name = $(this).find("name").text();
					var instrument = $(this).find("instrument").text();
					var notes = $(this).find("notes").text();
			
					var obj = { name:name, instrument:instrument, notes:notes };
					
					solo.push( obj );
				}
			);
			
			return solo;				
		},
		
		getPersons : function( node )
		{
			var persons = node.find("persons");
			xmlPersons = persons.find("soloist");
			
			var people = new Array();
			
			xmlPersons.each(
			
				function()
				{
					var name = $(this).find("name").text();
					var addressgroup = $(this).find("addressgroup").text();
					var func = $(this).find("function").text();
					var notes = $(this).find("notes").text();
			
					var obj = { name:name, addressgroup:addressgroup, func:func, notes:notes };
					
					people.push( obj );
				}
			);
			
			return people;				
		},
		
		cleanUp: function(str)
		{
			var s = str.split("+").join(" + ");
			var s = s.split("/").join(" / ");
			return s;
		},
		
		getEventData : function( node )
		{
			var id 			= getInt( node.find("id_event").text() );
			var highlight	= getInt( node.find("highlight").text() );
			
			var allDayEvent	= getInt( node.find("allday_event").text() );
			var withEndEvent = getInt( node.find("withend_event").text() );
			
			var startTime 	= getInt( node.find("start_event_unix").text() ) * 1000;
			var endTime 	= getInt( node.find("end_event_unix").text() ) * 1000;
			
			var startData	= splitDate( node.find("start_event").text() );			
			var endData 	= splitDate( node.find("end_event").text() );
			
			var text 		= this.cleanUp( node.find("text_event").text() );
			var notes 		= node.find("notes_event").text();
			var title 		= node.find("programtitle_event").text();
			
			var conductor	= node.find("conductor").text();
			var venue 		= node.find("name_venue").text();
			var project		= node.find("project_project").text();
			var code		= node.find("code_project").text();
			var ensemble	= node.find("name_orchestra").text();
			
			var works		= this.getWorks(node);
			var soloists	= this.getSoloists(node);
			var persons		= this.getPersons(node);
			
			var data = 
			{
				id: id,
				highlight : highlight,
				startTime : startTime,
				endTime : endTime,
				
				allDayEvent: allDayEvent,
				withEndEvent : withEndEvent,
				
				startDay : startData.day,
				startMonth : startData.month,
				startYear : startData.year,
				startHour : startData.hour,
				startMinutes : startData.minutes,
				
				endDay : endData.day,
				endMonth : endData.month,
				endYear : endData.year,
				endHour : endData.hour,
				endMinutes : endData.minutes,				
				
				text: text,
				notes : notes,
				title : title,
				
				conductor : conductor,
				venue : venue,
				project : project,
				code : code,
				ensemble : ensemble,
				
				works : works,
				soloists : soloists,
				persons : persons
				
			}
			
			return data;
		},
		
		getEventDetail : function( xmlData )
		{				
			var event = $(xmlData).find("event:eq(0)");
			
			var data = mcoAgenda.getEventData( event );
							
			mcoAgenda._detailData = data;
		
			mcoAgenda.showDetail();				
		},
		
		getEvents : function( xmlData )
		{				
			var arr = new Array();
				
			var events = $(xmlData).find("event");
			
			events.each(
				
				function()
				{
					var data = mcoAgenda.getEventData( $(this) );
					
					arr.push( data );
				}
			
			);
			
			
			mcoAgenda.saveToCache( arr );
			
			mcoAgenda._appointments = arr;
			mcoAgenda.updateView();				
		}
	}
	
	
	
	
})();
