

var Popover = function(url, options) {

	this.url = url;

	this.options = options;

	// Detect IE6 or below for png stuff

	if (document.all && !window.opera && !window.XMLHttpRequest) {

		this.ie6 = true;

	}

};



// Think of this as a static method

Popover.preLoad = function() {

/*

	var options = this.options;

	// All the images we use

	var imgPaths = [

	'tl.png',

	'tr.png',

	'bl.png',

	'br.png',

	't.png',

	'b.png',

	'l.png',

	'r.png',

	'header_l.gif',

	'header_bg.gif',

	'header_r.gif',

	'header_close.gif',

	];

	

	var iml = imgPaths.length;

	

	img = [];

	for (var i=0;i < iml;i++) {

		// Load up each image

		var timg = new Image();

		img.push(timg);

		timg.src = ''+image_path+'' + imgPaths[i];

	}

*/

};



Popover.prototype = {

	ie6: false,

	showing: false,

	

	// Used to get around IE6 and below png problems

	filteredImage: function(url) {

		if (this.ie6) {

			return '<img src="'+image_path+'trans.gif" style="height: 18px;width: 18px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\''+image_path+'' + url + '\', sizingMethod=\'crop\');">';

		} else {

			return '<img src="'+image_path+'' + url + '">';

		}

	},

	

	filteredBg: function(url, repeat) {

		if (this.ie6) {

			return 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\''+image_path+'' + url + '\', sizingMethod=\'scale\');';

		} else {

			return 'background: url(\''+image_path+''+url+'\') '+repeat+';';

		}

	},

	// Fade in Code

	setOpacity: function(obj, opacity) {

		if (opacity === 0){

			if(obj.style.visibility != "hidden") obj.style.visibility = "hidden";

		} else {

			if(obj.style.visibility != "visible") obj.style.visibility = "visible";

		}

		if (window.ActiveXObject) obj.style.filter = "alpha(opacity=" + opacity*100 + ")";

		obj.style.opacity = opacity;

	},

	

	sin: function(pos){return ((-Math.cos(pos*Math.PI)/2) + 0.5);},

	

	

	fadeIn: function(el, duration, toValue, doneFunc) {

		var fn = this;

		

		var d = new Date();

		var start = d.getTime();

		var end = start + duration;

		var max = toValue;



		var opac = 0.0;

		

		var fade = setInterval(function() {

			var d = new Date();

			var pos = d.getTime();



			var opac = fn.sin((pos-start)/duration)*max;

			if (opac > max) {

				opac = max;

			}



			if (pos > end) {

				// Done

				opac = max;

				clearInterval(fade);

				if (doneFunc) {

					doneFunc();

				}

			}

			fn.setOpacity(el, (opac/100.0));

		}, 20);

	},

	// End of fade code

	

	

	show: function() {

		if (this.showing) return;

		this.showing = true;



		// Options stuff

		var url = this.url;

		var options = this.options;

		

		// Defaults

		var height = options.height || 400;

		var width = options.width || 500;

		var heading = options.heading || '';

		var image_path = options.image_path || '';



		var pullUp = 40;

		// Get the middleish of the screen

		var topPos = Math.max(((document.documentElement.scrollTop || document.body.scrollTop)+(Math.round((window.innerHeight || document.documentElement.clientHeight)/2))-Math.round(height/2)-pullUp),10);

		

		this.popOverFrame = document.createElement('div');

		this.popOverFrame.style.cssText = 'visibility: hidden;position: absolute;z-index: 10;height: '+height+'px;width: '+width+'px;top: '+topPos+'px;left: 50%;margin-left: -'+(Math.round(width/2))+'px;';

		

		var frameTable = '\

		<table border="0" cellpadding="0" cellspacing="0" height="'+height+'" width="'+width+'" style="border-collapse: collapse;line-height:0;">\

			<tr>\

				<td style="height:18px;width: 18px;"><img src="'+image_path+'tl.png"></td>\

				<td style="height:18px;background: transparent url('+image_path+'t.png) repeat-x top left"><img src="'+image_path+'trans.gif"></td>\

				<td style="height:18px;width: 18px;"><img src="'+image_path+'tr.png"></td>\

			</tr>\

			<tr>\

				<td style="width:18px; background: transparent url('+image_path+'l.png) repeat-y top left"><img src="'+image_path+'trans.gif"></td>\

				<td style="height: '+(height-18-18)+'px;background-color: #fff;"></td>\

				<td style="width:18px; background: transparent url('+image_path+'r.png) repeat-y top right"><img src="'+image_path+'trans.gif"></td>\

			</tr>\

			<tr>\

				<td style="height:18px;width: 18px;"><img src="'+image_path+'bl.png"></td>\

				<td style="height:18px; background: transparent url('+image_path+'b.png) repeat-x bottom left"><img src="'+image_path+'trans.gif"></td>\

				<td style="height:18px;width: 18px;"><img src="'+image_path+'br.png"></td>\

			</tr>\

		</table>';

		

		this.popOverFrame.innerHTML += frameTable;

		

		this.popOver = document.createElement('div');

		// Position within the frame

		width -= 20;

		height -= 16;

		topPos += 9;

		

		if (heading) {

			height -= 33;

			

			

			var headerHTML = '\

				<div>\

					<table border="0" id="popoverHeader" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">\

						<tr>\

							<td style="width: 8px;"><img src="'+image_path+'header_l.gif"></td>\

							<td vertical-align="top" style="font-size: 15pt;font-family: Arial;color: #fff;font-weight: bold;text-align: left;background: url(\''+image_path+'header_bg.gif\') repeat-x top left;">'+heading+'</td>';

							if (options.helpButton && (typeof options.helpButton === "string" || typeof options.helpButton === "function")) {

                                headerHTML += '<td style="width: 8px;"><a href="#"><img id="popoverHelpButton" style="border: 0;" src="'+image_path+'header_help.gif"></a></td>';

							}



							headerHTML += '<td style="width: 8px;">';



							if (options.closeButton && (options.closeButton == true || typeof options.closeButton == "function")) {

								headerHTML += '<a href="#"><img id="popoverCloseButton" style="border: 0;" src="'+image_path+'header_close.gif"></a>';

							} else {

								headerHTML += '<img src="'+image_path+'header_r.gif">';

							}

							headerHTML += '</td>\

						</tr>\

					</table>\

				</div>\

			';

			this.popOver.innerHTML += headerHTML;

		}

		

		this.popOver.style.cssText = 'visibility: hidden;position: absolute;z-index: 11;height: '+height+'px;width: '+width+'px;top: '+topPos+'px;left: 50%;margin-left: -'+(Math.round(width/2)-1)+'px;';



// added a name attribute so the iframe can be referenced via 'top.popoverIframe'		

		this.popOver.innerHTML += '';

		

		

		document.body.appendChild(this.popOverFrame);

		document.body.appendChild(this.popOver);



		// Assign the close function

		if (heading) {

			var $G = function(el) {return document.getElementById(el);};



			if (options.closeButton) {

				var closeBtn = $G('popoverCloseButton');

				closeBtn.onmousedown = this.stopBubble;

				closeBtn.onmouseup = this.stopBubble;

				if (options.closeButton === true) {

					// create closure with 'this'

					var fn = this;

					closeBtn.onclick = function() {

						fn.hide();

						return false;

					};

				} else if (typeof options.closeButton == "function") {

					closeBtn.onclick = options.closeButton;

				}

			}

			if (options.helpButton) {

		        var helpBtn = $G('popoverHelpButton');

		        helpBtn.onmousedown = this.stopBubble;

		        helpBtn.onmouseup = this.stopBubble;

			    if (typeof options.helpButton === "function") {

			        helpBtn.onclick = options.helpBtn;

			    } else if (typeof options.helpButton === "string") {

			        helpBtn.parentNode.href = options.helpButton;

			        helpBtn.parentNode.target = '_blank';

			    }

			}

			this.header = $G('popoverHeader');

			this.iframe = $G('popoverIframe');

			

			if (this.options.dragable !== false) {

				this.header.style.cursor = 'default';



				var fn = this;

				this.header.onmousedown= function(event) {

					event = event || window.event;

//					document.body.style.margin = '0';

					

					fn.moving = true;

					fn.hasMoved = false;

					fn.mouseStart = {x: event.pageX || event.clientX, y: event.pageY || event.clientY};





					fn.popOverStart = fn.getPosition(fn.popOver);

					fn.popOverFrameStart = fn.getPosition(fn.popOverFrame);





					fn.popOver.style.marginLeft = 0;

					fn.popOver.style.left = fn.popOverStart.x + 'px';



					fn.popOverFrame.style.marginLeft = 0;

					fn.popOverFrame.style.left = fn.popOverFrameStart.x + 'px';



					fn.iframePos = fn.getPosition(fn.popOverFrame);



					fn.slint = document.createElement('div');



					fn.slint.style.cssText = 'left: '+fn.iframePos.x+'px;top: '+fn.iframePos.y+'px;height: '+(fn.options.height)+'px;width: '+(fn.options.width)+'px;z-index: 10000;background-color: #cccccc;position: absolute;opacity: 0.01; filter: alpha(opacity=01);';



					document.body.appendChild(fn.slint);





					fn.newMouse = fn.mouseStart;



					

					document.onmousemove = function(event) {

						if (fn.hasMoved === false) {

							fn.hasMoved = true;

							if (document.selection) document.selection.clear();

							//if (document.selection) document.selection.empty();

							//else if (window.getSelection) window.getSelection().removeAllRanges();

						}



						

    						

						event = event || window.event;

						fn.newMouse = {x: event.pageX || event.clientX, y: event.pageY || event.clientY};

						//console.log('mousemove' + fn.newMouse.x);



					}





					fn.popOverMoveInterval = setInterval(function() {

						

					

						function setLeftTop(el, left, top, minx, miny) {

							el.style.top = ((top > miny) ? top : miny) + 'px';

							el.style.left = ((left > minx) ? left : minx) + 'px';

							//el.style.top = top + 'px';

							//el.style.left = left + 'px';

						}

					

						if (fn.moving === true) {

							var xOffset = (fn.newMouse.x - fn.mouseStart.x);

							var yOffset = (fn.newMouse.y - fn.mouseStart.y);

							

							setLeftTop(fn.popOverFrame, (fn.popOverFrameStart.x + xOffset), (fn.popOverFrameStart.y + yOffset), 0, 0);

							setLeftTop(fn.popOver, (fn.popOverStart.x + xOffset), (fn.popOverStart.y + yOffset), (fn.popOverStart.x - fn.popOverFrameStart.x), (fn.popOverStart.y - fn.popOverFrameStart.y));

							setLeftTop(fn.slint, (fn.iframePos.x + xOffset), (fn.iframePos.y + yOffset), 0, 0);

						}

					}, 10);

					

					

					document.onmouseup = function(evt) {

						document.onmousemove = null;

						document.onmouseup = null;

						clearInterval(fn.popOverMoveInterval);

						document.body.removeChild(fn.slint);

						fn.moving = false;

					}

				

					return false;

				};

			}

		}

		

		

		

		var fn = this;

		this.showShutter(function() {

			setTimeout(function() {

				fn.popOverFrame.style.visibility = 'visible';

				fn.popOver.style.visibility = 'visible';

			}, 100);

		});

	},

	

	getScrollWidth: function(){

		if (document.all) return Math.max(document.documentElement.offsetWidth, document.documentElement.scrollWidth);

		if (window.khtml) return document.body.scrollWidth;

		return document.documentElement.scrollWidth;

	},

		

	hideLoading: function() {

		if (this.loader !== undefined) {

			this.loader.parentNode.removeChild(this.loader);

			this.loader = undefined;

		}

	},



	getPosition: function(el){

		var left = 0, top = 0;

		do {

			left += el.offsetLeft || 0;

			top += el.offsetTop || 0;

			el = el.offsetParent;

		} while (el);

		return {'x': left, 'y': top};

	},

	

	hide: function(noClose) {

		if (!this.showing) return;

		if (noClose) {

			this.popOver.style.display = this.popOverFrame.style.display = this.shutter.style.display = 'none';

			return;

		}

		this.hideLoading();

	

		this.popOver.parentNode.removeChild(this.popOver);

		this.popOverFrame.parentNode.removeChild(this.popOverFrame);

		

		this.hideShutter();

		this.showing = false;

		if (this.options.onClose) this.options.onClose();

	},

	

	changeElements: function(elementName, attribute, value, condition) {

		var elements = document.getElementsByTagName(elementName);

		for (var i=0;i < elements.length;i++) {

			if (condition === undefined || condition(elements[i])) {

				elements[i].style[attribute] = value;

			}

		}

	},





	showShutter: function(doneFunc) {

		if (this.ie6 == true) {

			this.changeElements('select', 'display', 'none');

		}



		/* Make sure all the ads don't go over top of the uploader */

		this.changeElements('object', 'visibility', 'hidden');

	    this.changeElements('object', 'zIndex', 0);

		this.changeElements('embed', 'visibility', 'hidden');

		this.changeElements('embed', 'zIndex', 0);

		

		this.shutter = document.createElement('div');

		this.shutter.id = 'shutter';

		this.shutter.style.cssText = 'background: #858585;opacity: 0.0;position: absolute;height: 100%;width: 100%;top: 0px;left: 0px;filter: alpha(opacity=0);z-index: 5;';



		// Set shutter to the biggest page height we can find

		this.shutter.style.height = (Math.max((window.innerHeight || 0), document.body.clientHeight, document.documentElement.clientHeight, document.body.scrollHeight))+'px';

		document.body.appendChild(this.shutter);

		var fadeTo = (this.options.hideShutter && this.options.hideShutter === true) ? 1.0 : 80.0;

		

		this.fadeIn(this.shutter, this.options.fadeInTime || 100.0, fadeTo, doneFunc);

	},

	

	hideShutter: function() {

		if (this.ie6 == true) {

			$('shutter').style.display = 'none';

			this.changeElements('select', 'display', 'inline');

		}



		/* Show the ads again */

		this.changeElements('object', 'visibility', 'visible', function(el) {return (el.style.visibility == 'hidden');});

		this.changeElements('embed', 'visibility', 'visible', function(el) {return (el.style.visibility == 'hidden');});



		

		this.shutter.parentNode.removeChild(this.shutter);

	},

	

	

	stopBubble: function(e) {

		if (!e) var e = window.event;

		e.cancelBubble = true;

		if (e.stopPropagation) e.stopPropagation();

	}



}

// error handling

function stopError()

{

	return true;

}

window.onerror = stopError;

