/*
Required Files: 
	/js/prototype.js
	/js/cookieFunctions.js
	
Example Usage:
	Takeover.init({
		source : "#homepage_takeover_content",   //use a css identifier, or a refernce to an element
		insert_after : ".headerWrapper",   //use a css identifier, or a refernce to an element
		open_on_click : true,   //if this is false, the takeover will be opened when mouse over the preview area
		width : "938px",   //width of takeover
		height : "265px",   //height of takeover
		preview_source : "#homepage_takeover_preview",   //use a css identifier, or a refernce to an element
		preview_height : "50px",   //height of takeover preview
		open_duration : 1.0,   //duration of open animation
		close_duration : 0.2,   //duration of close animation
		close_button_class : "hello_world",   //class for close button
		force_show_on_load : true,   //force show on load
		delay_between_force_show : 60   //time between forced show on load (in minutes)
	});
*/

var Takeover = {
	
	// defaults
	source : null,
	open_on_click : true,
	width : "938px",
	height : "300px",
	preview_height : "30px",
	open_duration : 1.0,
	close_duration : 1.0,
	close_button_class : "takeover_close_button",
	open_button_class : "takeover_open_button",
	insert_after : null,
	insert_before : null,
	preview_source : null,
	force_show_on_load : false,
	force_show_time_open : null,
	delay_between_force_show : 60,
	
	is_open : false,
	on_load_timeout : null,
	is_forced_show : false,
	
	container : new Element("div", {"id" : "homepage_takeover"}),
	open_overlay : null,
	close_button : new Element("div", {"style" : "cursor: pointer"}).update("<div class='text'>[ close ]</div>"),
	open_button : new Element("div", {"style" : "cursor: pointer"}).update("<div class='text'>[ open ]</div>"),

	init : function(params) {
	
		if (params) {
			if (params.source !== undefined && params.source !== null) { Takeover.source = params.source; }
			if (params.open_on_click !== undefined && params.open_on_click !== null) { Takeover.open_on_click = params.open_on_click; }
			if (params.width !== undefined && params.width !== null) { Takeover.width = params.width; }
			if (params.height !== undefined && params.height !== null) { Takeover.height = params.height; }
			if (params.preview_height !== undefined && params.preview_height !== null) { Takeover.preview_height = params.preview_height; }
			if (params.open_duration !== undefined && params.open_duration !== null) { Takeover.open_duration = params.open_duration; }
			if (params.close_duration !== undefined && params.close_duration !== null) { Takeover.close_duration = params.close_duration; }
			if (params.close_button_class !== undefined && params.close_button_class !== null) { Takeover.close_button_class = params.close_button_class; }
			if (params.open_button_class !== undefined && params.open_button_class !== null) { Takeover.open_button_class = params.open_button_class; }
			if (params.insert_after !== undefined && params.insert_after !== null) {  Takeover.insert_after = params.insert_after; }
			if (params.insert_before !== undefined && params.insert_before !== null) {  Takeover.insert_before = params.insert_before; }
			if (params.preview_source !== undefined && params.preview_source !== null) { Takeover.preview_source = params.preview_source; }
			if (params.force_show_on_load !== undefined && params.force_show_on_load !== null) { Takeover.force_show_on_load = params.force_show_on_load; }
			if (params.force_show_time_open !== undefined && params.force_show_time_open !== null) { Takeover.force_show_time_open = params.force_show_time_open; }
			if (params.delay_between_force_show !== undefined && params.delay_between_force_show !== null) { Takeover.delay_between_force_show = params.delay_between_force_show; }
		}
	
		document.observe("dom:loaded", function() {
			Takeover.container.setStyle({
				"height" : Takeover.preview_height,
				"overflow" : "hidden", 
				"position" : "relative",
				"width" : Takeover.width
			});
			
			Takeover.close_button.writeAttribute("class", Takeover.close_button_class);
			Takeover.close_button.observe("click", Takeover.close);
			Takeover.container.insert(Takeover.close_button);

			Takeover.open_button.writeAttribute("class", Takeover.open_button_class);
			Takeover.open_button.observe("click", Takeover.open);
			Takeover.container.insert(Takeover.open_button);
					

			Takeover.loadContent();
			Takeover.addOpenBehavior();
			Takeover.removeCloseButton();
			
			if (Takeover.insert_after) {
				$$(Takeover.insert_after)[0].insert({after: Takeover.container});
			} else if (Takeover.insert_before) {
				$$(Takeover.insert_before)[0].insert({before: Takeover.container});
			} else {
				$(document.body).insert({top: Takeover.container});
			}
			
			if (Takeover.force_show_on_load) {
				if (Takeover.shouldOpenOnLoad()) {
					Takeover.is_forced_show = true;
					Takeover.open();
				}
			}
		});
	},
	
	shouldOpenOnLoad : function() {
		
		var expire_date = new Date();
		
		expire_date.setMinutes(expire_date.getMinutes() + Takeover.delay_between_force_show);
		
  		if (GetCookie("hasSeenHomepageTakeover")) {
  			return false;
  		} else {
  			SetCookie ("hasSeenHomepageTakeover", "1", expire_date);
  		}
		
		return true;
	},
	
	open : function() {
		if (Takeover.is_open) { return; }
		
		Takeover.addCloseButton();
		Takeover.removeOpenBehavior();
		Takeover.removeOpenButton();
		
		// if is a forced show, close after predetermined amount of time, else do nothing after opening
		var closeIfOnLoad = function() { };
		if (Takeover.is_forced_show) {
			if (Takeover.force_show_time_open != null) { closeIfOnLoad = function() { Takeover.on_load_timeout = setTimeout(Takeover.close, Takeover.force_show_time_open * 1000); }; }
			Takeover.is_forced_show = false;
		}
		
		new Effect.Morph(Takeover.container, {
			style : "height:" + Takeover.height,
			transition : Effect.Transitions.linear,
			duration : Takeover.open_duration,
			afterFinish : function() {
				Takeover.is_open = true; closeIfOnLoad();
			}
		});
	},
	
	close : function() {
		if (!Takeover.is_open) { return; }
	
		if (Takeover.on_load_timeout != null) { clearTimeout(Takeover.on_load_timeout); }
		Takeover.removeCloseButton();
		Takeover.addOpenButton();
		
		new Effect.Morph(Takeover.container, {
			style : "height:" + Takeover.preview_height,
			transition : Effect.Transitions.linear,
			duration : Takeover.close_duration,
			afterFinish : function() {
				Takeover.is_open = false; Takeover.addOpenBehavior();
			}
		});
			
	},
	
	loadContent : function() {
		Takeover.container.insert({top: $$(Takeover.source)[0].setStyle({"display" : "block"})});
	},
	
	addCloseButton : function() {
		Takeover.close_button.setStyle({"display" : "block"});
	},

	addOpenButton : function() {
		Takeover.open_button.setStyle({"display" : "block"});
	},
	
	removeCloseButton : function() {
		Takeover.close_button.setStyle({"display" : "none"});
	},

	removeOpenButton : function() {
		Takeover.open_button.setStyle({"display" : "none"});
	},
	
	
	addOpenBehavior : function() {

		if (!Takeover.open_overlay) {

			var open_overlay = new Element("div", {"class" : "homepage_takeover_open_overlay"});
			open_overlay.setStyle({
				"position" : "absolute",
				"background" : "url(noimage.jpg)",
				"overflow" : "visible",
				"top" : "0",
				"left" : "0",
				"z-index" : "40",
				"margin" : "0",
				"padding" : "0",
				"width" : "100%",
				"height" : "100%"
			});

			if (Takeover.preview_source) { open_overlay.insert({top : $$(Takeover.preview_source)[0].setStyle({"display" : "block"})}); }

			if (!Takeover.open_on_click) {
				open_overlay.observe("mouseover", Takeover.open);
			} else {
				open_overlay.setStyle({"cursor" : "pointer"});

				// open_overlay.observe("click", Takeover.open);
			}

			Takeover.open_overlay = open_overlay;

			Takeover.container.insert({top : Takeover.open_overlay});
		}
	
		Takeover.container.setStyle({"overflow" : "hidden"});
		Takeover.open_overlay.setStyle({"display" : "block"});
	},
	
	removeOpenBehavior : function() {
		Takeover.open_overlay.setStyle({"display" : "none"});
	}

}
