var D = document;

	function PseudoControl(fieldname,X,Y,text,formDiv,classname) {
		var ret = "";
		ret += '<td id="'+fieldname+'Input'+Y+'" class="'+classname+'" onClick="Activate'+formDiv+'('+X+','+Y+')">'+text+'</td>';
		ret += '<td id="'+fieldname+'Button'+Y+'" class="dropButton"onClick="Activate'+formDiv+'('+X+','+Y+')"><img src="/ico/DropdownWithWhiteBorder.gif" width="17" height="19"></td>';
		return ret;
	}

	function HasData(array) {
		for (var i=0;i<array.length;i++) {if (array[i]) return true;}
		return false;
	}

	function RenderTable() {

//window.alert('In function RenderTable()');

		// Hide all divs:
		Hide("DateTimeOptions");Hide("SpecificDate");Hide("DateRange");Hide("dateIns");
		Hide("LocationOptions");Hide("Anywhere");Hide("SpecificCity");Hide("locIns");
		Hide("TravelModeOptions");Hide("LodgingTypeMode");Hide("LodgingPriceMode");
		Hide("LodgingOptions");
		Hide("VehicleOptions");
		hideCalendar();

		var str = "";
		var F = D.ItineraryForm;

		var fieldnames = new Array('arr_or_dep','date_or_range','specific_date','earliest_time','latest_time','earliest_date','latest_date','origin','dest','via','vehicle','lodging');
		for (var i = 0; i < ITI['arr_or_dep'].length; i++) {for (var j = 0; j < fieldnames.length; j++) {str += "<input type='hidden' name='ITI["+fieldnames[j]+"]["+i+"]' value=\""+ITI[fieldnames[j]][i]+"\">";}}

		D.getElementById("td_OW").style.fontWeight = ((F.triptype[0].checked)?'bold':'normal');
		D.getElementById("td_RT").style.fontWeight = ((F.triptype[1].checked)?'bold':'normal');
		D.getElementById("td_MULTI").style.fontWeight = ((F.triptype[2].checked)?'bold':'normal');

		var show_train = (F.show_train.checked || HasData(ITI['via']));
		var show_lodging = (F.show_lodging.checked || HasData(ITI['lodging']));
		var show_vehicles = (F.show_vehicles.checked || HasData(ITI['vehicle']));
		var show_row_2 = (show_train || show_lodging || show_vehicles);

		str += '<table id="itiTable" cellspacing="0" class="wide" border=0 bordercolor=#00CCCC>';

		if (F.triptype[0].checked || F.triptype[1].checked) { // ONE-WAY or ROUND-TRIP

			// BEGIN LABEL ROW
			str += '<tr>';
			str += '<td class="pos"><img id="PosX0" src="/ico/clearpix.gif" height="1" width="1"></td>';
			str += '<td colspan="2" class="legLabel">Departure Date</td>';
			str += '<td class="pos"><img id="PosX1" src="/ico/clearpix.gif" height="5" width="5"></td>';
			str += '<td colspan="2" class="legLabel">From</td>';
			str += '<td class="pos"><img id="PosX2" src="/ico/clearpix.gif" height="5" width="5"></td>';
			str += '<td colspan="2" class="legLabel">To</td>';
			str += '<td class="pos"><img id="PosX3" src="/ico/clearpix.gif" height="5" width="1"></td>';
			str += '</tr>';
			// END LABEL ROW

			// BEGIN DATE/FROM/TO ROW
			var dateString = DateRangeString(ITI['arr_or_dep'][0],ITI['date_or_range'][0],ITI['specific_date'][0],ITI['earliest_time'][0],ITI['latest_time'][0],ITI['earliest_date'][0],ITI['latest_date'][0]);
			var fromStr = LocationText(ITI['origin'][0]);
			var toStr = LocationText(ITI['dest'][0]);
			str += '<tr>';
			str += '<td></td>';
			str += PseudoControl('DateTime',0,0,((dateString)?dateString:"Choose date..."),'DateTimeOptions',((dateString)?"dropText":"dropTextEmpty"));
			str += '<td></td>';
			str += PseudoControl('From',1,0,((fromStr)?fromStr:"Departing from..."),'LocationOptions',((fromStr)?"dropText":"dropTextEmpty"));
			str += '<td></td>';
			str += PseudoControl('To',3,0,((toStr)?toStr:"Going to..."),'LocationOptions',((toStr)?"dropText":"dropTextEmpty"));
			str += '<td></td>';
			str += '</tr>';
			// END DATE/FROM/TO ROW

			// BEGIN SEPARATOR/Y-POSITIONING ROW
			str += '<tr><td class="pos" colspan="10"><div class="pos" id="PosY0"><img src="/ico/clearpix.gif" height="5" width="1"></div></td></tr>';
			// END SEPARATOR/Y-POSITIONING ROW

			if (show_row_2) {
				// BEGIN VEHICLE/HOTEL ROWS
				mStr = TravelModeText(ITI['via'][0]);
				lStr = LodgingText(ITI['lodging'][0]);
				vStr = VehicleText(ITI['vehicle'][0]);
				str += '<tr>';
				str += '<td></td>';

				if (show_train) {str += PseudoControl('TravelMode',0,0,((mStr)?mStr:"Air, train, bus..."),'TravelModeOptions',((mStr)?"dropText":"dropTextEmpty"));} else {str += '<td></td><td></td>';}
				str += '<td></td>';
				if (show_lodging) {str += PseudoControl('Lodging',1,0,((lStr)?lStr:"Lodging options..."),'LodgingOptions',((lStr)?"dropText":"dropTextEmpty"));} else {str += '<td></td><td></td>';}
				str += '<td></td>';
				if (show_vehicles) {str += PseudoControl('Vehicle',3,0,((vStr)?vStr:"Vehicle options..."),'VehicleOptions',((vStr)?"dropText":"dropTextEmpty"));} else {str += '<td></td><td></td>';}
				str += '<td></td>';
				str += '</tr>';
				// END VEHICLE/HOTEL ROWS

				// BEGIN SEPARATOR/Y-POSITIONING ROW
				str += '<tr><td class="pos" colspan="10"><div class="pos" id="PosY0a"><img src="/ico/clearpix.gif" height="5" width="1"></div></td></tr>';
				// END SEPARATOR/Y-POSITIONING ROW
			}

			if (F.triptype[1].checked) { // ROUND-TRIP ONLY
				// BEGIN LABEL ROW
				str += '<tr>';
				str += '<td></td>';
				str += '<td colspan="2" class="legLabel">Return Date</td>';
				str += '</tr>';
				// END LABEL ROW

				// BEGIN DATE/FROM/TO ROW
				var dateString = DateRangeString(ITI['arr_or_dep'][1],ITI['date_or_range'][1],ITI['specific_date'][1],ITI['earliest_time'][1],ITI['latest_time'][1],ITI['earliest_date'][1],ITI['latest_date'][1]);
				str += '<tr>';
				str += '<td></td>';
				str += PseudoControl('DateTime',0,1,((dateString)?dateString:"Choose date..."),'DateTimeOptions',((dateString)?"dropText":"dropTextEmpty"));
				str += '</tr>';
				// END DATE/FROM/TO ROW

				// BEGIN SEPARATOR/Y-POSITIONING ROW
				str += '<tr><td class="pos" colspan="10"><div class="pos" id="PosY1"><img src="/ico/clearpix.gif" height="5" width="1"></div></td></tr>';
				// END SEPARATOR/Y-POSITIONING ROW
			}
			str += '<tr><td colspan="10" class="right">';
			if (ITI['show_submit']) {str += '<input type="submit" name="submit" class="submit" style="width:80px" value="Get Bids &gt;">';}
			str += '</td></tr>';

		} else { // MULTI-STOP

			var ordinals = new Array('First','Second','Third','Fourth','Fifth','Sixth','Seventh','Eighth','Ninth','Tenth');
			for (var i = 0; i < ITI['arr_or_dep'].length; i++) {

				// BEGIN LABEL ROW
				str += '<tr>';
				str += '<td class="pos">'+((i)?'':'<img id="PosX0" src="/ico/clearpix.gif" height="1" width="1">')+'</td>';
				str += '<td colspan="2" class="legLabel">'+((i<ordinals.length)?ordinals[i]:'Next')+' Leg</td>';
				str += '<td class="pos">'+((i)?'':'<img id="PosX1" src="/ico/clearpix.gif" height="5" width="5">')+'</td>';
				str += '<td colspan="2" class="legLabel">'+((i)?'':'From')+'</td>';
				str += '<td class="pos">'+((i)?'':'<img id="PosX2" src="/ico/clearpix.gif" height="5" width="5">')+'</td>';
				str += '<td colspan="2" class="legLabel">'+((i)?'':'To')+'</td>';
				str += '<td class="pos">'+((i)?'':'<img id="PosX3" src="/ico/clearpix.gif" height="1" width="1">')+'</td>';
				str += '</tr>';
				// END LABEL ROW

				// BEGIN DATE/FROM/TO ROW
				var dateString = DateRangeString(ITI['arr_or_dep'][i],ITI['date_or_range'][i],ITI['specific_date'][i],ITI['earliest_time'][i],ITI['latest_time'][i],ITI['earliest_date'][i],ITI['latest_date'][i]);
				var fromStr = LocationText(ITI['origin'][i]);
				var toStr = LocationText(ITI['dest'][i]);
				str += '<tr>';
				str += '<td></td>';
				str += PseudoControl('DateTime',0,i,((dateString)?dateString:"Choose date..."),'DateTimeOptions',((dateString)?"dropText":"dropTextEmpty"));
				str += '<td></td>';
				str += PseudoControl('From',1,i,((fromStr)?fromStr:"Departing from..."),'LocationOptions',((fromStr)?"dropText":"dropTextEmpty"));
				str += '<td></td>';
				str += PseudoControl('To',3,i,((toStr)?toStr:"Going to..."),'LocationOptions',((toStr)?"dropText":"dropTextEmpty"));
				str += '<td></td>';
				str += '</tr>';
				// END DATE/FROM/TO ROW

				// BEGIN SEPARATOR/Y-POSITIONING ROW
				str += '<tr><td class="pos" colspan="10"><div class="pos" id="PosY'+i+'"><img src="/ico/clearpix.gif" height="5" width="1"></div></td></tr>';
				// END SEPARATOR/Y-POSITIONING ROW

				if (show_row_2) {
					// BEGIN VEHICLE/HOTEL ROWS
					mStr = TravelModeText(ITI['via'][i]);
					lStr = LodgingText(ITI['lodging'][i]);
					vStr = VehicleText(ITI['vehicle'][i]);
					str += '<tr>';
					str += '<td></td>';
					if (F.show_train.checked || mStr) {str += PseudoControl('TravelMode',0,i,((mStr)?mStr:"Air, train, bus..."),'TravelModeOptions',((mStr)?"dropText":"dropTextEmpty"));} else {str += '<td></td><td></td>';}
					str += '<td></td>';
					if (F.show_lodging.checked || lStr) {str += PseudoControl('Lodging',1,i,((lStr)?lStr:"Lodging options..."),'LodgingOptions',((lStr)?"dropText":"dropTextEmpty"));} else {str += '<td></td><td></td>';}
					str += '<td></td>';
					if (F.show_vehicles.checked || vStr) {str += PseudoControl('Vehicle',3,i,((vStr)?vStr:"Vehicle options..."),'VehicleOptions',((vStr)?"dropText":"dropTextEmpty"));} else {str += '<td></td><td></td>';}
					str += '<td></td>';
					str += '</tr>';
					// END VEHICLE/HOTEL ROWS

					// BEGIN SEPARATOR/Y-POSITIONING ROW
					str += '<tr><td class="pos" colspan="10"><div class="pos" id="PosY'+i+'a"><img src="/ico/clearpix.gif" height="5" width="1"></div></td></tr>';
					// END SEPARATOR/Y-POSITIONING ROW
				}
			}

			str += '<tr>';
			str += '<td></td>';
			str += '<td colspan="2" class="legLabel">Need more stops?</td>';
			str += '<td></td>';
			str += '<td colspan="2" class="legLabel"></td>';
			str += '<td></td>';
			str += '<td colspan="2" class="legLabel"></td>';
			str += '<td></td>';
			str += '</tr>';

			str += '<tr>';
			str += '<td></td>';
			str += '<td colspan="6" class="legLabel"><img src="/iconew/redarrow.gif" width="10" height="10">&nbsp;<a href="Javascript:AddRow()">Click here to add more</a></td>';
			str += '<td colspan="2" class="right">';
			if (ITI['show_submit']) {str += '<input type="submit" name="submit" class="submit" style="width:80px" value="Get Bids &gt;">';}
			str += '</td>';
			str += '<td></td>';
			str += '</tr>';
		}
		str += '</table>';
		document.getElementById("ItineraryTable").innerHTML = str;
		document.getElementById("Anywhere").style.display = "none";
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////

	//-------------------------------------------------------------------------------------------------
	//---- DATE/TIME OPTIONS --------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------

	function ActivateDateTimeOptions(X,Y) { // X is only used for LocationOptions
		RenderTable();
		ITI['activeRow'] = Y;
		// Prepopulate the form
		var f = document.DateTimeForm;
		f.arr_or_dep[0].checked		= (ITI['arr_or_dep'][Y] == "DEPART");
		f.arr_or_dep[1].checked		= (ITI['arr_or_dep'][Y] == "ARRIVE");
		f.specific_date.value		= ITI['specific_date'][Y];
		f.earliest_time.value		= ITI['earliest_time'][Y];
		f.latest_time.value			= ITI['latest_time'][Y];
		f.earliest_date.value		= ITI['earliest_date'][Y];
		f.latest_date.value			= ITI['latest_date'][Y];
		// End pre-population
		Activate('DateTimeOptions','DateTime',0,Y);
		DateMode(ITI['date_or_range'][Y]);
	}

	//-------------------------------------------------------------------------------------------------

	function DateMode(mode) {
		hideCalendar();
		var f = document.DateTimeForm;
		if (mode == 'DATE') {
			f.date_or_range[0].checked = true;
			f.date_or_range[1].checked = false;
			Hide("DateRange");
			Show("SpecificDate");
		} else { // RANGE
			f.date_or_range[0].checked = false;
			f.date_or_range[1].checked = true;
			Hide("SpecificDate");
			Show("DateRange");
		}
	}

	//-------------------------------------------------------------------------------------------------

	function CommitDateTimeOptions() {
		var F = document.DateTimeForm;
		var n = ITI['activeRow'];
		ITI['arr_or_dep'][n] = ((F.arr_or_dep[0].checked)?"DEPART":"ARRIVE");
		if (F.date_or_range[0].checked) {
			ITI['date_or_range'][n]	= "DATE";
			ITI['specific_date'][n]	= F.specific_date.value;
			ITI['earliest_time'][n]	= F.earliest_time.value;
			ITI['latest_time'][n]	= F.latest_time.value;
			ITI['earliest_date'][n]	= "";
			ITI['latest_date'][n]	= "";
		} else {
			ITI['date_or_range'][n]	= "RANGE";
			ITI['specific_date'][n]	= "";
			ITI['earliest_time'][n]	= "";
			ITI['latest_time'][n]	= "";
			ITI['earliest_date'][n]	= F.earliest_date.value;
			ITI['latest_date'][n]	= F.latest_date.value;
		}
		RenderTable();
	}

	//-------------------------------------------------------------------------------------------------

	function DateRangeString(arr_or_dep,date_or_range,specific_date,earliest_time,latest_time,earliest_date,latest_date) {
		if (specific_date == "0000-00-00") {specific_date = "";}
		if (earliest_date == "0000-00-00") {earliest_date = "";}
		if (latest_date == "0000-00-00")   {latest_date   = "";}
		if (earliest_time == "00:00:00") {earliest_time = "";}
		if (latest_time == "00:00:00")   {latest_time   = "";}
		if (!specific_date && !earliest_date && !latest_date) {return "";}

		if (arr_or_dep == "ARRIVE")	{retString = "Arrive"+((date_or_range == "DATE")?" by":"");}
		else						{retString = "Depart"+((date_or_range == "DATE")?"":"");}

		if (date_or_range == "DATE") {
			retString += " <nobr>"+specific_date+"</nobr>";
			if (earliest_time && latest_time) {retString += " between "+earliest_time+" and "+latest_time;}
			else if (earliest_time) {retString += " after "+earliest_time;}
			else if (latest_time) {retString += " by "+latest_time;}
		} else { // RANGE
			if (earliest_date && latest_date) {
				retString += " between <nobr>"+earliest_date+"</nobr> and <nobr>"+latest_date+"</nobr>";
			} else if (earliest_date) {
				retString += " on or after <nobr>"+earliest_date+"</nobr>";
			} else if (latest_date) {
				retString += " on or before <nobr>"+latest_date+"</nobr>";
			} else {
				retString = "";
			}
		}
		return retString;
	}

	//-------------------------------------------------------------------------------------------------
	//---- LOCATION OPTIONS ---------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------

	function ActivateLocationOptions(X,Y) {
		RenderTable();
		ITI['activeRow'] = Y;
		ITI['orig_or_dest'] = ((X == 1)?"origin":"dest");
		var fieldname = ((X == 1)?"From":"To");
		var val = ITI[ITI['orig_or_dest']][Y];
		var f = document.LocationForm;
	//	LocMode(((f.location_type[0].checked)?"CITY":""));

		var hash = GetHashFromLocationString(val);
		// Pre-populate the options form with values from the active row:
		f.region.selectedIndex = 0;
		f.countries.options.length = 0;
		f.states.options.length = 0;
		f.city0.value="";
		f.city1.value="";
		f.city2.value="";
		f.city3.value="";
		f.city4.value="";
		if (hash["CITIES"]) {
			f.location_type[0].checked = true;
			tempArray = hash["CITIES"].split(",");
			if (tempArray.length > 0) {f.city0.value = tempArray[0];}
			if (tempArray.length > 1) {f.city1.value = tempArray[1];}
			if (tempArray.length > 2) {f.city2.value = tempArray[2];}
			if (tempArray.length > 3) {f.city3.value = tempArray[3];}
			if (tempArray.length > 4) {f.city4.value = tempArray[4];}
		} else {
			if (hash["COUNTRY"]) {
				f.location_type[1].checked = true;
				SetRegion(Countries[hash["COUNTRY"].toLowerCase()][1]);
				SetCountriesList();
				SetCountry(hash["COUNTRY"]);
				SetStatesList();
			} else if (hash["REGION"]) {
				f.location_type[1].checked = true;
				SetRegion(hash["REGION"]);
				SetCountriesList();
			}
		}

		// End pre-population
		Activate('LocationOptions',fieldname,X,Y);
		LocMode(((f.location_type[0].checked)?"CITY":""));
	}

	//-------------------------------------------------------------------------------------------------

	function LocMode(mode){
		var f=document.LocationForm;
		if(mode=='CITY'){
			f.location_type[0].checked=true;
			f.location_type[1].checked=false;
			Hide("Anywhere"); document.getElementById("Anywhere").style.display = "none";
			Show("SpecificCity");
		}else{
			f.location_type[0].checked=false;
			f.location_type[1].checked=true;
			Hide("SpecificCity");
			Show("Anywhere"); document.getElementById("Anywhere").style.display = "block";
		}
	}
	function SetRegion(region) {var f=document.LocationForm;for(i=0;i<f.region.options.length;i++){if(f.region.options[i].value==region){f.region.selectedIndex=i;}}}
	function SetCountry(country){country=country.toLowerCase();var f=document.LocationForm;for(i=0;i<f.countries.options.length;i++){if(f.countries.options[i].value==country){f.countries.selectedIndex=i;break;}}}

	//-------------------------------------------------------------------------------------------------

	function CommitLocationOptions() {
		var f = document.LocationForm;
		var Y = ITI['activeRow'];
		var orig_or_dest = ITI['orig_or_dest'];
		if (f.location_type[0].checked) { // CITIES format: "city1;city2;..."
			var s = "";
			if(f.city0.value){s+=((s)?",":"")+f.city0.value;}
			if(f.city1.value){s+=((s)?",":"")+f.city1.value;}
			if(f.city2.value){s+=((s)?",":"")+f.city2.value;}
			if(f.city3.value){s+=((s)?",":"")+f.city3.value;}
			if(f.city4.value){s+=((s)?",":"")+f.city4.value;}
			if (s) {
				ITI[orig_or_dest][Y] = "CITIES:" + s;
			} else {
				ITI[orig_or_dest][Y] = "";
			}
		} else if (f.location_type[1].checked) { // ANYWHERE format: "REGION:US-CAN;COUNTRY:US;MUNI:CA"
			// Region
			if (f.region.selectedIndex > 0) {
				ITI[orig_or_dest][Y] = "REGION:"+f.region.options[f.region.selectedIndex].value;
			}
			// Countries
			var s="";
			for(i=0;i<f.countries.length;i++){if(f.countries.options[i].selected) {s+=((s)?",":"")+f.countries.options[i].value;}}
			if(s){ITI[orig_or_dest][Y]+=";COUNTRY:"+s;}
			// States
			s="";
			for(i= 0;i<f.states.length;i++) {if(f.states.options[i].selected) {s+=((s)?",":"")+f.states.options[i].value;}}
			if(s){ITI[orig_or_dest][Y]+=";MUNI:"+s;}
		}
		RenderTable();
	}

	//-------------------------------------------------------------------------------------------------

	function GetHashFromLocationString(location_string) {
		var array = location_string.split(";");
		var hash = new Array();
		var count = array.length;
		for (var i = 0; i < count; i++) {
			var tempArray = array[i].split(":");
			hash[tempArray[0]] = tempArray[1];
		}
		return hash;
	}

	//-------------------------------------------------------------------------------------------------

	function LocationText(location_string) {
		var hash = GetHashFromLocationString(location_string)
		if (hash["CITIES"])							{return hash["CITIES"];}
		else if (hash["MUNI"] && hash["COUNTRY"])	{return hash["MUNI"] + ", " + Countries[hash["COUNTRY"].toLowerCase()][0];}
		else if (hash["COUNTRY"])					{return Countries[hash["COUNTRY"].toLowerCase()][0];}
		else if (hash["REGION"])					{return Regions[hash["REGION"]];}
		return "";
	}

	//-------------------------------------------------------------------------------------------------
	//---- TRAVEL MODE OPTIONS ------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------

	function ActivateTravelModeOptions(X,Y) {
		RenderTable();
		ITI['activeRow'] = Y;
		var f = document.TravelModeForm;
		var val = ITI["via"][Y];
		// Pre-populate the options form with values from the active row:
		f.mode[0].checked = (val.indexOf("AIR1") != -1);
		f.mode[1].checked = (val.indexOf("AIR2") != -1);
		f.mode[2].checked = (val.indexOf("AIR3") != -1);
		f.mode[3].checked = (val.indexOf("TRAIN1") != -1);
		f.mode[4].checked = (val.indexOf("TRAIN2") != -1);
		f.mode[5].checked = (val.indexOf("BUS1") != -1);
		f.mode[6].checked = (val.indexOf("BUS2") != -1);
		// End pre-population
		Activate('TravelModeOptions','TravelMode',X,Y+"a");
	}

	//-------------------------------------------------------------------------------------------------

	function CommitTravelModeOptions() {
		var f = document.TravelModeForm;
		var tempArray = new Array();
		var i = 0;
		if (f.mode[0].checked) {tempArray[i++] = "AIR1";}
		if (f.mode[1].checked) {tempArray[i++] = "AIR2";}
		if (f.mode[2].checked) {tempArray[i++] = "AIR3";}
		if (f.mode[3].checked) {tempArray[i++] = "TRAIN1";}
		if (f.mode[4].checked) {tempArray[i++] = "TRAIN2";}
		if (f.mode[5].checked) {tempArray[i++] = "BUS1";}
		if (f.mode[6].checked) {tempArray[i++] = "BUS2";}
		ITI["via"][ITI['activeRow']] = tempArray.join(",");

		RenderTable();
	}

	function TravelModeText(val) {
		var tempArray = new Array();
		var i = 0;
		if (val.indexOf("AIR1") != -1)		{tempArray[i++] = "first class air";}
		if (val.indexOf("AIR2") != -1)		{tempArray[i++] = "business class air";}
		if (val.indexOf("AIR3") != -1)		{tempArray[i++] = "economy class air";}
		if (val.indexOf("TRAIN1") != -1)	{tempArray[i++] = "first class train";}
		if (val.indexOf("TRAIN2") != -1)	{tempArray[i++] = "economy class train";}
		if (val.indexOf("BUS1") != -1)		{tempArray[i++] = "first class bus";}
		if (val.indexOf("BUS2") != -1)		{tempArray[i++] = "economy class bus";}
		retVal = tempArray.join(" or ");
		return retVal;
	}

	//-------------------------------------------------------------------------------------------------
	//---- VEHICLE OPTIONS ----------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------

	function ActivateVehicleOptions(X,Y) {
		RenderTable();
		ITI['activeRow'] = Y;
		var f = document.VehicleForm;
		var val = ITI["vehicle"][Y];
		// Pre-populate the options form with values from the active row:
		f.vehicle[0].checked = (val.indexOf("2_2") != -1);
		f.vehicle[1].checked = (val.indexOf("2_4") != -1);
		f.vehicle[2].checked = (val.indexOf("4_5") != -1);
		f.vehicle[3].checked = (val.indexOf("CYCLE") != -1);
		f.vehicle[4].checked = (val.indexOf("SUV") != -1);
		f.vehicle[5].checked = (val.indexOf("CONV") != -1);
		f.vehicle[6].checked = (val.indexOf("EXOTIC") != -1);
		f.vehicle[7].checked = (val.indexOf("HOME") != -1);
		// End pre-population
		Activate('VehicleOptions','Vehicle',X,Y+"a");
	}

	//-------------------------------------------------------------------------------------------------

	function CommitVehicleOptions() {
		var f = document.VehicleForm;
		var tempArray = new Array();
		var i = 0;
		if (f.vehicle[0].checked) {tempArray[i++] = "2_2";}
		if (f.vehicle[1].checked) {tempArray[i++] = "2_4";}
		if (f.vehicle[2].checked) {tempArray[i++] = "4_5";}
		if (f.vehicle[3].checked) {tempArray[i++] = "CYCLE";}
		if (f.vehicle[4].checked) {tempArray[i++] = "SUV";}
		if (f.vehicle[5].checked) {tempArray[i++] = "CONV";}
		if (f.vehicle[6].checked) {tempArray[i++] = "EXOTIC";}
		if (f.vehicle[7].checked) {tempArray[i++] = "HOME";}
		ITI["vehicle"][ITI["activeRow"]] = tempArray.join(",");

		RenderTable();
	}

	//-------------------------------------------------------------------------------------------------

	function VehicleText(val) {
	//	var retVal = "<span class='error'>"+val+"</span>";
		var tempArray = new Array();
		var i = 0;
		if (val.indexOf("2_2") != -1)		{tempArray[i++] = "2-door, 2-passenger";}
		if (val.indexOf("2_4") != -1)		{tempArray[i++] = "2-door, 4-passenger";}
		if (val.indexOf("4_5") != -1)		{tempArray[i++] = "4-door, 4/5-passenger";}
		if (val.indexOf("CYCLE") != -1)		{tempArray[i++] = "Motorcycle";}
		if (val.indexOf("SUV") != -1)		{tempArray[i++] = "Sport-utility";}
		if (val.indexOf("CONV") != -1)		{tempArray[i++] = "Convertible";}
		if (val.indexOf("EXOTIC") != -1)	{tempArray[i++] = "Exotic";}
		if (val.indexOf("HOME") != -1)		{tempArray[i++] = "Motorhome";}
		retVal = tempArray.join("; ");
		return retVal;
	}

	//-------------------------------------------------------------------------------------------------
	//---- LODGING OPTIONS ----------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------

	function ActivateLodgingOptions(X,Y) {
		RenderTable();
		ITI['activeRow'] = Y;
		var f = document.LodgingForm;
		var val = ITI["lodging"][Y];
		// Pre-populate the options form with values from the active row:
		f.lodging_mode[0].checked = false;
		f.lodging_mode[1].checked = false;
		f.lodging[0].checked = false;
		f.lodging[1].checked = false;
		f.lodging[2].checked = false;
		f.lodging[3].checked = false;
		f.lodging[4].checked = false;
		f.lodging[5].checked = false;
		f.lodging[6].checked = false;
		f.lodging[7].checked = false;
		f.min_price.value = "";
		f.max_price.value = "";
		if (val.substring(0,1) == "$") {
			f.lodging_mode[1].checked = true;
			var tempArray = val.split(":");
			var currency_code = tempArray[0].substring(1,3);
			if (tempArray[1].substring(0,1) == ">") {
				f.min_price.value = tempArray[1].substring(1);
			} else if (tempArray[1].substring(0,1) == "<") {
				f.max_price.value = tempArray[1].substring(1);
			} else if (tempArray[1].substring(0,1) == "~") {
				f.min_price.value = tempArray[1].substring(1);
				f.max_price.value = f.min_price.value;
			} else if (tempArray[1].indexOf("-") != -1) {
				tempA = tempArray[1].split("-");
				f.min_price.value = tempA[0];
				f.max_price.value = tempA[1];
			} else {
				// do nothing; leave everything empty
			}
		} else {
			f.lodging_mode[0].checked = true;
			f.lodging[0].checked = (val.indexOf("HOTEL-ECO") != -1);
			f.lodging[2].checked = (val.indexOf("HOTEL-MID") != -1);
			f.lodging[4].checked = (val.indexOf("HOTEL-LUX") != -1);
			f.lodging[6].checked = (val.indexOf("B-B") != -1);
			f.lodging[1].checked = (val.indexOf("BUNGALOW") != -1);
			f.lodging[3].checked = (val.indexOf("HOSTEL") != -1);
			f.lodging[5].checked = (val.indexOf("APT") != -1);
			f.lodging[7].checked = (val.indexOf("GUEST") != -1);
		}
		// End pre-population
		Activate('LodgingOptions','Lodging',X,Y+"a");
		LodgingMode(((f.lodging_mode[0].checked)?"TYPE":""));

	}

	//-------------------------------------------------------------------------------------------------

	function CommitLodgingOptions() {
		var f = document.LodgingForm;
		var n = [ITI["activeRow"]];
		if (f.lodging_mode[0].checked) {
			var tempArray = new Array();
			var i = 0;
			if (f.lodging[0].checked) {tempArray[i++] = "HOTEL-ECO";}
			if (f.lodging[2].checked) {tempArray[i++] = "HOTEL-MID";}
			if (f.lodging[4].checked) {tempArray[i++] = "HOTEL-LUX";}
			if (f.lodging[6].checked) {tempArray[i++] = "B-B";}
			if (f.lodging[1].checked) {tempArray[i++] = "BUNGALOW";}
			if (f.lodging[3].checked) {tempArray[i++] = "HOSTEL";}
			if (f.lodging[5].checked) {tempArray[i++] = "APT";}
			if (f.lodging[7].checked) {tempArray[i++] = "GUEST";}
			ITI["lodging"][n] = tempArray.join(",");
		} else if (f.lodging_mode[1].checked) {
			var min = f.min_price.value/1; if (min == "") {min = 0;}
			var max = f.max_price.value/1; if (max == "") {max = 0;}
			var curr_code = f.currency_code.options[f.currency_code.selectedIndex].value;
			if (min == 0 && max == 0) {
				ITI["lodging"][n] = "";
			} else if (max > 0 && min == 0) {
				ITI["lodging"][n] = "$"+curr_code+":<"+max;
			} else if (min > 0 && max == 0) {
				ITI["lodging"][n] = "$"+curr_code+":>"+min;
			} else if (max == min) {
				ITI["lodging"][n] = "$"+curr_code+":~"+max;
			} else if (min > max) {
				ITI["lodging"][n] = "$"+curr_code+":"+max+"-"+min;
			} else if (max > min) {
				ITI["lodging"][n] = "$"+curr_code+":"+min+"-"+max;
			}
		}
		RenderTable();
	}

	//-------------------------------------------------------------------------------------------------

	function LodgingText(val) {
		var retVal = "<span class='error'>"+val+"</span>";
		if (val.substring(0,1) == "$") {
			var tempArray = val.split(":");
			var currency_code = tempArray[0].substring(1,4);
			if (tempArray[1].substring(0,1) == ">") {
				retVal = tempArray[1].substring(1)+" "+currency_code+" or higher";
			} else if (tempArray[1].substring(0,1) == "<") {
				retVal = "Up to "+tempArray[1].substring(1)+" "+currency_code;
			} else if (tempArray[1].substring(0,1) == "~") {
				retVal = "Around "+tempArray[1].substring(1)+" "+currency_code;
			} else if (tempArray[1].indexOf("-") != -1) {
				tempA = tempArray[1].split("-");
				retVal = "Between "+tempA[0]+" and "+tempA[1]+" "+currency_code;
			}
		} else {
			var tempArray = new Array();
			var i = 0;
			if (val.indexOf("HOTEL-ECO") != -1)	{tempArray[i++] = "Economy hotel";}
			if (val.indexOf("HOTEL-MID") != -1)	{tempArray[i++] = "Midrange hotel";}
			if (val.indexOf("HOTEL-LUX") != -1)	{tempArray[i++] = "Luxury hotel";}
			if (val.indexOf("B-B") != -1)		{tempArray[i++] = "Bed &amp; breakfast";}
			if (val.indexOf("BUNGALOW") != -1)	{tempArray[i++] = "Bungalow";}
			if (val.indexOf("HOSTEL") != -1)	{tempArray[i++] = "Hostel/pension";}
			if (val.indexOf("APT") != -1)		{tempArray[i++] = "Apartment";}
			if (val.indexOf("GUEST") != -1)		{tempArray[i++] = "Guest house";}
			retVal = tempArray.join(", ");
		}
		return retVal;
	}

	function LodgingMode(mode) {
		var f=document.LodgingForm;
		if(mode=='TYPE'){
			f.lodging_mode[0].checked=true;
			f.lodging_mode[1].checked=false;
			Hide("LodgingPriceMode");
			Show("LodgingTypeMode");
		}else{ // PRICE
			f.lodging_mode[0].checked=false;
			f.lodging_mode[1].checked=true;
			Hide("LodgingTypeMode");
			Show("LodgingPriceMode");
		}
	}

	//-------------------------------------------------------------------------------------------------
	//---- UTILITY FUNCTIONS --------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------

	function AddRow() {
		ITI['arr_or_dep'][ITI['arr_or_dep'].length] = "DEPART";
		ITI['date_or_range'][ITI['date_or_range'].length] = "DATE";
		ITI['specific_date'][ITI['specific_date'].length] = "";
		ITI['earliest_date'][ITI['earliest_date'].length] = "";
		ITI['latest_date'][ITI['latest_date'].length] = "";
		ITI['earliest_time'][ITI['earliest_time'].length] = "";
		ITI['latest_time'][ITI['latest_time'].length] = "";
		ITI['origin'][ITI['origin'].length] = "";
		ITI['dest'][ITI['dest'].length] = "";
		ITI['via'][ITI['via'].length] = "";
		ITI['vehicle'][ITI['vehicle'].length] = "";
		ITI['lodging'][ITI['lodging'].length] = "";
		RenderTable();
	}

	function Activate(formDiv,fieldName,X,Y) {
		xCoords = GetCoords(D.getElementById("PosX"+X)); posX = xCoords.x + GetBrowserOffset("x");
		yCoords = GetCoords(D.getElementById("PosY"+Y)); posY = yCoords.y + GetBrowserOffset("y");
		D.getElementById(formDiv).style.left = (posX+1+(4*(X==1))-(252*(X==3))+(65*(fieldName=='Vehicle')));
		D.getElementById(formDiv).style.top = (posY);
		Light(fieldName,(Y+"").substring(0,1));
		Show(formDiv);
	}

	function GetBrowserOffset(xy) {
		var x=0,y=0;
		if      (navigator.userAgent.indexOf("MSIE") != -1) {x=0;y=0;}
		else if (navigator.userAgent.indexOf("Netscape") != -1) {x=0;y=-1;}
		else if (navigator.userAgent.indexOf("Mozilla") != -1) {x=-1;y=-1;}
		if (xy=="x") {return x;} else {return y;}
	}

	function Show(id) {
		var el = D.getElementById(id);
		if (el) {
			el.style.visibility="visible";
		}
	}

	function Hide(id) {
		var el = D.getElementById(id);
		if (el){
			el.style.visibility="hidden";
			el.style.top=0;
			el.style.left=0;
		}
	}

	function Light(fieldname,Y) {
		var el = D.getElementById(fieldname+"Input"+Y);
		if (el) {
			el.style.color="#000000";
			el.style.backgroundColor="#FFFF99";
			el.style.borderColor="#000000";
			D.getElementById(fieldname+"Button"+Y).style.borderColor="#000000";
		}
	}

// THIS FUNCTION APPEARS NEVER TO BE CALLED - REMOVE IT
//	function Unlight(fieldname,Y) {
//		var el = D.getElementById(fieldname+"Input"+Y);
//		if (el) {
//			el.style.color = "#8A904C";
//			el.style.backgroundColor = "#FFFFFF";
//			el.style.borderColor = "#B2B775";
//			D.getElementById(fieldname+"Button"+Y).style.borderColor = "#B2B775";
//		}
//	}

	//-------------------------------------------------------------------------------------------------
	//---- DATE-PARSING FUNCTIONS ---------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------

	function ParseDate(dateString) {
		var retVal = "";
		var current = new Date();

		if (/^(\d{1,2})\W+(\d{1,2})\W+(\d{2,4})$/.test(dateString)) {
			var m = /^(\d{1,2})\W+(\d{1,2})\W+(\d{2,4})$/.exec(dateString);
			p1 = parseInt(m[1]); p2 = parseInt(m[2]); p3 = parseInt(m[3]);
			if		(isMonth(p1) && isDay(p2) && isYear(m[3]))	{retVal = FixYear(m[3])+"-"+p1+"-"+p2;}
			else if	(isDay(p1) && isMonth(p2) && isYear(m[3]))	{retVal = FixYear(m[3])+"-"+p2+"-"+p1;}
			else if	(isYear(m[1]) && isMonth(p2) && isDay(p3))	{retVal = FixYear(m[1])+"-"+p2+"-"+p3;}
		} else if (/^(\d{1,2})\W+(\w+)\W+(\d{2,4})$/.test(dateString)) {
			var m = /^(\d{1,2})\W+(\w+)\W+(\d{2,4})$/.exec(dateString);
			p1 = parseInt(m[1]); p2 = GetMonthNum(m[2]); p3 = parseInt(m[3]);
			if		(isDay(p1) && isMonth(p2) && isYear(m[3]))	{retVal = FixYear(m[3])+"-"+p2+"-"+p1;}
			else if	(isYear(m[1]) && isMonth(p2) && isDay(p3))	{retVal = FixYear(m[1])+"-"+p2+"-"+p3;}
		} else if (/(\d{2,4})\W+(\d{1,2})\W+(\d{1,2})/.test(dateString)) {
			var m = /(\d{2,4})\W+(\d{1,2})\W+(\d{1,2})/.exec(dateString);
			p1 = parseInt(m[1]); p2 = parseInt(m[2]); p3 = parseInt(m[3]);
			if		(isMonth(p1) && isDay(p2) && isYear(m[3]))	{retVal = FixYear(m[3])+"-"+p1+"-"+p2;}
			else if	(isDay(p1) && isMonth(p2) && isYear(m[3]))	{retVal = FixYear(m[3])+"-"+p2+"-"+p1;}
			else if	(isYear(m[1]) && isMonth(p2) && isDay(p3))	{retVal = FixYear(m[1])+"-"+p2+"-"+p3;}
		} else if (/(\d{2,4})\W+(\w+)\W+(\d{1,2})/.test(dateString)) {
			var m = /(\d{2,4})\W+(\w+)\W+(\d{1,2})/.exec(dateString);
			p1 = parseInt(m[1]); p2 = GetMonthNum(m[2]); p3 = parseInt(m[3]);
			if		(isDay(p1) && isMonth(p2) && isYear(m[3]))	{retVal = FixYear(m[3])+"-"+p2+"-"+p1;}
			else if	(isYear(m[1]) && isMonth(p2) && isDay(p3))	{retVal = FixYear(m[1])+"-"+p2+"-"+p3;}
		} else if (/(\w+)\W+(\d{1,2})\D+(\d{2,4})/.test(dateString)) {
			var m = /(\w+)\W+(\d{1,2})\D+(\d{2,4})/.exec(dateString);
			p1 = GetMonthNum(m[1]); p2 = parseInt(m[2]);
			if		(isMonth(p1) && isDay(p2) && isYear(m[3]))	{retVal = FixYear(m[3])+"-"+p1+"-"+p2;}
		} else if (/(\d{1,2})\W+(\d{1,2})/.test(dateString)) {
			var m = /(\d{1,2})\W+(\d{1,2})/.exec(dateString);
			p1 = parseInt(m[1]); p2 = parseInt(m[2]);
			if (isMonth(p1) && isDay(p2)) {
				returnDate = new Date(current.getFullYear(),p1-1,p2);
				if (returnDate.getTime() < current.getTime()) {returnDate.setFullYear(returnDate.getFullYear()+1);}
				retVal = returnDate.getFullYear()+"-"+(returnDate.getMonth()+1)+"-"+returnDate.getDate();
			} else if (isDay(p1) && isMonth(p2)) {
				returnDate = new Date(current.getFullYear(),p2-1,p1);
				if (returnDate.getTime() < current.getTime()) {returnDate.setFullYear(returnDate.getFullYear()+1);}
				retVal = returnDate.getFullYear()+"-"+(returnDate.getMonth()+1)+"-"+(returnDate.getDate());
			}
		} else if ( /(\w+)\W+(\d{1,2})/.test(dateString )) {
			var m = /(\w+)\W+(\d{1,2})/.exec(dateString);
			p1 = GetMonthNum(m[1]); p2 = parseInt(m[2]);
			if (isMonth(p1) && isDay(p2)) {
				var returnDate = new Date(current.getFullYear(),p1-1,p2);
				if (returnDate.getTime() < current.getTime()) {returnDate.setFullYear(returnDate.getFullYear()+1);}
				retVal = returnDate.getFullYear()+"-"+(returnDate.getMonth()+1)+"-"+(returnDate.getDate());
			}
		} else if (/(\d{1,2})\W+(\w+)/.test(dateString)) {
			var m = /(\d{1,2})\W+(\w+)/.exec(dateString);
			p1 = parseInt(m[1]); p2 = GetMonthNum(m[2]);
			if (isDay(p1) && isMonth(p2)) {
				var returnDate = new Date(current.getFullYear(),p2-1,p1);
				if (returnDate.getTime() < current.getTime()) {returnDate.setFullYear(returnDate.getFullYear()+1);}
				retVal = returnDate.getFullYear()+"-"+(returnDate.getMonth()+1)+"-"+returnDate.getDate();
			}
		}
		return retVal;
	}

	//-------------------------------------------------------------------------------------------------

	function isDay(str) {
		p = parseInt(str);
		if (p >= 1 && p <= 31)	{return true;}
		else					{return false;}
	}

	//-------------------------------------------------------------------------------------------------

	function isMonth(str) {
		p = parseInt(str);
		if (p >= 1 && p <= 12)	{return true;}
		else					{return false;}
	}

	//-------------------------------------------------------------------------------------------------

	function isYear(str) {
		if (/^\d{2}$/.test(str) || /^(19|20)\d{2}$/.test(str)) {
			return true;
		} else {
			return false;
		}
	}

	//-------------------------------------------------------------------------------------------------

	function FixYear(str) {
		if (/^20\d{2}$/.test(str))		{return str;}
		else if (/^\d{2}$/.test(str))	{return "20"+str;}
		else							{return "";}
	}

	//-------------------------------------------------------------------------------------------------

	function GetMonthNum(str) {
		str = str.toLowerCase();
		switch (str) {
			case "january":		case "jan":						return 1;
			case "february":	case "feb":						return 2;
			case "march":		case "mar":						return 3;
			case "april":		case "apr":						return 4;
			case "may":											return 5;
			case "june":		case "jun":						return 6;
			case "july":		case "jul":						return 7;
			case "august":		case "aug":						return 8;
			case "september":	case "sept":	case "sep":		return 9;
			case "october":		case "oct":						return 10;
			case "november":	case "nov":						return 11;
			case "december":	case "dec":						return 12;
			default: return "";
		}
	}

	//-------------------------------------------------------------------------------------------------

	function ReformatDate(inputField) {
		// var bday = new Date(75, 1, 16); Parameters are year, month*, day
		var months = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
		var p = ParseDate(inputField.value);
		if (p) {
			var m = /^(\d+)\W+(\d+)\W+(\d+)$/.exec(p);
			var p1 = parseInt(m[1]); var p2 = parseInt(m[2]); var p3 = parseInt(m[3]);
			var d = new Date(p1,p2-1,p3); // after this the date can be formatted any way we like
			inputField.value = d.getDate()+'-'+months[d.getMonth()]+'-'+(d.getFullYear().toString().substring(2));
			inputField.style.color="#000000";
			inputField.style.fontWeight="normal";
		} else {
			if (/[^\s]+/.test(inputField.value)) {
				inputField.style.color="#CC0000";
				inputField.style.fontWeight="bold";
				inputField.value += " (?)";
			} else {
				inputField.style.color="#000000";
				inputField.style.fontWeight="normal";
			}
		}
	}
