page = {

	init: function() {
		// if quick search, init form and run avl
		if ( isset(app.uri.queryKey.quick) ) {
			this.avl($('avl-frm'));
		}
	},

	/**
	 * Search for available rentals
	 */
	avl: function(frm) {
		if ( hasValue($('bk-frm').srv_code) ) {
			this.clearSelections();
			dom.hide('avl-region','bk-region','extra-area');
		}

		if ( !hasValue(frm.cnt_code) ) { return form.error("Please select at least a country ( Location field )."); }
		if ( !hasValue(frm.fromd) ) { return form.error("Please input delivery date.", frm.fromd); }
		if ( app.today.dayDiff(getValue(frm.fromd).toDate()) < 1 ) { return form.error("Please select a date after " + app.today.format()); }
		if ( !hasValue(frm.tod) ) { return form.error("Please input collection date.", frm.tod); }
		if ( !hasValue(frm.cars) ) { return form.error("Please input number of cars.", frm.cars); }

		// set labels
		$('pickup_date').innerHTML = frm.fromd.value;
		$('dropoff_date').innerHTML = frm.tod.value;
		var tbl = $('avl-tbl');
		ajax.queue(this.chkAvl, tbl.action);
		tbl.addRows(frm, "?action=avl", "Searching for available cars.");
		tbl = null;
		return false;
	},

	chkAvl: function() {
		var xmlDoc = ajax.getXML($('avl-tbl').action);

		// do we have any results?
		if ( parseInt(xmlDoc.getAttribute('totalrows'), 10) === 0 ) {
			dom.console(4, "No available group(s) have been found with the criteria specified.");
			return;
		}
		
		// handle places
		node = xmlDoc.getElementsByTagName('places')[0];
		var json = new Function('return '+(node.text||node.textContent))();
		if ( !json.places.length ) {
			dom.console(4, "No delivery or collection places were found for the selected cities.");
			return;
		}
		
		var frmAvl = $('avl-frm'), frm = $('bk-frm'), optD, optC;
		
		frm.fromd.value = frmAvl.fromd.value;
		frm.tod.value = frmAvl.tod.value;
		frm.cars.value = frmAvl.cars.value;
		frm.unlimited_km.value = frmAvl.unlimited_km.checked ? 1 : 0;

		// fill select boxes
		for ( var i=0; i < json.places.length; i=i+4 ) {
			optD = document.createElement('option');
			optC = document.createElement('option');
			optD.value = optC.value = json.places[i];
			optD.innerHTML = optC.innerHTML = json.places[i+2] + ' - ' + json.places[i+1] + ( json.places[i+3].length ? ' ( ' + json.places[i+3] +' ) ' : '' );
			frm.del_place_id.appendChild(optD);
			frm.col_place_id.appendChild(optC);
		}
		frm = null;

		dom.show('avl-region');
	},

	clearSelections: function() {
		// clear places
		var frm = $('bk-frm');
		for ( var i=frm.del_place_id.length-1; i >= 0; i-- ) {
			frm.del_place_id.remove(i);
		}
		for ( i=frm.col_place_id.length-1; i > 0; i-- ) {
			frm.col_place_id.remove(i);
		}
		frm=null;

		// clear labels
		$('pref_vehicle').innerHTML = lang.common.no_sel;
		$('tot_group_price').innerHTML = (0.0).currencyFormat() + ' &euro;';
		$('tot_extra_price').innerHTML = (0.0).currencyFormat() + ' &euro;';
		$('tot_price').innerHTML = (0.0).currencyFormat() + ' &euro;';
		$('min_age').innerHTML = lang.common.na;
		$('max_age').innerHTML = lang.common.na;
		$('min_lic').innerHTML = lang.common.na;

		$('sum_status').innerHTML = lang.common.na;
		$('sum_status').style.color = "";

		// clear tables
		$('extra-tbl').clear();
	},

	/**
	 * Select a vehicle and do appropriate actions
	 * @method
	 */
	srvSel: function(obj, group_id) {
		dom.hide('extra-area');

		// set form values
		var frm = $('bk-frm'), tbl = $('extra-tbl');
		app.row = obj.parentNode.parentNode;

		frm.srv_code.value = app.row.getAttribute('crr_code');
		frm.group_id.value = group_id;
		frm.version_id.value = app.row.getAttribute('version_id');
		frm.downpayment.value = app.row.getAttribute('downpayment') || 100.00;
		frm.status.value = app.row.getAttribute('status');
		if ( frm.status.value == 'AV' ) {
			frm.status.value = 'AVL';
		}

		var statObj = $('sum_status');
		switch ( frm.status.value ) {
		case 'AVL':
			statObj.innerHTML = lang.common.available;
			statObj.style.color = "green";
			break;
		case 'OR':
			statObj.innerHTML = lang.common.or;
			statObj.style.color = "orange";
			break;
		case 'NA':
			statObj.innerHTML = lang.common.not_available;
			statObj.style.color = "red";
			break;
		}

		// update labels
		$('tot_group_price').innerHTML = app.row.getAttribute('price').currencyFormat() + " &euro;";
		$('tot_down').innerHTML = frm.downpayment.value.currencyFormat() + '%';
		$('min_age').innerHTML = app.row.getAttribute('min_age').length ? app.row.getAttribute('min_age') : lang.no_limitations;
		$('max_age').innerHTML = app.row.getAttribute('max_age').length ? app.row.getAttribute('max_age') : lang.no_limitations;
		$('min_lic').innerHTML = app.row.getAttribute('min_lic').length ? 'at least ' + app.row.getAttribute('min_lic') : lang.no_limitations;
		$('pref_vehicle').innerHTML = app.row.getAttribute('vehicle').length ? app.row.getAttribute('vehicle') : lang.common.no_sel;

		ajax.post(frm);
		ajax.stack(this.sumAll, tbl.action);
		tbl.addRows(frm, "?action=def_extra", "Loading default supplements and fees.");

		dom.show('bk-region');
		tbl=frm=null;
	},

	sumAll: function() {
		dom.show('extra-area');
		var extra_price = 0.0;

		if ( $('extra-tbl').rowCount ) {
			Array.forEach($('extra-tbl').getRows(), function(r) {
				extra_price += r.cells[8].innerHTML.parseCurrency();
			});
		}

		$('tot_extra_price').innerHTML = extra_price.currencyFormat() + " &euro;";
		$('tot_price').innerHTML = ($('tot_group_price').innerHTML.parseCurrency() + extra_price).currencyFormat() + " &euro;";
		$('tot_pay').innerHTML = ($('tot_price').innerHTML.parseCurrency()*parseFloat($('bk-frm').downpayment.value)/100.0).currencyFormat() + " &euro;";
	},

	// Car Selection
	selCar: function() {
		var frm = $('bk-frm');
		ajax.load("?action=carSel&crr_code="+frm.srv_code.value+"&group_id="+getValue(frm.group_id), "carSel", "Loading available vehicles.");
		frm=null;
		return false;
	},

	carApply: function(pref, vId) {
		$('pref_vehicle').innerHTML = pref;
		$('bk-frm').version_id.value = vId;
		modal.close('carSel');
	},

	//---( EXTRAS ADDITIONS )---//
	extraAdd: function(frm) {
		ajax.post(frm, 'fromd', 'tod', 'srv_code', 'group_id', 'cars');
		ajax.load(frm.action + "?action=extras", "extra_bk", "Loading extra selection list.");
	},

	extraSel: function() {
		var frm = $('bk-frm');
		var cars = parseInt(frm.cars.value, 10);
		var carSel = "1";

		if ( cars > 1 ) {
			carStrB = new StringBuilder();
			Array.forEach($$('input', 'extras-veh'), function(chk){
				if ( chk.checked ) {
					carStrB.append(chk.value);
				}
			});
			if ( carStrB.isEmpty() ) {
				return form.error("At least one car should be selected.", $$('input', 'extras-veh')[0]);
			}
			carSel = carStrB.toString(',');
		}

		ajax.post(frm, 'fromd', 'tod', 'srv_code', 'group_id', 'cars');
		ajax.load("?action=extraAdd&extra_type=" + app.row.getAttribute('extra_type') + "&extra_code=" + app.row.getAttribute('extra_code') + "&carSel=" + carSel, "extra_bk", "Loading details form for selected extra.");
	},

	exIndCheck: function(obj) {
		var stObj = obj.form.dayIndexSt;
		var enObj = obj.form.dayIndexEn;
		var stObjChecked, enObjChecked = null;

		for ( var i=0; i < stObj.length; i++ ) {
			if ( stObj[i].checked ) {
				stObjChecked = stObj[i];
				break;
			}
		}

		for ( i=0; i < enObj.length; i++ ) {
			if ( enObj[i].checked ) {
				enObjChecked = enObj[i];
				break;
			}
		}

		if ( stObjChecked.value > enObjChecked.value ) {
			if ( obj.name == 'dayIndexSt' ) {
				enObj[stObjChecked.value-1].checked = true;
			} else {
				stObj[enObjChecked.value-1].checked = true;
			}
		}
	},

	extraAddValidate: function(frm) {
		if ( !validateInt(frm.units, 1) ) { return form.error("Please input a valid number of units (at least 1).", frm.units); }

		queryAppend(frm, "action=extraAddHnd");
		ajax.stack(this.sumAll, $('extra-tbl').action);
		$('extra-tbl').recordAdd(frm, frm.action, "Adding selected extra to booking form.");
		return false;
	},

	extraDel: function() {
		if ( dom.confirm("Are you sure you want to remove this extra?") ) {
			$('extra-tbl').deleteRow(app.row);
			page.sumAll();
		}
	},

	//---( BOOKING )---//
	addService: function(frm) {
		// validate form
		if ( !hasValue(frm.group_id) ) { return form.error("Please select a group to continue."); }
		if ( !hasValue(frm.del_place_id) ) { return form.error("Please select place of delivery."); }
		if ( !hasValue(frm.del_time) ) { return form.error("Please input time of delivery."); }
		if ( !hasValue(frm.col_time) ) { return form.error("Please input time of collection."); }
		frm.price.value = $('tot_price').innerHTML.parseCurrency();

		// create extras strings
		// car_no1:extra_type1:extra_code1:per_type1:units1:fromd1:tod1^
		if ( $('extra-tbl').rowCount ) {
			var extraStr = new StringBuilder();
			Array.forEach($('extra-tbl').getRows(), function(r) {
				if ( r.getAttribute('extra_substr') ) {
					extraStr.append(r.getAttribute('extra_substr'));
				}
			});
			frm.extras_str.value = extraStr.toString('^') + '^';
		} else {
			frm.extras_str.value = "";
		}

		ajax.queue(this.bkHnd, "crr_bk");
		ajax.post(frm);
		ajax.loadXML("bookings/add_service.cfm", "crr_bk", "Adding service to shopping cart.");
	},

	bkHnd: function() {
		if ( !ajax.checkXMLResult( "crr_bk", true ) ) {
			ajax.checkXMLResult("crr_bk");
			return false;
		}
		nav("cart.cfm");
	}

};