log = function (text) {
	var insert = new Insertion.Bottom('chaste-environment', "<div>" + text + "</div>");
};
var ChasteEnvironment = Class.create();
ChasteEnvironment.prototype = {
	Model : Class.create(),
	View : Class.create(),
	Controller: Class.create(),
	__repr__ : function () {
		this.model = new this.Model();
		this.view = new this.View();
		this.controller = new this.Controller(this.model, this.view);
	},
	initialize: function () {
		this.Model.prototype = {
			home : {},
			contact : {
				a : {},
				b : {}
			},
			// @@ + foo foo
			initialize: function () {}
		};
		this.View.prototype = {
			apply_js_flash_rendering_to_main_content: function () {
				$('chaste-environment').getElementsByClassName('chaste-flash-container').each(
					function (container) {
						var date = new Date();
						var uid = date.getTime();
						container.setAttribute('id', 'flash-container-' + uid);
						var flash = container.down();
						var src = flash.readAttribute('data');
						var w = flash.readAttribute('width');
						var h = flash.readAttribute('height');
						var swfo = new SWFObject(src, 'flash-' + uid, w, h, '7', '#ffffff');
						swfo.setAttribute('redirectUrl', '/install_flash');
						swfo.write('flash-container-' + uid);
					}
				);
			},
			update_content: function (content, path) {
				var update = new Ajax.Updater(
					content,
					'/content/' + path, {
						evalScripts: true,
						onComplete: function () {
							if($('property-search-form')) {
								if(window.newhall_property_instance) {
									window.newhall_property_instance.apply_observers();
								} else {
									window.newhall_property_instance = new Nproperty();
								}
							}
							this.apply_js_flash_rendering_to_main_content();
						}.bind(this)
					}
				);
			},
			update_navigation: function (nav, nav_path, config, url_path, here, keys) {
				// log('update_navigation: nav_path = ' + nav_path + ' url_path = ' + url_path);
				var defined_keys = keys
				var nav_keys = new Hash();
				if (here) {
					nav.immediateDescendants().each(
						function (nav_item) {
							var a = nav_item.down();
							try {
								var href = a.readAttribute('href')
								var item_name = href.sub(nav_path, '');
								var i = 0;
								var access_key = '';
								var clean_name = item_name.gsub('_', '').gsub('and', '');
								var limit = clean_name.length;
								while (i < limit) {
									access_key = clean_name[i];
									if (defined_keys.include(access_key)) {
										i = i + 1;
									}
									else {
										break;
									}
								}
								if (access_key) {
									defined_keys.push(access_key);
									nav_keys[item_name] = access_key;
								}
							}
							catch (e) {}
						}
					);
				}
				var nav_path_array = nav_path.split("/");
				nav_path_array = nav_path_array.without(nav_path_array.first());
				var url_path = url_path;
				var url_path_array = url_path.split("/");
				url_path_array = url_path_array.without(url_path_array.last());
				nav.immediateDescendants().each(
					function (nav_item) {
						var a = nav_item.down();
						try {
							var href = a.readAttribute('href');
							//var item_name = a.readAttribute('id').sub('nav-', '');
							var item_name = href.sub(nav_path, '');
							var item_here = false;
							if (url_path_array.length && item_name == url_path_array.first()) {
								//log(item_name + " = here");
								nav_item.addClassName('here');
								item_here = true;
							}
							else if (item_name == 'ethos/design' && a.readAttribute('id') == 'nav-ethos' && url_path_array.first() == 'ethos') {
								nav_item.addClassName('here');
								item_here = true;
							}
							else if (item_name == 'sights_to_see/historic_buildings' && a.readAttribute('id') == 'nav-harlow-and-east-anglia-sights-to-see' && url_path_array.first() == 'sights_to_see') {
								nav_item.addClassName('here');
								item_here = true;
							}
							else if (item_name == 'travel_links/location' && a.readAttribute('id') == 'nav-harlow-and-east-anglia-travel-links' && url_path_array.first() == 'travel_links') {
								nav_item.addClassName('here');
								item_here = true;
							}
							else {
								if (nav_item.hasClassName('here')) {
									nav_item.removeClassName('here');
								}
							}
							if (here && nav_keys.keys().include(item_name)) {
								a.setAttribute('accesskey', nav_keys[item_name]);
							}
							else {
								if (a.getAttribute('accesskey')) {
									a.removeAttribute('accesskey');
								}
							}
							var next_nav = nav_item.getElementsBySelector('ul').first();
							if (next_nav) {
								if (url_path_array.length > 1 && item_here) {
									url_path_array = url_path_array.without(url_path_array.first());
								}
								var item_path = nav_path + item_name.split('/').first() + '/';
								//var item_path = nav_path + item_name + '/';
								var url_path = url_path_array.join('/') + '/';
								this.update_navigation(next_nav, item_path, config, url_path, item_here, defined_keys);
							}
						}
						catch (e) {}
					}.bind(this)
				);
				if($$('.here').length == 1) {
					$('sub-arrow').show();
				} else if(url_path == 'design/' || url_path == 'ethos/design/') {
					$('sub-arrow').show();
				} else {
					$('sub-arrow').hide();
				}
			},
			convert_value_to_label: function (v) {
				return v.gsub('_', ' ').gsub('and', '&');
			},
			set_title_from_path: function (p){
				var upa = new Array();
				var pa = p.split('/');
				pa = pa.without(pa.last());
				pa.each(
					function (w) {
						if (w) {
							upa.push(w.capitalize());
						}
					}
				);
				var stub = 'Newhall';
				if (upa.length) {
					stub = stub + ' > ';
				}
				document.title = stub + this.convert_value_to_label(upa.join(' > '));
			},
			update: function (path) {
				var url_path = path;
				var content =
				  $A($('chaste-environment').getElementsByClassName('main-content')).first();
				this.update_content(content, url_path);
				var nav =
				  $A($('chaste-environment').getElementsByClassName('nav')).first();
				var nav_path = '/';
				var config = {
					'render': 'text'
				}
				var here = true;
				var keys = new Array();
				keys.push('h');
				this.update_navigation(nav, nav_path, config, url_path, here, keys);
				this.set_title_from_path(url_path);
				
			},
			initialize: function () {
				$('sub-arrow').hide();
			}
		};
		this.Controller.prototype = {
			is_ie: window.ActiveXObject,
			is_moz: (navigator.userAgent.indexOf('Gecko') > -1),
			is_safari: (navigator.userAgent.indexOf('Safari') > -1),
			is_opera: (navigator.userAgent.indexOf('Opera') > -1),
			has_plugins_array: (navigator.plugins && navigator.mimeTypes.length),
			history_stack: new Array(),
			forward_stack: new Array(),
			ignore_location_change: false,
			set_history: function (raw_path) {
				if (this.kwargs){
					var path = this._remove_initial_slash(this._append_trailing_slash(raw_path) + '?' + this.kwargs);
				} else {
					var path = this._remove_initial_slash(this._append_trailing_slash(raw_path));
				}
				var d = new Date();
				var timestamp = d.getTime().toString();
				this.ignore_location_change = true;
				this._set_iframe_src(window.frames["chaste-history-iframe"], "/static/html/history.htm?" + timestamp, false);
				this.history_stack.push(new Hash({'timestamp': timestamp, 'path': path}));
				this.view.update(path);
			},
			set_initial_history: function (href) {
				var parsed_url = this._parse_url(href);
				var path = this._remove_initial_slash(this._append_trailing_slash(parsed_url.directory_path) + '?' + parsed_url.query);
				var d = new Date();
				var timestamp = d.getTime().toString();
				this.ignore_location_change = true;
				this._set_iframe_src(window.frames["chaste-history-iframe"], "/static/html/history.htm?" + timestamp, false);
				this.history_stack.push(new Hash({'timestamp': timestamp, 'path': path}));
			
			},
			handle_click_event: function (evt) {
				var target = Event.element(evt);
				if (target.classNames().include('chaste-link')) {
					var path = target.readAttribute('href');
					if (path != null) {
						Event.stop(evt);
						this.set_history(path);
					}
					else if ($('property-search-form').readAttribute('action') != null){
						if ($('loading-bar-image')){$('loading-bar-image').style.display = 'block'};
						this.kwargs = $('property-search-form').serialize();
						this.set_history($('property-search-form').readAttribute('action'));
						Event.stop(evt);
					}
				}
			},
			handle_history_frame_location_change: function (evt, history_frame_location) {
				if (!this.is_opera) {
					if (this.ignore_location_change) {
						this.ignore_location_change = false;
						return;
					}
					var query = this._parse_url(history_frame_location.href).query;
					if (query == '' || query == null) {
						return;
					}
					else if (this.history_stack.length >= 2 && query == this.history_stack[this.history_stack.length - 2].timestamp) {
						this.handle_back_button();
					}
					else if (this.forward_stack.length > 0 && query == this.forward_stack[this.forward_stack.length - 1].timestamp) {
						this.handle_forward_button();
					}
				}
			}, 
			handle_back_button: function () {
				var current = this.history_stack.pop();
				if (!current) {
					return;
				}
				this.view.update(this.history_stack.last().path);
				this.forward_stack.push(current);
			},
			handle_forward_button: function () {
				var next = this.forward_stack.pop();
				if (!next) {
					return;
				}
				this.view.update(next.path);
				this.history_stack.push(next);
			},
			_parse_url: function (src_url) {
				var uri_part_names = ["source","protocol","authority","domain","port","path","directory_path","file_name","query","anchor"];
				var uri_parts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)?((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(src_url);
				var uri = {};
				for(var i = 0; i < 10; i++){
					uri[uri_part_names[i]] = (uri_parts[i] ? uri_parts[i] : "");
				}
				uri.directory_path = this._append_trailing_slash(uri.directory_path);
				return uri;
			},
			_append_trailing_slash: function (s) {
				if (s.length > 0) {
					return s.replace(/\/?$/, "/");
				}
			},
			_remove_initial_slash: function (s) {
				if (s.length > 0) {
					return s.replace(/^\/?/, "");
				}
			},
			_set_iframe_src: function (iframe, src, replace) {
				try {
					if (!replace) {
						if (this.is_safari) {
							iframe.location = src;
						}
						else {
							iframe.location.href = src;
						}
					}
					else {
						var idoc;
						if (this.is_ie) {
							idoc = iframe.contentWindow.document;
						}
						else {
							if (this.is_safari) {
								idoc = iframe.document;
							}
							else {
								idoc = iframe.contentWindow;
							}
						}
						if (!idoc) {
							iframe.location = src;
							return;
						}
						else {
							idoc.location.replace(src);
						}
					}
				}
				catch (e) {
					// @@ catch something
				}
			},
			__repr__: function () {
				var insert = new Insertion.Bottom('history_container', 
					'<iframe name="chaste-history-iframe" id="chaste-history-iframe" width="90%" src="/static/html/history.htm">\
				</iframe>');
			},
			initialize: function (model, view) {
				this.model = model;
				this.view = view;
				this.__repr__();
			}
		}; /*
		var launch = new Ajax.Request(
			'/middle', {
				onSuccess:*/ this.__repr__(); /*this.__repr__.bind(this)
			}
		); */
	}
};
/*var NavHack = Class.create();
NavHack.prototype = {
	'nav': null,
	'hit': null,
	__hide: function (evt) {
		var pos = {
			'_x': Event.pointerX(evt),
			'_y': Event.pointerY(evt)
		};
		if (pos._y >= 115) {
			var current_item;
			current_item = this.nav_items.find(
				function (item) {
					if (Position.within(item, pos._x, pos._y)) {
						return true;
					}
					return false;
				}
			);
			if (this.dev_details != current_item) {
				this.biggies.invoke(
					'setStyle', {
						'visibility': 'hidden'
					}
				);
			}
			if (current_item && current_item != this.histoire && current_item != this.devinfo) {
				if(current_item.up(0).hasClassName('here') != true) {
					this.nav.getElementsBySelector('.sub-sub-nav').invoke(
						'setStyle', {
							'visibility': 'hidden'
							//'display':'none'
						}
					);
				}
			}
		}
	},
	__show: function () {
		this.nav.getElementsBySelector('.sub-sub-nav').concat(this.biggies).invoke(
			'setStyle', {
				'visibility': 'visible'
				//'display':'block'
			}
		);
	},
	initialize: function () {
		this.nav = $$('ul.nav').first();
		this.nav_items = $$('.nav-item a');
		this.biggies = $$('li.big');
		this.dev_details = $('nav-development-details');
		this.histoire = $('nav-newhall-history'); //.getElementsBySelector('.sub-sub-nav').first();
		this.devinfo = $('nav-developers-information'); //.getElementsBySelector('.sub-sub-nav').first();
		Event.observe(this.nav, 'mouseover', this.__hide.bindAsEventListener(this));
		Event.observe(this.nav, 'mouseout', this.__show.bindAsEventListener(this));
	}
};*/
Event.observe(
	window,
	'load',
	function () {
		window.environment = new ChasteEnvironment();
		var c = window.environment.controller;
		c.set_initial_history(window.location.href);
		Event.observe('chaste-environment', 'click', c.handle_click_event.bindAsEventListener(c));
		Event.observe('chaste-environment', 'submit', c.handle_click_event.bindAsEventListener(c));
		//var nav_hack_instance = new NavHack();
	}
);
