var calendar_event_types = Array("calendarevent","calendareventallday","topicstart","topicevent","birthday");
var calendar_eventlist_close_event, calendar_eventlist_show_event, calendar_eventlist_show_ob;

/* Create an iframe with the minicalendar in it */
function minicalendarCreate()
{
	if(!show_mini_calendar)
		return;

	if(arguments.callee.initialRun)
		return;

	/* don't show the calendar on result pages; by the time it's loaded, the page refreshes */
	var metaRefresh = new DOMQuery('meta[http-equiv="refresh"]');
	if(metaRefresh.length > 0)
		return false;

	var iframe = createDOMNode('iframe', {"id" : 'top-calendar', "frameBorder" : 0, scrolling: 'no', "hideFocus" : true, "src" : board_script_url + '/list_calendar/mini/0/0/5', "allowTransparency" : true }, []);

	document.body.appendChild(iframe);
	arguments.callee.initialRun = true;
};

function WksInYr(Y)
{
    return 52 + ((new Date(Y, 0, 1)).getDay() == 4 ||
        (new Date(Y, 11, 31)).getDay() == 4);
};

/* Setup the minicalendar */
function minicalendarSetup()
{
	/* Make sure we are not in the full calendar */
	if (document.location.pathname.indexOf('list_calendar/mini') == -1)
		return false;

	if(arguments.callee.initialRun)
		return;

	var calendar_table = new DOMQuery('table#calendar').get(0);
	if(!calendar_table)
		return;

	/* Jump to today, or the first day on the calendar */
	var cell_today = new DOMQuery('td.today', calendar_table), items, tbodyCells;
	if (cell_today.length > 0)
	{
		minicalendarShowEventlist(cell_today.get(0));
	}
	else
	{
		tbodyCells = new DOMQuery('tbody td', calendar_table);
		minicalendarShowEventlist(tbodyCells.get(0));
	}

	/* add (double)click event to all minicalendar TDs */
	/* recycle previous lookup */
	if(typeof tbodyCells != 'undefined')
		items = tbodyCells;
	else
		items = new DOMQuery('tbody td', calendar_table);

	for (var i = 0, item; (item=items.get(i)); i++)
	{
		addEvent(item, 'focus', function(e){ this.blur(); } );
		addEvent(item, 'click', function(e){ minicalendarShowEventlist(this); e.preventDefault(); } );
		addEvent(item, 'dblclick', function(e){ parent.location.href = this.firstChild.href ? this.firstChild.href : this.childNodes[1].href; e.preventDefault(); } );
	}

	/* When mousing over the eventlist; enlarge it */
	if(parent != self)
	{
		var calendar_eventlist = document.getElementById('mini-calendar-eventlist');
		addEvent(calendar_eventlist, 'mouseover', function() { calendarEventlistEnlarge('over'); });
		addEvent(calendar_eventlist, 'mouseout', function() { calendarEventlistEnlarge('out'); });
	}

	/* Add links to next and previous month */
	var targetcell = calendar_table.tHead.rows[0].cells[0];
	targetcell.removeChild(targetcell.firstChild);

	var currentWeekLink = new DOMQuery('table#calendar tbody tr:first-child th a').get(0);

	if(currentWeekLink)
	{
		var matches = currentWeekLink.href.match(/(.*)week\/([0-9]+)\/([0-9]+)/, 'mini/$1/$2/5');

		var currentWeekNumber = parseInt(matches[3]);
		var currentWeekNumberYear = parseInt(matches[2]);

		previousSequenceStartWeek = currentWeekNumber - 5;
		previousSequenceYear = currentWeekNumberYear;

		if(previousSequenceStartWeek < 0)
		{
			previousSequenceYear -= 1;
			previousSequenceStartWeek += WksInYr(previousSequenceYear);
		}

		targetcell.appendChild( createDOMNode('a', {"href" : matches[1] + 'mini/' + previousSequenceYear + '/' + previousSequenceStartWeek + '/5' }, ['<']) );

		nextSequenceStartWeek = currentWeekNumber + 5;
		nextSequenceYear = currentWeekNumberYear;

		if(nextSequenceStartWeek > WksInYr(nextSequenceYear))
		{
			nextSequenceStartWeek -= WksInYr(nextSequenceYear);
			nextSequenceYear += 1;
		}

		targetcell.appendChild( createDOMNode('a', {"href" : matches[1] + 'mini/' + nextSequenceYear + '/' + nextSequenceStartWeek + '/5' }, ['>']) );
	}

	/* Reroute weeknumber-column clicks to the parent frame */
	var weeknumber_columns = new DOMQuery('tbody th', calendar_table);
	for (i = 0; (item=weeknumber_columns.get(i)); i++)
	{
		addEvent(item, 'click', function(e) { parent.location.href = this.firstChild.href; e.preventDefault(); } );
	}

	miniCalendarResizeToFullHeight();

	arguments.callee.initialRun = true;
};

function miniCalendarResizeToFullHeight()
{
	var iframe = parent.document.getElementById('top-calendar');

	if(!iframe)
		return;

	var iframeHeight = window.getComputedStyle ? window.getComputedStyle(iframe,'').getPropertyValue('height') : iframe.currentStyle.getAttribute('height');

	if(!arguments.callee.initialRun && (iframeHeight == 'auto' || iframeHeight == '100%'))
	{
		iframe.resizeToFullHeight = true;
	}

	if (iframe.resizeToFullHeight)
	{
		if(!isNaN(parseInt(iframeHeight)))
			var newHeight = Math.max(document.body.scrollHeight, parseInt(iframeHeight));
		else
			var newHeight = document.body.scrollHeight;

		iframe.style.height = newHeight + 'px';
	}

	arguments.callee.initialRun = true;
};

/* When a calender-day-td is clicked; this function will show the events for that day */
function minicalendarShowEventlist(ob)
{
	var calendar_eventlist = document.getElementById('mini-calendar-eventlist');
	var calendar_table = document.getElementById('calendar');
	var child, header, events, list, insertlink, j, item, eventList = [];

	if (!calendar_eventlist)
		return false;

	/* Kill children */
	while (child = calendar_eventlist.firstChild)
		calendar_eventlist.removeChild(child);

	var items = new DOMQuery('td.selected', getSiblingNode(ob, 'up', 'tbody'));
	for(i=0;(item=items.get(i)); i++)
	{
		jscss('remove', item, 'selected', '');
	}

	jscss('add', ob, 'selected', '');

	if(typeof miniCalendarEventlistLength == 'undefined')
	{
		miniCalendarEventlistLength = 1;
	}

	for (var numberOfDaysShown = 0; numberOfDaysShown < miniCalendarEventlistLength; numberOfDaysShown++)
	{
		/* Display addevent link */

		insertlink = createDOMNode('span', {},
		[
			createDOMNode('a', {"href" : board_script_url + '/insert_calendarevent/' + ob.id.replace(/day-(\d+)-(\d+)-(\d+)$/, '$3-$2-$1'), "event" : ['click', function(){ parent.location.href = this.href; return false;}]}, ['+'])
		]);

		calendar_eventlist.appendChild(insertlink);

		/* Display current date */
		header = createDOMNode('h2', {}, [
			createDOMNode('a', {"href" : board_script_url + '/list_calendar/day/' + ob.id.replace(/day-(\d+)-(\d+)-(\d+)$/, '$2/$3/$1'), "event" : ['click', function(){ parent.location.href = this.href; return false;}]}, [ob.firstChild.title])
		]);
		calendar_eventlist.appendChild(header);

		/* Display events by type */
		for (var i = 0; (item = calendar_event_types[i]); i++)
		{
			event_type = item;
			eventList = [];

			events = new DOMQuery('ol.event-type-' + event_type + ' > li', ob);

			if (events.length > 0)
			{
				header = createDOMNode('h3', {}, [getText('calendar', event_type)]);
				calendar_eventlist.appendChild(header);

				for (j = 0; j<events.length; j++)
				{
					item = events.get(j).cloneNode(true);
					addEvent(item, 'click', function(e) { var link = new DOMQuery('a.primary', this); if(link.length > 0) { parent.location.href = link.get(0).href; e.preventDefault(); } } );

					eventList[eventList.length] = item;
				}

				list = createDOMNode('ul', {"id" : 'mini-events-' + event_type}, eventList);

				calendar_eventlist.appendChild(list);
			}
		}

		// search next working day
		do
		{
			if(ob.nextSibling)
				ob = ob.nextSibling;
			else if (ob.parentNode.nextSibling)
				ob = ob.parentNode.nextSibling.childNodes[1];
			else
				break;
		}
		while(ob.cellIndex > 5);
	}

	miniCalendarResizeToFullHeight();

	return false;
};


function calendarEventlistEnlarge(type)
{
	if (isIE)
		return false;

	var calendar_eventlist = document.getElementById('mini-calendar-eventlist');
	var calendar_iframe = parent.document.getElementById('top-calendar');
	var events = new DOMQuery('li', calendar_eventlist);

	if (type == 'over')
	{
		if (typeof calendar_close_event != 'undefined')
			clearTimeout(calendar_close_event);

		jscss('add', calendar_eventlist, 'hover', '');

		for(var	i=0, item; (item=events.get(i)); i++)
		{
			jscss('add', item, 'hover', '');
		}

		var has_scrollbar = (calendar_eventlist.scrollHeight > calendar_eventlist.clientHeight);

		if(has_scrollbar)
		{
			jscss('add', calendar_iframe, 'hover', '');
			jscss('add', calendar_eventlist, 'expand', '');
		}
	}
	else if (type == 'out')
	{
		calendar_close_event = setTimeout(
			function ()
			{
				jscss('remove',calendar_iframe,'hover','');
				jscss('remove',calendar_eventlist,'hover','');
				jscss('remove',calendar_eventlist,'expand','');
				for(var	i=0, item; (item=events.get(i)); i++)
				{
					jscss('remove', item, 'hover', '');
				}
			}
			, 100);
	}
};
