// For Flash
var contact_slide; // globalize that
var valid_pages = new Array();

function flash_change_page(page_id) {
	
	window.location.hash = "/"+page_id;

}

function flash_contact() {

	contact_slide.slideIn();
	var body = $(document.body);
	var pageScroll = new Fx.Scroll(body).start(0, 0);
	

}

function url_to_function(string) {
	
	var array = string.split('-');
	if (array.length > 1) {
		
		var newstring = "";
		array.each(function(item, index) {
			
			if (index == array.length -1) {
				newstring += item;
			} else {
				newstring += item + "_";
			}
			
		});
		
		return newstring;
		
	}
	
	return string;
	
}

function function_to_url(string) {
	
	var array = string.split('_');
	if (array.length > 1) {
		
		var newstring = "";
		array.each(function(item, index) {
			
			if (index == array.length -1) {
				newstring += item;
			} else {
				newstring += item + "-";
			}
			
		});
		
		return newstring;
		
	}
	
	return string;
	
}

function flash_get_page() {
	
	if ( window.location.hash && valid_pages.contains( window.location.hash.substring(2).split("/")[0] ) ) {
		
		return url_to_function(window.location.hash.substring(2).split("/")[0]);
		
	}
	
	return valid_pages[0];
	
}

// Main site class
var ICUC = new Class({
	
	Implements: [Options],
	
	options: {
		delimiter: "#",
		lang: "en",
		validLangs: ["en", "fr", "es"],
		routes: {
			"en" : ["welcome", "does", "has", "covers", "is"],
			"fr" : ["bienvenue", "est-ce-que", "a", "couvre", "est"],
			"es" : ["bienvenido", "hace", "tiene", "cubre-a", "es"]
		},
		titles: {
			"welcome": "Welcome",
			"does": "Our Solution",
			"has": "Our Advantage",
			"covers": "Our Clients",
			"is": "Our Story",
			"bienvenue": "Bienvenue",
			"est-ce-que": "Nos Services",
			"a": "Notre Atout",
			"couvre": "Nos Clients",
			"est": "Notre Histoire",
			"bienvenido": "Bienvenido",
			"hace": "Nuestra Soluci&oacute;n",
			"tiene": "Nuestra Ventaja",
			"cubre-a": "Nuestros Clientes",
			"es": "Nuestra Historia"
		}
	},
	
	initialize: function (options) {
		
		this.setOptions(options);
		
		this.init_gat();
		
		this.delimiter = "#";
		
		this.init_valid_pages(this.options.lang);
		
		this.route_request();
		this.init_dom();
		this.init_flash();
		this.init_load();
		
		this.init_logger();
		
		this.init_active_page();
		
	},
	
	init_gat: function() {
		
		var self = this;
		try { self.pageTracker = _gat._getTracker("UA-2723793-1"); } catch(err) {}
		
	},
	
	init_valid_pages: function(lang) {

		valid_pages = this.options.routes[lang];
		
	},
	
	init_active_page: function() {
		
		var page_id = window.location.hash.substring(2).split("/")[0];
		if (page_id) {
			$("primary-navigation").getElement("a.active").removeClass("active");
			$("primary-navigation").getElement("a[href=/"+page_id+"]").addClass("active");
		}
		
	},
	
	get_routes: function(lang) {
		
		return this.options.routes[lang];
		
	},
	
	is_valid_page: function(page) {
		
		var self = this;
		var valid = false;
		this.options.validLangs.each(function(lang) {
			
			if (self.options.routes[lang].contains(page)) {
				
				valid = new Hash({
					lang: lang,
					page: page,
					index: self.options.routes[lang].indexOf(page)
				});
				
			}
			
		});
		
		return valid;
		
	},
	
	route_request: function() {
		
		var self = this;
		var uri = new URI(window.location);
		
	// STEP 1: Get the parts of the URI.
		
		var hash = uri.get("fragment");
		var page = (uri.get("file") || uri.get("directory")).replace(/\//g, "");
		var query = uri.get("query");
		
	// STEP 2: Process the parts.
		if (hash) {
			var aHash = hash.split("/").erase("");
			
			if (!page) {
				
				// only set the first item of the hash as the
				// page if the page doesn't already exist.
				page = (aHash[0] || this.options.routes[this.options.lang][0]);
				aHash = aHash.erase(aHash[0]);
				
			}
			
			if (page == hash[0]) { aHash = aHash.erase(page); }
			
			// reformat the hash;
			hash = "";
			aHash.each(function(item, index) { hash += item + ((index != (aHash.length -1)) ? "/" : ""); });
			
		}
		
		if (page) {
			// is it a valid page?
			var valid = this.is_valid_page(page);
			// translate the page if necessary.
			if (valid) {
				
				if (valid.lang != this.options.lang) {
					page = this.options.routes[this.options.lang][valid.index];
				}
				
			} else {
				
				window.location = page;
				
			}
			
		}
		
		if (page == "") {
			page = this.options.routes[this.options.lang][this.options.routes["en"].indexOf("welcome")];
		}
		
	// STEP 3: Everything should be good.
		var reformatted_uri = "/#/" + page + (hash ? "/" + hash : "");
		
		// Hold on a second... was there a query string?
		if (query) {
			
			// clean up the query string.
			query = query.replace(/\//g, "");
			
			// quickly, log the new formatted uri with
			// the query string for Google Analytics.
			//_GATC
			try { self.pageTracker._trackPageview(reformatted_uri + ((query) ? "?" + query: "")); } catch (err) {}
			
		}
		
		// store the values.
		this.current_uri = new Hash({
			page: page,
			hash: hash
		});
		
		window.location = reformatted_uri;
		
		
		if($('google-holder')) {
			googleURL = "http://icucmoderation.com" + reformatted_uri;
			gapi.plusone.render($('google-holder'), {"size": "medium", "count": "false", "href": googleURL });
		}
		
		try { self.pageTracker._trackPageview(reformatted_uri); } catch (err) {}
		
	},
	
	init_dom: function() {
		
		var self = this;
		
		this.focal_area = $("focal-area");
		this.contact = $("contact").addClass("drawer");
		this.contact_content = $("contact-content");
		this.focal_area_swf = null;
		this.primary_navigation = $("primary-navigation");
		this.pages = this.primary_navigation.getElements("a");
		this.main_content = $("main").getElement(".content").setStyle("overflow", "hidden");
		
		// animations, events, and effects
		this.contact_drawer = new Fx.Slide(this.contact_content, {
			duration: 500,
			transition: Fx.Transitions.Pow.easeOut
		}).hide();
		
		contact_slide = this.contact_drawer;
		
		this.hide_button = $("hide-button").addEvent("click", function(evt) {
			evt.stop();
			self.contact_drawer.slideOut();
			if (self.message_box && self.message_box.hidden == false) {
				self.message_box.hide();
			}
		});
		
		// data storage
		this.main_content_height = this.main_content.getComputedSize("height").height;
		this.main_content_width = this.main_content.getComputedSize('width').width;
		
		this.main_slider = new Element("div", {
			id : "main-slider",
			styles : {
				"position" : "relative",
				"width" : this.main_content_width
			}
		});
		
		this.page_slider = new Fx.Tween(this.main_slider, {
			duration: 1000,
			transition: Fx.Transitions.Pow.easeOut
		});
		
		this.container_window = new Fx.Morph(this.main_content,{
			duration: 1000,
			transition: Fx.Transitions.Pow.easeOut
		});
		
		this.page_scroller = new Fx.Scroll(document.body);
		
	},
	
	init_load: function() {
		
		this.main_content.empty();
		this.main_slider.injectInside(this.main_content);
		this.page_total = this.pages.length;
		this.page_count = 0;
		
		var self = this;
			
		this.pages.each(function(page, index){

			// local namespace only.
			var page_location = page.get("href");

			if (page_location.test("#") == true) {

				// found a disqualified url. remove from array total.
				self.page_total --;

			} else {
				
				var page_id = page_location.substring(1);
				
				var page_container = new Element("div", {
					id: page_id+"-page",
					"class" : "page-slide",
					styles : {
						"position" : "absolute",
						"left" : (self.main_content_width * index),
						"width": (self.main_content_width)
					}
				}).injectInside(self.main_slider);

				// initial height
				if (index == 0) {

					self.main_content.setStyle("height", self.main_content_height);

				}

				var load_page = new Request.HTML({
					url: page_location,
					update: page_container,
					evalScripts: true,

					onSuccess: function(responseTree, responseElements, responseHTML) {
						
						if (responseTree[1].get("class") == "pageTitle") {
							page_container.pageTitle = responseTree[1].get("title");
							// responseTree[1].destroy();
						}
						
						self.givr_proxy();

					}

				}).send();
				
			}
			
		});
		
	},
	
	init_flash: function() {
		
		if (Browser.Plugins.Flash.version && Browser.Plugins.Flash.version >= 10) { 

			// load the flash content
			var focal_swf_file = "/swf/preloader_"+ this.options.lang +".swf";
			this.focal_area.addClass("flash");
			this.focal_area_swf = new Swiff(focal_swf_file, {
				
				id: "icuc-focal-swf",
				width: "100%",
				height: this.focal_area.getStyle("height"),
				container: this.focal_area,
				vars: {
					sPath: '/swf/'
				}
				
			});
			
			var footer_swf_file = "/swf/dood_"+ this.options.lang +".swf";
			var footer_logo = $("footer-logo");
			footer_logo.addClass("flash");
			this.footer_swf = new Swiff(footer_swf_file, {
				id: "icuc-footer-swf",
				width: "288px",
				height: "110px",
				container: footer_logo
			});

		} else {
			
			// JavaScript Alternative to flash.
			this.init_nonflash_carousel();
			
		}
		
	},
	
	init_media: function() {
		
		var self = this;
		
		this.focal_area.empty();
		
		// Build the elements.
		this.media_container = new Element("div", {
			id: "media-container"
		}).inject(this.focal_area);
		
		this.media_slider = new Element("div", {
			id: "media-slider"
		}).inject(this.media_container);
		
		this.media_page_indicator_container = new Element("div", {
			id: "media-page-indicator-container"
		}).inject(this.media_container);

		var close_media_viewer = function(evt) {
			
			console.log(evt);
			
			if (evt.target.get("tag") != "video") {
			
				// fade stuff out
				self.media_viewer_container.fade("out");
				self.media_modal.fade("out");
				self.media_viewer_close_button.hide();
				// destroy the element.
				self.loaded_media.destroy();
				
			}
			
		};

		this.media_viewer_container = new Element("div", {
			id: "media-viewer-container",
			styles: { opacity: 0 },
			events: {
				click: close_media_viewer
			}
		}).inject(document.body);
		
		this.media_viewer_close_button = new Element("div", {
			id: "media-viewer-close-button",
			text: "X",
			events: {
				click: close_media_viewer
			}
		}).inject(this.media_viewer_container);

		this.media_modal = new Element("div", {
			id: "media-modal",
			styles: { opacity: 0 },
			events: {
				click: close_media_viewer
			}
		}).inject(document.body);

		this.media_viewer = new Element("div", {
			id: "media-viewer",
			events: {
				click: close_media_viewer
			}
		}).inject(this.media_viewer_container);
		
	},
	
	init_nonflash_carousel: function() {
		
		var self = this;
		
		// load the appropriate XML.
		var xml_data = {
			file: "/swf/xmldata/logo_carousel_en.xml",
			type: "logo"
		};
		
		switch(this.current_uri.page) {
			
			case "does":
				xml_data.file = "/swf/xmldata/does.xml";
				xml_data.type = "video";
			break;
			
			case "has":
				xml_data.file = "/swf/xmldata/has.xml";
				xml_data.type = "video";
			break;
			
			case "is":
				xml_data.file = "/swf/xmldata/is.xml";
				xml_data.type = "video";
			break;
			
		}
		
		var page = new Element("div", { "class": "media-page" });
		var page_indicator = new Element("div", { "class": "media-page-indicator" });
		
		var request = new Request({
			
			url: xml_data.file,
			method: "get",
			
			onRequest: function() {
				
				// clear and re-instantiate objects.
				self.init_media();
				
			},
			
			onSuccess: function(responseText, responseXML) {
			
				var nodes = responseXML.getElements("mediaitem");
				var count = nodes.length;
				var page_count = 3;
				var item_count = 0;
				var i = 0;
				var pages = 0;
				
				self.media_page_indicator_container.count = 0;
				// page.injectInside(logos_container);
				for (i; i < count; i++) {
					
					if (item_count == 0) {
						
						var new_page = page.clone();
						new_page.inject(self.media_slider);
						
						var new_page_indicator = page_indicator.clone();
						new_page_indicator.inject(self.media_page_indicator_container);
						self.media_page_indicator_container.count++;
						
						pages == 0 ? new_page_indicator.addClass("active") : null;
/*						self.logo_pages.push(new_page_indicator);*/
						
						pages++;
						self.media_slider.setStyle("width", 960 * pages);
					}
					
					var thumb_container = new Element("div", {
						"class": "media-thumb column quarter"
					}).inject(new_page);
					
					var img_title = xml_data.type == "logo" ? nodes[i].getElement("headline").get("text") : nodes[i].getElement("quote").get("text");
					var img_alt = xml_data.type == "logo" ? nodes[i].getElement("body").get("text") : nodes[i].getElement("credit").get("text");
					var img_rel = xml_data.type == "logo" ? nodes[i].getElement("image").get("src") : "/video/" + nodes[i].getElement("video").get("src").split("/")[5].split(".")[0] + ".mp4";;
					
					var img = new Element("img", {
						src: nodes[i].getElement("thumb").get("src"),
						title: img_title,
						alt: img_alt,
						rel: img_rel
					}).inject(thumb_container);
					
					img.addEvents({
						
						"mousedown": function(evt) {
							// register start position of the mouse.
							img.startX = evt.client.x;
						},
						
						"click": function(evt) {

							evt.stop();
							// if the mouse has moved more than 25 pixels, don't fire the click event.
							if ( !((evt.client.x - img.startX) > 25 || (evt.client.x - img.startX < -25)) ) {
								
								self.media_viewer.empty();
								self.loaded_media = null;
								
								// load an image or a video.
								if (xml_data.type == "logo") {
									
									self.media_viewer_close_button.set("class", "image");
									
									self.loaded_media = new Element("img", {
										src: this.get("rel"),
										width: 388,
										height: 297
									});

								} else {
									// convert the filename into the H.264 video.
									// var file_path = "/video/";
									self.media_viewer_close_button.set("class", "video");
									
									var filename = this.get("rel");
									self.loaded_media = new Element("video", {
										src: filename,
										controls: "true",
										width: 480,
										height: 342
									});
									
								}
								
								self.loaded_media.inject(self.media_viewer);
								self.media_viewer_container.fade("in");
								self.media_modal.fade("in");
								self.media_viewer_close_button.show();
								
								// if it's video, tell it to play
								if (xml_data.type == "video") { self.loaded_media.play(); }

							}
						}
						
					});
					
					if (item_count == page_count) { item_count = -1; }
					
					item_count++;
					
				}
				
				self.media_page_indicator_container.setStyle("margin-left", -(self.media_page_indicator_container.getSize().x / 2)).hide();
				
				if (self.media_page_indicator_container.count > 1) {
					self.init_touch_slider();
					self.media_page_indicator_container.show();
				}
				
			},

			onFailure: function(xhr) { }
			
		}).send();
		
	},
	
	init_touch_slider: function() {
		
		var self = this;
		
		var current_page = 0;
		
		// touch test
		if (Touch) {
			
			var touch_slider = new Fx.Tween(self.media_slider, {
				duration: 500,
				transition: Fx.Transitions.Back.easeOut
			});
			
			self.media_slider.addClass("slide");
			
			var touch = new Touch(self.media_slider);
			touch.data = {};
			touch.addEvents({
				
				"start": function() {

					touch.data.startX = parseInt(self.media_slider.getStyle("left"), 10);
					// touch_slider.pause();

				},
				
				"move": function(dx, dy) {

					self.media_slider.setStyle('left', touch.data.startX + dx);
					touch.data.dx = dx;
					
				},
				
				"end" : function() {

					var position = 0;
					
					// remove the old active page.
					self.media_page_indicator_container.getElements(".media-page-indicator")[current_page].removeClass("active");
					
					// move over by page.
					if (touch.data.dx > 380) {
						position = touch.data.startX + 960;
						current_page != 0 ? current_page-- : current_page = 0;
					} else if (touch.data.dx < -380) {
						position = touch.data.startX - 960;
						current_page != (self.media_page_indicator_container.count -1) ? current_page++ : current_page = (self.media_page_indicator_container.count -1);
					} else {
						position = touch.data.startX;
					}
					
					// detect first or last page
					if (touch.data.startX + touch.data.dx > 0) {
						position = 0;
					}
					
					if (self.media_slider.getPosition().x + touch.data.dx < -(self.media_slider.getSize().x)) {
						// position = -(self.media_slider.getSize().x - 960);
						position = touch.data.startX;
					}
					
					touch_slider.start("left", position);

					// add the new active page.
					self.media_page_indicator_container.getElements(".media-page-indicator")[current_page].addClass("active");
					
				}
				
			});
			
		}
		
	},
	
	givr_proxy: function () {
		
		// page has loaded and this function has fired.
		// increase the page_count by 1.
		this.page_count ++;
		
		if (this.page_count == this.page_total) {
			
			// this should only fire once.
			this.givr();
			
		}
		
	},
	
	givr: function() {
		
		this.init_cufon();
		this.init_content();
		this.init_page();
		this.init_forms();
		this.init_carousel();
		this.init_meebo();
		this.init_snoows();
		
	},
	
	init_cufon: function() {
		
		Cufon.replace("h1");
		Cufon.replace("h2", { letterSpacing : "-0.5px" });
		Cufon.replace("#logo .tagline");
		Cufon.replace("p.intro", {fontSize: "23px"});
		
	},
	
	init_content: function() {
		
		var self = this;
		
		// all contact buttons
		this.contact_buttons = $$("a[rel=contact]").addEvent("click", function(evt) {
			evt.stop();
			self.contact_drawer.slideIn();
			
			var body = $(document.body);
			var pageScroll = new Fx.Scroll(body).start(0, 0);
			
			// Google Analytics Event Tracking.
			// _GATC
			try { self.pageTracker._trackEvent("Contact", "Shelf", "Opening the Contact Shelf"); } catch(err) {}
			
		});
		
		// external link buttons
		$$("a[rel=external]").addEvent("click", function(evt) {
			
			evt.stop();
			
			// Google Analytics Event Tracking.
			// _GATC
			try { self.pageTracker._trackEvent("Link", "External", this.get("href")); } catch(err) {}
			
			window.open(this.get("href"));
			
		});
		
		// additional support links.
		var pages = valid_pages; // pull from the global scope.
		pages.each(function(item, index) {
			
			var paged_buttons = $$("a[rel="+item+"]").addEvent("click", function(evt) {
				evt.stop();
				window.location.hash = "/"+item;
				$("primary-navigation").getElement("a.active").removeClass("active");
				$("primary-navigation").getElement("a[href=/"+page_id+"]").addClass("active");
			});
			
		});
		
		// vcard event tracking
		$("vcard-download").addEvent("click", function(evt) {
			
			// Google Analytics Event Tracking.
			// _GATC
			try { self.pageTracker._trackEvent("Contact", "vCard", "Download vCard"); } catch(err) {}
			
		});
		
		// checklist switchers
		if ($$(".check-item")) {

			// grab the current page
			this.current_location = window.location.toString(); // renders window.location as a static string.

			this.checkitem_containers = $$(".check-item-container");
			this.checkitem_containers.each(function(checkitem){

				// strip out the backlinks.
				// checkitem.getElements(".back-link").destroy();
				
				// Not sure if we need this yet.
				//checkitem.set("id", checkitem.getElement("h2").get("text").toLowerCase().replace(/\s/g, "-").replace(/&/g, "and"));
				
				var checkitems = checkitem.getElements(".check-item");
				var current_item = checkitems[0]; // first item as a default
				var item_container = current_item.getParent();
				
				item_container.setStyle("height", current_item.getSize().y);

				checkitems.removeClass("separator").setStyles({
					"position": "absolute",
					"width": item_container.getComputedSize("width").width
				});

				checkitems.each(function(item, index) {

					// make the other items invisible.
					if (item != current_item) {
						item.setStyle("opacity", 0);
					}

				});

				// create the dynamic checklist
				var checklist_container = checkitem.getElement(".checklist-container");
				var checklist = new Element("ul", { "class" : "checklist" }).injectInside(checklist_container);

				// create the checklist items.
				checkitems.each(function(item, index) {


					var checklist_item = item.getElement("h4");
					
					if (checklist_item) {
						
						var text = checklist_item.get("text");
						var html = checklist_item.get("html");
						var target = checklist_item.getParent();
						// checklist_item.destroy();
					
						var list_item = new Element("li").injectInside(checklist);
						var link = new Element("a", {
							"html" : html,
							"href" : "#",
							events : {

								"click" : function (evt) {
									
									// this event gets fired externally.
									// let evt.stop() silently fail.
									try { evt.stop(); } catch (err) {}
									
									// remove the active class from the other items.
									this.getParent("ul").getElements("a").removeClass("active");
									this.addClass("active");
									
									var item_container_morph = new Fx.Morph(item_container, {
										duration: 300,
										transition: Fx.Transitions.Pow.easeOut
									});

									// grab the target.
									var link_target = target;

									// make the switch
									if (link_target != current_item) {

										// switch opacities
										link_target.fade("in");
										current_item.fade("out");

										var difference =  ((current_item.getSize().y) - (link_target.getSize().y)); // subtract this result. EX: current - (10-8) = current - 2

										// reset current item
										current_item = link_target;
										item_container_morph.start({
											"height": current_item.getSize().y
										});

										// adjust the main container accordingly.
										self.container_window.start({"height" : self.main_content.getSize().y - difference});
										
										// Google Analytics Event Tracking.
										// _GATC
										// try { self.pageTracker._trackEvent("Content", "View", ""); } catch(err) {}
										var fake_uri = "/" + self.current_uri.page + "#" + text.toLowerCase().replace(/\s/g, "-");
										try { self.pageTracker._trackPageview(fake_uri); } catch(err) {}

									}

								}

							}
						
						}).injectInside(list_item);
						
						if (text == "Overview") {
							text = link.getParent(".check-item-container").getElement("h2").get("text");
							link.addClass("active");
						}
						
						link.set("id", text.toLowerCase().replace(/\s/g, "-").replace(/&/g, "and"));
						
					}

				});

			});

		}
		
		// all other H2 elements
		var headlines = $$(".section h2");
		headlines.each(function(headline, index) {
			
			if (!headline.getParent(".check-item-container")) {
				
				headline.set("id", headline.get("text").toLowerCase().replace(/\s/g, "-").replace(/&/g, "and"));
				
			}
			
		});
		
	},
	
	init_meebo: function() {
		
		if (Browser.Plugins.Flash.version && Browser.Plugins.Flash.version >= 10) {
			
			var self = this;
			
			// Show the Meebo Prompt
			this.meebo_contact = $("meebo-contact");
			var c_info = $("contact-information");
			var contact_box_height = c_info.getComputedSize("height").height - c_info.getElement("h2").getSize().y - c_info.getElement("h3").getSize().y;
			this.meebo_contact.setStyles({
				"display": "block",
				"height" : contact_box_height
			});
			
			// <embed height="275" width="190" wmode="transparent" type="application/x-shockwave-flash" src="http://widget.meebo.com/mm.swf?rrfyPoqhwb "/>
			this.meebo_container = new Element("div",{
				"id" : "meebo-container",
				"class": "third",
				styles: {
					"opacity": 0,
					"height": 275
				}
			});
		
			this.meebo = new Swiff("http://widget.meebo.com/mm.swf?rrfyPoqhwb", {
				container: self.meebo_container,
				height: "100%",
				width: "100%"
			});
		
			var show_button = this.meebo_contact.getElement("button");
			show_button.addEvent("click", function(evt) {
			
				evt.stop();
				self.meebo_container.setStyle("opacity", 0);
				self.meebo_container.injectInside("contact-information").fade("in");
				self.meebo_container.setStyle("height", 275);
				$("blog-headlines").setStyle("opacity", 0);
			
				// Google Analytics Event Tracking.
				// _GATC
				try { self.pageTracker._trackEvent("Contact", "Meebo", "Meebo Chat in Welcome Section"); } catch(err) {}
			
			});
	
			this.chat_button = $("chat-button").getElement("button").addEvent("click", function(evt){

				evt.stop();
				$("blog-headlines").setStyle("opacity", 1);
				self.meebo_container.setStyle("opacity", 0);
				self.meebo_container.injectInside("meebo-target").fade("in");
				self.meebo_container.setStyle("height", 210);
			
				// Google Analytics Event Tracking.
				// _GATC
				try { self.pageTracker._trackEvent("Contact", "Meebo", "Meebo Chat in Contact Shelf"); } catch(err) {}
			
			});
		
			// Close button
		
			var close_button = new Element('div', {
				id: "close-meebo-button",
				text: "close",
				events: {
				
					"click" : function(evt) {
					
						self.meebo_container.fade("out");
					
						if ($("blog-headlines").getStyle("opacity") == 0) {
						
							$("blog-headlines").setStyle("opacity", 1);
						
							// Google Analytics Event Tracking.
							// _GATC
							try { self.pageTracker._trackEvent("Contact", "Meebo", "Closing Meebo Chat"); } catch(err) {}
						
						}
					
					}
				
				}
			}).injectInside(self.meebo_container);
			
		}
				
	},
	
	init_snoows: function() {
		
		snoows_container = $("blog-headlines");
		var list = new Element("ul");
		var limit = 6;
		
		var feed_request = new Request.JSON({
			url: "/feed",

			onSuccess: function(responseJSON, responseText) {
				
				list.injectInside(snoows_container);
				var json_data = responseJSON;
				json_data.each(function(item, index){
					
					if (index < limit) {

						var list_item = new Element("li").injectInside(list);
						var link = new Element("a", {
							"href": item.link[0],
							"text": item.title[0],
							events : {
								click: function(evt) {
									
									evt.stop();
									window.open(this.get("href"));
									
								}
							}
						}).injectInside(list_item);
						
					}
					
				});

			},
			
			onFailure: function(xhr) {
				
				
			}

		}).send();
		
	},
	
	init_page: function() {

		if (this.current_location.test("#") == true) {
			
			// you're somewhere other than the homepage.
			// local namespace
/*			var path = this.current_location.split("#");*/
			var page_id = window.location.hash.substring(2).split("/")[0];
			var content = $(page_id + "-page");
			
			this.main_slider.setStyle("left", "-" + content.getStyle("left"));
			this.main_content.setStyle("height", content.getComputedSize("height").height);
			
			// this.set_page_title(page_id);
			this.set_page_title(content.pageTitle);
			
			this.change_page_content();
			
		}
		
	},
	
	init_forms: function() {
		
		var self = this;
		
		// do it
		var forms = $$("form");
		forms.each(function(form, index) {
			
			var textinputs = form.getElements(".text-input");
			var textareas = form.getElements(".text-area");
			
			var original_values = new Array();
			
			textinputs.each(function(field, index) {
				
				if (!field.hasClass("cap")) {
				
					field.oValue = field.get("value");
					// original_values.push(original_value);

					field.addEvents({
						"focus" : function(evt) {

							if (field.get("value") == field.oValue) {

								field.set("value", "");
								field.select();

							}

						},

						"blur" : function(evt) {

							if (field.get("value") == "") {

								field.set("value", field.oValue);

							}

						}
					});
				}
			});
			
			self.message_box = new Element("p", {
				
				"id" : "message-box",
				"class" : "",
				"text" : "",
				events: {
					click: function(evt) {
						
						self.message_box.hide().set({"class": "", "text": ""});
						
					}
				}
				
			}).inject(form, "top").hide();
			//var fade_message = new Fx.Morph(message_box,{duration: 200,onComplete:function(e){message_box.fade("hide");}});
			
			// Submit the form.
			var submit_button = form.getElement(".button");
			submit_button.addEvent("click", function(evt) {
			
				evt.stop();
			
				// var self = this;
			
				var action = form.get("action");
				var method = form.get("method");
				var error = false;
				
				var data = "";
				var item_index = 0;
				
				// text inputs
				textinputs.each(function(input, index) {
				
					var value = input.get("value");
				
					// clear original values.
					if ((value == "" || value == input.oValue) && !input.hasClass("cap")) {
			
						input.set("value", "");
			
					}
						
					data += input.get("name") +"="+ input.get("value") +"&";
						
				});
				
				var send_message = new Element("p", {
					"id": "submit-button-send-message",
					"class": "",
					"text": "Sending..."
				});
				
				var submit_form = new Request.JSON({
					
					url: action,
					method: method,
					
					onRequest: function() {
						
						// Show a status...
						submit_button.hide();
						send_message.inject(submit_button, "after");
						
					},
					
					onSuccess: function(responseJSON, responseText) {
						
						var response = responseJSON;
						
						self.message_box.set({
							"class": response.type,
							"text": response.text
						}).show().highlight();
						
						//(function(){ message_box.hide(); }).delay(3000);
												
						if (response.type == "success") {
							
							textinputs.each(function(input, index) {
								
								if (!input.hasClass("cap")) {
								
									input.set("value", input.oValue);
								
								}

							});
							
							// Google Analytics Event Tracking.
							// _GATC
							// try { self.pageTracker._trackEvent("Contact", "Form", "Form was Submitted"); } catch(err) {}
							// self.init_gat();
							try { self.pageTracker._trackPageview("/contact/thanks"); } catch (err) {}
							
							(function(){ self.message_box.hide().set({"text": "", "class": ""}); }).delay(4000);
							
						} else {
							
							textinputs.each(function(input, index){
								
								if ((input.get("value") == "" || input.get("value") == input.oValue) && !input.hasClass("cap")) {
									
									input.set("value", input.oValue);
									
								}
								
							});
							
						}
										
					},
					
					onComplete: function() {
						
						send_message.destroy();
						submit_button.show();
						
					},
					
					onFailure: function(xhr) {
						
						self.message_box.set({
							"class" : "error",
							"text" : "There was a problem sending your message. Please try again later."
						}).show().highlight();
						
						//(function(){ message_box.hide(); }).delay(3000);
						
					}
					
				}).send(data);
				
			
			});
			
		});
		
	},
	
	init_carousel: function() {
		
		var self = this;
		var navigations = $$(".navigation");
		
		navigations.each(function(navigation, index) {
			
			// because we're iterating over both navigations.
			var pages = navigation.getElements("a");
			
			pages.each(function(page, index) {
				
				if (page.get("href").test("#") == false) {
					
					page.addEvent("click", function(evt) {
						
						evt.stop();
						
						var page_id = page.get("href").substring(1);
						
						// window.location logs the history.
						window.location.hash = "/"+page_id;
					});
					
				}
				
			});

		});
		
	},
	
	change_page: function(page_id) {
		
		// route the request
		var last_page = this.current_uri.page;
		
		this.route_request();
		
		if (this.options.routes[this.options.lang].contains(page_id)) {
		
			this.container_window.cancel();
			this.page_slider.cancel();
		
			this.contact_drawer.slideOut();
			if (self.message_box && self.message_box.hidden == false) {
				self.message_box.hide();
			}
		
			// HTML
			var related_content = $(page_id + "-page");
			var related_content_position = "-"+related_content.getStyle("left");
			var related_content_height = related_content.getComputedSize("height").height;
		
			// do it.
			this.container_window.start({"height" : related_content_height});
			this.page_slider.start("left", related_content_position);
			
			// Active page:
			this.primary_navigation.getElement("a.active").removeClass("active");
			this.primary_navigation.getElement("a[href=/"+page_id+"]").addClass("active");
			
			// Page title:
			this.set_page_title(related_content.pageTitle);

			// Page Content
			this.change_page_content();
			
			// FLASH			
			if (last_page != page_id) {
				var flash_function = "goto_" + url_to_function(page_id);

				// flash remote
				if (this.focal_area_swf) {

					var swf = this.focal_area_swf.toElement();
					var flash_result = Swiff.remote(swf, flash_function);

				}
			}
			
			// Non Flash
			if (this.media_container) {
				
				this.init_nonflash_carousel();
				
			}
			
		}
		
	},
	
	change_page_content: function() {

		// last valid match wins
		var content_element = "";
		if (this.current_uri.hash) {
			this.current_uri.hash.split("/").each(function(hash_item) {
			
				if ($(hash_item)) { content_element = $(hash_item); }
				
				
			});
		}
		
		// make sure this content is on the currently active page.
		if ((content_element && content_element.get("tag") == "a") && (content_element.getParent(".page-slide").get("id") == this.current_uri.page + "-page")) { 
			
			// fire the click event for this item.
			content_element.fireEvent("click");
			
			// scroll the window.
			this.page_scroller.toElement(content_element.getParent(".check-item-container"));
			
		}
		
		
		if ((content_element && content_element.get("tag") != "a")) {
			this.page_scroller.toElement(content_element);
		}
		
	},
	
	// history logger
	logger: function() {
		
		if (this.current_page != window.location.hash.substring(2)) {

			this.current_page = window.location.hash.substring(2);
			
			// change the page from history.
			var page_id = this.current_page.split("/")[0];
			this.change_page(page_id);
			
		}
		
	},
	
	init_logger: function() {
		
		this.current_page = window.location.hash.substring(2);
		this.logger.periodical(200, this);
		
	},
	
	set_page_title: function(pageTitle) {
		
		// var old_title = document.title;
		// var title = old_title.split(" | ");
		// document.title = title[0] + " | " + this.options.titles[page_id];
		
		document.title = pageTitle;
		
	}
	
});
