//USE MOO
Function.prototype.extend = function(constructor, prototype) {
	var base = this;
	var Extended = function() {
		base.apply(this, arguments);
		constructor.apply(this, arguments);
	};

	Extended.implement(base.prototype);
	Extended.implement(prototype);
	return Extended;
};
Function.prototype.implement = function(proto) {
	for(var i in proto) { this.prototype[i] = proto[i]; }
};

var BasePopupWindow = function(obj) {
	this.init(obj);
};


BasePopupWindow.prototype.init = function(obj) {
	for (var i in obj) {
		this[i] = obj[i];
	}
	this.windowIdentifier = new Date().getTime();
	this.startDepth = 1011;
	this.injectObject = $('wrapper');
	this.visibilityBlocks = new Array();
	this.blockBlocks = new Array();
	this.eventIdQueue = new Array();
	this.isShowing = false;
	if (this.showOnCreate !== false) { this.showOnCreate = true; }
	this.winHMax = window.getScrollHeight();
	this.winWMax = window.getScrollWidth();
	this.addResizeEvents();
	
	this.buildWindowContainers();
	this.createWindow();
};


BasePopupWindow.prototype.addResizeEvents = function() {
	var me = this;
	window.addEvent("resize", function() { me.positionWindow(); });
	window.addEvent("scroll", function() { me.positionWindow(); });
};

BasePopupWindow.prototype.positionWindow = function() { };
BasePopupWindow.prototype.createWindow = function() {	
	if (this.showOnCreate) this.showWindow();
	for(var i = 0; i < this.eventIdQueue.length; i++) {
		var currentEvent = this.eventIdQueue[i];
		if ($(currentEvent.id)) {
			$(currentEvent.id).addEvent(currentEvent.event, currentEvent.func);
		}
	}
};

BasePopupWindow.prototype.setParams = function(params) {
	for (var i in params) {
		this[i] = params[i];
	}
};

BasePopupWindow.prototype.buildWindowContainers = function() { alert('buildWindowContainers needs to be implemented by subclass'); };

		
BasePopupWindow.prototype.setContent = function(html) {
	//var passedStyles = src_obj.getFirst().getStyles('width','height','margin','padding');
	//this.sourceObject.setStyles(passedStyles);
	this.sourceObject.setHTML(html);
	this.win = this.sourceObject.getFirst();
};

BasePopupWindow.prototype.getSharedStyles = function() {
	return {
		"background" : "transparent", 
		"position": "absolute",
		"width" : "0px",
		"height" : "0px",
		"display" : "none",
		"top" : window.getScrollTop() + "px",
		"left" : "0px"
	};
};

BasePopupWindow.prototype.buildWindowBlockers = function() {

	var shared_styles = this.getSharedStyles(); 
	shared_styles['z-index'] = this.startDepth + 2;
	this.innerContainer = new Element("div", { 
			'styles' : shared_styles
			});

	// so overlay can be positioned before showing
	this.innerContainer.style.visibility = 'hidden';
	this.innerContainer.injectAfter(this.injectObject);	
	
	this.sourceObject = new Element("div", {
		'styles' : {
			'clear' : 'both',
			'width' : 'auto',
			'height' : 'auto',
			'left' : "0px",
			'position' : 'absolute'
		}
	}).setHTML(this.htmlSource);
	this.setContent(this.htmlSource);
	this.innerContainer.adopt(this.sourceObject);
	
	if (this.useIframeShim !== false) {
		shared_styles['z-index'] = this.startDepth;
		this.iframeHolder = new Element("div", {
			'styles' : shared_styles
			});
		this.iframeHolder.injectAfter(this.injectObject);
		this.iframeShim = new Element("iframe", {
			'styles' : {
				"background" : "transparent",
				"position" : "absolute",
				"width" : "0px",
				"height" : "0px",
				"top" : "auto",
				"left" : "auto",
				"border" : "0px",
				"scrolling" : "no",
				"src" : "javascript:void(0)",
				"filter" : "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"	
			}
		});
		this.iframeHolder.adopt(this.iframeShim);
		this.blockBlocks.push(this.iframeHolder);
		this.visibilityBlocks.push(this.iframeHolder);
	}

	this.blockBlocks.push(this.innerContainer);
	this.visibilityBlocks.push(this.innerContainer);
};

BasePopupWindow.prototype.preShow = function() {};
BasePopupWindow.prototype.preHide = function() {};

BasePopupWindow.prototype.showWindow = function() {
	if (this.isShowing) { return; }
	this.isShowing = true;
	for (var i = 0; i <  this.blockBlocks.length; i++) {
		this.blockBlocks[i].style.display = "block";
	}
	this.positionWindow();
	for (var i = 0; i <  this.visibilityBlocks.length; i++) {
		this.visibilityBlocks[i].style.visibility = "visible";
	}
	this.positionWindow();
	this.preShow();
};

BasePopupWindow.prototype.hideWindow = function() {
	if (!this.isShowing) return;
	this.isShowing = false;
	this.preHide();
	for (var i = 0; i <  this.blockBlocks.length; i++) {
		this.blockBlocks[i].style.display = "none";
	}
	this.positionWindow();
	for (var i = 0; i <  this.visibilityBlocks.length; i++) {
		this.visibilityBlocks[i].style.visibility = "hidden";
	}
	if (this.onClose && typeof(this.onClose) == 'function') { this.onClose.call(); }
};

BasePopupWindow.prototype.killWindow = function() { alert('killWindow needs to be implemented by subclass'); };




var _RelativePopupWindow = {};

_RelativePopupWindow.positionWindow = function() {
	var snapTarget = this.snapTarget || this.injectObject;	
	
	var ht = this.sourceObject.offsetHeight;
	var wt = this.sourceObject.offsetWidth;
	var pl = 0;
	var pt = 0;
	var crds = snapTarget.getCoordinates();
	if (this.margin) {
		this.hMargin = this.margin;
		this.vMargin = this.margin;
	} else {
		this.hMargin = (this.hMargin || 0);
		this.vMargin = (this.vMargin || 0);
	}

	switch(this.hAlign) {
		case 'leftOf':
			pl = crds.left - this.hMargin - wt;
		break;
		case 'left':
			pl = crds.left - this.hMargin;
		break;
		case 'rightOf':
			pl = this.hMargin + crds.right;
		break;
		case 'right':
			pl = this.hMargin + crds.right - wt;
		break;
		case 'centerOf':
		default:
			pl = crds.left + (crds.width / 2 - wt / 2) + this.hMargin;
		break;
		case 'center':
			pl = crds.left + crds.width / 2 + this.hMargin;
		break;
	}

	switch(this.vAlign) {
		case 'bottomOf':
			pt = this.vMargin + crds.bottom - ht; 		
		break;
		case 'bottom':
			pt = this.vMargin + crds.bottom;
		break;
		case 'topOf':
			pt = crds.top - ht - this.vMargin;
		case 'top':
			pt = crds.top - this.vMargin; 
		break;
		case 'centerOf':
		default:
			pt = crds.top + (crds.height / 2 - ht / 2 ) + this.vMargin;
		break;
		case 'center':
			pt = crds.top + crds.height / 2 + this.vMargin;
		break;
			
	}
	var abs_styles = {
		'height': ht,
		'width': wt,
		'left': pl + "px",
		'top': pt + "px"
	};
	
	this.innerContainer.setStyles(abs_styles);
	if (this.useIframeShim !== false) {
		this.iframeHolder.setStyles(abs_styles);
		this.iframeShim.setStyles(abs_styles);	
	}
};

_RelativePopupWindow.addEvents = function() {};

_RelativePopupWindow.buildWindowContainers = function() {		
	this.buildWindowBlockers();
};

var RelativePopupWindow = BasePopupWindow.extend(function () {}, _RelativePopupWindow);


var _OverlayPopupWindow = {}; 

_OverlayPopupWindow.positionWindow = function() {
	var ww = window.getWidth();
	var wh = window.getHeight();

	
	var ht = this.sourceObject.offsetHeight;
	var wt = this.sourceObject.offsetWidth;
	var pl = (( ww/2 - parseInt(wt)/2 ) > 0) ? Math.round(ww/2 - parseInt(wt)/2 + window.getScrollLeft()) + "px" : "0px";
	var pt = (( wh/2 - parseInt(ht)/2 ) > 0) ? Math.round(wh/2 - parseInt(ht)/2 + window.getScrollTop()) + "px" : "0px";


	var abs_styles = {
		'height': ht,
		'width': wt,
		'left': pl,
		'top': pt
	};
	this.innerContainer.setStyles(abs_styles);
	this.iframeHolder.setStyles(abs_styles);
	this.iframeShim.setStyles(abs_styles);	
};

_OverlayPopupWindow.buildWindowContainers = function() {	
	this.buildWindowBlockers();
		
	this.overlay = new Element("div", {
			'styles' : {
			"background" : "#000",
			"position" : "absolute",
			"width" : window.getScrollWidth() + "px",
			"height" : window.getScrollHeight() + "px",
			"display" : "none",
			"top" : "0px",
			"left" : "0px",
			"text-align" : "center",
			"z-index" : this.startDepth + 1
			}});

	if (window.gecko) {    
		this.overlay.style["opacity"] = "1";
		this.overlay.style["background"] = "url(/static/images/ff_bg_overlay.png)";
	} else {
		this.overlay.style["opacity"] = ".8";
		this.overlay.style["filter"] = "alpha(opacity=80)";
	}
	this.overlay.injectAfter(this.injectObject);
	this.blockBlocks.push(this.overlay);
};

_OverlayPopupWindow.preShow = function() {
	//$E('html').style.overflow = "hidden";
	//$E('body').style.overflow = "hidden";
}

_OverlayPopupWindow.preHide = function() {
	//$E('html').style.overflow = "";
	//$E('body').style.overflow = "";
}

var OverlayPopupWindow = BasePopupWindow.extend(function(){},_OverlayPopupWindow);

var _DesignedOverlay = {};

_DesignedOverlay.setContent = function(html) {
	html = '<div class="popup" style="width:' + this.outerWidth + 'px;"><div class="section"><div class="header" style="height:auto"><h3>' + this.titleText + '</h3><p class="widgets"><a href="#" onclick="return false;" id="close_button_' + this.windowIdentifier + '" class="close"><span>Close</span></a></p></div><div>' + html + '</div></div></div>';
		
	this.sourceObject.setHTML(html);
	this.win = this.sourceObject.getFirst();
	var me = this;
	this.eventIdQueue.push({id: 'close_button_' + this.windowIdentifier, event: 'click', func:function(){me.hideWindow();}});
};

var DesignedOverlay = OverlayPopupWindow.extend(function(){},_DesignedOverlay);

