/* 
============================================================================================================================= CREDITS
Copyright 	: Copyright 2010 Descenza Diamonds. All Rights Reserved.
Author(s) 	: Larry Daughenbaugh - ldaughenbaugh@systemsynapse.com
Date    	: 04/08/2010
Notes     	: JavaScript file for handling all things relative to modals.
            : Based off of a script created by Chris Campbell - http://particletree.com
            : Based off of an adapted script created by  Simon de Haan - http://blog.eight.nl
============================================================================================================================= CHANGE LOG
Date		Name			Desc
---			---				---
============================================================================================================================= BEGIN JAVASCRIPT
*/

/* --------------------------------------------------------------------------------------- VARIABLES */

var ua						= navigator.userAgent.toLowerCase();	// browser info
var overlay_div 			= "overlay";							// name of the Overlay Div that is created
var modal_image_container 	= "modal_image";						// name of Container Div that holds image-based modals only
var page_request 			= false;								// var that is used to determine the XML HTTP Request type
var modal_image_preloader 	= '';

// src of the loading gif that is displayed while images load
var modal_image_preloader 	= '<img src="lib/img/loading.gif" alt="Loading Image" />';	

/* --------------------------------------------------------------------------------------- USED PASSED STRING TO CHECK BROWSER TYPE AND OS */

function getType(str) {
	loc = ua.indexOf(str) + 1;
	return loc;
}

/* --------------------------------------------------------------------------------------- GET BROWSER TYPE */

function getUserAgent() {
	if (getType("msie"))			return "Internet Explorer";
	else if (getType("firefox"))	return "Firefox";
	else if (getType("safari")) 	return "Safari";
	else if (getType("opera")) 		return "Opera";
	else if (getType("iphone"))		return "iPhone";
	else if (getType("ipod"))		return "iPod";
	else 							return "Other";
}

/* --------------------------------------------------------------------------------------- GET OS TYPE */

function getOS() {
	if (getType("win")) 		return "Windows";
	else if (getType("mac")) 	return "Mac";
	else if (getType("x11")) 	return "Unix";
	else if (getType("linux")) 	return "Linux";
	else 						return "Other";
}

/* --------------------------------------------------------------------------------------- SET UP OPEN MODAL OBJECT */
/* CREATE NEW MODAL OBJECT AND ACTIVATE THE MODAL */
function open_modal(new_href, new_rel) {
	var open_this_modal, new_modal;
	var is_image = false;
	var get_rel = '', get_href = '';
	
	if (new_rel == "undefined" || new_rel == null) {
		get_rel = this.getAttribute("rel");
		get_href = this.href;
		open_this_modal = get_href;
		if (get_rel != "modal_image") open_this_modal = this.href.split("#")[1];
	} else {
		get_rel = new_rel;
		get_href = new_href;
		open_this_modal = get_href;
		if (get_rel != "modal_image") open_this_modal = get_href.split("#")[1];
	}
	if (get_rel == "modal_image") is_image = true;
	
	new_modal = new modal(open_this_modal,is_image);
	new_modal.activate();
	return false;
}

/* --------------------------------------------------------------------------------------- MODAL OBJECT/CLASS */
/* init_modal should be called on page load witin the event-handlers.js file */
function init_modal() {
	var arrLinks = document.getElementsByTagName("a");
	for (var i = 0; i < arrLinks.length; i++) { 
		if (arrLinks[i].getAttribute("rel") == "modal" || arrLinks[i].getAttribute("rel") == "modal_image") {
			arrLinks[i].onclick = open_modal;
		}
	}

	/* CREATE OVERLAY DIV */
	var overlayDiv = document.createElement("div");
	overlayDiv.id = overlay_div;
	document.getElementsByTagName('body')[0].appendChild(overlayDiv);

	/* OPEN MODAL VIA QUERYSTRING - example.html?modal=modal0 */
	var pageQuerystring = window.location.search;
	if (pageQuerystring != "") {
		if (pageQuerystring.indexOf("modal=") >= 0) {
			/* GET QUERYSTRING PARAMETER'S VALUE */
			function getQuerystring(key) {
				key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
				var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
				var qs = regex.exec(window.location.href);
				if (qs == null) return "";
				return qs[1];
			}
			var modal_value = getQuerystring('modal');
			if (modal_value != "") {
				// MAKE SURE THERE IS AN ITME WITH IS ID BEFORE OPENING
				if (document.getElementById(modal_value) != null) {
					new_url_modal = new modal(modal_value,false);
					new_url_modal.activate();
				}
			}
		}
	}
}

/* --------------------------------------------------------------------------------------- MODAL OBJECT/CLASS */

function modal(obj,standalone_image) {
	/* GET CURRENT POSITION OF SCROLLBARS ON THE PAGE */
	var modalObject = this;
	this.obj = obj;
	this.setAttributes = true;
	this.overlay = overlay_div; 
	this.yPos = 0;
	this.browser = getUserAgent();
	this.user_os = getOS();
	this.standalone_image = standalone_image;
	
	var overlay_object = document.getElementById(overlay_div);
	if (overlay_object != null) {
		overlay_object.onclick = function() {
			modalObject.deactivate();
			return false;
		}
	} 

	/* GET CURRENT POSITION OF SCROLLBARS ON THE PAGE */
	modal.prototype.getScrollBarPos = function() {
		if (document.documentElement && document.documentElement.scrollTop){
			this.yPos = document.documentElement.scrollTop; 
		} else if (document.body) {
			this.yPos = document.body.scrollTop;
		}
	}

	/* HIDE SCROLLBARS */
	modal.prototype.scrollbarDisplay = function(height,overflow) {
		document.getElementsByTagName('body')[0].style.height = height;
		document.getElementsByTagName('body')[0].style.overflow = overflow;
	}

	/* RESET THE POSITION OF THE PAGE TO THE TOP */
	modal.prototype.setScrollPos = function(x, y) {
		window.scrollTo(x, y); 
	}

	/* HIDE SELECTS (THEY SHOW THROUGH IN IE */
	 modal.prototype.displaySelects = function(visibility) {
		selects = document.getElementsByTagName("select");
		for (var i = 0; i < selects.length; i++) {
			selects[i].style.visibility = visibility;
		}
	}

	/* ACTIVATE THE MODAL */
	modal.prototype.activate = function() {
		if (this.setAttributes) {
			this.setWidthHeight();
		}
		if (this.browser == "Internet Explorer") {
			this.getScrollBarPos();
			this.scrollbarDisplay("100%", "hidden");
			this.setScrollPos(0,0);
			this.displaySelects("hidden");
		}
		this.displayModal("block");
	}

	/* TURN MODAL DISPLAY ON/OFF */
	modal.prototype.displayModal = function(display) {
		document.getElementById(this.overlay).style.display = display;
		if (this.standalone_image) {
			if (display == "none") {
				document.getElementById(modal_image_container).style.display = display;
			} else {
				var imgContainer;
				if (document.getElementById(modal_image_container) == null) {
					imgContainer = document.createElement("div");					
					imgContainer.setAttribute('id',modal_image_container);
					document.getElementsByTagName('body')[0].appendChild(imgContainer);
				} else {
					imgContainer = document.getElementById(modal_image_container);
				}

				function load_modal_image(image_to_open) {
					if (image_to_open != "") {		
						if (window.XMLHttpRequest) {
							page_request = new XMLHttpRequest();
						} else if (window.ActiveXObject) {
							try { page_request = new ActiveXObject("Msxml2.XMLHTTP"); } 
							catch (e) {
								try { page_request = new ActiveXObject("Microsoft.XMLHTTP"); }
							catch (e) {}
							}
						} else {
							page_request = false;
						}
						page_request.onreadystatechange = function() { load_modal_content(page_request, image_to_open); }
						page_request.open('GET', image_to_open, true);
						page_request.send(null);
						
						function load_modal_content(page_request, image_to_open) {				

							if (page_request.readyState == 4 && (page_request.status == 200 || window.location.href.indexOf("http") == -1)) {
								var objLoadingImage = new Image();
									objLoadingImage.src = image_to_open;
								
								objLoadingImage.onload = function() {
									imgContainer.style.marginTop = "-" + Math.ceil(objLoadingImage.height / 2) + "px";
									imgContainer.style.marginLeft = "-" + Math.ceil(objLoadingImage.width / 2) + "px";
									
									document.getElementById(modal_image_container).innerHTML = '<a href="#" rel="modal_close"><img src="' + image_to_open + '" alt="Loading Image" /></a>';
									modal.prototype.addCloseListeners();
								}
							} else {
								// POSITION CONTENT SO IT IS CENTERED (APPROX. BASED ON INIITAL TEXT/IMAGE)
								imgContainer.style.marginTop = "-35px";
								imgContainer.style.marginLeft = "-35px";

								document.getElementById(modal_image_container).style.display = "block";
								document.getElementById(modal_image_container).innerHTML = '<p>loading image</p><p>' + modal_image_preloader + '</p>';
							}
						}
					}
				}

				var image_source = this.obj;
				load_modal_image(image_source);
			}
		} else {
			document.getElementById(this.obj).style.display = display;
			if (display != "none") {
				this.addCloseListeners();	
				this.addMoreModalOpeners();
			}
		}
	}

	/* TURN MODAL DISPLAY ON/OFF */
	modal.prototype.addCloseListeners = function() {
		var arrCloseLinks = document.getElementsByTagName("a");
		for (var i = 0; i < arrCloseLinks.length; i++) { 
			if (arrCloseLinks[i].getAttribute("rel") == "modal_close") arrCloseLinks[i].onclick = closeModal;
		}

		/* CREATE NEW MODAL OBJECT AND ACTIVATE THE MODAL */
		function closeModal() {
			modalObject.deactivate();
			return false;
		}
	}

	/* ADDITIONAL MODAL OPENERS INSIDE THE OPEN MODAL */
	modal.prototype.addMoreModalOpeners = function() {
		var more_modals = document.getElementById(this.obj).getElementsByTagName("a");
		for (var i = 0; i < more_modals.length; i++) { 
			if (more_modals[i].getAttribute("rel") == "modal" || more_modals[i].getAttribute("rel") == "modal_image") {
				more_modals[i].onclick = open_new_modal;
			}
		}

		/* CLOSE EXISTING MODAL, OPEN NEW MODAL */
		function open_new_modal() {
			modalObject.deactivate();
			open_modal(this.href, this.rel);
			return false;
		}
	}

	/* TURN MODAL DISPLAY ON/OFF */
	modal.prototype.deactivate = function() {
		if (this.browser == "Internet Explorer") {
			this.scrollbarDisplay("auto", "auto");
			this.displaySelects("visible");
			this.setScrollPos(0,this.yPos);
		}
		this.displayModal("none");
	}
	
	/* DETERMINE HEIGHT/WIDTH OF MODAL AND SET HERE INSTEAD OF WITHIN YOUR CSS */
	modal.prototype.setWidthHeight = function() {
		var modalContainer = document.getElementById(this.obj);
		var divIEheightAdjust = 0;
		var divIEwidthAdjust = 0;
		
		if (modalContainer != null) {
			// set visibility to hidden so we can't see it once we set it's display type to block
			modalContainer.style.visibility = "hidden";
			modalContainer.style.display = "block";

			/* WITH ITS DISPLAY TYPE AS "BLOCK" WE CAN GET ITS WIDTH/HEIGHT VALUES */
			var divHeight = modalContainer.offsetHeight;
			var divWidth = modalContainer.offsetWidth;

			/* WE NEED TO SUBTRACT ANY PADDING USED WITHIN THE DIV FOR IE/OPERA */
			if (this.browser == "Internet Explorer" || this.browser == "Opera") {
				divHeight = divHeight - divIEheightAdjust;
				divWidth = divWidth - divIEwidthAdjust;
			}
				
			if (divHeight > 0) modalContainer.style.marginTop = "-" + Math.ceil(divHeight / 2) + "px";
			if (divWidth > 0) modalContainer.style.marginLeft = "-" + Math.ceil(divWidth / 2) + "px";
						
			/* RESET VISITBILITY AND DISPLAY ATTRIBUTES */
			modalContainer.style.visibility = "";
			modalContainer.style.display = "none";
		}
	}
}
