/* addEvent: simplified event attachment */
function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		/*obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );*/
		obj.attachEvent( "on"+type, fn );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}
	
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();


addEvent(window,'unload',EventCache.flush);

/* window 'load' attachment */
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}

/* grab Elements from the DOM by className */
function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

var openEl = null;

function initFold() {

	var entries = getElementsByClass('fold');
	for (var i=0; i < entries.length; i+=2) {
		var entry = entries[i];
		entry.answer = entries[i+1];
		//alert('entries[i]='+entries[i]+' entries[i+1]='+entries[i+1]);
		if (entry.type == 'radio' && entry.checked) {
			openEl = entry;
		}
		
		if (entry.answer == null) {
			continue;
		}
		
		if ((entry.answer.className != 'fold open' && entry.type != 'radio') || (entry.className != 'fold open' && entry.type == 'radio')) {
		    //alert('setting display to none');
			entry.answer.style.display = 'none';			
		}

		//alert('entry onclick = '+entry.onclick+' id = '+entry.id);
		// this overrides all other onclick functions
		if (!(entry.onclick && entry.id=='kortingscode')) {
		entry.onclick = function () {
			this.blur();
			if (this.answer != null) {
				if (this.answer.style.display == 'none') {
					if (openEl) {
						openEl.answer.style.display = 'none';
						openEl.className = "fold";
					}
					this.answer.style.display = 'block';
					this.className = "fold open";
					openEl = this;
				} else if (entry.type != 'radio') {
					this.answer.style.display = 'none';
					this.className = "fold";
				}
			}
		}
		}
	}
}

/**
 * Initializes the on screen state of all checkboxes, radiobuttons and fieldsets for ssr.
 * Attaches events to the radiobuttons and checkboxes
 * Depends on YUI 
 */
function initSSR() {
	// 0. set the needed change events for the group opts 
	var relevantChecks = YAHOO.util.Dom.getElementsByClassName("optWHCH")
			.concat(YAHOO.util.Dom.getElementsByClassName("optWCHH"));

	for ( var i = 0; i < relevantChecks.length; i++) {
		YAHOO.util.Event.addListener(relevantChecks[i], "click",
				handleSSROptChange, relevantChecks[i]);
	}

	// 1. set the needed change events for all radios to make sure the checkboxes are all set
	// + 2. get all relevant fieldsets and see if any values are checked. if so:
	// set the checkbox for the fieldset
	// + 3. unfold the fieldsets with values (if still needed)
	var relevantFieldsets = YAHOO.util.Dom.getElementsByClassName("groupWHCH")
			.concat(YAHOO.util.Dom.getElementsByClassName("groupWCHH"));

	for ( var x = 0; x < relevantFieldsets.length; x++) {
		var radios = YAHOO.util.Dom.getElementsBy( function(el) {
			if (el.type == "radio")
				return true;
			else
				return false;
		}, "input", relevantFieldsets[x]);
		for ( var y = 0; y < radios.length; y++) {
			if (radios[y].checked) {
				var fieldsetOfGroup = YAHOO.util.Dom.getAncestorByTagName(
						radios[y], "fieldset");
				var groupCheck = YAHOO.util.Dom.get(fieldsetOfGroup.id.replace(
						"\.group", "\.opt"));
				groupCheck.checked = true;
				handleSSROptChange(undefined, groupCheck)
			}
			// set additional class on parent label if radio is disabled
			if (radios[y].disabled) {
				YAHOO.util.Dom.addClass(YAHOO.util.Dom.getAncestorByTagName(
						radios[y], "label"), "disabled");
			}
			// for up-flights: show warning if the down-flight will not be allowing scootmobiles
			if (noScootForDown && radios[y].value.indexOf(".SM") >= 0) { 
				addDownFlightSMWarning(radios[y]); 
			}
			// disable scoot-options if noScootAtAll condition was true
			if (noScootAtAll && radios[y].value.indexOf(".SM") >= 0) {
				disableScootOptionWithMessage(radios[y]);
			}
			// disable other scoot options if this SM radio was set
			if (radios[y].value.indexOf(".SM") >= 0 && radios[y].checked) {
				handleSSRRadioChange(undefined, radios[y]);
			}
			YAHOO.util.Event.addListener(radios[y], "click",
					handleSSRRadioChange, radios[y]);
		}
	}
}

function handleSSRRadioChange(e, srcEl) {
	// check if current passenger already has a 'no scoot' warning. if so, keep that in place at all times
	var srcValue = srcEl.value;
	var srcPassengerPart = srcValue.substr(0, 12);
	var parentLabel, ssrMessageContainer;
	var currentScootMessage = YAHOO.util.Dom.getElementsBy( function(el) {
		if (el.className.indexOf("max-one-scoot-message") >= 0
				&& el.className.indexOf(srcPassengerPart) >= 0) {
			return true;
		} else {
			return false;
		}
	}, "span");
	var noScootShownForPassenger = currentScootMessage.length > 0;
	var allRadiosForPassenger = YAHOO.util.Dom.getAncestorByTagName(srcEl,
			"label");

	// check all radios that have something to do with ScootMobiles, for radios
	// that are SM
	var radios = YAHOO.util.Dom.getElementsBy( function(el) {
		if (el.type == "radio")
			return true;
		else
			return false;
	}, "input", srcEl.form);
	for ( var x = 0; x < radios.length; x++) {
		parentLabel = YAHOO.util.Dom.getAncestorByTagName(radios[x], "label");
		if (srcValue.indexOf(".SM") >= 0) {
			var radioValue = radios[x].value;
			var radioPassengerPart = radioValue.substr(0, 12);
			if (radioValue.indexOf(".SM") >= 0 && radioValue != srcValue
					&& radioPassengerPart != srcPassengerPart) {
				if (srcEl.checked) {
					disableScootOptionWithMessage(radios[x]);
				}
			}
		} else {
			ssrMessageContainer = YAHOO.util.Dom.getElementsByClassName(
					"ssr-scoot-messages", "span", parentLabel)[0];
			// re-enable all other radios, remove sm message, but only if scoot
			// was possible in the first place
			var fieldsetOfGroup = YAHOO.util.Dom.getAncestorByTagName(
					srcEl, "fieldset");
			var withinRelevantGroup = fieldsetOfGroup.className == "groupWHCH";
			if (!noScootAtAll && !noScootShownForPassenger
					&& withinRelevantGroup) {
				radios[x].disabled = false;
				YAHOO.util.Dom.removeClass(parentLabel, "disabled");
				if (ssrMessageContainer) {
					var msg = YAHOO.util.Dom.getElementsByClassName(
							"max-one-scoot-message", "span",
							ssrMessageContainer)[0];
					if (msg)
						ssrMessageContainer.removeChild(msg);
				}
			}
		}
	}
	return true;
}

function handleSSROptChange(e, srcEl) {
	// if checked, open the fieldset that follows it and select the first radio
	var coupledFieldset = YAHOO.util.Dom.get(srcEl.id.replace("\.opt",
			"\.group"));
	var radios;
	if (srcEl.checked) {
		// show coupled radios
		coupledFieldset.style.display = "block";
		// select the first radio, if no other one was selected before
		radios = getRadiobuttonsOfFieldset(coupledFieldset);
		if (radios) {
			var preChecked = false;
			for ( var y = 0; y < radios.length; y++) {
				if (radios[y].checked) {
					preChecked = true;
					break;
				}
			}
			if (!preChecked) {
				radios[0].checked = true;
			}
		}
		// check other checkboxes, if needed and set status
		if (coupledFieldset.id.indexOf("WHCH") >= 0) {
			// set other fieldset too, show options
			var dependentFieldsetCheck = YAHOO.util.Dom.get(srcEl.id.replace(
					"WHCH", "WCHH"));
			dependentFieldsetCheck.checked = true;
			dependentFieldsetCheck.disabled = true;
			handleSSROptChange(undefined, dependentFieldsetCheck);
		}

	} else {
		// hide coupled radios
		coupledFieldset.style.display = "none";
		// reset selection in fieldset
		radios = getRadiobuttonsOfFieldset(coupledFieldset);
		if (radios) {
			for ( var x = 0; x < radios.length; x++) {
				radios[x].checked = false;
				handleSSRRadioChange(undefined, radios[x]);
			}
		}
		// re-enable other checkboxes too, if needed
		if (coupledFieldset.id.indexOf("WHCH") >= 0) {
			var dependentFieldSetCheck = YAHOO.util.Dom.get(srcEl.id.replace(
					"WHCH", "WCHH"));
			dependentFieldSetCheck.disabled = false;
		}
	}
}

function getRadiobuttonsOfFieldset(fieldset) {
	return YAHOO.util.Dom.getElementsBy( function(el) {
		if (el.type == "radio")
			return true;
		else
			return false;
	}, "input", fieldset);
}

function disableScootOptionWithMessage(radio) {
	var radioValue = radio.value;
	var radioPassengerPart = radioValue.substr(0, 12);
	var parentLabel = YAHOO.util.Dom.getAncestorByTagName(radio, "label");
	ssrMessageContainer = YAHOO.util.Dom.getElementsByClassName(
			"ssr-scoot-messages", "span", parentLabel)[0];

	radio.checked = false;
	radio.disabled = true;
	YAHOO.util.Dom.addClass(parentLabel, "disabled");
	if (ssrMessageContainer) {
		var msg = YAHOO.util.Dom.getElementsByClassName(
				"max-one-scoot-message", "span", ssrMessageContainer)[0];
		if (msg) {
			msg.innerHTML = maxOneScootMobilePerFlightMessage;
		} else {
			ssrMessageContainer.innerHTML = ssrMessageContainer.innerHTML
					+ "<span class=\"max-one-scoot-message "
					+ radioPassengerPart + "\">"
					+ maxOneScootMobilePerFlightMessage + "</span>";
		}
	}
}
function addDownFlightSMWarning(radio) {
	var radioValue = radio.value;
	var radioPassengerPart = radioValue.substr(0, 12);
	var parentLabel = YAHOO.util.Dom.getAncestorByTagName(radio, "label");
	ssrMessageContainer = YAHOO.util.Dom.getElementsByClassName(
			"ssr-scoot-messages", "span", parentLabel)[0];
	if (ssrMessageContainer) {
		var msg = YAHOO.util.Dom.getElementsByClassName(
				"no-scoot-on-down-message", "span", ssrMessageContainer)[0];
		if (msg) {
			msg.innerHTML = noScootAvailableForDownFlightMessage;
		} else {
			ssrMessageContainer.innerHTML = ssrMessageContainer.innerHTML
					+ "<span class=\"no-scoot-on-down-message "
					+ radioPassengerPart + "\">"
					+ noScootAvailableForDownFlightMessage + "</span>";
		}
	}
}