/**
 * Show/hide daybox in month calendar
 */

function showDayHolder( el ) {
	
	var dayId = document.getElementById(el.id);
	var dayHolder = document.getElementById('dayOverlayHolder');
	
	if(el.parentNode) {
		if(el.parentNode.className.indexOf('currentDay') > -1) {
			dayHolder.className = 'currentDay';
		} else {
			dayHolder.className = '';
		}
	}
	
	var x = ((YAHOO.util.Dom.getX(el.id)) - YAHOO.util.Dom.getX("main"))-25;
	var y = ((YAHOO.util.Dom.getY(el.id)) - YAHOO.util.Dom.getY("main"))-25;
	
	dayHolder.innerHTML = dayId.innerHTML;	
	
	dayHolder.style.left = x+'px';
	dayHolder.style.top = y+'px';
	dayHolder.style.display = 'block';
}

function hideDayHolder( el, e ) {
	var curTarget = null;
	
	if( e.toElement ) {				
		curTarget = e.toElement;
		
	} else if( e.relatedTarget ) {
		curTarget = e.relatedTarget; }
		
	if( !isNestedChild(el, curTarget) && el != curTarget ) {
		document.getElementById("dayOverlayHolder").style.display='none'; }
}

function isNestedChild(parent, child) { //mouseover fix
	if( child != null) {
		
		// Workaround for gecko mouse-over bug (e.g. when hovering a scrollbar element,
		// it throws a 'permission denied in non chrome context' exception)
		if(YAHOO.env.ua.gecko) {
			var child_type = HTMLElement.prototype.toString.call(child);
			if(child_type == '[xpconnect wrapped native prototype]' || child_type == '[object XULElement]') {
				// Don't know if this is the correct way, but it works for now
				return true;
			}			
		}
		
		while( child.parentNode ) {
			if( (child = child.parentNode) == parent ) {
				return true; }
		}
	}
	return false;
}

/**
 * Show/hide dialogbox
 */

function showDialog( el, e ) {	
	var element = new YAHOO.util.Element(el);	
	var x = (YAHOO.util.Event.getPageX(e) - YAHOO.util.Dom.getX("main"))-25;
	var y = (YAHOO.util.Event.getPageY(e) - YAHOO.util.Dom.getY("main"));
	element.setStyle('left', x+'px');
	element.setStyle('top', y+'px');
	element.setStyle('display', 'block');
}

function hideDialog( el ) {
	var element = new YAHOO.util.Element(el);	
	element.setStyle('display', 'none');
}

function showGoogleMapsDirection(){

	var form = document.forms['plan_route'];
	var inputs = form.getElementsByTagName("input");

	var length = inputs.length;

	for(var key=0;key<length;key++) {
		if (inputs[key].type == 'radio' && inputs[key].checked) {
			var direction = inputs[key].value;
		}
	}

	if ((form.address.value == "Vb.: Straatnaam 1, Stad") || (form.address.value == "e.g. Streetname 1, City")) {
		form.address.className = "text required";
	} else {
		if (direction == "from") {
			window.open("http://maps.google.com/maps?f=d&source=s_d&saddr=" + form.address_event.value + "&daddr=" + form.address.value);
		} else if (direction == "to") {
			window.open("http://maps.google.com/maps?f=d&source=s_d&saddr=" + form.address.value + "&daddr=" + form.address_event.value);
		}
	}
}

function toggleLoginForm() {
	document.getElementById('loginForm').style.display='block';
	document.getElementById('loginInfo').style.display='none';	
	return false;
}

/**
 * Stuur de bezoeker naar een nieuwe URL d.m.v. Javascript.
 *
 * Past fix toe voor pagina's met base href-tag i.v.m. MSIE bug.
 */
function browserRedirect(url) {
	url = fixBaseHrefIEBug(url);
	document.location.href = url;
	return false;
}

/**
 * Past fix toe voor pagina's met base href-tag i.v.m. MSIE bug.
 * IE en FF behandelen namelijk in Javascript de base href verschillend
 * wat verschillende urls oplevert bij relatieve paden.
 */
function fixBaseHrefIEBug(url) {
	if (url.indexOf("http://") == -1) {
		//	Relatieve URL
		baseElements = document.getElementsByTagName('base');
		if (baseElements.length > 0) {
			//	Document heeft base-tag
			base = baseElements[0].href;
			url = base + url;
		}
	}
	return url;
}

/**
 * Functions for calendar block
 *
 */

var FormChecker = { 

	block_id : null,
	cur_date : null,
	timer : null,
	calendar_active : false,
	preferences_changed : null,
	
	init: function(fullInit) {

		if(document.getElementById('main').className.indexOf('home') > -1) {
			YAHOO.util.Event.on("headerContainer", "mouseover", function (e) { document.getElementById('dayOverlayHolder').style.display='none';});
			YAHOO.util.Event.on("sidebar", "mouseover", function (e) { document.getElementById('dayOverlayHolder').style.display='none';});			
		}

		// Attach onchange events to all appointment types
		var inputs = FormChecker.getInputs('appointment_types');
		var length = inputs.length;
		for(var key=0;key<length;key++) {
			YAHOO.util.Event.addListener(inputs[key], 'click', FormChecker.updateAppointmentTypes, this.id);
		}
		
		var groups = FormChecker.getInputs('app_types_aggr');
		var groups_length = groups.length;
		for(var gr_key=0;gr_key<groups_length;gr_key++) {
			YAHOO.util.Event.addListener(groups[gr_key], 'click', FormChecker.updateAppointmentTypeGroups, groups[gr_key].id);
		}

		if(fullInit) {
			FormChecker.calendar_active = true;
			//FormChecker.updateCalendar();
		}
		
		YAHOO.util.Event.addListener('allebranches', 'click', FormChecker.toggleAllCategories);
		YAHOO.util.Event.addListener('typesButton', 'click', FormChecker.toggleDropDown, 'downlistTypes');
		YAHOO.util.Event.addListener('categoriesButton', 'click', FormChecker.toggleDropDown, 'downlistBranches');
		YAHOO.util.Event.addListener('selected_country', 'change', FormChecker.updateLocationCountry);
		FormChecker.updateAllCategoriesInput();
		FormChecker.updateAllTypesInput();
	},

	getInputs: function(form_name) {
		var form = document.forms[form_name];
		var inputs = form.getElementsByTagName("input");
		
		return inputs;
	},
	
	getLocationCountry : function() {
		return document.getElementById('selected_country').value;
	},
	
	getAppointmentTypes: function() {
		
		var inputs = FormChecker.getInputs('appointment_types');
		var values = new Array();
		var appointment_types = new Array();
		var length = inputs.length;
		var x = 0;	
		
		for(var key=0;key<length;key++) {
			
			// Check if input has property 'checked'
			if(inputs[key].checked) {
	
				var temp_val = inputs[key].name;
	
				// Parse id and add it to array
				appointment_types[x] = parseInt(temp_val.substr(4));
				x++;
			}
		}
		return appointment_types;
	},
	
	updateLocationCountry : function() {
		
		if(FormChecker.calendar_active) {
			// Render new Calendar element
			FormChecker.updateCalendar();
		} else {
			FormChecker.submitSearch();
		}
		FormChecker.preferences_changed = true;
	},
	
	updateAppointmentTypeGroups: function(e, input_id) {

		// Let everybody know some preferences have changed
		//FormChecker.preferences_changed = true;

		var aggr_form = document.forms['app_types_aggr'];
		var form = document.forms['appointment_types'];
		
		if(input_id == 'beurzen') {
			// Beurzen
			if(aggr_form.beurzen.checked) {
				form.type1.checked = 1;
			} else {
				form.type1.checked = 0;
				aggr_form.alletypes.checked = 0;
			}
		} else if(input_id == 'congressen') {
			// Congressen, conferenties, seminars
			if(aggr_form.congressen.checked) {
				form.type2.checked = 1;
				form.type3.checked = 1;
				form.type4.checked = 1;
			} else {
				form.type2.checked = 0;
				form.type3.checked = 0;
				form.type4.checked = 0;
				aggr_form.alletypes.checked = 0;				
			}
		} else if(input_id == 'bedrijfsdagen') {
			// Bedrijfsdagen, workshops	
			if(aggr_form.bedrijfsdagen.checked) {
				form.type5.checked = 1;
				form.type6.checked = 1;
			} else {
				form.type5.checked = 0;
				form.type6.checked = 0;
				aggr_form.alletypes.checked = 0;				
			}
		} else if(input_id == 'trainingen') {
			// Trainingen, opleidingen, cursussen
			if(aggr_form.trainingen.checked) {
				form.type7.checked = 1;
				form.type8.checked = 1;
				form.type9.checked = 1;
			} else {
				form.type7.checked = 0;
				form.type8.checked = 0;
				form.type9.checked = 0;	
				aggr_form.alletypes.checked = 0;						
			}						
		} else if(input_id == 'alletypes') {
			// Alle types
			if(aggr_form.alletypes.checked) {
				form.type1.checked = 1;
				form.type2.checked = 1;
				form.type3.checked = 1;
				form.type4.checked = 1;	
				form.type5.checked = 1;
				form.type6.checked = 1;					
				form.type7.checked = 1;
				form.type8.checked = 1;
				form.type9.checked = 1;
				aggr_form.beurzen.checked = 1;
				aggr_form.congressen.checked = 1;
				aggr_form.bedrijfsdagen.checked = 1;
				aggr_form.trainingen.checked = 1;									
			} else {
				form.type1.checked = 0;
				form.type2.checked = 0;
				form.type3.checked = 0;
				form.type4.checked = 0;	
				form.type5.checked = 0;
				form.type6.checked = 0;					
				form.type7.checked = 0;
				form.type8.checked = 0;
				form.type9.checked = 0;	
				aggr_form.beurzen.checked = 0;
				aggr_form.congressen.checked = 0;
				aggr_form.bedrijfsdagen.checked = 0;
				aggr_form.trainingen.checked = 0;					
			}						
		}
		
		if(input_id != 'alletypes' && form.type1.checked && form.type2.checked && form.type3.checked && form.type4.checked && form.type5.checked && form.type6.checked && form.type7.checked && form.type8.checked && form.type9.checked) {
			aggr_form.alletypes.checked = 1;
		} else if(input_id != 'alletypes') {
			aggr_form.alletypes.checked = 0;
		}

		if(FormChecker.calendar_active) {
			// Render new Calendar element
			FormChecker.updateCalendarDelayed();
		}

		// Make sure no other events are fired by the YUI onclick event
	    YAHOO.util.Event.stopPropagation(e);
	},
	
	updateAppointmentTypes: function(e) {
		
		// Let everybody know some preferences have changed
		//FormChecker.preferences_changed = true;
		
		var aggr_form = document.forms['app_types_aggr'];
		var form = document.forms['appointment_types'];
		
		// Beurzen
		if(form.type1.checked) {
			aggr_form.beurzen.checked = 1;
		} else {
			aggr_form.beurzen.checked = 0;
		}
		
		// Congressen, conferenties, seminars
		if(form.type2.checked && form.type3.checked && form.type4.checked) {
			aggr_form.congressen.checked = 1;
		} else {
			aggr_form.congressen.checked = 0;
		}		
		
		// Bedrijfsdagen, workshops
		if(form.type5.checked && form.type6.checked) {
			aggr_form.bedrijfsdagen.checked = 1;
		} else {
			aggr_form.bedrijfsdagen.checked = 0;
		}
		
		// Trainingen, opleidingen, cursussen
		if(form.type7.checked && form.type8.checked && form.type9.checked) {
			aggr_form.trainingen.checked = 1;
		} else {
			aggr_form.trainingen.checked = 0;
		}
		
		// Alle types
		FormChecker.updateAllTypesInput();
		
		if(FormChecker.calendar_active) {
			// Render new Calendar element
			FormChecker.updateCalendarDelayed();
		}
		
		// Make sure no other events are fired by the YUI onclick event
	    YAHOO.util.Event.stopPropagation(e);
	},
	
	updateAllTypesInput : function() {
		
		var form = document.forms['appointment_types'];
		var aggr_form = document.forms['app_types_aggr'];
				
		if(form.type1.checked && form.type2.checked && form.type3.checked && form.type4.checked && form.type5.checked && form.type6.checked && form.type7.checked && form.type8.checked && form.type9.checked) {
			aggr_form.alletypes.checked = 1;
		} else {
			aggr_form.alletypes.checked = 0;
		}
	},
	
	getCalendar : function (date) {
		//Slik.HTTP.callHandler('showCalendar', {'class': 'XMSCalendarBlock', 'id':block_id, 'date':date, 'appointment_types':appointment_types, 'categories':categories}, FormChecker.calendarLoaded, "tabContainer");
		
		var appointment_types = FormChecker.getAppointmentTypes();
		var categories = FormChecker.getCategories();
		var country = FormChecker.getLocationCountry();
		
		var currentUrl = Slik.Workspace.getCurrentUrl();
		// Strip off all parameters
		if (currentUrl.indexOf("?") > -1) {
			//alert("stripped off "+currentUrl.substring(currentUrl.indexOf("?")));
			currentUrl = currentUrl.substring(0, currentUrl.indexOf("?"));
		}
		
		var mode_input = document.getElementById('calendar_mode');
		if(mode) {
			var mode = mode_input.value;
		} else {
			mode = "month";
		}
		
		var new_url = currentUrl+"?mode="+encodeURIComponent(mode)+"&date="+encodeURIComponent(date)+"&appointment_types="+encodeURIComponent(appointment_types)+"&categories="+encodeURIComponent(categories);
		
		new_url += "&country="+encodeURIComponent(country);
		
		// Use Slik.Workspace to load the url and manipulate the browser's history
		Slik.Workspace.navigateTo(new_url);
	},
	
	loaderCallback: function(success, obj) {
		//Slik.HTTP.writeElement(response, element);
		
		FormChecker.preferences_changed = true;
		
		var loading = document.getElementById('loadingContainer');
		loading.style.display = "none";
		
		if(success) {
			
			if (!YAHOO.env.ua.ie) {
				// fade in the new updated calendar.
				var attributes = { opacity: { from: 0, to: 1 } };		
				var easeIn = new YAHOO.util.Anim('contentContainer', attributes, 0.2, YAHOO.util.Easing.easeIn);		
				easeIn.animate();
			}
		} else {
			location.reload();
		}
	},
	
	updateCalendar: function(block_id, date) {
				
		/*if(!block_id) {
			if(document.getElementById("block_id")){
				block_id = document.getElementById("block_id").value;
			}
			//var block_id = 5008;
		}*/
		
		clearTimeout(FormChecker.timer);
		
		if(!date) {
			var date = document.getElementById('current_date').value;
		}
		
		if (!YAHOO.env.ua.ie) {
			var loading = document.getElementById('loadingContainer');
			loading.style.display = "block";
		
			// fade out the current calendar.
			var attributes = { opacity: { from: 1, to: 0 } };
			var easeOut = new YAHOO.util.Anim('contentContainer', attributes, 0.2, YAHOO.util.Easing.easeOut);
			easeOut.animate();
		} else {
			var loading = document.getElementById('loadingContainer');
			loading.style.display = "block";
		}
		
		FormChecker.getCalendar(date);
	},
	
	updateCalendarDelayed: function(block_id, date) {
		
		clearTimeout(FormChecker.timer);
		FormChecker.timer = setTimeout("FormChecker.updateCalendar("+block_id+", "+date+")", 1000);
		
		//FormChecker.updateCalendar(block_id, date);
	},

	attachEvents: function(oMenu) {
		var list_items = oMenu.getItems();
			
		var values = new Array();
		var length = list_items.length;

		// because of lazy loading, attach events with loadSubmenu when onShow is fired
		oMenu.subscribe("beforeRender", FormChecker.loadSubmenu);

		for(var key=0;key<length;key++) {
	
			YAHOO.util.Event.purgeElement(list_items[key].id, true, "click");	
			YAHOO.util.Event.addListener(list_items[key].id, "click", FormChecker.updateCategories, list_items[key]);
			if(list_items[key]._oSubmenu) {
				//FormChecker.attachEvents(list_items[key]._oSubmenu);
			}
		}
	},

	loadSubmenu: function(event_name, event_args) {
		FormChecker.attachEvents(this);
	},

	toggleDropDown: function(e, id) {

		var el = document.getElementById(id);

		if(el.style.display != 'block') {
			el.style.display="block";
			var attributes = {
				height: { from:0, to: 190 }
			};
			var anim = new YAHOO.util.Anim(id, attributes, 0.4, YAHOO.util.Easing.easeIn);
			anim.onComplete.subscribe((function(){
					document.getElementById(id).style.overflow="visible";
				})
			);
		} else {
			document.getElementById(id).style.overflow="hidden";			
			var attributes = {
				height: { from: 190, to: 0 }
			};
			var anim = new YAHOO.util.Anim(id, attributes, 0.4, YAHOO.util.Easing.easeIn);
			anim.onComplete.subscribe((function(){
					document.getElementById(id).style.display="none";
				})
			);
		}
		anim.animate();

		YAHOO.util.Event.stopEvent(e);
		YAHOO.util.Event.stopPropagation(e);
		YAHOO.util.Event.preventDefault(e);
	},
	
	toggleAllCategories : function(e) {
		var inputs = FormChecker.getInputs('appointment_cats');
		var length = inputs.length;
		var x = 0;
		
		var new_value = document.getElementById('allebranches').checked;
		
		for(var key=0;key<length;key++) {
			inputs[key].checked = new_value;
		}
		
		if(FormChecker.calendar_active) {
			// Render new Calendar element
			FormChecker.updateCalendarDelayed();
		}

		// Make sure no other events are fired by the YUI onclick event
	    YAHOO.util.Event.stopPropagation(e);		
	},
	
	updateCategories : function(e, obj) {
		
		// Let everybody know some preferences have changed
		//FormChecker.preferences_changed = true;
		
		// Firefox uses other reference to original clicked element
		if (YAHOO.env.ua.gecko > 0) {
			var element = e.originalTarget;
		// IE7, Chrome and Safari all support srcElement
		} else {
			var element = e.srcElement;
		}
		
		// If clicked on the list item (not on input or label, launch click event on input)
		if(element && element.tagName == "LI") {
			element.getElementsByTagName('input')[0].click();
		}
		
		// Check if menu item has a submenu
		if(obj._oSubmenu) {			
			var checkboxes = obj.element.getElementsByTagName('input');
			var length = checkboxes.length;
			var new_value = checkboxes[0].checked;

			for(key=0;key<length;key++) {
				checkboxes[key].checked = new_value;
			}
		}
		
		if(new_value == false) {
			document.getElementById('allebranches').checked = new_value;
		}
		
		FormChecker.updateParentCategories(obj);
	
		if(FormChecker.calendar_active) {
			// Render new Calendar element
			FormChecker.updateCalendarDelayed();
		}

		// Make sure no other events are fired by the YUI onclick event
	    YAHOO.util.Event.stopPropagation(e);
	},
	
	updateParentCategories : function(obj)	{

		// Let everybody know some preferences have changed
		//FormChecker.preferences_changed = true;

		// update parent state
		if(obj.parent) {
			var children = obj.parent.getItems();
			var new_value = 1;
			
			if(obj.parent.parent) {
				var parent_checkbox = obj.parent.parent.srcElement.getElementsByTagName('input')[0];
				var obj_checkbox = obj.srcElement.getElementsByTagName('input')[0];

				// Don't do anything when parent already has the right status
				if(!parent_checkbox.checked && !obj_checkbox.checked) {
					return;
				} else {
					for(x in children) {
						child_checkbox = children[x].srcElement.getElementsByTagName('input')[0]
						if(!child_checkbox.checked) {
							new_value = 0;
						}
					}
					if(obj.parent && obj.parent.parent) {
						parent_checkbox.checked = new_value;						
						FormChecker.updateParentCategories(obj.parent.parent);
					}
				}
			}
			
			// Alle branches input
			FormChecker.updateAllCategoriesInput();
		}
	},
	
	updateAllCategoriesInput : function() {
		
		var menu = document.getElementById('branchemenu');
		if(!document.getElementById('cat5002').checked || !document.getElementById('cat5021').checked || !document.getElementById('cat5031').checked || !document.getElementById('cat5173').checked) {
			document.getElementById('allebranches').checked = false;
		} else {
			document.getElementById('allebranches').checked = true;
		}		
	},
	
	getCategories : function() {
		var inputs = FormChecker.getInputs('appointment_cats');
		var values = new Array();
		var appointment_cats = new Array();
		var length = inputs.length;
		var x = 0;
		
		for(var key=0;key<length;key++) {
			
			// Check if input has property 'checked'
			if(inputs[key].checked) {
	
				var temp_val = inputs[key].name;
				temp_val = parseInt(temp_val.substr(3));
				
				if(!isNaN(temp_val)) {
					// Parse id and add it to array
					appointment_cats[x] = temp_val;	
					x++;
				}
			}
		}
		return appointment_cats;
	},
	
	submitSearch : function() {
		var categories = FormChecker.getCategories();
		var types = FormChecker.getAppointmentTypes();
		var selected_country = FormChecker.getLocationCountry();
		
		var searchForm = document.forms["searchForm"];
		
		searchForm.country.value = selected_country;
		searchForm.categories.value = categories;
		searchForm.appointment_types.value = types;
		var search_term = searchForm.search_term.value;
		if(search_term == 'Zoeken' || search_term == 'Search') {
			return false;
		}
		searchForm.submit();
		return false;
	},
	
	searchForEvents : function(old) {
		var searchForm = document.forms["searchForm"];
		
		if(old) {
			searchForm.show_old_events.value = 1;			
		}
		
		if(FormChecker.submitSearch()) {
			searchForm.submit();
		}
	},
	
	navigateTo : function(link) {		
		// Add parameters to url when preferences have changed, 
		// or else just return true to follow the link
		if(FormChecker.preferences_changed) {
			var url = null;
			if (typeof link == "string") {
				url = link;
			} else if (link.getAttribute) {
				url = link.getAttribute("href");
			} else {
				throw new Exception("agd 001 Weird link!" + link);
			}	
			
			var categories = FormChecker.getCategories();
			var types = FormChecker.getAppointmentTypes();
			var selected_country = FormChecker.getLocationCountry();
			
			var params = "categories="+encodeURIComponent(categories)+"&appointment_types="+encodeURIComponent(types);
			
			if (selected_country) {
				params += "&country="+encodeURIComponent(selected_country);
			}
			
			if (url.indexOf("?") > -1) {
				url += "&"+params;
			} else {
				url += "?"+params;
			}
			
			browserRedirect(url);
			return false;
		} else {
			return true;
		}
	},
	
	savePreferences : function() {
		var categories = FormChecker.getCategories();
		var types = FormChecker.getAppointmentTypes();
		var country = FormChecker.getLocationCountry();
		
		if( document.getElementById("block_id") ){
			var block_id = document.getElementById("block_id").value;
		}
		
		XMS.savePreferences(block_id, categories, types, country);
		
	}
}