var Flight_plan = Class.create();

Flight_plan.prototype = {
	object_state: {},
	
	initialize: function(className) {
		var context, stub;
		context = this;
		this.Error = $('error');
		this.Results = $('results');
		this.parent_class = className;
		this.planners = $$("div."+className+" form");
		this.planners.each( function(form) {
			stub = new Form.EventObserver(form, context.get_airport_details.bindAsEventListener(form, context));
			if (form.parentNode.id !== "departure") { form.disable(); }
		});
	},
	load_airport_data: function(airport_data) {
		this.airport_details = airport_data;
	},
	load_field_name_map: function(field_name_map) {
		this.field_name_map = field_name_map;
	},
	load_postfix_data: function(field_name_postfix) {
		this.field_name_postfix = field_name_postfix	
	},
	get_airport_details: function(form, context) {
		var airport_id, status;
		//context.Results.setStyle({'display': 'none'});
		//context.Results.hide()
		airport_id = form.airport.getValue();
		status = form.parentNode.id // arrival | departure
		context.object_state[status] = airport_id;
		target = Element.getElementsByClassName(form.parentNode, 'airports-target')[0];
		
		context.object_state.current_target = target; 
		context.object_state.current_status = status;
		
		target.innerHTML = "";
		if (!context.airport_details[airport_id]) {
			if ($('get-flight-plan')) { $('get-flight-plan').remove(); }
			context.raise_error('Option not found.');
			Event.stop(arguments[0]);
			return;			
		}
		if (context.object_state.departure === context.object_state.arrival) {
			context.object_state[status] = null;
			if ($('get-flight-plan')) { $('get-flight-plan').remove(); }
			context.raise_error('You cannot have the same arrival and departure point.');
			Event.stop(arguments[0]);
			return;
		}		
		if ($('get-flight-plan')) { $('get-flight-plan').remove(); }
		airport_details = context.airport_details[airport_id];
		
			var big_string = [ 
							  	"<p>You selected <a href=\"http://maps.google.com/maps?f=q&hl=en&q=",
								airport_id,
								"\" title=\"Get info about this airport from Google Maps\" target=\"_blank\">",
								airport_details[0],
								"</a> (",
								airport_id,
								") ",
								airport_details[1],
								", ",
								airport_details[2],
								"</p>"
							  ]
		
		target.innerHTML = big_string.join("");
		context.request_airport_data(airport_id, context);
		//effect_stub = new Effect.Appear(target);
		if (status === "departure") {
			context.get_available_airports(context);
			if ($('get-flight-plan')) { $('get-flight-plan').remove(); }
			if ($$('div#arrival ul.airports-target').length == 1) { 
				var old_target = $$('div#arrival ul.airports-target'); 
				//old_target[0].remove(); 
				old_target[0].innerHTML = "";
				context.object_state.arrival = null;
			}
		}
		else {
			var button;
			button = document.createElement('button');
			button.id = "get-flight-plan";
			button.setAttribute('value', 'Get average load factor for this flight.');
			button.setAttribute('type', 'button');
			button.innerHTML = "Get average load factor for this flight.";
			if (button.observe) {
				button.observe('click', context.show_flight_data.bindAsEventListener(context.event_stub, context), false);
			}
			else {
				button.onclick = context.show_flight_data.bindAsEventListener(context.event_stub, context);
			}
			target.parentNode.appendChild(button);			
		}
	},
	
	get_available_airports: function(context) {
		var json, url, params;
		//url = 'http://staging4.usnews.com/usnews/js_test/flight-plan/sample.php';
		url = 'lib/flight_data.php';
		params = {'aircode' : this.object_state.departure }
		new Ajax.Request(url, {
			method: 'get',
			parameters: params,
			onSuccess: context.set_arrival_options.bind(json, context)
		});
	},
	
	set_arrival_options: function(context, json) {
		eval(json.responseText); //var json
		var airports = $H(result);
		context.object_state.available_airports = airports;
		airport_ids = $H(airports).keys();
		context.planners[1].airport.enable();
		context.planners[1].airport.innerHTML = "";
		var default_option = document.createElement('option');
		default_option.value = "null";
		default_option.innerHTML = "Select an airport...";
		context.planners[1].airport.appendChild(default_option);
		airport_ids.each( function(airport_id) {
			var option = document.createElement('option');
			option.value = airport_id;
			option.innerHTML = context.airport_details[airport_id][1];
			context.planners[1].airport.appendChild(option);
	   });
	},
	
	close_error: function(evt, context) {
		context.Error.hide();
		Event.stop(evt);
	},
	
	raise_error: function(message) {
		var close_control, stub;
		this.Error.innerHTML = message + "&nbsp; &nbsp";
		close_control = document.createElement('a');
		close_control.href = "index.html";
		close_control.innerHTML = "Close box";
		if (close_control.observe) {
			close_control.observe('click', this.close_error.bindAsEventListener(this.event_stub, this), false);
		}
		else {
			close_control.onclick = this.close_error.bindAsEventListener(this.event_stub, this);
		}
		this.Error.appendChild(close_control);
		stub = new Effect.Appear(this.Error, { duration: 1.0, from: 0.0, to: 0.9 });
		//this.Error.show()
	},
	
	show_flight_data: function() {
		var context, load_factor, flight_info;
		var context = arguments[1];
		load_factor = context.object_state.available_airports[context.object_state.arrival]
		flight_info = "<p><span>" + load_factor + "% </span></p>";
		flight_info += "<div class=\"explain_measure\">[<a href=\"javascript:void(0)\" onclick=\"a.raise_error('Load Factor measures how full the plane is. The average load factor for all flights in 2007 was 74\%.')\">What is load factor?</a>]</div>";
		if (context.Results.innerHTML.length === 0) {
			context.Results.innerHTML = flight_info;
			var stub = new Effect.Appear(context.Results);
		}
		else { context.Results.innerHTML = flight_info; }
		
	},
	request_airport_data: function(airport) {
		var context, url, json, params;
		var context = arguments[1];
		if ($('get-flight-plan')) { $('get-flight-plan').remove(); }
		url = 'lib/airport_data.php';
		params = {'airport' : airport}
		new Ajax.Request(url, {
			method: 'get',
			parameters: params,
			onSuccess: context.request_airport_data_callback.bind(json, context)
		});		
	},
	request_airport_data_callback: function(context, json) {
		var status, result, fields, airport_info_container, airport_info_content, airport_info_fields, postfix;
		status = context.object_state.current_status;
		eval(json.responseText);
		if (result === null) {
			effect_stub = new Effect.Appear(context.object_state.current_target);
			return;	
		}
		result = $H(result);
		fields = result.keys();
		airport_info_container = document.createElement('div');
		airport_info_container.id = "airport_info";
		//$(airport_info_container).setStyle({'display': 'none'});
		airport_info_content = "<h4>Airport Information</h4><dl>";
		airport_info_fields = "";
		fields.each( function(field) {
			if (field !== "code") {
				postfix = (context.field_name_postfix[field])?" " + context.field_name_postfix[field]:null
				if (postfix) {
					explainer = "[<a href=\"javascript:void(0)\" onclick=\"a.raise_error(a.field_name_postfix." + field+");\">?</a>]";
				}
				else { explainer = ""; }
				airport_info_array = [
					"<dt class=\"",
					field, 
					"\">",
					context.field_name_map[field],
					explainer,
					":&nbsp;</dt><dd class=\"",
					field,
					"\">",
					result[field],
					"<span class=\"explain_measure\">",
					"</span></dd>"
				]
				airport_info_fields += airport_info_array.join("");
			}
		}); 
		airport_info_content += airport_info_fields + "</dl>";
		airport_info_container.innerHTML = airport_info_content;
		context.object_state.current_target.appendChild(airport_info_container);
		effect_stub = new Effect.Appear(context.object_state.current_target);
	}
};