var mapUsage;

// ==================================================================
// Event listener.
// ==================================================================

function attachEventListener(target, eventType, functionRef, capture) {
  if (typeof target.addEventListener != "undefined") {
	target.addEventListener(eventType, functionRef, capture);
  }
  else if (typeof target.attachEvent != "undefined") {
	target.attachEvent("on" + eventType, functionRef);
  }
  else {
	eventType = "on" + eventType;

	if (typeof target[eventType] == "function") {
	  var oldListener = target[eventType];

	  target[eventType] = function() {
		oldListener();

		return  functionRef();
	  }
	}
	else {
	  target[eventType] = functionRef;
	}
  }

  return true; 
}

// ==================================================================
// This function sets the focus on a select box.
// ==================================================================

function setFocus() {
	try {
		if (document.getElementById('assignedStopsSelection')) {
			document.getElementById('assignedStopsSelection').focus();
		}
		else if (document.getElementById('dmLineSelection')) {
			document.getElementById('dmLineSelection').focus();
		}
		else if (document.forms[0].lineName) {
			document.forms[0].lineName.focus();
		}
		else if (document.getElementById('name_origin') && document.getElementById('name_origin').value=='') {
			document.getElementById('name_origin').focus();
		}
		else if (document.getElementById('name_destination') && document.getElementById('name_destination').value=='') {
			document.getElementById('name_destination').focus();
		}
		else if (document.getElementById('name_via') && document.getElementById('name_via').value=='') {
			document.getElementById('name_via').focus();
		}
		else if (document.getElementById('name_dm')) {
			document.getElementById('name_dm').focus();
		}
		else if (document.getElementById('name_ttb')) {
			document.getElementById('name_ttb').focus();
		}
		else if (document.getElementById('name_stt')) {
			document.getElementById('name_stt').focus();
		}
		else if (document.getElementById('name_ss')) {
			document.getElementById('name_ss').focus();
		}
		else if(document.getElementById('nameList_origin')) {
			document.getElementById('nameList_origin').focus();
		}
		else if (document.getElementById('nameList_destination')) {
			document.getElementById('nameList_destination').focus();
		}
		else if(document.getElementById('nameList_via')) {
			document.getElementById('nameList_via').focus();
		}
		else if (document.getElementById('nameList_dm')) {
			document.getElementById('nameList_dm').focus();
		}
		else if (document.getElementById('nameList_stt')) {
			document.getElementById('nameList_stt').focus();
		}
		else if (document.getElementById('nameList_ttb')) {
			document.getElementById('nameList_ttb').focus();
		}
	}
	catch (e) {
	}
}


// ==================================================================
// This function causes submit if the focus is e.g. on a list and
// the enter key is pressed.
// ==================================================================

function checkReturnKey(event) {
	if(!event) event = window.event;
		var keycode = event.which || event.keyCode;
	
		if (event && event.keyCode==13) {
			document.forms[0].submit();
		}
}


// ==================================================================
// This function sets the date in the correct format for the 
// calendar.
// ==================================================================

function setCalendarDate () {
	document.getElementById('calendarDate').innerHTML = document.getElementById('date1').value + '.' + document.getElementById('date2').value + '.' + document.getElementById('date3').value;
}


// ==================================================================
// This function enters the date in the date input fields after
// using the calendar.
// ==================================================================

function getCalendarDate () {
	var date = document.getElementById('calendarDate').innerHTML.split('.');
	document.getElementById('date1').value = date[0];
	document.getElementById('date2').value = date[1];
	document.getElementById('date3').value = date[2];
}


// ==================================================================
// This function toggles the help for a certain element with id 
// helpID.
// ==================================================================

function toggleHelp(helpID) {
	var numberOfHelpIDs = 5;
	var open = false;
	if (document.getElementById(helpID) && document.getElementById(helpID).style.display == 'block') 
		open = true;
	
	// close all open help elements
	for (var i=1; i<= numberOfHelpIDs; i++) {
		if (document.getElementById('help_'+i)) 
			document.getElementById('help_'+i).style.display = 'none';
	}
	// show clicked help element if it is not already open
	if (!open && document.getElementById(helpID)) {
		document.getElementById(helpID).style.display = 'block';
		if (document.getElementById('bannerBox'))
			document.getElementById('bannerBox').style.display = 'none';
	}
	else {
		if (document.getElementById('bannerBox'))
			document.getElementById('bannerBox').style.display = 'block';
	}	
}


// ==================================================================
// This function toggles the detailviwe of a journey with the ID
// detail_<index of journey>.
// ==================================================================

function toggleDetailview (id, noOfRoutes, isPrint) {
	
	//details opened via toggleAll
	if (openedDetails.length > 1) {
		
		//store only the index
		var idIdx = id.substring(7, id.length);
		
		if (document.getElementById(id) && document.getElementById(id).style.display == 'none') {
			document.getElementById(id).style.display = '';
			openedDetails.push(idIdx);
		} else {
			document.getElementById(id).style.display = 'none';
			//USE PROTOTYPE LIB
			openedDetails = openedDetails.without(idIdx);
		}
		changeToggleStr(noOfRoutes);
		return;
	}
	
	// only 1 open, toggle exclusively
	var open = false;
	
	if (document.getElementById(id) && document.getElementById(id).style.display == 'none') {
		open = true;
	}	
	
	if (!isPrint) {
		// close all journey detailviews
		for (var i=1; i <= noOfRoutes; i++) {
			if (document.getElementById('detail_'+i))
				document.getElementById('detail_'+i).style.display ='none';
		}
	}
	
	// open detailview of selected journey
	if(document.getElementById(id) && document.getElementById(id).style.display=='none' && open) {
		document.getElementById(id).style.display = '';
	}
	
	// set showDetailview layout parameter to maintain detailview open after returning from fares screen or after opening indoor information
	document.forms[0].itdLPxx_showDetailview.value = id.substring(7,id.length);
}

function toggleAll (noOfRoutes) {
	
	var state = (openedDetails.length === noOfRoutes) ? 'none' : '';
	
	//always reset array
	openedDetails.length = 0;
	
	for (var i=1; i <= noOfRoutes; i++) {
		if (document.getElementById('detail_'+i)) {
			document.getElementById('detail_'+i).style.display = state;
		}
		if (state==='') {
			openedDetails.push(i);
		}
	}
	changeToggleStr(noOfRoutes);
}

function changeToggleStr(noOfRoutes) {
	
	var linkObj = mdvLib.$('linkToggleAll');
	if (linkObj && toggleLinkStr) {
		linkObj.innerHTML = (openedDetails.length === noOfRoutes) ? toggleLinkStr.doClose : toggleLinkStr.doOpen;
	}
	//remember opened details
	document.forms[0].itdLPxx_showDetailview.value = openedDetails.join('|');

}


// ==================================================================
// This function toggles the input map. If a map is opened the other
// maps will be closed.
// ==================================================================

function toggleMap (usage) {
	
	mapUsage = usage;
	
	var frame = 0;
	if (usage == 'ttb' && document.forms[1]) {
		//frame = 1;
	}
	var mapCloser = document.getElementById('closeIAMap_' + usage);
	if  (mapCloser) {
		mapCloser.style.display =  'none';
	}
	
	// up to three maps exist on enquiry screen - there is not more than one map open at the same time
	if (document.getElementById('mdvMap_origin') && document.getElementById('mdvMap_destination')) {
		if (usage == 'origin') {
			if (document.getElementById('mdvMap_origin').style.display == 'block') {
				document.getElementById('mdvMap_origin').style.display = 'none';
				if (document.forms[frame].itdLPxx_mapOpen)
					document.forms[frame].itdLPxx_mapOpen.value = '';
			}
			else {
				if (usage != 'dm')
					document.forms[frame].execInst.value = 'verifyOnly';
				if (document.forms[frame].itdLPxx_mapOpen)
					document.forms[frame].itdLPxx_mapOpen.value = 'origin';
				document.forms[frame].submit();
			}
		}
		else if (usage =='destination') {
			if (document.getElementById('mdvMap_destination').style.display == 'block') {
				document.getElementById('mdvMap_destination').style.display = 'none';
				if (document.forms[frame].itdLPxx_mapOpen)
					document.forms[frame].itdLPxx_mapOpen.value = '';
			}
			else {
				if (usage != 'dm')
					document.forms[frame].execInst.value = 'verifyOnly';
				if (document.forms[frame].itdLPxx_mapOpen)
					document.forms[frame].itdLPxx_mapOpen.value = 'destination';
				document.forms[frame].submit();
			}
		}
		else if (usage == 'via' && document.getElementById('mdvMap_via')) {
			if (document.getElementById('mdvMap_via').style.display == 'block') {
				document.getElementById('mdvMap_via').style.display = 'none';
				if (document.forms[frame].itdLPxx_mapOpen)
					document.forms[frame].itdLPxx_mapOpen.value = '';
			}
			else {
				if (usage != 'dm')
					document.forms[frame].execInst.value = 'verifyOnly';
				if (document.forms[frame].itdLPxx_mapOpen)
					document.forms[frame].itdLPxx_mapOpen.value = 'via';
				document.forms[frame].submit();
			}
		}
	}
	// only one map exists on enquiry screen
	else if (document.getElementById('mdvMap_' + usage)) {
		if (document.getElementById('mdvMap_' + usage).style.display == 'block') {
			document.getElementById('mdvMap_' + usage).style.display = 'none';
			if (document.forms[frame].itdLPxx_mapOpen || usage=='ttb') {
				document.forms[frame].itdLPxx_mapOpen.value = '';
				if (document.forms.length===3) {
					document.forms[1].itdLPxx_mapOpen.value = '';
				};
			}
		}
		else {
			if (usage != 'dm' && usage != 'ttb')
				document.forms[frame].execInst.value = 'verifyOnly';
			if (document.forms[frame].itdLPxx_mapOpen)
				document.forms[frame].itdLPxx_mapOpen.value = usage;
			document.forms[frame].submit();
		}
	}
}

// ==================================================================
// This function opens/closes the output map.
// ==================================================================

function toggleOutputMap (route, sessionID, requestID) {
	
	if (document.getElementById('mdvMapArea_' + route) && document.getElementById('mdvMap_' + route)) {
		
		// clear MDVMapControl DOM container 
		// to prevent the control from showing up twice 
		var map = document.getElementById('mdvMap_' + route);
		for (var len = map.childNodes.length-1; len > 0; len--) {
			if (map.childNodes[len].nodeType === 1) {
				if (map.childNodes[len].className === "MDVMapControl") {
					map.childNodes[len].innerHTML = '';
					break;
				}
			}
		}
		
		if (document.getElementById('MDVMapControl') && document.getElementById('MDVMapControl').innerHTML !== '') {
			document.getElementById('MDVMapControl').innerHTML = '';
		}
	
		if (document.getElementById('mdvMapArea_' + route).style.display == 'none') {
			document.getElementById('mdvMapArea_' + route).style.display = 'block';
			onLoadMapHandler();
			mdvOutputMaps['mdvMap_' + route].display(); 
			
			mdvOutputMaps['mdvMap_' + route].displayJourney(sessionID, requestID, route);
			if (document.forms[0].itdLPxx_mapOpen) {
				document.forms[0].itdLPxx_outputMapOpen.value = 'open';
			}
		}
		else {
			document.getElementById('mdvMapArea_' + route).style.display = 'none';
			if (document.forms[0].itdLPxx_outputMapOpen) 
				document.forms[0].itdLPxx_outputMapOpen.value = '';
		}
	}
}


// ==================================================================
// This checkes the password spelling: it compares two passwords
// entered by the user.
// ==================================================================

function checkPassword() {
	if(document.forms[0].ppPersonNetPassword.value!=document.forms[0].ppPersonConfirmNetPassword.value || document.forms[0].ppPersonNetPassword.value=='') {
		alert(passwordInvalid);
		document.forms[0].ppPersonNetPassword.value="";
		document.forms[0].ppPersonConfirmNetPassword.value="";
	}
	else
		document.forms[0].submit();
}

// ==================================================================
// This function changes the odv type for "my locations" and "recentlocation"
// from any to pp/hp.
// ==================================================================

function togglePPType(state, usage, ppType) {
	if(document.getElementById('type_' + usage) && document.getElementById('itdLPxx_ppOdv_' + usage)) { 
		// personal location selected
		if (state && ppType) {
			if(ppType=='hp') 
				document.getElementById('type_' + usage).value = 'pp';
			else 
				document.getElementById('type_' + usage).value = ppType;
			document.getElementById('itdLPxx_ppOdv_' + usage).value = ppType;
			document.forms[0].submit();
		}
		// other odv type selected (any)
		else 
			document.getElementById('type_' + usage).value = 'any';
	}
}


// ==================================================================
// Find a certain parent tag (first occurance) and hide it
// ==================================================================

function closeParentTag(el, tag) {
				
	var parentEl = el.parentNode;
	var cnt = 0;
	
	// use counter to avoid infinite loop
	// nesting depth 20 should be enough...
	while (parentEl.tagName.toUpperCase() !== tag.toUpperCase() && cnt < 20) {
		parentEl = parentEl.parentNode;
		cnt++;
	} 
	// we found one
	if (cnt < 20) {
		parentEl.style.display = 'none';
	}
}

// ==================================================================
// advanced options, pram and wheelchair
// ==================================================================

function toggleCheckboxes(input, arr) {
		
	if (input.id === 'pram' && 
		mdvLib.$('wch').checked === true) {
		return true;
	}
	
	if (input.id === 'wch' && 
		input.checked === false && 
		mdvLib.$('pram').checked === true) {
		mdvLib.$(arr[2]).checked = false;
		return true;
	}

	for (var i = 0; i < arr.length; i++) {
		var elem = mdvLib.$(arr[i]);
		elem.checked = input.checked; 
	}
}

function deselectCheckboxes(input, arr) {
								
	if (input.checked === true) {
		return true;
	}
	for (var i = 0; i < arr.length; i++) {
		var elem = mdvLib.$(arr[i]);
		elem.checked = false; 
	}
	return true;
}

function checkHandycapOptions() {
	
	var noSolidStairs = document.getElementById('noSolidStairs');
	var noEscalators = document.getElementById('noEscalators');
	var wheelchair = document.getElementById('wheelchair');
	
	if (!noSolidStairs || !noEscalators || !wheelchair) {
		return true;
	}
	
	if(noSolidStairs.checked === true && noEscalators.checked === true && wheelchair.checked === false) {
		document.getElementById('pram').checked = true;
	} 
	
	if(noSolidStairs.checked === true && noEscalators.checked === true && wheelchair.checked === true) {
		document.getElementById('wch').checked = true;
	}	

}

function checkTripSelectors() {

	var form = document.getElementById('print');
	
	if (!form) {
		return;
	}
	
	var routes = (!currentNoOfRoutes) ? 0 : parseInt(currentNoOfRoutes, 10);

	function appenHiddenField(name, value) {
		var elem = document.createElement('input');
		elem.type = 'hidden';
		elem.name = name;
		elem.value = value;
		form.appendChild(elem);
	}
		
	for (var i=1; i<=routes; i++) {
		
		for(var j=0; j < form.elements.length; j++) {
			if (form.elements[j].name === 'tripSelector' + i) {
				form.removeChild(form.elements[j]);
			}
		} 

		if (document.getElementById('tripSelector' + i) && document.getElementById('tripSelector' + i).checked === true) {
			var n = 'tripSelector' + i;
			appenHiddenField(n, 'on');
		}
	} 
}

function checkDetailviewSelectors() {
	
	// reset itdLPxx_showDetailview
	if (document.forms[0].itdLPxx_showDetailview) {
		document.forms[0].itdLPxx_showDetailview.value = '';
	}
	
	var routes = (!currentNoOfRoutes) ? 0 : parseInt(currentNoOfRoutes, 10);
	var printRoutes = '';
	var form = document.forms[0];
	
	if (!form) {
		return;
	}
	
	for (var i=1; i<=routes; i++) {
		for (var j=0; j < form.elements.length; j++) {
			if (form.elements[j].name === 'tripSelector' + i) {
				if (form.elements[j].checked === true) {
					printRoutes += i + '|';
				}
			}
		} 
	} 
	
	appendHiddenField('itdLPxx_printRoutes', printRoutes);
	
}

function togglePrintRoutes(routesToShow, noOfRoutes) {

	appendHiddenField('itdLPxx_isPrint', '1');
	
	if (typeof routesToShow === 'undefined' || routesToShow === '') {
		return;
	}
	
	var  routes = routesToShow.split('|');
	
	for (var i=0; i<routes.length; i++) {
		toggleDetailview('detail_'+routes[i], parseInt(noOfRoutes, 10), true);
	}
	
}

function appendHiddenField(name, value) {
	
	var form = document.forms[0];
	
	if (!form) {
		return;
	}
	
	if (form[name]) {
		form[name].value=value;
		return;
	}
	var elem = document.createElement('input');
	elem.type = 'hidden';
	elem.name = name;
	elem.id = name;
	elem.value = value;
	form.appendChild(elem);
}

attachEventListener(window, 'load', checkHandycapOptions, false);
