var caloptions = $H({category:'',jtmonth:'',jtyear:'',activeID:''});
//var calendardata;

// observers
document.observe("dom:loaded", function() {
	nmcalendar.initCalAjaxLinks();
	nmcalendar.navObservers();

	// for when calendar is not loaded via webkit.modinit()
	
	if ($('calendardata') && $('calendardata').innerHTML) {
		nmcalendar.calendardata = $('calendardata').innerHTML.evalJSON();
		if (nmcalendar.calendardata.calendardata.category) {
			caloptions.set('category', nmcalendar.calendardata.calendardata.category)
		}
	}
	if ($('ajax_calendar')) {
		// setup background images for cal_image markers
		nmcalendar.setupCalendar();
	}
	
	if (typeof calCustomInit == "function") {
		calCustomInit();
	}
});

function nmcalendar() {
	
	this.makeTransparent = function(ID, state) {
		$H(nmcalendar.calendardata.mdevents[ID].eventIDs).each(function(o) {
			if (typeof o.value !== 'function' && o.value.match(/^ID/,'')) {
				var thisID = o.value.replace(/^ID/,'');
				if (state == "on" && !$('event_' + thisID).parentNode.hasClassName('noimage')) {
					$('event_' + thisID).addClassName('iconover');
				}
				else if (state == "off") {
					$('event_' + thisID).removeClassName('iconover');
				}
			}
		});
	}
	
	this.selectMdEvent = function(ID) {
		$$('#ajax_calendar .calmarker').each(function(o) {
			o.removeClassName('selectedicon');
			o.removeClassName('iconover');
		});
		$H(nmcalendar.calendardata.mdevents[ID].eventIDs).each(function(o) {
			if (typeof o.value !== 'function' && o.value.match(/^ID/,'')) {			
				var thisID = o.value.replace(/^ID/,'');
				$('event_' + thisID).addClassName('selectedicon');					
			}
		});
	}

	this.setupCalendar = function() {
		if (!$('calendar_block')) {
			// user is not using graphical calendar
			return;
		}
		
		// reinit json data for each calendar load
		nmcalendar.calendardata = $('calendardata').innerHTML.evalJSON();
		if (nmcalendar.calendardata.calendardata.category) {
			caloptions.set('category', nmcalendar.calendardata.calendardata.category)
		}			
		
		// assign CSS to currently selected event
		if ($('ajax_calendar').select('.selecteddate .calmarker').length) {		
			// seleteddate exists for this month (i.e. there is at least one event this month)
			// mark it as selected
			var selecteddate = $('ajax_calendar').select('.selecteddate .calmarker');
			var selectedID = selecteddate[0].id.replace(/^event_/,'');
			nmcalendar.selectMdEvent(selectedID);	
		}		
			
		
		if (!caloptions.get('category')) {
			// set default category
			caloptions.set('category','showall');			
		}
		
		if (!caloptions.get('cellwidth')) {
			var cellWidths = $('ajax_calendar').select('.calmarker');
			if (cellWidths.length > 0) {
				caloptions.set('cellwidth', cellWidths[0].getWidth());							
			}
		}		

		var maxIconHeight = 0;
		nmcalendar.calendardata.totalweeks = 0;		
		$$('#ajax_calendar .calmarker').each(function(o) {
			var thisID = o.id.replace(/^event_/,'');
			var thisWidth = caloptions.get('cellwidth');
			if (nmcalendar.calendardata.mdevents[thisID].thisday == 2) {
				thisWidth--;
			}
			if (nmcalendar.calendardata.mdevents[thisID].thisday == "1") {
				var thisBackgroundPosition = "0px 0px";
			}
			else {
				var thisBackgroundPosition = "-" + ((parseInt(nmcalendar.calendardata.mdevents[thisID].thisday) - 1) * thisWidth) + "px 0px";
			}
			if (nmcalendar.calendardata.mdevents[thisID].thisimage) {
				o.setStyle({
					backgroundImage:'url(/nm_webkit/eventscalendar_pics/' + nmcalendar.calendardata.mdevents[thisID].thisimage + ')',
					backgroundRepeat:'no-repeat',
					backgroundPosition:thisBackgroundPosition,
					width:thisWidth + 'px',
					height:nmcalendar.calendardata.mdevents[thisID].thisimagedimensions[1] + 'px'
					});		
			}
			else {
				o.parentNode.addClassName('noimage');
			}
			// scrunch calendar markers together to cover borders	
			
			// mark last day so that we can CSS style noimage final day
			if (nmcalendar.calendardata.mdevents[thisID].thisday == nmcalendar.calendardata.mdevents[thisID].totaldays) {
				o.addClassName('calendar_noimagemdlast');
			}
			
			// track the total number of weeks of each event so that we can reset calendar_mdx -> 1 on Sundays
			if (nmcalendar.calendardata.mdevents[thisID].thisday == 1) {
				// reset totalweeks
				nmcalendar.calendardata.totalweeks = 0;
			}
		
			if (nmcalendar.calendardata.mdevents[thisID].thisday >= 7 && o.hasClassName('sunday')) {
				nmcalendar.calendardata.totalweeks++;				
				o.addClassName('overlapweek')
			}			
		
			if (nmcalendar.calendardata.totalweeks > 0) {
				nmcalendar.calendardata.mdevents[thisID].thisday = nmcalendar.calendardata.mdevents[thisID].thisday - (6 * nmcalendar.calendardata.totalweeks);					
			}
			
			o.addClassName('calendar_md' + nmcalendar.calendardata.mdevents[thisID].thisday);
			o.addClassName('calendar_noimagemd' + nmcalendar.calendardata.mdevents[thisID].thisday);			
			
			// set link heights to be identical to wrapping div tag heights		
			$$('#ajax_calendar #' + o.id + ' a').each(function(a) {
				a.setStyle({height:nmcalendar.calendardata.mdevents[thisID].thisimagedimensions[1] + 'px'});
				// calculate tallest icon
				if (a.getHeight() > maxIconHeight) { maxIconHeight = a.getHeight(); }				
			});

			// setup colored screen underneath event to conceal borders
			if (nmcalendar.calendardata.mdevents[thisID].thisday == 2 && nmcalendar.calendardata.mdevents[thisID].totaldays > 2) {
				thisScreenWidth = thisWidth + 5;
			}
			else {
				thisScreenWidth = thisWidth;
			}
			$('eventscreen_' + thisID).setStyle({
				width:thisScreenWidth + 'px',
				height:nmcalendar.calendardata.mdevents[thisID].thisimagedimensions[1] + 'px'
			});
			$('eventscreen_' + thisID).addClassName('calendar_md' + nmcalendar.calendardata.mdevents[thisID].thisday);

			// setup mouseover observers
			o.observe('mouseover', function(e) {
				if (o.hasClassName('selectedicon')) { return; }
				webkit.cursorLink();
				nmcalendar.makeTransparent(thisID,'on');
			});
			o.observe('mouseout', function() {
				if (o.hasClassName('selectedicon')) { return; }				
				webkit.cursorClear();
				nmcalendar.makeTransparent(thisID,'off');
			});
		});

		// find tallest calcell
		var maxHeight = 0;
		$$('#ajax_calendar .calcell').each(function(o) {
			if (o.getHeight() > maxHeight) { maxHeight = o.getHeight(); }
		});
		$$('#ajax_calendar .calcell').each(function(o) {
			if (!o.hasClassName('day_header')) {
				// set calcell
				o.setStyle({height:maxHeight + 'px'});			
			}
		});	

		// set up spacer blocks
		$$('#ajax_calendar .calmarkerspacer').each(function(o) {
			o.setStyle({width:'1px',height:maxIconHeight + 'px'});
		});

		if (!caloptions.get('jtmonth') && typeof nmcalendar.calendardata.calendardata.startmonth !== "undefined") {
			// set jtmonth, jtyear based on JSON startmonth
			caloptions.set('jtmonth',nmcalendar.calendardata.calendardata.startmonth.replace(/^[0-9]{4}/,''));
			caloptions.set('jtyear',nmcalendar.calendardata.calendardata.startmonth.replace(/[0-9]{2}$/,''));			
		}

		// noicon observers
		$$('#calendar_block .eventnoicon a').each(function(o) {
			o.stopObserving('mouseover');
			o.stopObserving('mouseout');				
			o.observe('mouseover', function() {
				o.parentNode.addClassName('eventnoicon_over');
			});
			o.observe('mouseout', function() {
				o.parentNode.removeClassName('eventnoicon_over');	
			});			
		});

		// update cache
		webkit.cacheset('calendar', caloptions.get('jtyear') + caloptions.get('jtmonth') + '-' + caloptions.get('category'), $('ajax_calendar'));
	}

	this.calendar = function (eventID) {
		/* used in graphical display */
		if (eventID == caloptions.get('activeID')) { return; }  // event already selected

		if ($('caleventinfo_block')) {
			// set visibility of caleventinfo_block to hidden
			$('caleventinfo_block').setStyle({visibility:'hidden'});	
		}

		if (!caloptions.get('disableResizeEffect') && $('eventinfo_block')) {
			var origHeight = parseInt($('eventinfo_block').getHeight()) - 18;	

			// lock div wrapper to original height
			$('eventinfo_block').setStyle({height:origHeight + 'px'});
		}

		// use cache if it is available
		if (webkit.cacheget('calendar', eventID)) {
			webkit.cacheoutput('calendar', eventID, $('caleventinfo_block'))

			if (!caloptions.get('disableResizeEffect')) {
				var targetHeight = $('caleventinfo_block').getHeight() + 5;	
				$('caleventinfo_block').setStyle({height:targetHeight + 'px',visibility:'',display:'none'});					
				new Effect.Morph('eventinfo_block', { duration:0.5, transition: Effect.Transitions.sinoidal, style:'height:' + targetHeight + 'px', afterFinish:function() {
					new Effect.Appear('caleventinfo_block', { duration:0.3, afterFinish:function() {
						$('caleventinfo_block').setStyle({height:''});

						if (caloptions.get('scrollToEvent')) {
							new Effect.ScrollTo('calendar_showevent', { duration:0.5 });
						}
					}});
				}});
			}
			else {
				if ($('caleventinfo_block')) {
					$('caleventinfo_block').setStyle({visibility:''});
				}
			}

			nmcalendar.selectMdEvent(eventID);

			// unselect existing selected events
			$$('#calendar_block .selecteddate').each(function(o) {
				if (o.hasClassName('selecteddate')) {
					o.removeClassName('selecteddate');	
				}
			});
			// select this event
			if ($('event_' + eventID)) {
				$('event_' + eventID).parentNode.parentNode.addClassName('selecteddate');				
			}		
		}
		else {
			// make AJAX call

			var ajaxParameters = 'eventID=' + eventID;	
			new Ajax.Updater('caleventinfo_block', '/nm_webkit/templates/eventscalendar_template.php', {
				method: 'post',
				parameters: ajaxParameters,
				onComplete: function(transport) {
					// set cache
					webkit.cacheset('calendar', eventID, $('caleventinfo_block'));

					if (!caloptions.get('disableResizeEffect')) {
						var targetHeight = $('caleventinfo_block').getHeight() + 5;	
						$('caleventinfo_block').setStyle({height:targetHeight + 'px',visibility:'',display:'none'});
						new Effect.Morph('eventinfo_block', { duration:0.5, transition: Effect.Transitions.sinoidal, style:'height:' + targetHeight + 'px', afterFinish:function() {
							new Effect.Appear('caleventinfo_block', { duration:0.3, afterFinish:function() {
								$('caleventinfo_block').setStyle({height:''});
								
								if (caloptions.get('scrollToEvent')) {
									new Effect.ScrollTo('calendar_showevent', { duration:0.5 });
								}								
							}});
						}});
					}
					else {
						if ($('caleventinfo_block')) {
							$('caleventinfo_block').setStyle({visibility:''});
						}
					}
					
					nmcalendar.selectMdEvent(eventID);

					// unselect existing selected events
					$$('#calendar_block .selecteddate').each(function(o) {
						if (o.hasClassName('selecteddate')) {
							o.removeClassName('selecteddate');	
						}
					});
					// select this event
					$('event_' + eventID).parentNode.parentNode.addClassName('selecteddate');
								
					// re-establish nav observers
					nmcalendar.navObservers();
				}
			});
		}
		caloptions.set('activeID',eventID);
	}

	this.jumpto = function(category,month,year) {
		if (category) {
			caloptions.set('category',category);			
		}
		// pulldown menu
		var jumpto = document.jumpto_date.jump_to.options[document.jumpto_date.jump_to.selectedIndex].value;
		if (jumpto) {
			// using select form element
			var jtarray = jumpto.split('||');
			caloptions.set('jtmonth',jtarray[0]);
			caloptions.set('jtyear',jtarray[1]);		
		}
		else if (month && year) {
			// using nav links
			caloptions.set('jtmonth',month);
			caloptions.set('jtyear',year);
		}

		/*
		// strip all observers
		$$('#ajax_calendar a').each(function(o) {
			o.stopObserving('mouseover');
			o.stopObserving('mouseout');				
			o.stopObserving('click');
		});
		*/
		if (webkit.cacheget('calendar', caloptions.get('jtyear') + caloptions.get('jtmonth') + '-' + caloptions.get('category'))) {
			// use cache
			webkit.cacheoutput('calendar', caloptions.get('jtyear') + caloptions.get('jtmonth') + '-' + caloptions.get('category'), $('ajax_calendar'));
			// reload JSON data
			nmcalendar.reloadJSON();

			// reinit calendar
			nmcalendar.initCalendar();

			// recreate calmarker observers
			$$('#ajax_calendar .calmarker').each(function(o) {
				var thisID = o.id.replace(/^event_/,'');
				o.observe('mouseover', function() {
					if (o.hasClassName('selectedicon')) { return; }
					nmcalendar.makeTransparent(thisID,'on');
				});
				o.observe('mouseout', function() {
					if (o.hasClassName('selectedicon')) { return; }					
					nmcalendar.makeTransparent(thisID,'off');
				});
				o.observe('click', function(e) {
					e.stop();
					if (o.hasClassName('selectedicon')) { return; }
					var calendarID = o.id.replace(/^event_/,'');
					nmcalendar.calendar(calendarID);
				});
			});

			if (typeof calCustomObservers == "function") {
				calCustomObservers();
			}

			if (caloptions.get('scrollToEvent')) {
			//	new Effect.ScrollTo('ajax_calendar', { duration:0.5 });
			}
		}
		else {
			// make AJAX request

			//	$('calendar_block').update(waitHTML);
			$('calendar_block').addClassName('contentloading');
			//$('eventinfo_block').update(waitHTML);
			$('eventinfo_block').addClassName('contentloading');

			var ajaxParameters = 'reload=1&category=' + caloptions.get('category') + '&jtmonth=' + caloptions.get('jtmonth') + '&jtyear=' + caloptions.get('jtyear') + '&urlbase=' + nmcalendar.calendardata.calendardata.urlbase;

			new Ajax.Updater('ajax_calendar', '/nm_webkit/templates/eventscalendar_template.php', {
				method: 'post',
				parameters: ajaxParameters,
				onComplete: function(transport) {
					// reset opacity
					$('calendar_block').removeClassName('contentloading');

					// reload JSON data
					nmcalendar.reloadJSON();

					// reinit calendar
					nmcalendar.initCalendar();

					if (typeof calCustomObservers == "function") {
						calCustomObservers();
					}

					if (caloptions.get('scrollToEvent')) {
					//	new Effect.ScrollTo('ajax_calendar', { duration:0.5 });
					}
					
					if (caloptions.get('jtmonth') == nmcalendar.calendardata.calendardata.oldestmonth && caloptions.get('jtyear') == nmcalendar.calendardata.calendardata.oldestyear) {
						$$('#ajax_calendar #calendar_options .lastmonth').each(function(o) {
							o.addClassName('grayedout');
						});
					}
				}
			});	
		}
	}

	this.initCalendar = function() {
	//	webkit.initAjaxLinks();
		nmcalendar.initCalAjaxLinks();
		nmcalendar.navObservers();
		nmcalendar.setupCalendar();
		if (typeof calCustomInit == "function") {
			calCustomInit();
		}
	}

 	this.reloadJSON = function() {
		if ($('jsondatareload')) {
			$('calendardata').innerHTML = $('jsondatareload').innerHTML;
			$('jsondatareload').remove();
			nmcalendar.calendardata = $('calendardata').innerHTML.evalJSON();	
		}		
	}

	this.calendar_showevent = function(eventID,act) {
		// used in text only display 
		if (act == "show") {
			if (!$('upcomingevent_' + eventID + 'expand').innerHTML) {
				// full details for this event haven't been loaded yet, trigger AJAX request to populate div tag
				var ajaxParameters = 'act=' + act + '&eventID=' + eventID;
				new Ajax.Request('/nm_webkit/templates/eventscalendar_template.php', {
					method: 'post',
					parameters: ajaxParameters,
					onComplete: function(transport) {
						$('upcomingevent_' + eventID + 'expand').update(transport.responseText);
						$('upcomingevent_' + eventID + 'expand').setStyle({display:'none'});						
						$('upcomingevent_' + eventID + 'expand').removeClassName('displaynone');
						$('upcomingevent_' + eventID + 'link').removeClassName('reveal');
						$('upcomingevent_' + eventID + 'link').addClassName('conceal');			
						new Effect.Appear('upcomingevent_' + eventID + 'expand', {duration:0.75});
					}
				});
			}
			else {
				// event details have already been loaded, just display them
				$('upcomingevent_' + eventID + 'expand').setStyle({display:'none'});				
				$('upcomingevent_' + eventID + 'expand').removeClassName('displaynone');				
				$('upcomingevent_' + eventID + 'link').removeClassName('reveal');
				$('upcomingevent_' + eventID + 'link').addClassName('conceal');			
				new Effect.Appear('upcomingevent_' + eventID + 'expand', {duration:0.75});
			}

		}
		else if (act == "hide") {
			new Effect.Fade('upcomingevent_' + eventID + 'expand', {duration:0.5, afterFinish:function() {
				$('upcomingevent_' + eventID + 'expand').addClassName('displaynone');
			}});		
			$('upcomingevent_' + eventID + 'link').removeClassName('conceal');
			$('upcomingevent_' + eventID + 'link').addClassName('reveal');			
		}
	}

	this.gen_calajax = function() {
		// legacy function
		nmcalendar.initCalAjaxLinks();
	}

	this.initCalAjaxLinks = function() {
		$$('#ajax_calendar .calevent a').each(function(o) {		
			//	consoler('searching ' + o.href);		
			o.stopObserving('click');
			//	consoler('creating ajax link for ' + o.href);				
			o.observe('click', function(e) {
				e.stop();
				if ($($(o.id).parentNode).hasClassName('selectedicon') || $($(o.id).parentNode).hasClassName('eventnoicon_active')) { return; }				
				if ($('calendar_block')) {
					// graphical calendar
					if ($($(o.id).parentNode).id.match(/^upcomingevent_/)) {
						var calendarID = $($(o.id).parentNode).id.replace(/^upcomingevent_/,'');																	
					}
					else {
						var calendarID = $($(o.id).parentNode).id.replace(/^event_/,'');											
					}
									
					$$('#calendar_block .eventnoicon a').each(function(c) {
						$($(c.id).parentNode).removeClassName('eventnoicon_active');
					});
					$($(o.id).parentNode).addClassName('eventnoicon_active');
										
					nmcalendar.calendar(calendarID);										
				}
				else {
					var calendarID = $($(o.id).parentNode).id.replace(/^upcomingevent_/,'');					
					// text listing
					if ($('upcomingevent_' + calendarID + 'link').hasClassName('conceal')) {
						nmcalendar.calendar_showevent(calendarID,'hide');
					}
					else {
						nmcalendar.calendar_showevent(calendarID,'show');
					}
				}
			});	
		});
		
		if ($('upcomingeventswrapper')) {
			nmcalendar.calendardata = $('calendardata').innerHTML.evalJSON();			
			if (nmcalendar.calendardata.startevent) {
				new Effect.ScrollTo('upcomingevent_' + nmcalendar.calendardata.startevent, { duration:0.5});
			}
		}
	}

	this.show_otherevents = function(events) {
		nmcalendar.calendardata = $('calendardata').innerHTML.evalJSON();
		$('ajax_calendar').addClassName('contentloading');
	
		if (events == 'hide') {
			var ajaxParameters = "reload=1&show_currentevents=1&category=" + caloptions.get('category') + "&jtmonth=" + caloptions.get('jtmonth') + "&jtyear=" + caloptions.get('jtyear');
		}
		else if (events == "show") {
			var ajaxParameters = "reload=1&list_pastevents=1&category=" + caloptions.get('category') + "&jtmonth=" + caloptions.get('jtmonth') + "&jtyear=" + caloptions.get('jtyear');
		}
		else {
			return;
		}
		
		if (nmcalendar.calendardata.calendardata.urlbase) {
			ajaxParameters += '&urlbase=' + nmcalendar.calendardata.calendardata.urlbase;
		}

		new Ajax.Updater("ajax_calendar", "/nm_webkit/templates/eventscalendar_template.php", {
			method: 'post',
			parameters: ajaxParameters,
			onComplete: function() {
				$('ajax_calendar').removeClassName('contentloading');
				nmcalendar.initCalAjaxLinks();
				nmcalendar.navObservers();
			}
		});

	}

	this.show_event = function (ID,eventID,day) {
		var ajaxParameters = 'eventID=' + eventID + '&day=' + day;

		new Ajax.Updater(ID, 'show_event.php', {
			method: 'get',
			parameters: ajaxParameters
		});
	}

	this.navObservers = function() {
		// make sure that JSON data is hidden
		if ($('calendardata')) {
			$('calendardata').setStyle({display:'none'});		
		}

		if ($('ajax_calendar')) {
			if ($('upcoming_events')) {

				// temporary code to make sure eventscalendar_defaults.css is loaded
				var defaultsFound = false;
				for (var i in document.styleSheets) {
					if (document.styleSheets[i].href && document.styleSheets[i].href.match(/\/nm_webkit\/CSS\/eventscalendar_defaults.css$/)) {
						defaultsFound = true;
					}
				}
				if (defaultsFound == false) {
					webkit.loadJSCSSfile('/nm_webkit/CSS/eventscalendar_defaults.css','css');	
				}
			}

			if ($('calendar_jumpto')) {
				$('calendar_jumpto').observe('change', function() {
					nmcalendar.jumpto();
				});
			}

			$$('#ajax_calendar .calendarnav').each(function(o) {
				o.stopObserving('click');
				o.observe('click', function(e) {
					e.stop();
					if (o.hasClassName('grayedout')) { return; }
					if (o.id.match(/^nextmonth-/)) {
						// next month link
						var thisDate = o.id.replace(/^nextmonth-/,'').split("_");
						nmcalendar.jumpto('',thisDate[1],thisDate[0]);
					}
					else if (o.id.match(/^lastmonth-/)) {
						// last month link
						var thisDate = o.id.replace(/^lastmonth-/,'').split("_");
						nmcalendar.jumpto('',thisDate[1],thisDate[0]);
					}	
				});
			});

			if ($('pasteventshide')) {
				$('pasteventshide').stopObserving('click');
				$('pasteventshide').observe('click', function(e) {
					e.stop();
					nmcalendar.show_otherevents('hide');
				});
			}
			else if ($('pasteventsshow')) {
				$('pasteventsshow').stopObserving('click');
				$('pasteventsshow').observe('click', function(e) {
					e.stop();				
					nmcalendar.show_otherevents('show');				
				});
			}
			
			$$('#ajax_calendar .categoryicon').each(function(o) {
				o.stopObserving('click');
				o.observe('click', function(e) {
					e.stop();
					var category = o.id.replace(/^category_/,'');
					nmcalendar.jumpto(category,'','');
				});
			});
		}
	}

	/*
	function resizeDefaults() {
		if ($$('#upcoming_events .c2').first().getWidth() > ($('upcoming_events').getWidth() - $$('#upcoming_events .c1').first().getWidth())) {
			var newWidth = $('upcoming_events').getWidth() - $$('#upcoming_events .c1').first().getWidth();
			$$('#upcoming_events .c2').each(function(o) {
				o.setStyle({width:newWidth + 'px'});
			});
		}
	}
	*/	
	
	
	
}

var nmcalendar = new nmcalendar();

// legacy functions
function gen_calajax() {
	nmcalendar.gen_calajax();
}

function initCalAjaxLinks() {
	nmcalendar.initCalAjaxLinks();
}