function goBack(form, step) {
	form.action="step"+step+".do"
	form.submit();
}

function checkTerms(){
	var ch = document.getElementById('agree')
	if (!ch.checked){
		 alert("Please read terms & conditions");
		 return false
	}
	return true;
}

function submitForm(form, car_id, car_name, car_image,supplierId,dropSupplierId,car_price,deposit,cur,driverFee,dropFee, outOfHoursFee, discount, reasonForDiscount, isDeposit, realDeposit, balancePaymentDate){
	form.carId.value=car_id
	form.carName.value=car_name
	form.carImage.value=car_image
	form.carSupplierId.value=supplierId
	form.dropCarSupplierId.value=dropSupplierId
	form.carPrice.value=car_price
	form.deposit.value=deposit
	form.currency.value=cur
	form.driverFee.value=driverFee
	form.dropOffFee.value=dropFee
	form.outOfHoursFee.value=outOfHoursFee
	form.discount.value=discount
	form.reasonForDiscount.value=reasonForDiscount
	form.paymentType.value = isDeposit
	form.realDeposit.value = realDeposit
	form.balancePaymentDate.value = balancePaymentDate
	form.submit();
}

/**
 * Function is executed when user selects any quantity of extras. Function performs complex of actions
 * wich main are : 	1. counts total price for booking;
 *					2. counts total price for extras;
 *					3. counts total price for extras the customer is paying at the time of rental (now)
 *					4. counts total price for extras the customer is paying when pick-ups the car (locally)
 */
function getTotalPrice(form) {
	totalElement = document.getElementById("totalPrice")
	depositElement = document.getElementById("totalDeposit")
	payNowElement = document.getElementById("payNowPrice")
	payLocElement = document.getElementById("payLocPrice")
	extrasElement = document.getElementById("extraPrice")
	paymentType = form.paymentType.value;

	extras = ""
	var deposit = form.deposit.value
	var payNow = form.payNowPrice.value
	var payLoc = form.payLocPrice.value
	var total = parseFloat(form.carPrice.value)
	var equipment = 0
	var str = '';

	if (form.isDriverFeeLocal.value == 'true') {
		equipment += parseFloat(form.driverFeeLocal.value)
	} else {
		total += parseFloat(form.driverFee.value)
	}

	if (form.isDropOffFeeLocal.value == 'true') {
		equipment += parseFloat(form.dropOffFeeLocal.value)
	} else {
		total += parseFloat(form.dropOffFee.value)
	}

    if (form.isOutOfHoursFeeLocal) {
        if (form.isOutOfHoursFeeLocal.value == 'true') {
            equipment += parseFloat(form.outOfHoursFeeLocal.value)
        } else {
            total += parseFloat(form.outOfHoursFee.value)
        }
    }
    else if (form.outOfHoursFeeLocalApplicable) {
        if (form.outOfHoursFeeLocalApplicable.value == 'true') {
            equipment += parseFloat(form.outOfHoursFeeLocal.value)
        } else {
            total += parseFloat(form.outOfHoursFee.value)
        }
    }

    if (paymentType == "Deposit Prepayment") {
		result = countSelectedExtras();
		total = parseFloat(total) + parseFloat(result[0])
		deposit = parseFloat(deposit) + parseFloat(result[1])
		extras += result[2];

		payNow = result[1]
		payLoc = parseFloat(result[0]) - parseFloat(result[1])
		depositElement.value = toDouble(deposit)
	}
  else if (paymentType == "Total Prepayment") {
		result = countSelectedExtras2();
		total = parseFloat(total) + parseFloat(result[0]);
		extras += result[2];

		payNow = result[0];
		payLoc = result[1];
	}
	if (form.currencyRate.value != 0) {
    equipment = parseFloat(equipment) + parseFloat(payLoc)/parseFloat(form.currencyRate.value);
	}
  else {
		equipment = parseFloat(equipment) + parseFloat(payLoc);
	}
	payNowElement.value = toDouble(payNow);
	payLocElement.value = toDouble(payLoc);
	totalElement.value = toDouble(total);
	extrasElement.value = toDouble(equipment);

	form.extras.value = replaceAll(extras, 'ID', '');
}

/**
 * Used in case of 'deposit prepayment' payment type.
 * Counts selected extras payments total/deposit, makes selected extras string.
 */
function countSelectedExtras() {
	var price = 0
	var deposit = 0
	var extras = "";
	for(var i in payLocPrice){
		var extraDropDown = document.getElementById(i); // extra dropdown
		if (extraDropDown && extraDropDown.selectedIndex > 0){
			quantity = extraDropDown.options[extraDropDown.selectedIndex].value
			extraPrice = payLocPrice[i] * quantity
			extraDeposit = (payLocPrice[i] - netPrice[i]) * quantity
			price = parseFloat(price) + parseFloat(extraPrice)
			deposit = parseFloat(deposit) + parseFloat(extraDeposit)
			extras += " "+i+":"+quantity
		}
	}
	for(var i in payNowPrice){
		var extraDropDown = document.getElementById(i); // extra dropdown
		if (extraDropDown && extraDropDown.selectedIndex > 0){
			quantity = extraDropDown.options[extraDropDown.selectedIndex].value
			extraPrice = payNowPrice[i] * quantity
			price = parseFloat(price) + parseFloat(extraPrice)
			deposit = parseFloat(deposit) + parseFloat(extraPrice)
			extras += " "+i+":"+quantity
		}
	}
	return [price, deposit, extras];
}

/**
 * Used in case of 'total prepayment' payment type.
 * Counts selected extras payments total/pay locally, makes selected extras string.
 */
function countSelectedExtras2() {
	var payNow = 0
	var payLoc = 0
	var extras = "";
	for(var i in payLocPrice) {
		var extraDropDown = document.getElementById(i); // extra dropdown
		if (extraDropDown && extraDropDown.selectedIndex > 0){
			quantity = extraDropDown.options[extraDropDown.selectedIndex].value
			extraPrice = payLocPrice[i] * quantity
			payLoc = parseFloat(payLoc) + parseFloat(extraPrice)
			extras += " "+i+":"+quantity
		}
	}
	for(var i in payNowPrice) {
		var extraDropDown = document.getElementById(i); // extra dropdown
		if (extraDropDown && extraDropDown.selectedIndex > 0){
			quantity = extraDropDown.options[extraDropDown.selectedIndex].value
			extraPrice = payNowPrice[i] * quantity
			payNow = parseFloat(payNow) + parseFloat(extraPrice)
			extras += " "+i+":"+quantity
		}
	}
	return [payNow, payLoc, extras];
}

function show_popup($obj) {
	var pos = findPos(document.getElementById('popupPoint'))
	document.getElementById($obj).style.left = pos[0]+3 + "px";
	document.getElementById($obj).style.display = 'block';
}

function show_popup2($obj, id) {
	var pos = findPos(document.getElementById('popupPoint'))
	var pos2 = findPos(document.getElementById(id))
	document.getElementById($obj).style.left = pos[0]+3 + "px";
	document.getElementById($obj).style.top = pos2[1]-100 + "px";
	document.getElementById($obj).style.display = 'block';
}

function hide_popup($obj){
	document.getElementById($obj).style.display = 'none';
}

function makeOpts(id, amount, def){
	elem=document.getElementById(id);
	for(j = 0; j <= amount; j++){
		elem.options[j] = new Option(j, j);
	}
	selectValue(elem, def);
}

/**
 * Runs vehicles searching according to selected subgroups.
 */
function filterCars() {
	count = 0;
	currentGroup = 0;
	if (groups[currentGroup] == '')
		nextGroup()

	searchElem = document.getElementById('results')
    searchElem.innerHTML = ('')

	elem = document.getElementById('searching')
	elem.innerHTML = '<font class="h2">Searching... <img src="images/searching.gif" alt="searching" style="vertical-align: middle;"/></font>'
	getVehicles(groups[currentGroup], 'true')
}

/**
 * Opens popup window to display vehicle info.
 */
function showCarInfo(carSupplierId, car_image, car_name, transmission, airco, comments) {
	getTerms(carSupplierId)

	var carHas = transmission + " Transmission";
	if (airco == "YES") {
		carHas = carHas + " with Air Conditioning";
	} else {
		carHas = carHas + " without Air Conditioning";
	}
	document.getElementById('carIm').src = car_image;
	document.getElementById('carInfoHeader').innerHTML = '<b>' + car_name + ' Or Similar</b>';
	document.getElementById('carInfoHeader2').innerHTML = '<b>' + carHas + '</b>'

	try {
		if (comments != "" && comments != " ")
			document.getElementById('comments').innerHTML = "Comments: " + comments
		else
			document.getElementById('comments').innerHTML = ''
	} catch (e) {
	}

	var pos = findPos(document.getElementById('popupPoint'))
	document.getElementById('popup').style.left = pos[0]+3 + "px";
	document.getElementById('popup').style.top = document.documentElement.scrollTop + "px";
	document.getElementById('popup').style.display = 'block';
}

function submitToStep4(form){
	if (!checkTerms())
		return;
	getTotalPrice(form);
	form.submit();
}

/**
 * Sets defaults: United Kingdom as a customer country and 1967 as customer birthYear.
 */
function setUKandYear(form) {
	selectValue(form.country, "United Kingdom");
	selectValue(form.birthYear, "1967");
}

/**
 * Displays or hides 'issue number' html elements, according to selected paymentcard.
 *
 * @param selectedCard -
 *						payment card.
 */
function showIssueNumber(selectedCard) {
	if (selectedCard == 'UK Maestro') {
		document.getElementById('inumbertitle').style.display = 'block'
		document.getElementById('inumber').style.display = 'block'
	} else {
		document.getElementById('inumbertitle').style.display = 'none'
		document.getElementById('inumber').style.display = 'none'
	}
}

function showExtraPopup(image, name, comments) {
	if (image == SSL_IMAGES_DOMAIN+'/unsecure/') {
		document.getElementById('eImage').style.display = 'none';
		document.getElementById('eImageExplanation').style.display = 'none';
	} else {
		document.getElementById('extraImage').src = image;
		document.getElementById('eImage').style.display = 'block';
		document.getElementById('eImageExplanation').style.display = 'block';
	}
	document.getElementById('extraName').innerHTML = '<b>'+name+'</b>';
	document.getElementById('extraComments').innerHTML = comments;

	var pos = findPos(document.getElementById('popupPoint'))
	document.getElementById('extra_info').style.left = pos[0]+3 + "px";
	document.getElementById('extra_info').style.display = 'block';
}

/**
 * Displays simple internal frame with comment for 'pay-now' extra.
 */
function showPaynowPopup(element_id) {
	var pos = findPos(document.getElementById(element_id))
	document.getElementById('payment_info_N').style.top = pos[1]-100 + "px";
	document.getElementById('payment_info_N').style.left = pos[0]-300 + "px";
	document.getElementById('payment_info_N').style.display = 'block';
}

/**
 * Displays simple internal frame with comment for 'pay-locally' extra.
 */
function showPaylocPopup(element_id) {
	var pos = findPos(document.getElementById(element_id))
	document.getElementById('payment_info_L').style.top = pos[1]-100 + "px";
	document.getElementById('payment_info_L').style.left = pos[0]-300 + "px";
	document.getElementById('payment_info_L').style.display = 'block';
}

function submitQuote(form){
	if (!checkTerms())
		return;

	getTotalPrice(form);
	form.quote.value="1"
	var uri="saveQuote.do"
  var oldAction = form.action;
  form.action=uri
	form.submit();
  form.action = oldAction;
}

function showComment(val) {
	if (val == 1) {
		document.getElementById('infotd').style.display = 'block'
		document.getElementById('infotd2').style.display = 'none'
	} else if (val == 2) {
		document.getElementById('pickinfotd').style.display = 'block'
		document.getElementById('pickinfotd2').style.display = 'none'
	} else if (val == 3) {
		document.getElementById('dropinfotd').style.display = 'block'
		document.getElementById('dropinfotd2').style.display = 'none'
	}
}

/**
 * Function updates credit card expiry month selection:  if the current year selected than the
 * months selection is cut until current month.
 */
function updateCardExpMon(form) {
	var curDate = new Date()
	expYear = form.cardExpireYear.options[form.cardExpireYear.selectedIndex].text
	expMon = form.cardExpireMon.options[form.cardExpireMon.selectedIndex].text

	var curYear = curDate.getYear()
	if (!isMSIE()) {
		curYear += 1900
	}

	if (expYear > curYear) {
		emptyOptions(form.cardExpireMon, 0)
		var index=0;
		for(i=1; i<=12; i++){
			j = (i<10)?"0"+i:i
			form.cardExpireMon.options[index++]=new Option(j,i)
		}
	} else {
		emptyOptions(form.cardExpireMon, 0)
		var index=0;
		for(i=curDate.getMonth()+1; i<=12; i++){
			j = (i<10)?"0"+i:i
			form.cardExpireMon.options[index++]=new Option(j,i)
		}
	}
	selectValue(form.cardExpireMon, expMon);
}

/**
 * Function updates credit card valid from month selection:  if the current year selected than the
 * months selection is cut above current month.
 */
function updateCardValidFromMon(form) {
	var curDate = new Date()
	validYear = form.validFromYear.options[form.validFromYear.selectedIndex].text
	validMon = form.validFromMon.options[form.validFromMon.selectedIndex].text

	var curYear = curDate.getYear()
	if (!isMSIE()) {
		curYear += 1900
	}

	if (validYear == '' || validYear < curYear) {
		emptyOptions(form.validFromMon, 0)
		var index=0;
		for(i=1; i<=12; i++){
			j = (i<10)?"0"+i:i
			form.validFromMon.options[index++]=new Option(j,i)
		}
	} else if (validYear == curYear) {
		emptyOptions(form.validFromMon, 0)
		var index=0;
		for(i=1; i<=curDate.getMonth()+1; i++){
			j = (i<10)?"0"+i:i
			form.validFromMon.options[index++]=new Option(j,i)
		}
	}
	selectValue(form.validFromMon, validMon);
}

function selectAllGroups() {
	for (var i in groups2) {
		document.getElementById(groups2[i]).checked = "checked"
		groups[i] = groups2[i]
	}
}

function initFilter() {
	f = document.bookingBean
	var subgroup = f.carSubgroup.value

	if (subgroup == 'Any') {
		selectAllGroups()
	} else {
		document.getElementById(subgroup).checked = "checked"
		groups[0] = subgroup
	}
}

function changeFilter(elem) {
	document.getElementById('filterOn').checked = "checked"
	if (elem.checked == true) {
		for (var i in groups) {
			if (groups[i] == '') {
				groups[i] = elem.id
				return;
			}
		}
	} else {
		for (var i in groups) {
			if (groups[i] == elem.id) {
				groups[i] = ''
				return
			}
		}
	}

}

function initExtras(extras)
{
	//var str='';
	//
	if (extras != "")
	{

		var extrasAr = new Array();
		var extra = new Array();


		extras = LTrim(extras);
		extrasAr = extras.split(" ");

		for(i=0;i<extrasAr.length;i++){
			extra = extrasAr[i].split(":")
			if(extra)
			{
				//document.getElementById(extra[0]).value=extra[1]
				obj = document.getElementById(extra[0]);
				index = extra[1];
				obj.options[index].selected = true;

				//str += '  ' + extra[0] + '=' + extra[1];
			}
		}

		//alert(str);
	}
}

function initExtras2(extras) {
	if (extras != "") {

		var extrasAr = new Array();
		var extra = new Array();

		extras = LTrim(extras);
		extrasAr = extras.split(" ");

		for(i = 0; i < extrasAr.length; i++){
			extra = extrasAr[i].split(":");
			if(extra) {
				obj = $('ID' + extra[0]);
        obj.setValue(extra[1]);
			}
		}
	}
}

function addSubgroup(collection, index, subgroup) {
	collection[index] = subgroup
}

/**
 * Executed when pickUpDay changed, sets the dropOffDay value same as pickUpDay value.
 */
function updateDropDay(f) {
	selectValue(f.dropOffDay, f.pickUpDay.options[f.pickUpDay.selectedIndex].text);
}

/**
 * Executed when pickUpMonth changed, sets the dropOffMonth value same as pickUpMonth value.
 */
function updateDropMon(f) {
	selectValue(f.dropOffMon, f.pickUpMon.options[f.pickUpMon.selectedIndex].text);
}

/**
 * Executed when pickUpYear changed, sets the dropOffYear value same as pickUpYear value.
 */
function updateDropYear(f) {
	selectValue(f.dropOffYear, f.pickUpYear.options[f.pickUpYear.selectedIndex].text);
}

/**
 * Validates pickUpDate, controls whether this is less than current date or not.
 */
function checkPickUpDate(f) {
	var pickDate = new Date();
	var date = new Date();
	pickYear = f.pickUpYear.options[f.pickUpYear.selectedIndex].text;
	pickMon  = f.pickUpMon.selectedIndex;
	pickDay  = f.pickUpDay.options[f.pickUpDay.selectedIndex].text
	pickDate.setFullYear(pickYear, pickMon, pickDay);

	alertId = "alertMsg2a"
	actionId = "actiona"
	if (f == document.bookingBean) {
		alertId = 'alertMsg2'
		actionId = 'action'
	}
	if (date > pickDate) {
		document.getElementById(alertId).style.display = 'block';
		document.getElementById(actionId).disabled = true;
	} else {
		document.getElementById(alertId).style.display = 'none';
		document.getElementById(actionId).disabled = false;
	}
}

/**
 * Validates dropOffDate, controls whether this is less than pickUpDate or not.
 */
function checkDropDate(f) {
	var pickDate = new Date();
	var dropDate = new Date();

	pickYear = f.pickUpYear.options[f.pickUpYear.selectedIndex].text;
	pickMon  = f.pickUpMon.selectedIndex;
	pickDay  = f.pickUpDay.options[f.pickUpDay.selectedIndex].text

	dropYear = f.dropOffYear.options[f.dropOffYear.selectedIndex].text;
	dropMon  = f.dropOffMon.selectedIndex;
	dropDay  = f.dropOffDay.options[f.dropOffDay.selectedIndex].text
	pickDate.setFullYear(pickYear, pickMon, pickDay);
	dropDate.setFullYear(dropYear, dropMon, dropDay);

	var alertId = "alertMsga"
	var actionId = "actiona"
	if (f == document.bookingBean) {
		alertId = 'alertMsg'
		actionId = 'action'
	}

	if (dropDate < pickDate) {
		document.getElementById(alertId).style.display = 'block';
		document.getElementById(actionId).disabled = true;
	} else {
		document.getElementById(alertId).style.display = 'none';
		document.getElementById(actionId).disabled = false;
	}
}

/**
 * Updates number of days in the month. Executed when month or year (looking for leap years)
 * changed.
 *
 * @param spec -
 *				parameter specifies dayslist for update.
 *				1 - pickUpDays, 2 - dropOffDays, any other - birthDays
 */
function updateDays(spec, f) {
	if (spec == 1) {
		select_day = f.pickUpDay
		select_mon = f.pickUpMon
		select_year = f.pickUpYear
	} else if (spec == 2) {
		select_day = f.dropOffDay
		select_mon = f.dropOffMon
		select_year = f.dropOffYear
	} else {
		select_day = f.birthDay
		select_mon = f.birthMon
		select_year = f.birthYear
	}

	var selected = select_day.options[select_day.selectedIndex].text
	var month = select_mon.selectedIndex
	var year = parseInt(select_year.options[select_year.selectedIndex].text);

	emptyOptions(select_day, 31);
  fillDays(select_day, 31);

/*  if (month == 1) {
		fillDays(select_day, 31)
	} else if (month == 2) {
		if (year/4 == parseInt(year/4)) {
			fillDays(select_day, 29)
		} else {
			fillDays(select_day, 28)
		}
	} else if (month == 3) {
		fillDays(select_day, 31)
	} else if (month == 4) {
		fillDays(select_day, 30)
	} else if (month == 5) {
		fillDays(select_day, 31)
	} else if (month == 6) {
		fillDays(select_day, 30)
	} else if (month == 7) {
		fillDays(select_day, 31)
	} else if (month == 8) {
		fillDays(select_day, 31)
	} else if (month == 9) {
		fillDays(select_day, 30)
	} else if (month == 10) {
		fillDays(select_day, 31)
	} else if (month == 11) {
		fillDays(select_day, 30)
	} else if (month == 12) {
		fillDays(select_day, 31)
	}*/

	selectValue(select_day, selected);
}

/**
 * Helper method for updateDays() method, modifies days values list.
 *
 * @param formEl -
 *				html element which dropdown list will be changed. (pickUpDay/dropOffDay/birthDay)
 * @param max -
 *				maximum day available in specified month/year.
 */
function fillDays(formEl, max) {
	var index=26;
	for(i=26; i<=max; i++){
		formEl.options[index++]=new Option(i,i)
	}
}

/**
 * Performs complex of methods when pickUpDay changed.
 */
function manageDays(f) {
	try {
		updateDropDay(f)
		checkPickUpDate(f)
		updateOpenTimes(f)
		manageDays2(f)
	} catch (e) {
		alert('Please specify pick-up and drop-off locations')
	}
}

/**
 * Performs complex of methods when pickUpMonth changed.
 */
function manageMonths(f) {
	try {
		updateDropMon(f)
		checkPickUpDate(f)
		updateOpenTimes(f)
		updateDays(1, f)
		manageMonths2(f)
	} catch (e) {
		alert('Please specify pick-up and drop-off locations')
	}
}

/**
 * Performs complex of methods when pickUpYear changed.
 */
function manageYears(f) {
	try {
		updateDropYear(f)
		checkPickUpDate(f)
		updateOpenTimes(f)
		updateDays(1, f)
		manageYears2(f)
	} catch (e) {
		alert('Please specify pick-up and drop-off locations')
	}
}

/**
 * Performs complex of methods when dropOffDay changed.
 */
function manageDays2(f) {
	try {
		checkDropDate(f)
		updateDropTimes(f)
	} catch (e) {
		alert('Please specify pick-up and drop-off locations')
	}
}

/**
 * Performs complex of methods when dropOffMonth changed.
 */
function manageMonths2(f) {
	try {
		checkDropDate(f)
		updateDropTimes(f)
		updateDays(2, f)
	} catch (e) {
		alert('Please specify pick-up and drop-off locations')
	}
}

/**
 * Performs complex of methods when dropOffYear changed.
 */
function manageYears2(f) {
	try {
		checkDropDate(f)
		updateDropTimes(f)
		updateDays(2, f)
	} catch (e) {
		alert('Please specify pick-up and drop-off locations')
	}
}

/**
 * Sets initial values and dayslistsizes to pickUpDay/dropOffDay, pickUpLocName, dropOffLocName
 * and performs pickUp/dropOff dates validation.
 */
function setInitialValues(f) {
	try {
		updateDays(1, f)
		updateDays(2, f)
		selectValue(f.pickUpLocationId, f.pickUpLocName.value)
		selectValue(f.dropOffLocationId, f.dropOffLocName.value)
		checkPickUpDate(f)
		checkDropDate(f)
	} catch(e) {
	}
}

/**
 * Makes login fields visible.
 */
function showLoginFields(){
	if (document.getElementById('login_span')) {
		document.getElementById('login_span').style.display = 'block';
		document.getElementById('login_span2').style.display = 'block';
    if (document.getElementById('right')) {
      document.getElementById('right').style.display = 'none';
    }
  }
}

/**
 * Returns 'insert email' form fields to inital state.
 */
function setEmailInitialFields() {
	document.getElementById('email').value=''
	document.getElementById('mailedTo').style.display = 'block';
	document.getElementById('mailResult').style.display = 'none';
	document.getElementById('emailInvalid').style.display = 'none';
}

/**
 * Set selected extras quantity to 0 in drop-down elements.
 */
function clearExtras(array) {
	for (var i in array) {
    var element = $(i);
    if (element) {
      selectValue(element, '0');
    }
	}
}

/**
 * Performs credit card expiration date compare with current date, blocks proccess if the
 * date was put less than current date.
 */
function checkCardExpiryDate(form) {
	var date = new Date();
	date.setDate("1")

	var cardExpiryDate = new Date();
	cardExpiryYear = form.cardExpireYear.options[form.cardExpireYear.selectedIndex].text;
	cardExpiryMon  = form.cardExpireMon.selectedIndex;
	cardExpiryDay  = "1"

	if (cardExpiryYear == "" || cardExpiryMon == "") {
		return;
	}

	cardExpiryDate.setFullYear(cardExpiryYear, cardExpiryMon, cardExpiryDay);

	if (date > cardExpiryDate) {
		document.getElementById('alertCardExpiry').style.display = 'block';
		document.getElementById('submAction').disabled = true;
	} else {
		document.getElementById('alertCardExpiry').style.display = 'none';
		document.getElementById('submAction').disabled = false;
	}
}