var EviteWindow = Class.create();
Object.extend(EviteWindow.prototype, Window.prototype);
Object.extend(EviteWindow.prototype, {
	DEFAULT_CLASSNAME: 'evite',
	DEFAULT_HEADER_HEIGHT: 0,
	DEFAULT_FOOTER_HEIGHT: 0,
	DEFAULT_LINE_HEIGHT: 16,
	DEFAULT_AD_HEIGHT: 90,
	//DEFAULT_AD_WIDTH: 728,
	DEFAUTL_AD_PADDING: 10,
	// Creates HTML window code
	_createWindow: function(id) {
		if(this.options.resizable && (!this.options.url || this.options.url == null)) {
			throw("The resizable option is not supported on non-url windows (Windows, not using an IFRAME as it's content).");
		}
		//if(this.options.adURL) {
			// if the given width of the window is smaller than the default ad size
			// we need to set the window width to accommodate the ad. Otherwise,
			// the content will be misplaced.
			//if(this.options.width < this.DEFAULT_AD_WIDTH) {
				//this.options.width = this.DEFAULT_AD_WIDTH;
			//}
		//}
		return this.createWindowFrame(id);
	},
	createContentIFrame: function(id) {
		return "<IFRAME frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" name=\"" + id + "_content\"  id=\"" + id + "_content\" SRC=\"" + this.options.url + "\" onload=\"" + this.options.onload + "\" > </IFRAME>";
	},
	createContentHTML: function(id) {
		var waitText = "";
		if(this.options.waitText && this.options.waitText != null) {
			waitText = this.options.waitText;
		}
		var contentHTML =
			"<DIV id=\"" + id + "_content\" class=\"" + this.options.className + "_content\" onload=\"" + this.options.onload + "\">\n" +
			"\t<div id=\"" + id + "_wait\" class=\"" + this.options.className + "_wait\">" + waitText + "</div>\n" +
			"</DIV>";
		return contentHTML;
	},
	createWindowFrame: function(id) {
		var className = this.options.className;
		var win = document.createElement("div");
		win.setAttribute('id', id);
		if(className && className != null) {
			win.className = className + "_window";
		} else {
			win.className = EviteWindow.DEFAULT_CLASSNAME;
		}

		var content = "";
		if (this.options.url && this.options.url != null) {
			content = this.createContentIFrame(id);
		} else {
			content = this.createContentHTML(id);
		}

		var header = this.createHeaderHTML(id);
		var footer = this.createFooterHTML(id);

		win.innerHTML =
			"<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"" + className + "_window_frame\" id=\"evite_window_frame\" style=\"display: block;\">"+
			"\t<tr>"+
			"\t\t<td id=\"evite_window_frame_content\" class=\"" + className + "_window_frame_content\">" + 
			header +
			"<div id=\"" + id + "_table_content\" class=\"" + className + "_content\">" + content + "</div>" +
			footer +
			"</td>"+
			"\t\t<td id=\"evite_window_frame_rBorder\" class=\"" + className + "_window_frame_rBorder\"></td>"+
			"\t</tr>"+
			"\t<tr>"+
			"\t\t<td id=\"evite_window_frame_bBorder\" class=\"" + className + "_window_frame_bBorder\"></td>"+
			"\t\t<td id=\"evite_window_frame_brBorder\" class=\"" + className + "_window_frame_brBorder\"></td>"+
			"\t</tr>"+
			"</table>";

		Element.hide(win);
		this.options.parent.insertBefore(win, this.options.parent.firstChild);

		var headerCloseOnClick = this.options.headerCloseOnClick;	
		if( headerCloseOnClick == null ) {
			headerCloseOnClick = function() {Windows.close(id);};
		}

		// set up the close button action		
		setTimeout( 
			function() {
				Event.observe(id + '_close_button', 'click', headerCloseOnClick);
			}, 50
		)

		return win;
	},
	getHeader: function() {
		return $(this.element.id + "_header");
	},
	getFooter: function() {
		return $(this.element.id + "_bottom");
	},
	createHeaderHTML: function(id) {
		var className = this.options.className;
		
		var header =
		"<div class=\"" + className + "_header\" id=\""+ id +"_header\" >";
		header += this.createHeaderAdIFrame(id);
		header += this.createHeaderTitleHTML(id);
		header += this.createHeaderCloseButton(id);
		header += this.createHeaderOptions(id);
		header = header + "<br class=\"invisibleClr\" /></div><br class=\"invisibleClr\" />";
		return header;
	},
	createHeaderOptions: function(id) {
		var headerOptionHTML = "";
		if(this.options.headerOptions) {
			var headerOptionsCount = this.options.headerOptions.length;
			for(var index = 0; index < headerOptionsCount; index++) {
				headerOptionHTML = headerOptionHTML +
					"<div class=\"evite_header_option\" style=\"float: right;\">"+
					"\t" + this.options.headerOptions[index] +
					"</div>";
			}
		}
		return headerOptionHTML;
	},
	createHeaderTitleHTML: function(id) {
		var className = this.options.className;
		var title = this.options.title;
		var headerTitle = "\t<div class=\"" + className + "_title\" style=\"float: left;\" id=\"" + id + "_top\">" + title + "</div>";
		return headerTitle;
	},
	createHeaderCloseButton: function(id) {
		var className = this.options.className;
		var showHeaderCloseButton = true;
		if(this.options.showHeaderCloseButton != null) {
			showHeaderCloseButton = this.options.showHeaderCloseButton;
		}
		var headerCloseButtonURL = "/images/06/buttons/close_x.gif"
		var headerCloseButtonWidth = 11;
		var headerCloseButtonHeight = 11;
		var headerCloseButtonAlt = "close";
		if(this.options.headerCloseButtonURL) {
			headerCloseButtonURL = this.options.headerCloseButtonURL;
			headerCloseButtonWidth = this.options.headerCloseButtonWidth;
			headerButtonHeight = this.options.headerCloseButtonHeight;
			headerCloseButtonAlt = this.options.headerCloseButtonAlt;		
		}
		var headerCloseButton = "";
		if(showHeaderCloseButton == true) {
			headerCloseButton = headerCloseButton +
				"\t<div class=\"" + className + "_header_close\" style=\"float: right;\">" +
				"\t\t<button id=\"" + id + "_close_button\"><img src=\"" + headerCloseButtonURL + "\" width=\"" +
					headerCloseButtonWidth + "\"" + " height=\"" + headerCloseButtonHeight + "\"" +
					" alt=\"" + headerCloseButtonAlt + "\"" + " border=\"0\"  style=\" margin:8px 6px 0px 0px;\" />" + "</button>" +
				"\t</div>";
		}
		return headerCloseButton;
	},
	createHeaderAdIFrame: function(id) {
		var className = this.options.className;
		var headerAdIFrame = "";
		if(this.options.adURL || this.options.encodedAdURL) {
			var adUrl = this.options.adURL;
			if (this.options.encodedAdURL) {
				adUrl = unescape(this.options.encodedAdURL);
			}
			headerAdIFrame = 
			"<div class=\"" + className + "_header_ad\" id=\"" + id + "_header_ad\">\t"+
			"\t<iframe width=\"728\" height=\"90\" marginwidth=\"0\" marginheight=\"0\" hspace=\"0\" vspace=\"0\" frameborder=\"0\" scrolling=\"no\" bordercolor=\"#000000\" "+
			"\t\tsrc=\"" + adUrl + "\">"+
			"\t</iframe>"+
			"</div>";
		}
		return headerAdIFrame;
	},
	createFooterHTML: function(id) {
		var className = this.options.className;
		var footer =
		"<div class=\"" + className + "_footer\" id=\"" + id +"_bottom\">&nbsp;";
		if(this.options.resizable) {
			footer += "<div class=\"" + className + "_sizer\" id=\"" + id + "_sizer\">&nbsp</div>";
		}
		footer += "</div>" +
		"<br class=\"invisibleClr\" />";
		return footer;
	},
	getDimensions: function(element, defaultWidth, defaultHeight) {
		element = $(element);
		var elementPadding = Element.getStyleValue(element, 'padding');
		var topPadding = Element.getStyleValue(element, 'padding-top');
		var botPadding = Element.getStyleValue(element, 'padding-bottom');
		var rtPadding = Element.getStyleValue(element, 'padding-right');
		var lfPadding = Element.getStyleValue(element, 'padding-left');
		if (Element.getStyle(element, 'display') != 'none') {
			var dimensions = {width: 0, height: 0};
			if(!element.offsetWidth || element.offsetWidth == null) {
				// try to get the width from the style.
				var styleWidth = Element.getStyleValue(element, 'width');
				if(!styleWidth || styleWidth == null) {
					styleWidth = defaultWidth;
				} else {
					if(elementPadding && elementPadding != null) {
						styleWidth += elementPadding;
					} else {
						if(rtPadding && rtPadding != null) {
							styleWidth += rtPadding;
						}
						if(lfPadding && lfPadding != null) {
							styleWidth += lfPadding;
						}
					}
				}
				dimensions.width = styleWidth;
			} else {
				dimensions.width = element.offsetWidth;
			}
			if(!element.offsetHeight || element.offsetHeight == null) {
				// try to get the height from the style.
				var styleHeight = Element.getStyleValue(element, 'height');
				if(!styleHeight || styleHeight == null) {
					styleHeight = defaultHeight;
				} else {
					if(elementPadding && elementPadding != null) {
						styleHeight += elementPadding;
					} else {
						if(topPadding && topPadding != null) {
							styleHeight += topPadding;
						}
						if(botPadding && botPadding != null) {
							styleHeight += botPadding;
						}
					}
				}
				dimensions.height = styleHeight;
			} else {
				dimensions.height = element.offsetHeight;
			}
			return dimensions;
		}

		// All *Width and *Height properties give 0 on elements with display none,
		// so enable the element temporarily
		var els = element.style;
		var originalVisibility = els.visibility;
		var originalPosition = els.position;
		els.visibility = 'hidden';
		els.position = 'absolute';
		els.display = '';
		var originalWidth = element.clientWidth;
		var originalHeight = element.clientHeight;
		els.display = 'none';
		els.position = originalPosition;
		els.visibility = originalVisibility;
		return {width: originalWidth, height: originalHeight};
	},
	setSize: function(width, height) {
		// Override, to set height of content pane to the correct amount.
		width = parseFloat(width);
		height = parseFloat(height);

		// Check min and max size
		if (width < this.options.minWidth) {
			width = this.options.minWidth;
		}

		if (height < this.options.minHeight) {
			height = this.options.minHeight;
		}

		if (this.options. maxHeight && height > this.options. maxHeight) {
			height = this.options. maxHeight;
		}

		if (this.options. maxWidth && width > this.options. maxWidth) {
			width = this.options. maxWidth;
		}

		this.width = width;
		this.height = height;
		this.element.setStyle({width: width + this.widthW + this.widthE + "px"})
		this.element.setStyle({height: height  + "px"})

		// Update content height
		var content = $(this.element.id + '_content');
		var headerHeight = this.getDimensions(this.element.id + '_header', this.DEFAULT_FOOTER_HEIGHT, this.DEFAULT_HEADER_HEIGHT).height;
		if(this.options.adURL) {
			headerHeight += this.DEFAULT_AD_HEIGHT;
			headerHeight += this.getDimensions(this.element.id + '_header_ad', this.DEFAUTL_AD_PADDING, this.DEFAUTL_AD_PADDING).height;
		}
		var footerHeight = this.getDimensions(this.element.id + '_bottom', this.DEFAULT_FOOTER_HEIGHT, this.DEFAULT_HEADER_HEIGHT).height;
		var contentHeight = height - (headerHeight + footerHeight);
		var waitElement = $(this.element.id + '_wait');
		var lineHeight = this.DEFAULT_LINE_HEIGHT;
		if(waitElement && waitElement != null) {
			lineHeight = Element.getStyleValue(waitElement, 'line-height');
			var waitTextPadding = (contentHeight / 2) - lineHeight;
			Element.setStyle(this.element.id + '_wait', {paddingTop: waitTextPadding + 'px'});
		}
		content.setStyle({height: contentHeight  + 'px'});
		content.setStyle({width: width  + 'px'});
	}
});