var passengers = function() {

	var per_room = false;
	var frmName = null;

	var fname_lst = new StringBuilder();
	var lname_lst = new StringBuilder();
	var title_lst = new StringBuilder();
	var sex_lst = new StringBuilder();
	var age_lst = new StringBuilder();
	var leader_lst = new StringBuilder();

	function listHnd() {
		var result = ajax.getXML("passList").childNodes[0];

		$('pass_list').innerHTML = result.text || result.textContent;
		if ( result.getAttribute('pers_proom') ) {
			document.forms[frmName].pers_proom.value = result.getAttribute('pers_proom');
		}

		// apply behavior
		Behavior.apply($('pass_list'));
	}

	function validatePassenger(frm, id) {
		var person = per_room ? "guest" : "passenger";

		var ttl = frm['cl_title_' + id].value;
		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);

		return true;
	}

	return {

		// CREATE PASSENGER FORM
		list: function(frm, proom) {
			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 ( !$('pass_list') ) {
				return false;
			}

			var actionStr = "inc/passengers.cfm";
			if ( per_room ) {
				actionStr += "?per_room";
			}

			ajax.post(frm);
			ajax.queue(listHnd, "passList");
			ajax.loadXML(actionStr, "passList", "Loading " + (this.per_room ? "guest" : "passenger") + " list form.");
		},

		reset: function() {
			if ( $('pass_list') ) {
				$('pass_list').innerHTML = "";
			}
		},

		// FORM VALIDATION AND CREATE LISTS
		validate: function(frm, proom) {
			var obj = null;
			var row = null;
			var i = 0;

			per_room = proom;

			// PASSENGER LIST PARSING
			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");
				leader_lst.set(getValue(frm.leader), "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;
		}

	};

} ();