var Popover = function(url, options) { this.url = url, this.options = options, this.viewportwidth = "", this.viewportheight = ""; }

var websover = {
    removeBadElements: function() { 
		if(/msie|MSIE 6/.test(navigator.userAgent)) { 
            var selects = document.getElementsByTagName("SELECT");
            for(var i = 0; i < selects.length; i++) {
                if(selects[i].style.visibility == "hidden") selects[i].style.visibility = "visible";
                else selects[i].style.visibility = "hidden";
            }
        } 

        var iframes = document.getElementsByTagName("IFRAME");
        for(var i = 0; i < iframes.length; i++) {
            if(iframes[i].style.visibility == "hidden") {
                iframes[i].style.visibility = "visible";
            } else { if(iframes[i].id != "websover_iframe" && iframes[i].id != "documentarea") iframes[i].style.visibility = "hidden"; }
        }
    },

    getTotalDocSize: function() { return Math.max((document.documentElement.scrollHeight || document.body.scrollHeight), (document.documentElement.offsetHeight || document.body.offsetHeight)); },

    hide: function() {
        websover.removeBadElements();
        var websover_shadow = document.getElementById("websover_shadow"),
            websover_border = document.getElementById("websover_border"),
            inner_websover = document.getElementById("inner_websover");

        inner_websover.parentNode.removeChild(inner_websover);
        websover_border.parentNode.removeChild(websover_border);
        websover_shadow.parentNode.removeChild(websover_shadow);
    },

	changeIframeDest: function(paramObj) { 
		document.getElementById("websover_title").innerHTML = paramObj.title;
		document.getElementById("websover_iframe").src = paramObj.url; 
	},

	resize: function(resizeObj) {
		var websoverBorder = document.getElementById("websover_border"),
			innerWebsover = document.getElementById("inner_websover"),
			websoverIframe = document.getElementById("websover_iframe"),
			websoverIframeWidth = websoverIframe.offsetWidth,
			viewportwidth = (typeof window.innerWidth !== "undefined" ? window.innerWidth : document.documentElement.clientWidth),
			viewportheight = (typeof window.innerHeight !== "undefined" ? window.innerHeight : document.documentElement.clientHeight),
			scrollPoint = Math.max(document.body.scrollTop, document.documentElement.scrollTop),
			medianwidth = (viewportwidth - resizeObj.width) / 2,
            medianheight = ((viewportheight - resizeObj.height) / 2 + scrollPoint);
		
		function checkResizeScrolling(resizeObj, websoverIframe) {
			if(typeof resizeObj.scrolling !== "undefined") {
				if(resizeObj.scrolling === true) {
					websoverIframe.setAttribute("scrolling", "auto");
					websoverIframe.style.overflow = "auto";
				} else if(resizeObj.scrolling === false) {
					websoverIframe.setAttribute("scrolling", "no");
					websoverIframe.style.overflow = "hidden";
				}
			}
		}

		if(typeof jQuery != "undefined") {
			$(websoverIframe).fadeOut("fast");
			if(typeof resizeObj.before !== "undefined" && typeof resizeObj.before === "function") resizeObj.before();
			$(websoverBorder).animate({width: resizeObj.width, height: resizeObj.height, top: (medianheight - 11) < 0 ? 10 : (medianheight - 11), left: medianwidth - 22}, 500);
			$(innerWebsover).animate({width: resizeObj.width, height: resizeObj.height, top: (medianheight < 0) ? 21 : medianheight, left: medianwidth - 11}, 500, function() {
				websoverIframe.style.height = (resizeObj.height - 26) + "px";
				if(typeof resizeObj.after !== "undefined" && typeof resizeObj.after === "function") resizeObj.after();
				checkResizeScrolling(resizeObj, websoverIframe);
				$(websoverIframe).fadeIn("fast");
			});
		} else {
			websoverIframe.style.display = "none";
			if(typeof resizeObj.before != "undefined" && typeof resizeObj.before == "function") resizeObj.before();
			websoverBorder.style.top = medianheight - 11 + "px"; 
			websoverBorder.style.left = (medianwidth - 22) + "px",
			websoverBorder.style.width = resizeObj.width + "px";
			websoverBorder.style.height = resizeObj.height + "px";
			innerWebsover.style.top = medianheight + "px",
			innerWebsover.style.left = (medianwidth - 11) + "px",
			innerWebsover.style.width = resizeObj.width + "px";
			innerWebsover.style.height = resizeObj.height + "px";
			websoverIframe.style.height = (resizeObj.height - 26) + "px";
			if(typeof resizeObj.after != "undefined" && typeof resizeObj.after == "function") resizeObj.after();
			checkResizeScrolling(resizeObj, websoverIframe);
			websoverIframe.style.display = "block";
		}
	}
}

Popover.prototype = {    
    show: function() {
        websover.removeBadElements(); 
        var options = this.options,
			shadow = document.createElement('div'),
            popover_layer = document.createElement('div'), 
            inner_websover = document.createElement('div'),
			viewportwidth = (typeof window.innerWidth !== "undefined" ? window.innerWidth : document.documentElement.clientWidth),
			viewportheight = (typeof window.innerHeight !== "undefined" ? window.innerHeight : document.documentElement.clientHeight),
			scrollPoint = Math.max(document.body.scrollTop, document.documentElement.scrollTop),
			medianwidth = (viewportwidth - options.width) / 2,
            medianheight = ((viewportheight - options.height) / 2 + scrollPoint),		
			trueDocHeight = websover.getTotalDocSize(),
			contentCode = null,
			scrollOption = (typeof options.scrolling !== "undefined" && options.scrolling == true ? "auto" : "no");

		if(typeof options.closeButton == 'undefined') options.closeButton = true;

	    shadow.setAttribute("id", "websover_shadow");
        popover_layer.setAttribute("id", "websover_border");
        inner_websover.setAttribute("id", "inner_websover");
        
        shadow.style.height = trueDocHeight + "px", 
		document.body.appendChild(shadow);
		
		/* The following block of code is very annoying. Basically, if we're not passed a url for an iframe, get the height of the passed in object and set the shadow -- Ryan */
		if(typeof this.url == "string") {
            contentCode = '<iframe id="websover_iframe" rel="' + this.url + '" name="popoverIframe" frameborder="0" scrolling="' + scrollOption  + '" src="' + this.url + '" style="height: ' + (options.height - 26) + 'px;' + (scrollOption === "no" ? 'overflow="hidden"' : 'overflow="auto"') + '"></div>';
            popover_layer.style.height = options.height + "px";
        } else {
            contentCode = this.url; /* Do not ask -- Ryan */
            contentCode.className = 'websover_content';
            contentCode.style.display = 'block';
        }
       
	   inner_websover.innerHTML = '<div id="websover_header">' + 
            '<span id="websover_title">' + options.heading + '</span>' + 
            (options.closeButton ? '<a href="#" title="Close" id="websover_close">Close</a>' : '') + '</div>' +
	        '<div id="websover_iframe_container">' + (typeof contentCode === "string" ? contentCode : "") + '</div>';

        popover_layer.style.width = options.width + "px";
        popover_layer.style.left = medianwidth - 22 + "px";
		popover_layer.style.display = "none";

        inner_websover.style.left = medianwidth - 11 + "px";
        inner_websover.style.width = options.width + "px";
		inner_websover.style.display = "none";

		document.body.appendChild(popover_layer);
		document.body.appendChild(inner_websover);
		
		popover_layer.style.display = "block";
		inner_websover.style.display = "block";
		
		if(typeof contentCode !== "string") {
            document.getElementById("websover_iframe_container").appendChild(contentCode);
            var contHeight = contentCode.offsetHeight, 
                objMedHeight = ((viewportheight - contHeight) / 2 + scrollPoint);
			popover_layer.style.height = (contHeight + 26) + "px";
            popover_layer.style.top = objMedHeight - 11 + "px"; 
            inner_websover.style.top = objMedHeight + "px";
        } else {
            popover_layer.style.top = medianheight - 11 + "px",
            inner_websover.style.top = medianheight + "px",
            inner_websover.style.height = options.height + "px";
        }

		if(document.getElementById("websover_close")) document.getElementById("websover_close").onclick = this.hide;
		return false;
    },    

    hide: function() { 
		websover.hide(); 
		if(typeof this.options != "undefined" && this.options.onClose) this.options.onClose();
		return false; 
	}
}

