var Site = {
	init: function() {		
		Site.Overlay.init()				
	},
	
	HomeShow: {
		isReady: false,
		init: function() {
			// LayerGroup(array of layer ids, starting zIndex(integer), {options});
			Site.AmbienHome = new LayerGroup(["roosterFrame", "flashFrame", "boxesFrame"], 1); 	
				
			Site.SleepSelect = new DropDown("#sleepSelect select", window.root, 
				[
					"treating-sleep-problems.aspx",
					"over-the-counter-sleep-aids.aspx",
					"taking-ambien.aspx",
					"generic-ambien-zolpidem.aspx",
					"prescription-sleep-aids.aspx"
				]
			
			);
			Site.Boxes = new BoxGroup("#mediaWrap .boxed", [0, 1000, 2000, 3000]);	// array contains delays for each box in order (left, top right, top mid, top bottom)
			// no flash, show content immediately
			if (!swfobject.hasFlashPlayerVersion("9.0.0")) {
				shadeDown();   
			}			
			
			var beforeRooster = function() {				
				var f = this.getElements("iframe")[0];
				f.setStyle("visibility", "visible");						
			};
			
			Site.Boxes.addEvent("boxTweened", function(box, i, instance) { // listens to box instance, when all boxes have faded out calls "shadeUp" function
				if (!instance.mode && i == instance.boxes.length - 1) {				
					Site.AmbienHome.execOnFrame("roosterFrame", beforeRooster);
					shadeUp();
				}
			});
		},
		
		testURL: function() {
			var exp 	= /.*\?.*tvspot=true.*/i
			if (window.location.href.test(exp)) {
				// replace old shade down function
				shadeDown = function() {
					Site.Boxes.toggle(false);
				}
			}						
		}
		
	},
	
	Overlay: {
		init: function() {
		    SqueezeBox.initialize({
		    	url: window.root+'overlay/default.aspx',
		    	handler:'iframe', 
		    	size:{x:687,y:440}, 
		    	shadow: false,
		    	targetBody: null, //'overlayholder'
		    	zIndex: 1050,
		    	absoluteLeft: 217,
		    	absoluteTop: 42,
		    	customScale: true,
				resizeFx: {
					duration: 1500
				},
				overlayOpacity: 0.2						    			    	
	    	});
			SqueezeBox.assign($$('a.squeezebox'));
			
			//test href for querystring "overlay=true," if present launch the overlay
			var exp 	= /.*\?.*overlay=true.*/i
			if (window.location.href.test(exp)) {
				var cta = $(document.body).getElement('a.squeezebox');
				if (cta) SqueezeBox.fromElement(cta);
			}
		}
	}
	
}

window.addEvent('domready', function() {
	Site.init();
})

var DropDown = new Class({
	Implements: [Options, Events],
	
	options: {
		wrapClass: "ddWrap",
		toggClass: "ddToggle",
		itemsWrapClass: "ddItemsWrap",
		
		itemsClass: "ddItems",
		itemsTopClass: "ddItemsTop",
		itemsBottomClass: "ddItemsBottom",
		
		currentItemClass: "ddCurrent",
		itemClass: "ddItem",				
		firstItemClass: "ddFirstItem",
		lastItemClass: "ddLastItem",
		
		firstOverClass: "ddFirstOver",
		lastOverClass: "ddLastOver",
		
		overClass: "ddOver",
		selectedClass: "ddSelected"
		
	},
	
	expanded: false,
	
	initialize: function(selector, base, map, opts) {
		this.setOptions(opts);
		
		this.selects = $$(selector);
		
		if (this.selects.length == 0) return;
		
		this.base = (base) ? base : "";
		this.maps = new Array();
		this.maps.push(map);		
		
		
		this.collections = new Array();
		this.selects.each(function(el, i) {
			el.setStyle("display", "none");
			this.createDD(el, i);
		}, this);
				
		
	},
	
	createDD: function(el, index) {				
		var options = this.options;
		
		var wrap 	= new Element("div", {"class": options.wrapClass});
		var toggle 	= new Element("div", {"class": options.toggClass});
		var curr 	= new Element("div", {"class": options.currentItemClass});
		var itemsWrap 	= new Element("div", {"class": options.itemsWrapClass, styles: {"display": "none"}});		
		
		wrap.adopt(toggle, curr, itemsWrap);

		$$(toggle, curr).addEvent("click", function(e) {
			e.stop();
			this.toggleDD(curr, itemsWrap, wrap);
		}.bind(this));
		
		var items = new Element("div", {"class": options.itemsClass});
		itemsWrap.adopt(items);
		
		
		var opts 	= el.getElements("option");
		
		// add empty entries for map if not correct size
		if (!this.maps[index])
			this.maps[index] = (this.maps[index]) ? this.maps[index] : new Array();
			
		if (this.maps[index].length != opts.length) {			
			var maplength = this.maps[index].length;
			var optslength = opts.length;
			
			if (optslength > maplength) {
				var diff = optslength - maplength;
				for (var count=0; count < diff; count++)
					this.maps[index].push("");
			}
		}			
		var newOpts = new Array();
		opts.each(function(opt, i) {
			var o = new Element("div", {"class": options.itemClass, "html": opts[i].innerHTML});
			o.addEvents({
				"click": function(e) { 					
					this.selectItem(o, this.maps[index][i], options.selectedClass,index, i)					
				}.bind(this),
				"mouseenter": function(e) {					
					this.addClass(options.overClass)	
				},
				"mouseleave": function(e) {				
					this.removeClass(options.overClass)	
				}				
			});		
			items.adopt(o);
			newOpts.push(o);	
		}, this);
		
		newOpts[0].addClass(options.firstItemClass).removeEvents("mouseenter").removeEvents("mouseleave").removeEvents("click");
		newOpts[0].addEvents({				
				"click": function(e) { 
					this.selectItem(newOpts[0], this.maps[index][0], options.selectedClass,index, 0)					
				}.bind(this),
				"mouseenter": function(e) {					
					this.addClass(options.firstOverClass)	
				},
				"mouseleave": function(e) {				
					this.removeClass(options.firstOverClass)	
				}				
		});	
		
		if (newOpts.length > 1) {
			newOpts[newOpts.length - 1].addClass(options.lastItemClass).removeEvents("mouseenter").removeEvents("mouseleave").removeEvents("click");
			newOpts[newOpts.length - 1].addEvents({				
				"click": function(e) { 
					this.selectItem(newOpts[newOpts.length - 1], this.maps[index][newOpts.length - 1], options.selectedClass,index, newOpts.length - 1)					
				}.bind(this),
				"mouseenter": function(e) {					
					this.addClass(options.lastOverClass)	
				},
				"mouseleave": function(e) {				
					this.removeClass(options.lastOverClass)	
				}				
			});	
		}
		
		curr.set("html", newOpts[0].get("html"));
		
		wrap.inject(el, "before")						
	},
	
	toggleDD: function(curr, items) {
		var state = (curr.getStyle("display") == "none") ? true : false;		
		curr.setStyle("display", (state) ? "" : "none");
		items.setStyle("display", (state) ? "none" : "");		
		
		var bodyToggle = function(tog, togd) {			
			tog.setStyle("display", "");
			togd.setStyle("display", "none");								
			
			$(document.body).removeEvent("click", bodyToggleBound)
		}	
		
		var bodyToggleBound = bodyToggle.bind(bodyToggle, [curr, items])
		
		if (!state) $(document.body).addEvent("click", bodyToggleBound)		
	},
	
	selectItem: function(el, url, cls, p, i) {
		el.addClass(cls);
		window.location.href = url;
				
		this.setCurrent(el);		
		this.fireEvent("onItemSelect", [el, p, i, url]);
	}
});

var BoxGroup = new Class({
	Implements: [Options, Events],
	
	options: {
		startVisible: false,
		tween: {
			duration: 500,
			link: "cancel"
		}		
	},
	
	mode: null,
	
	initialize: function(boxes, delays, opts) {
		if (opts) this.setOptions(opts);
		
		this.boxes = $$(boxes);
		if (this.boxes.length == 0) return this.fireEvent("error");
		
		this.delays = delays;		
		this.fxInstances = new Array();
		
		this.boxes.each(function(box, i) {
			/*
			var opts = $extend(this.options.tween, {
				property: "opacity",
				onComplete: function() {
					this.fireEvent("onBoxTweened", [box, i, this]);
				}.bind(this)
			});
			
			var fx = new Fx.Tween(box, opts).set(0);
			
			this.fxInstances.push(fx);		
			*/
			box.setStyle("visibility", "hidden");
			
		}, this);
				
	},
	
	toggle: function(how) {		
		this.clearIds = new Array();
		var opacity, delays, method, count;
		if (how) {
			this.mode = true;
			this.boxes.each(function(box, i) {
				box.setStyle("visibility", "visible");
				this.fireEvent("onBoxTweened", [box, i, this]);				
			}, this);
			/*
			this.mode = true;
			
			opacity 	= 1;
			delays 		= this.delays;
			
			for (var i=0; i < this.clearIds.length; i++)
				this.clearIds[i] = $clear(this.clearIds[i]);
			
			this.clearIds = new Array();	
				
			this.boxes.each(function(box, i) {											
				var clearId = function() {				
					if (this.mode) this.fxInstances[i].start(opacity);				
				}.delay(delays[i], this);
				
				this.clearIds.push(clearId);
	
			}, this)	
			*/		 	
		}
		else {
			this.mode 	= false;
			this.boxes.each(function(box, i) {				
				box.setStyle("visibility", "hidden");
				this.fireEvent("onBoxTweened", [box, i, this]);			
			}, this);
			/*
			this.mode 	= false;
			
			opacity 	= 0;
			count		= 0;
			
			for (var i=0; i < this.clearIds.length; i++)
				this.clearIds[i] = $clear(this.clearIds[i]);
			
			this.clearIds = new Array();	
				
			this.boxes.each(function(box, i) {							
				if (!this.mode) this.fxInstances[i].start(opacity);		
			}, this)
			*/								
		}
	}
	
});

var LayerGroup = new Class({
	Implements: [Options, Events],
	
	options: {},
	
	initialize: function(idArr, startZ, opts) {
		if (opts) 
			this.setOptions(opts);
		
		if ($type(idArr) != "array") return;
		
		this.zMap 		= new Hash({}); // maps a zIndex to an element
		this.nameMap 	= new Hash({}); // maps a name (id) to a zIndex
		
		var z = ($type(startZ) == "integer") ? startZ : 1;
		
		this.zFloor = z;
		
		for (var i=0; i < idArr.length; i++) {
			this.zMap[z] = $(idArr[i]).setStyle("zIndex", z)
			this.nameMap[idArr[i]] = z;
			
			z+=1;	
		};				
		
		this.zCiel = z - 1;
		
		return this;		
	},
	
	bringToFront: function(which) {
		// determine which layer they're referring to
		var named = ($type(which) == "string" && $chk(this.nameMap[which])) ? this.zMap[this.nameMap[which]] : false;
		var z = (named) ? this.nameMap[which] : false;
		
		if (!named || !z) return this.fireEvent("error");
		
		// copy existing maps
		var newZ = $H(this.zMap);
		var newN = $H(this.nameMap);
		
								
	},
	
	execOnFrame: function(layer, func) {		
		var f = ($type(layer) == "string" && $chk(this.nameMap[layer])) ? this.zMap[this.nameMap[layer]] : false;
		
		if (!f || $type(func) != "function") return;
		
		return func.call(f);		
	},
	
	sendToBack: function() {},
	
	swap: function(first, second) {			
		var f = ($type(first) == "string" && $chk(this.nameMap[first])) ? this.zMap[this.nameMap[first]] : false;
		var fZ = (f) ? this.nameMap[first] : false;
		
		if (!f || !fZ) return this.fireEvent("error");
		
		var s = ($type(second) == "string" && $chk(this.nameMap[second])) ? this.zMap[this.nameMap[second]] : false;
		var sZ = (f) ? this.nameMap[second] : false;
		
		if (!s || !sZ) return this.fireEvent("error");
		
		f.setStyle("zIndex", sZ);
		s.setStyle("zIndex", fZ);
		
		var fId = f.get("id");
		var sId = s.get("id");
		
		this.nameMap[fId] = sZ;
		this.nameMap[sId] = fZ;
		
		this.zMap[fZ] = s;
		this.zMap[sZ] = f;
		
		var ontop = (this.nameMap[fId] > this.nameMap[sId]) ? fId : sId;
		this.fireEvent("swap", ontop); // arg is a string of the layer thats now higher on the layer stack
	}		
});

function thisMovie(movieName) {
	 if (navigator.appName.indexOf("Microsoft") != -1) {
		 return document.getElementById(movieName);//window[movieName];
	 } else {
		 return document[movieName];
	 }
}

function shadeDown() {
	Site.HomeShow.isReady = true;
	Site.Boxes.toggle(true);
}

function shadeUp() {
	// this is called when all the content boxes have faded out
	thisMovie("flashHomepage").openShade();
}

function showRoosterFrame() {    
	if (Site.HomeShow.isReady) {	    
		Site.Boxes.toggle(false);
	}	
}

// flash functions
function onShadeClosed()
{
	shadeDown();
}
function onShadeOpened()
{
	Site.AmbienHome.swap("roosterFrame", "boxesFrame");
}
function onAppReady()
{
	Site.HomeShow.testURL();
}


