(function(){

var ajaxId = "ajax-act",
	chrMode = 1,
	rndDatesId = "chr-rnd",
	avlTblId = "avl-tbl",
	ajaxAvl = "ajax-avl",
	preBookId = "ajax-prebook",
	bookId = "ajax-book",
	bookBtn = 'book-btn',
	step1 = 'step-1',
	step2 = 'step-2',
	step3 = 'step-3',
	ticketPrice = 0.0,
	extras = null,
	rowA = null,
	rowR = null;

Queue.add(function(){
	var frm = document.forms.avlFrm;

	if ( parseInt(getValue(frm.chr_type), 10) != 1 ) {
		dom.show(rndDatesId);
	}
	Event.on(cssQuery('input[name=chr_type]', frm), 'click', dirChange, frm.chr_type);
	setDefaultItin();

	if ( isset(app.uri.queryKey.quick) ) {
		setTimeout(page.avl.callback(frm), 100);
	}
	frm=null;
});
/*
Queue.add(function(){
	var frm = document.forms.avlFrm;
	frm.dep_air.value="";
	frm.arr_air.value="";
	
	depCompleteflt = new v8.AutoComplete(frm.dep_air,
						JS.apply(
								 
							new v8.AutoComplete.Ajax('common/all_airport.list.cfm'),	// we don't pass a url here @see: page.topologyChange()
							{
								format: function(data) {
									
									return Array.map(data.output, function(output, i) {
										return data.city[i] + ', ' +output;
									});
									
								},
								handle: function(data, i, input) {
									input.value =  data.city[i];
									frm.dep_cty_air_code.value= data.codes[i];
									frm.dep_cty_code.value= data.cty_codes[i];
									frm.dep_cnt_code.value= data.cnt_codes[i];									
								}
							}
						), {delay:0.1, max:20, threshold:3, width: 300});
	colCompleteflt = new v8.AutoComplete(frm.arr_air,
						JS.apply(
							new v8.AutoComplete.Ajax('common/all_airport.list.cfm'),	// we don't pass a url here @see: page.topologyChange()
							{
								
								format: function(data) {
									
									return Array.map(data.output, function(output, i) {
										return data.city[i] + ', ' +output;
									});
									
								},
								handle: function(data, i, input) {
									input.value =  data.city[i];
									frm.arr_cty_air_code.value= data.codes[i];
									frm.arr_cty_code.value= data.cty_codes[i];
									frm.arr_cnt_code.value= data.cnt_codes[i];						
								}
							}
						), {delay:0.1, max:20, threshold:3, width: 300});
	var depCompleteflt=null,
		colCompleteflt=null;
									
});*/

function dirChange(e, obj) {
	dom[parseInt(getValue(obj), 10) == 1 ? "hide" : "show"](rndDatesId);
	setDefaultItin();
}

// This sets default itinerary for One-way to GR->UK and Roundtrip to UK->GR
function setDefaultItin() {
	var frm = document.forms.avlFrm;
	if ( !app.meta['x-cnt-uk'] || getValue(frm.dep_cty_code)  || getValue(frm.arr_cty_code) ) {
		return;
	}
	var uk = app.meta['x-cnt-uk'].split(','),
		gr = app.meta['x-cnt-gr'].split(',');

	if (( !getValue(frm.dep_cnt_code) || getValue(frm.dep_cnt_code) == uk[0] || getValue(frm.dep_cnt_code) == gr[0] )
		&& ( !getValue(frm.arr_cnt_code) || getValue(frm.arr_cnt_code) == uk[0] || getValue(frm.arr_cnt_code) == gr[0] )
	
	) {
		if ( getValue(frm.chr_type) == '1' ) {
			v8.PTopology.set(frm.dep_cnt_code, gr[0], "", "", gr[1], "", "");
			v8.PTopology.set(frm.arr_cnt_code, uk[0], "", "", uk[1], "", "");
		} else {
			v8.PTopology.set(frm.dep_cnt_code, uk[0], "", "", uk[1], "", "");
			v8.PTopology.set(frm.arr_cnt_code, gr[0], "", "", gr[1], "", "");
		}
	}
}

function avlHnd() {
	var xmlObj = ajax.getXML(ajaxAvl);

	if ( parseInt(xmlObj.getAttribute('flag'), 10) > 1 ) {
		return ajax.checkXMLResult(ajaxAvl);
	}

	$(avlTblId).addRowsXML(xmlObj);
	if ( dom.getStyle(step1, 'display') != 'none' ) {
		dom.fadeInOut(step2,step1);
		//dom.hide('rightc');
	} else {
		dom.fadeIn(step2);
	}
}

function flightSelect() {
	var row = app.row,
		isExternal = parseInt(row.getAttribute('external'), 10) == 1,
		direction = row.getAttribute('direction');

	// handle selections
	if ( direction == 'A' ) {
		rowA = row;
	} else {
		rowR = row;
	}

	if ( chrMode == 1 ) {
		prebook();
		return;
	}

	if ( isExternal ) {
		flightExternalsDisabled(false);
		flightResetStyles();
		dom.classAdd(row, "rnd");
		flightSelectExternalPair(row);
		if ( rowA && rowR ) {
			prebook();
		}
		return;
	}
	
	if ( direction == 'A' ) {
		flightResetStyles();
		if ( rowR ) {
			$$('input', rowR)[0].checked = false;
			rowR = null;
		}
		flightSelectPair(row);
	} else {
		$$('input', row)[0].checked = true;
	}
	flightExternalsDisabled(true);

	if ( rowA && rowR ) {
		if ( rowA.getAttribute('chr_date').toDate().dayDiff(rowR.getAttribute('chr_date').toDate()) <= 0 ) {
			flightResetStyles();
			$$('input', rowA)[0].checked = false;
			rowA = null;
			return;
		}
		prebook();
	}	
}

function flightResetStyles() {
	Array.forEach($(avlTblId).getRows(), function(el){
		dom.classRemove(el, "rnd");
		dom.classRemove(el, "ret");
		dom.classRemove(el, "ext");
	});
}

function flightExternalsDisabled(state) {
	Array.forEach(cssQuery('tr[external=1]', avlTblId), function(el){
		dom[state ? 'classAdd' : 'classRemove'](el, 'ext');
	});
}

function flightSelectExternalPair(row) {
	var bonds = row.getAttribute('bond').split('^'),
		trgDirection = row.getAttribute('direction') == 'A' ? 'R' : 'A',
		rows = cssQuery('tr[external=1][direction='+trgDirection+']', avlTblId);

	bonds.pop();

	for (var r=0; r < rows.length; r++ ) {
		var rBonds = rows[r].getAttribute('bond').split('^');
		rBonds.pop();

		for ( var b=0; b < rBonds.length; b++ ) {
			if ( Array.exists(bonds, rBonds[b]) ) {
				if ( trgDirection == 'A' ) {
					rowA = rows[r];
				} else {
					rowR = rows[r];
				}
				dom.classAdd(rows[r], "rnd");
				$$('input', rows[r])[0].checked = true;
				return;
			}
		}
	}
}

function flightSelectPair(row) {
	var bonds = row.getAttribute('bond').split('^'),
		found = false;
		rows = cssQuery('tr[external=0][direction=R]', avlTblId);

	if ( !bonds.length ) {
		Array.forEach(rows, function(el){
			dom.classAdd(el, 'ret');
		});
		return;
	}

	bonds.pop();

	for (var r=0; r < rows.length; r++ ) {	// search in table for [bond]
		var rBonds = rows[r].getAttribute('bond').split('^');
		found = false;
		rBonds.pop();

		for ( var b=0; b < rBonds.length; b++ ) {
			if ( Array.exists(bonds, rBonds[b]) ) {
				found = true;
			}
		}

		if ( found ) {
			dom.classAdd(rows[r], 'rnd');
		} else {
			dom.classAdd(rows[r], 'ret');
		}
		
	}
}

function prebook() {
	var desc = summaryItinerary(rowA),
		frm = document.forms.chrFrm,
		srcFrm = document.forms.avlFrm,
		prebookUrl = "chr/prebook.cfm";

	if ( chrMode != 1 ) {
		desc = desc.concat([''], summaryItinerary(rowR));
	}

	$('sum-details').innerHTML = desc.join("<br>");

	frm.chr_type.value = chrMode;
	frm.pax_adult.value = srcFrm.pax_adult.value;
	frm.pax_child.value = srcFrm.pax_child.value;
	frm.pax_infant.value = srcFrm.pax_infant.value;

	frm.external.value = rowA.getAttribute('external');
	if ( frm.external.value == "1" ) {
		prebookUrl = "chr/prebook-olympic.cfm";
	}

	// outbound flight
	frm.chr_no.value = rowA.getAttribute('chr_no');
	frm.chr_class.value = rowA.getAttribute('chr_class');
	frm.bk_date.value = rowA.getAttribute('chr_date');
	frm.bk_time.value = rowA.getAttribute('time_dep');
	frm.units_info.value = rowA.getAttribute('units');
	frm.sales_info.value = rowA.getAttribute('sales');
	frm.rem_dsn.value = rowA.getAttribute('rem_dsn');
	if ( chrMode == 2 ) {
		frm.rnd_duration.value = parseInt(getValue(srcFrm.rnd_duration), 10)*7;
		frm.chr_no_rnd.value = rowR.getAttribute('chr_no');
		frm.chr_class_rnd.value = rowR.getAttribute('chr_class');
		frm.bk_date_rnd.value = rowR.getAttribute('chr_date');
		frm.bk_time_rnd.value = rowR.getAttribute('time_dep');
		frm.units_info_rnd.value = rowR.getAttribute('units');
		frm.sales_info_rnd.value = rowR.getAttribute('sales');
	} else {
		frm.rnd_duration.value = "";
		frm.chr_no_rnd.value = "";
		frm.chr_class_rnd.value = "";
		frm.bk_date_rnd.value = "";
		frm.bk_time_rnd.value = "";
		frm.units_info_rnd.value = "";
		frm.sales_info_rnd.value = "";
	}

	// ADULT:2^CHILD:1^INFANT:0^
	frm.pax_types_str.value = 'ADULT:'+frm.pax_adult.value
		+ '^CHILD:'+frm.pax_child.value
		+ '^INFANT:'+frm.pax_infant.value
		+ '^';

	ajax.post(frm);
	ajax.queue(prebookHnd, preBookId);
	ajax.loadXML(prebookUrl, preBookId, "Checking availability and calculating price.");
}

function summaryItinerary(row) {
	var result = [];
	result.push('<span class="flt">'+ row.cells[2].innerHTML +'</span>');
	result.push('<strong>Route</strong>:' + row.cells[3].innerHTML);
	result.push('<strong>Departure</strong>:' + row.cells[4].innerHTML);
	return result;
}

function prebookHnd() {
	var result = ajax.getXML(preBookId),
		flag = parseInt(result.getAttribute('flag'), 10);
		frm = document.forms.chrFrm;

	if ( flag != 1 ) {
		if ( flag == 2 ) {
			page.avl(document.forms.avlFrm);
		}
		return dom.console(4, result.getAttribute('msg'));
	}

	var status = result.getAttribute('status').toUpperCase();
	frm.status.value = status;
	$('sum-status').className = status;
	$('sum-status').innerHTML = (function(){
		switch ( status ) {
		case "AVL":
			return "Available";
		case "OR":
			return "On Request";
		default:
			return "No Available";
		}
	})();

	if ( status == 'OR' ) {
		$(bookBtn).innerHTML = lang.book_button_or;
		dom.hide('cc-panel');
	} else {
		$(bookBtn).innerHTML = lang.book_button;
		dom.show('cc-panel');
	}

	ticketPrice = parseFloat(result.getAttribute('price'));
	
	frm.pax_types_str.value = result.getAttribute('pax_types_str');
	frm.pax_names_str.value = result.getAttribute('pax_names_str');
	frm.pax_refs_str.value = result.getAttribute('pax_refs_str');
	frm.pax_refs_str_rnd.value = ( chrMode != 1 ) ? result.getAttribute('pax_refs_str_rnd') : "";

	passengers.list(frm,0);
	extrasLoad(frm);
	recalcPrice();

	dom.fadeInOut(step3,step2);
	$(step3).scrollIntoView(true);
}

function extrasLoad(frm) {
	ajax.post(frm);
	ajax.queue(extrasLoadHnd, ajaxId);
	ajax.loadJSON("chr/extras.cfm", ajaxId, "Loading extra services.");
}

function extrasLoadHnd() {
	extras = ajax.getJSON(ajaxId);
	var tbl = $('extras-tbl');

	Event.purgeElement(tbl, true);

	if ( extras.length ) {
		var html = "";
		Array.forEach(extras, function(el){
			html += '<div class="extra"><span class="price">'+el.sales.currencyFormat()+' EUR</span><input type="checkbox" name="extra_type" value="'+el.type+'"> ' + el.title + "</div>";
		});
		tbl.innerHTML = html;
		Event.on(cssQuery('input[type=checkbox]', tbl), "click", recalcPrice);
		dom.show('extras-area');
	} else {
		extras = null;
		dom.hide('extras-area');
		tbl.innerHTML = "";
	}

	tbl = null;
}

function recalcPrice() {
	var extrasPrice = 0.0,
		bk_str = "",
		px_str = "";

	$('sum-ticket').innerHTML = ticketPrice.currencyFormat() + " EUR";

	// sum extras
	if ( extras ) {
		var selectedExtras = cssQuery('input[type=checkbox]:checked', 'extras-tbl'),
			len = selectedExtras.length,
			exlen = extras.length;

		for ( var i=0; i < len; i++ ) {
			var extra = selectedExtras[i].value;
			for ( var ex=0; ex < exlen; ex++ ) {
				if ( extras[ex].type == extra ) {
					extrasPrice += extras[ex].sales;
					bk_str += extras[ex].bk_str;
					px_str += extras[ex].px_str;
				}
			}		
		}
	}
	document.forms.chrFrm.extra_bk_str.value = bk_str;
	document.forms.chrFrm.extra_px_str.value = px_str;
	$('sum-extras').innerHTML = extrasPrice.currencyFormat() + " EUR";

	frm.price.value = (ticketPrice + extrasPrice).currencyFormat();
	$('sum-price').innerHTML = frm.price.value + " EUR";
}

function validate(frm) {
/*	if ( !passengers.validate(frm, false) ) {
		return false;
	}*/
	
	if ( !hasValue(frm.first_name) ) { return form.error("Please type your first name.", frm.first_name); }
	if ( !hasValue(frm.last_name) ) { return form.error("Please type your last name.", frm.last_name); }
	if ( !hasValue(frm.email) || !frm.email.value.isEmail() ) { return form.error("Please type a valid email address.", frm.email); }
	if ( frm.email.value != frm.email_again.value ) { return form.error("email addresses don't match.", frm.email_again); }
	if ( !hasValue(frm.cnt_code) ) { return form.error("Please select a country.", frm.cnt_code); }
	
	if ( !hasValue(frm.tel) ) { return form.error("Please type your telephone number.", frm.tel); }
	if ( !hasValue(frm.location) ) { return form.error("Please type your location.", frm.location); }
	if ( !hasValue(frm.address) ) { return form.error("Please type your mailing address.", frm.address); }
	if ( !hasValue(frm.zip) ) { return form.error("Please type your postal code.", frm.zip); }

	if ( frm.status.value != 'OR' ) {
		// validate credit card
		var cc_year = parseInt(getValue(frm.card_year), 10),
			cc_month = parseInt(getValue(frm.card_month), 10);
	
		if ( frm.card_number.value.length < 13 || !validateInt(frm.card_number.value) ) { return form.error("Please input credit's card number", frm.card_number); }
		if ( !validateCreditCard(frm.card_number.value, frm.card_type.value) ) {
			return form.error("Please input a valid credit card number", frm.card_number);
		}
		if ( !hasValue(frm.card_name) ) { return form.error("Please input the full name as it appears on the credit card.", frm.card_name); }
		if ( cc_year == app.today.getFullYear() && cc_month < app.today.getMonth()+1 ) {
			return form.error("Please input a valid expiration date");
		}
		if ( frm.card_cvv2.value.length < 3 || !validateInt(frm.card_cvv2.value) ) { return form.error("Please input credit's card CVV2 number", frm.card_cvv2); }
	}

	// Terms and Conditions
	if ( frm.tcagree && !frm.tcagree.checked ) {
		return form.error("You must agree our terms to continue.", frm.tcagree);		
	}

	return true;
}

page = {

	avl: function(frm) {
		if ( !app.loaded ) {
			return false;
		}

		chrMode = parseInt(getValue(frm.chr_type), 10);

		if ( !hasValue(frm.fromd) ) { return form.error("Please input departure date.", frm.fromd); }
		if ( !hasValue(frm.dep_cnt_code) ) { 
			return form.error("Please select at least the country of departure.", frm.dep_cty_air_code);			
		}
		if ( !hasValue(frm.arr_cnt_code) ) { 
			return form.error("Please select at least the country of destination.", frm.arr_cty_air_code);			
		}
		if ( parseInt(frm.pax_adult.value, 10) + parseInt(frm.pax_child.value, 10) + parseInt(frm.pax_infant.value, 10) < 1 ) { return form.error("At least one person should exist for availability to continue.", frm.pax_adult); }

		ajax.post(frm);
		ajax.queue(avlHnd, ajaxAvl);
		ajax.loadXML(frm.action, ajaxAvl, "Searching for flights.");
		return false;
	},

	stepA: function() {
		dom.fadeInOut(step1,step2);
		//dom.show('rightc');
		rowA=rowR=null;
	},

	stepB: function() {
		dom.fadeOut(step3);
		page.avl(document.forms.avlFrm);
	},

	sel: function() {
		$$('input', app.row)[0].checked = true;
		flightSelect();
	},

	book: function(frm) {
		
		if ( validate(frm) ) {
			if ( frm.status.value == 'OR' ) {
				
				onrequest(frm);
			} else {
				frm.cavv.value = frm.eci.value = frm.xid.value = "";

				if ( dom.confirm('Are you sure you want to continue with payment and book your ticket(s)?') ) {
					ajax.post(frm, "cavv,eci,xid,card_number,card_name,card_cvv2,card_type,card_month,card_year");
					ajax.queue(lookup.callback(frm), authAct);
					ajax.loadXML("pnr/auth.cfc?method=lookup", authAct, "Looking up eligibility for credit card payer authentication programs.");
					/*ajax.post(frm);
					ajax.queue(bkHnd, ajaxId);
					ajax.loadJSON("chr/book.cfm", ajaxId, "Booking your charter flight ticket.");*/
				}
			}
		}
		return false;
	}
};

function onrequest(frm) {
	ajax.post(frm);
	ajax.queue(ajax.checkXMLResult.callback(bookId), bookId);
	ajax.loadJSON("chr/onrequest.cfm", bookId, "Sending request for selected flight.");
}

function book() {
	var frm = document.forms.chrFrm;
	ajax.post(frm);
	ajax.queue(bkHnd, ajaxId);
	ajax.loadJSON("chr/book.cfm", ajaxId, "Booking your charter flight ticket.");
}

function bkHnd() {
	var result = ajax.getJSON(ajaxId);
	if ( result.flag != 1 ) {
		dom.console(2, result.msg);		
	} else {
		nav('reservation_complete.cfm');
	}
}

function mod10(number) {
	var cLen = number.length,
		digits = [],
		n = 0;

	digits.length = cLen;
	for( ; n < cLen; n++ ) {
		digits[n] = parseInt(number.charAt(n), 10);
	}

	for ( n = cLen - 2; n >= 0; n = n - 2 ) {
		digits[n] *= 2;
		if ( digits[n] >= 10 ) {
			digits[n] -= 9;
		}
	}
	
	return Array.sum(digits) % 10 === 0;
}

function validateCreditCard(cc, type) {
	var isValid = false, len = 0;

	cc = cc.trim().replace(/[\s-]/g, '');
	if ( !(/^[0-9]+$/).test(cc) ) {
		return false;
	}

	len = cc.length;

	switch ( type ) {
	case "Mastercard":
		isValid = (len == 16) && (/^5[1-5]/).test(cc);
		break;
	case "VISA":
		isValid = (len == 13 || len == 16) && (/^4/).test(cc);
		break;
	case "DINERS":
		isValid = (len == 14) && (/^3/).test(cc);
		break;
	default:
		return false;
	}

	return isValid && mod10(cc);
}

var authAct = "ajax-auth",
	authId = "auth-modal",
	authFrmId = "auth-form",
	ACSUrl = "",
	Payload = "";

function lookup(frm) {
	var result = ajax.getXML(authAct),
		errorNo = parseInt(dom.xmlText(result.selectSingleNode('/CardinalMPI/ErrorNo')), 10);
		EciFlag = result.selectSingleNode('/CardinalMPI/EciFlag');

	EciFlag = EciFlag ? dom.xmlText(EciFlag) : "";
	if ( EciFlag.length ) {
		frm.eci.value = EciFlag;
	} else {
		frm.eci.value = ( frm.card_type.value == 'VISA' ) ? '07' : '01';	// fallback to default values = VISA:07, MasterCard:01
	}

	if ( errorNo !== 0 ) {
		if ( dom.confirm('Failed to contact credit card authentication system. Would you like to proceed to booking without authentication?') ) {
			book();
		}
	} else {
		var enrolled = dom.xmlText(result.selectSingleNode('/CardinalMPI/Enrolled'));

		if ( enrolled == 'Y' ) {
			// launch authentication program
			ACSUrl = dom.xmlText(result.selectSingleNode('/CardinalMPI/ACSUrl'));
			Payload = dom.xmlText(result.selectSingleNode('/CardinalMPI/Payload'));

			ajax.queue(function() {
				modal.allowClose(authId, false);
			}, authId);
			ajax.load("pnr/auth.cfc?method=authFrame", authId, "Launching credit card authentication form.");
		} else {
			book();	// not enrolled, continue to booking
		}
	}
}

function authInit() {
	var frm = window.frames[0].document.forms[authFrmId];
	frm.PaReq.value = Payload;
	frm.action = ACSUrl;
	frm.submit();
}

function authResult(data) {
	if ( data.success ) {
		var frm = document.forms.bkFrm;
		frm.cavv.value = data.cavv;
		if ( data.eci.length ) {
			frm.eci.value = data.eci;
		} else {
			frm.eci.value = ( frm.card_type.value == 'VISA' ) ? '07' : '01';	// fallback to default values = VISA:07, MasterCard:01
		}
		frm.xid.value = data.xid;
		modal.close(authId);
		book();
	} else {
		modal.close(authId);
		dom.console(2, data.noauth ? "<strong>Authentication Failed</strong><br/><br/>Your financial institution has indicated that it could not successfully authenticate this transaction. To protect against unauthorized use, this card cannot be used to complete your purchase." : "<strong>Authentication Failed</strong><br/><br/>An error occured while trying to authenticate the transaction. Please try again or contact technical support.");
	}
}

})();