//---------------------------------------- Windows ----------------------------------------
/*
	Attaches the onclick behavior to elements with specific class names.  The dimensions of the window depend on the class name.
	
	Parameters:
	Name	Type			Default		Description
	parent	object						(Optional) Object to initialize child elements.
	
	Returns:
	Type	Description
	void
*/
function initWindows(parent) {
	if(parent) {
		var popup_small = dojo.query(".LinkPopupSmall", parent);
		var popup_medium = dojo.query(".LinkPopupMedium", parent);
		var popup_large = dojo.query(".LinkPopupLarge", parent);
		var new_window = dojo.query(".LinkNewWindow", parent);
	} else {
		var popup_small = dojo.query(".LinkPopupSmall");
		var popup_medium = dojo.query(".LinkPopupMedium");
		var popup_large = dojo.query(".LinkPopupLarge");
		var new_window = dojo.query(".LinkNewWindow");
	}
	
	// LinkPopupSmall
	dojo.forEach(popup_small, function (result) {
		dojo.connect(result, "onclick", function (e) {openWindow(e.currentTarget.href, "small"); e.preventDefault();});
	});
	
	// LinkPopupMedium
	dojo.forEach(popup_medium, function (result) {
		dojo.connect(result, "onclick", function (e) {openWindow(e.currentTarget.href, "medium"); e.preventDefault();});
	});
	
	// LinkPopupMedium
	dojo.forEach(popup_large, function (result) {
		dojo.connect(result, "onclick", function (e) {openWindow(e.currentTarget.href, "large"); e.preventDefault();});
	});
	
	// LinkNewWindow
	dojo.forEach(new_window, function (result) {
		dojo.connect(result, "onclick", function (e) {openWindow(e.currentTarget.href, "new"); e.preventDefault();});
	});
}

/*
	Opens a new browser window with dimensions based on "type."  Custom dimensions may be used if "type" is an object containing width and height parameters.
	
	Parameters:
	Name	Type			Default		Description
	url		string						The URL location
	type	string/object				A string containing the class name, or an object containing specific width and height
	name	string						The name to assign to the window
	
	Returns:
	Type	Description
	void
*/
function openWindow(url, type, name) {
	if(!name) {
		name = "";
	}
	
	if(type && type.width && type.height) {
		window.open(url, name, "width=" + type.width + ", height=" + type.height + ", scrollbars, resizable");
	} else if(type) {
		var width = 800;
		var height = 600;
		switch(type) {
			case "small":
				width = 320;
				height = 240;
				break;
			case "medium":
				width = 640;
				height = 480;
				break;
			case "large":
				width = 800;
				height = 600;
				break;
		}
		if(type == "new") {
			var viewport = getViewport();
			var mod_width = Math.round(viewport.w * 0.8);
			var mod_height = Math.round(viewport.h * 0.8);
			window.open(url, name, "width=" + mod_width + ", height=" + mod_height + ", scrollbars, resizable, menubar, toolbar, location, status");
		} else {
			window.open(url, name, "width=" + width + ", height=" + height + ", scrollbars, resizable");
		}
	} else {
		window.open(url, name);
	}
}

// Return the width and height of the viewport
function getViewport() {
	var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
	var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
	return {w: width, h: height};
}

// Request error handler.
function dataError(response, ioArgs) {
	console.error("HTTP status code: ", ioArgs.xhr.status);
	return response;
}

function initFeatured() {
	var rotation_interval = 8000;
	var featured = dojo.byId("Featured");
	if(featured) {
		var tab_content = dojo.query("#Featured .TabContent");
		if(tab_content[0]) {
			dojo.addClass(tab_content[0], "Active");
			
			var tabs = dojo.query("#Featured .Tab");
			dojo.forEach(tabs, function (result) {
				dojo.connect(result, "onclick", function (e) {
					var tab_content = dojo.query("#Featured .TabContent");
					dojo.forEach(tab_content, function (result) {
						dojo.removeClass(result, "Active");
					});
					var tab_content_id = "TabContent" + e.currentTarget.id.split("Tab")[1];
					dojo.addClass(dojo.byId(tab_content_id), "Active");
					
					var tabs = dojo.query("#Featured .Tab");
					dojo.forEach(tabs, function (result) {
						dojo.removeClass(result, "Active");
					});
					dojo.addClass(e.currentTarget, "Active");
				});
			});
			
			var rotate_tabs = setInterval(function () {
				// Rotate to the next tab if the mouse is not on the featured area
				if(!featured.hold) {
					var tabs = dojo.query(".Tab", dojo.byId("FeaturedTabs"));
					var active_tab_id;
					var next_tab_id;
					var tab_content_id;
					
					// Find the active tab index
					dojo.forEach(tabs, function (result, index) {
						if(dojo.hasClass(result, "Active")) {
							active_tab_id = index;
						}
					});
					
					// Calculate the next tab in sequence and restart at the first tab when the end is reached
					next_tab_id = active_tab_id + 1;
					if(tabs[active_tab_id + 1]) {
						next_tab_id = active_tab_id + 1;
					} else {
						next_tab_id = 0;
					}
					
					// Activate the next tab
					dojo.addClass(tabs[next_tab_id], "Active");
					dojo.removeClass(tabs[active_tab_id], "Active");
					
					// Show tab content
					var tab_content = dojo.query("#Featured .TabContent");
					dojo.forEach(tab_content, function (result) {
						dojo.removeClass(result, "Active");
					});
					tab_content_id = "TabContent" + tabs[next_tab_id].id.split("Tab")[1];
					dojo.addClass(tab_content_id, "Active");
				}
			}, rotation_interval);
			
			// Set flag to stop rotation on mouseover
			dojo.connect(featured, "onmouseover", function (e) {
				e.currentTarget.hold = true;
			});
			dojo.connect(featured, "onmouseout", function (e) {
				e.currentTarget.hold = false;
			});
		}
	}
}

function initStriping() {
	var stripe = dojo.query(".Stripe");
	dojo.forEach(stripe, function (result) {
		var rows = result.getElementsByTagName("tr"); 
		dojo.forEach(rows, function (result, index) {
			if(index % 2 != 1) {
				dojo.addClass(result, "StripeColor");
			}
		});
	});
}

// Initialize link behavior based on class names or href.
function initLinks(parent) {
	var site_domain = "springspreserve.org";
	var certificate_domain = "digicert.com";
	
	var anchor_links = [];
	
	if(parent) {
		anchor_links = dojo.query("a", parent).concat(dojo.query("area", parent));
	} else {
		anchor_links = dojo.query("a").concat(dojo.query("area"));
	}
	
	dojo.forEach(anchor_links, function (result) {
		var behavior = false;
		
		//Normalize hrefs for secure page
		if(document.location.href.indexOf("https://") == 0) {
			if(result.href.indexOf("secure=true") == -1 && result.href.indexOf("#") == -1) {
				var current_anchor_text = result.innerHTML;
				result.href = result.href.replace("https://", "http://");
				result.innerHTML = current_anchor_text;
			}
		}
		
		// Video portal
		if(!behavior && result.href.indexOf("apps/video/") != -1) {
			dojo.addClass(result, "LinkVideo");
			dojo.connect(result, "onclick", function (e) {
				openWindow(e.currentTarget.href, "large");
				e.preventDefault();
			});
			behavior = true;
		}
		
		// Photo gallery
		if(!behavior && result.href.indexOf("apps/photo/") != -1) {
			dojo.addClass(result, "LinkPhoto");
			dojo.connect(result, "onclick", function (e) {
				openWindow(e.currentTarget.href, "large");
				e.preventDefault();
			});
			behavior = true;
		}
		
		// Contact
		if(result.href.indexOf("apps/contact/") != -1) {
			dojo.addClass(result, "LinkEmail");
		}
		
		// Subscription
		if(result.href.indexOf("apps/subscription/index.cfml") != -1) {
			dojo.addClass(result, "LinkSubscribe");
		}
		
		// Pop-up windows
		if(!behavior && dojo.hasClass(result, "LinkPopupSmall")) {
			dojo.connect(result, "onclick", function (e) {
				openWindow(e.currentTarget.href, "small");
				e.preventDefault();
			});
			behavior = true;
		}
		if(!behavior && dojo.hasClass(result, "LinkPopupMedium")) {
			dojo.connect(result, "onclick", function (e) {
				openWindow(e.currentTarget.href, "medium");
				e.preventDefault();
			});
			behavior = true;
		}
		if(!behavior && dojo.hasClass(result, "LinkPopupLarge")) {
			dojo.connect(result, "onclick", function (e) {
				openWindow(e.currentTarget.href, "large");
				e.preventDefault();
			});
			behavior = true;
		}
		if(!behavior && dojo.hasClass(result, "LinkNewWindow")) {
			dojo.connect(result, "onclick", function (e) {
				openWindow(e.currentTarget.href, "new");
				e.preventDefault();
			});
			behavior = true;
		}
		
		// Links
		var ext_pdf = ".pdf";
		if(result.href.indexOf(ext_pdf) != -1) {
			dojo.addClass(result, "LinkPDF");
		}
		
		var ext_doc = ".doc";
		if(result.href.indexOf(ext_doc) != -1) {
			dojo.addClass(result, "LinkDOC");
		}
		
		var ext_xls = ".xls";
		if(result.href.indexOf(ext_xls) != -1) {
			dojo.addClass(result, "LinkXLS");
		}
		
		var ext_jpg = ".jpg";
		if(result.href.indexOf(ext_jpg) != -1) {
			dojo.addClass(result, "LinkImage");
		}
		
		var ext_gif = ".gif";
		if(result.href.indexOf(ext_gif) != -1) {
			dojo.addClass(result, "LinkImage");
		}
		
		var ext_png = ".png";
		if(result.href.indexOf(ext_png) != -1) {
			dojo.addClass(result, "LinkImage");
		}
		
		var ext_zip = ".zip";
		if(result.href.indexOf(ext_zip) != -1) {
			dojo.addClass(result, "LinkArchive");
		}
		
		if(!behavior && ((result.href.indexOf(site_domain) == -1&& result.href.length > 0&& result.href.indexOf(certificate_domain) == -1) || dojo.hasClass(result, "LinkExternal"))) {
			dojo.addClass(result, "LinkExternal");
			dojo.connect(result, "onclick", function (e) {
				openWindow(e.currentTarget.href, "new");
				e.preventDefault();
			});
		}
	});
	
	// Remove any classes from search pagination
	dojo.query(".Pagination a").forEach(function (result) {
		result.className = null;
	});
}

// Initialize close and print buttons for pop-up windows
function initPopup() {
	var popup_close = dojo.query(".PopupClose");
	dojo.forEach(popup_close, function (result) {
		dojo.connect(result, "onclick", function (e) {
			top.close();
			e.preventDefault();
		});
	});
	
	var popup_print = dojo.byId("PopupPrint");
	if(popup_print) {
		dojo.connect(popup_print, "onclick", function (e) {
			window.print();
			e.preventDefault();
		});
	}
}

// Initialize Dojo widgets
function initWidgets() {
	dojo.require("dojo.parser");
	dojo.addOnLoad(function () {dojo.parser.parse();});
	
	dojo.require("custom.Date");
	dojo.addOnLoad(initDatePicker);
}

// Initialize helper text behavior for date widgets
function initDatePicker() {
	dojo.query(".FormDateSelector input.dijitReset").forEach(function (date) {
		if(date.value == "") {
			dojo.addClass(date, "Default");
			dojo.connect(date, "onclick", function (e) {
				if(date.value == "mm/dd/yyyy") {
					dojo.removeClass(date, "Default");
					date.value = "";
				}
			});
			dojo.connect(date, "onfocus", function (e) {
				if(dojo.hasClass(date, "Default")) {
					dojo.removeClass(date, "Default");
					date.value = "";
				}
			});
			date.value = "mm/dd/yyyy";
		}
	});
}

// Lazy-load external JavaScript files
function loadShareScripts() {
	// Facebook
	dojo.io.script.get({
		url: "http://static.ak.fbcdn.net/connect.php/js/FB.Share"
	});
	
	// Twitter
	dojo.io.script.get({
		url: "http://platform.twitter.com/widgets.js"
	});
}

function initShareBackdrop() {
	var backdrop = dojo.byId("ShareBackdrop");
	
	// Hack to enable a clickable empty div
	if(dojo.isIE) {
		dojo.style(backdrop, "opacity", "0");
		dojo.style(backdrop, "backgroundColor", "white");
	}
	
	dojo.style(backdrop, "height", dijit.getViewport().h + "px");
	dojo.style(backdrop, "width", dijit.getViewport().w + "px");
	dojo.style(backdrop, "top", dijit.getViewport().t + "px");
	dojo.style(backdrop, "left", dijit.getViewport().l + "px");
	
	dojo.connect(backdrop, "onclick", function (e) {
		dojo.removeClass(dojo.byId("ShareContent"), "Active");
		dojo.removeClass(dojo.byId("ShareEmailContent"), "Active");
		dojo.removeClass(dojo.byId("ShareBackdrop"), "Active");
		e.preventDefault();
	});
	
	dojo.connect(window, "onresize", function (e) {
		var backdrop = dojo.byId("ShareBackdrop");
		dojo.style(backdrop, "height", dijit.getViewport().h + "px");
		dojo.style(backdrop, "width", dijit.getViewport().w + "px");
		dojo.style(backdrop, "top", dijit.getViewport().t + "px");
		dojo.style(backdrop, "left", dijit.getViewport().l + "px");
	});
	
	dojo.connect(window, "onscroll", function (e) {
		var backdrop = dojo.byId("ShareBackdrop");
		dojo.style(backdrop, "height", dijit.getViewport().h + "px");
		dojo.style(backdrop, "width", dijit.getViewport().w + "px");
		dojo.style(backdrop, "top", dijit.getViewport().t + "px");
		dojo.style(backdrop, "left", dijit.getViewport().l + "px");
	});
}

function shareEmailCallback(response, ioArgs) {
	if(response.length > 0) {
		var email_content = dojo.byId("ShareEmailContent");
		email_content.innerHTML = dojo.trim(response);
		
		dojo.query("#ShareEmailContentClose").forEach(function (result) {
			dojo.connect(result, "onclick", function (e) {
				dojo.removeClass(dojo.byId("ShareEmailContent"), "Active");
				dojo.removeClass(dojo.byId("ShareBackdrop"), "Active");
				e.preventDefault();
			});
		});
		
		dojo.query("#ShareEmailCancel").forEach(function (result) {
			dojo.connect(result, "onclick", function (e) {
				dojo.removeClass(dojo.byId("ShareEmailContent"), "Active");
				dojo.removeClass(dojo.byId("ShareBackdrop"), "Active");
				e.preventDefault();
			});
		});
		
		dojo.query("#ShareEmail").forEach(function (result) {
			dojo.connect(result, "onsubmit", function (e) {
				dojo.xhrPost({
					form: result,
					load: shareEmailCallback,
					preventCache: true,
					error: dataError
				});
				
				e.preventDefault();
			});
		});
	}
	return response;
}

// Initialize sharing tools
function shareCallback(response, ioArgs) {
	if(response.length > 0) {
		var share = dojo.byId("Share");
		if(share) {
			share.innerHTML = dojo.trim(response);
			
			// Reorganize nodes
			var backdrop = dojo.byId("ShareBackdrop");
			document.body.appendChild(backdrop.parentNode.removeChild(backdrop));
			
			var share_content = dojo.byId("ShareContent");
			document.body.appendChild(share_content.parentNode.removeChild(share_content));
			
			var share_email_content = dojo.byId("ShareEmailContent");
			document.body.appendChild(share_email_content.parentNode.removeChild(share_email_content));
			
			// Share tools list
			dojo.query(".LinkShare").forEach(function (result) {
				dojo.connect(result, "onclick", function (e) {
					var share_content = dojo.byId("ShareContent");
					if(!dojo.hasClass(share_content, "Active")) {
						dojo.addClass(share_content, "Active");
						var link_coords = dojo.coords(e.currentTarget);
						dojo.style(share_content, "top", link_coords.y + link_coords.h + 5 + "px");
						dojo.style(share_content, "left", link_coords.x + "px");
					} else {
						dojo.removeClass(share_content, "Active");
					}
					
					dojo.removeClass(dojo.byId("ShareEmailContent"), "Active");
					dojo.addClass(dojo.byId("ShareBackdrop"), "Active");
					e.preventDefault();
				});
			});
													   
			dojo.query("#ShareContentClose").forEach(function (result) {
				dojo.connect(result, "onclick", function (e) {
					dojo.removeClass(dojo.byId("ShareContent"), "Active");
					dojo.removeClass(dojo.byId("ShareBackdrop"), "Active");
					e.preventDefault();
				});
			});
			
			// E-mail
			dojo.query(".LinkShareEmail").forEach(function (result) {
				dojo.connect(result, "onclick", function (e) {
					var share_email_content = dojo.byId("ShareEmailContent");
					share_email_content.innerHTML = "";
					
					var path = "";
					if(document.location.href.indexOf("/STAGE-LVSP2") != -1) {
						path = "/STAGE-LVSP2";
					}
					
					dojo.xhrGet({
						url: path + "/apps/share/email.cfml?reset&url=" + escape(document.location.href) + "&title=" + escape(document.title),
						load: shareEmailCallback,
						preventCache: true,
						error: dataError
					});
					
					if(!dojo.hasClass(share_email_content, "Active")) {
						dojo.addClass(share_email_content, "Active");
						var link_email_coords = dojo.coords(e.currentTarget);
						dojo.style(share_email_content, "top", link_email_coords.y + link_email_coords.h + 5 + "px");
						dojo.style(share_email_content, "left", link_email_coords.x + "px");
					} else {
						dojo.removeClass(share_email_content, "Active");
					}
					
					dojo.removeClass(dojo.byId("ShareContent"), "Active");
					dojo.addClass(dojo.byId("ShareBackdrop"), "Active");
					e.preventDefault();
				});
			});
			
			// Twitter
			dojo.query(".ShareTwitter").forEach(function (result) {
				result.href = result.href + "?url=" + escape(window.location.href);
			});
			
			// Digg
			dojo.query(".ShareDigg").forEach(function (result) {
				result.href = result.href + "?url=" + escape(window.location.href) + "&title=" + escape(document.title);
			});
			
			// Reddit
			dojo.query(".ShareReddit").forEach(function (result) {
				result.href = result.href + "?url=" + escape(window.location.href);
			});
			
			// StumbleUpon
			dojo.query(".ShareStumbleUpon").forEach(function (result) {
				result.href = result.href + "?url=" + escape(window.location.href) + "&title=" + escape(document.title);
			});
			
			// Delicious
			dojo.query(".ShareDelicious").forEach(function (result) {
				result.href = result.href + "?v=5&noui&jump=close&url=" + escape(document.location.href) + "&title=" + escape(document.title);
			});
			
			// Yahoo! Buzz
			dojo.query(".ShareYahooBuzz").forEach(function (result) {
				result.href = result.href + "?targetUrl=" + escape(document.location.href);
			});
			
			// Hide share tools list when one is selected
			dojo.query("#ShareContent li").forEach(function (result) {
			 	dojo.connect(result, "onclick", function (e) {
					dojo.removeClass(dojo.byId("ShareContent"), "Active");
					dojo.removeClass(dojo.byId("ShareBackdrop"), "Active");
				});
			});
			
			initWindows(share_content);
			dojo.addOnLoad(loadShareScripts);
			dojo.addOnLoad(initShareBackdrop);
		}
	}
	return response;
}

function initShare() {
	var share = dojo.byId("Share");
	if(share) {
		dojo.require("dijit.dijit");
		dojo.require("dojo.io.script");
		
		var path = "";
		if(document.location.href.indexOf("/STAGE-LVSP2") != -1) {
			path = "/STAGE-LVSP2";
		}
		
		dojo.xhrGet({
			url: path + "/apps/share/index.cfml?url=" + escape(document.location.href) + "&title=" + escape(document.title),
			load: shareCallback,
			preventCache: true,
			error: dataError
		});
	}
}

function initSite() {
	initStriping();
	initLinks();
	initFeatured();
	initPopup();
	initShare();
}

dojo.addOnLoad(initSite);

