(function(){

var per_room = false,
	frmName = null,
	listId = 'pass_list',
	ajaxId = 'pass-list-ajax',

	fname_lst = new StringBuilder(),
	lname_lst = new StringBuilder(),
	title_lst = new StringBuilder(),
	sex_lst = new StringBuilder(),
	age_lst = new StringBuilder(),
	birth_lst = new StringBuilder(),
	leader_lst = new StringBuilder();

function listHnd() {
	var result = ajax.getXML(ajaxId).childNodes[0];

	$(listId).innerHTML = result.text || result.textContent;
	if ( result.getAttribute('pers_proom') ) {
		document.forms[frmName].pers_proom.value = result.getAttribute('pers_proom');
	}

	Behavior.apply(listId);
}

function validatePassenger(frm, id) {
	var person = per_room ? "guest" : "passenger",
		ttl = frm['cl_title_' + id].value,
		obj;

	title_lst.append(ttl);
	sex_lst.append( ttl == 'Mr.' || ttl == 'Mstr.' ? "MALE" : "FEMALE" );

	var obj = frm['age_' + id];
	age_lst.append( !obj ? "0" : getValue(obj) );

	obj = frm['first_name_' + id];
	if ( !hasValue(obj) ) {
		return form.error("Please input " + person + "'s first name.", obj);
	}
	if ( obj.value.indexOf(',') != -1 ) {
		return form.error("The comma character is not allowed.", obj);
	}
	fname_lst.append(obj.value);

	obj = frm['last_name_' + id];
	if ( !hasValue(obj) ) {
		return form.error("Please input " + person + "'s last name.", obj);
	}
	if ( obj.value.indexOf(',') != -1 ) {
		return form.error("The comma character is not allowed.", obj);
	}
	lname_lst.append(obj.value);

	if ( frm['ic_' + id] ) {
		obj = frm['nationality_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please select passenger nationality.", obj);
		}
		obj = frm['ic_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input passport or ID card number.", obj);
		}
		obj = frm['birthdate_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input birthdate.", obj);
		}
	}
	
	if(frm.srv_type.value == 'CHR') {
		obj = frm['day_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input " + person + "'s day of birth.", obj);
		}
		birth_lst.append( getValue(obj) + "/" );
		obj = frm['month_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input " + person + "'s month of birth.", obj);
		}
		birth_lst.append( getValue(obj) + "/" );
		obj = frm['year_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input " + person + "'s year of birth.", obj);
		}
		birth_lst.append( getValue(obj) );
		
		obj = frm['ic_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input " + person + "'s IC.", obj);
		}
		
		obj = frm['expires_' + id];
		if ( !hasValue(obj) && frm['ic_type_' + id].value == 'PASS') {
			return form.error("Please input " + person + "'s passport expiration date.", obj);
		}
		
		obj = frm['cnt_code_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input " + person + "'s nationality.", obj);
		}
		
		obj = frm['ic_issue_country_' + id];
		if ( !hasValue(obj) ) {
			return form.error("Please input " + person + "'s IC issue country.", obj);
		}			
	}

	return true;
}

window.passengers = {
	
	list: function(frm, proom, expanded) {
		per_room = proom;
		frmName = frm.id || frm.name;

		if ( per_room ) {
			// validate persons per room form elements, skip for other services
			var i = 0;
			while ( frm['adult_' + (++i)] ) {
				if ( !hasValue(frm['adult_' + i], 0) ) { frm['adult_'+i].value = 0; }
				if ( !hasValue(frm['teen_' + i], 0) ) { frm['teen_'+i].value = 0; }
				if ( !hasValue(frm['child_' + i], 0) ) { frm['child_'+i].value = 0; }
				if ( !hasValue(frm['infant_' + i], 0) ) { frm['infant_'+i].value = 0; }

				if ( parseInt(frm['adult_' + i].value, 10) + parseInt(frm['teen_' + i].value, 10) + parseInt(frm['child_' + i].value, 10) + parseInt(frm['infant_' + i].value, 10) === 0 ) {
					return form.error("At least on person should be defined", frm['adult_' + i]);
				}
			}
		}

		if ( !$(listId) ) {
			return false;
		}

		var actionStr = "inc/passengers.cfm?";
		if ( per_room ) {
			actionStr += "per_room=1";
		}
		if ( expanded ) {
			actionStr += "expanded=1";
		}

		ajax.post(frm);
		ajax.queue(listHnd, ajaxId);
		ajax.loadXML(actionStr, ajaxId, "Loading " + (this.per_room ? "guest" : "passenger") + " list form.");
	},

	reset: function() {
		if ( $(listId) ) {
			$(listId).innerHTML = "";
		}
	},

	validate: function(frm, proom) {
		var obj = null,
			row = null,
			i = 0;

		per_room = proom;

		fname_lst.clear();
		lname_lst.clear();
		title_lst.clear();
		sex_lst.clear();
		leader_lst.clear();
		age_lst.clear();

		if ( !proom ) {
			while ( frm['cl_title_' + (++i)] ) {
				if ( !validatePassenger(frm, i) ) {
					return false;
				}
			}
			leader_lst.fill(i+1, "0");
			if ( frm.leader ) {
				leader_lst.set(getValue(frm.leader)-1, "1");
			} else {
				leader_lst.set(0, "1");
			}
		} else {
			var room = 1;

			while ( frm['cl_title_' + room + '_1'] ) {
				leader_lst.append( getValue(frm['lead_' + room]) );
				while ( frm['cl_title_' + room + '_' + (++i)] ) {
					if ( !validatePassenger(frm, room+'_'+i) ) {
						return false;
					}
				}
				room++;
				i=0;
			}
		}

		if ( frm.fname_lst ) {
			frm.fname_lst.value = fname_lst.toString(',');
			frm.lname_lst.value = lname_lst.toString(',');
			frm.title_lst.value = title_lst.toString(',');
			frm.sex_lst.value = sex_lst.toString(',');
			frm.age_lst.value = age_lst.toString(',');
			frm.leader_lst.value = leader_lst.toString(',');
		}

		return true;
	}

};

})();