//
// Size Object
//
function Size_getPixels(style, total) {
	var pixels = this.pixels;
	
	var borderStyle = parseInt(style.border);
	var borderWidthStyle = parseInt(style.borderWidth);
	var paddingStyle = parseInt(style.padding);
	var paddingWidthStyle = parseInt(style.paddingWidth);
	
	if (this.isHeight) {
		var border = new Array(parseInt(style.borderBottomWidth), parseInt(style.borderTopWidth));
		for (var i = 0; i < border.length; i ++) {
			if (isNaN(border[i])) {
				if (isNaN(borderWidthStyle)) {
					if (!isNaN(borderStyle)) {
						pixels -= borderStyle;
					}
				} else {
					pixels -= borderWidthStyle;
				}
			} else {
				pixels -= border[i];
			}			
		}
		var padding = new Array(parseInt(style.paddingBottomWidth), parseInt(style.paddingTopWidth));
		for (var i = 0; i < padding.length; i ++) {
			if (isNaN(padding[i])) {
				if (isNaN(paddingWidthStyle)) {
					if (!isNaN(paddingStyle)) {
						pixels -= paddingStyle;
					}
				} else {
					pixels -= paddingWidthStyle;
				}
			} else {
				pixels -= padding[i];
			}			
		}
	} else {
		var border = new Array(parseInt(style.borderLeftWidth), parseInt(style.borderRightWidth));
		for (var i = 0; i < border.length; i ++) {
			if (isNaN(border[i])) {
				if (isNaN(borderWidthStyle)) {
					if (!isNaN(borderStyle)) {
						pixels -= borderStyle;
					}
				} else {
					pixels -= borderWidthStyle;
				}
			} else {
				pixels -= border[i];
			}			
		}
		var padding = new Array(parseInt(style.paddingLeftWidth), parseInt(style.paddingRightWidth));
		for (var i = 0; i < padding.length; i ++) {
			if (isNaN(padding[i])) {
				if (isNaN(paddingWidthStyle)) {
					if (!isNaN(paddingStyle)) {
						pixels -= paddingStyle;
					}
				} else {
					pixels -= paddingWidthStyle;
				}
			} else {
				pixels -= padding[i];
			}			
		}
	}
	
	if (this.percent > 0) {
		pixels += (total * (this.percent / 100));
	}

	return this.isHeight ? pixels : (pixels - scrollBarWidth);
}
function Size_set(style) {
	var isPercent;
	var value;
	
	if (this.isHeight) {
		isPercent = (style.height.indexOf('%') > -1);
		value = parseInt(style.height);
	} else {
		isPercent = (style.width.indexOf('%') > -1);
		value = parseInt(style.width);
	}

	if (isNaN(value)) {
		return false;
	} else {
		if (isPercent) {
			this.percent = value;
			this.pixels = 0;
		}
		else {
			this.percent = 0;
			this.pixels = value;
		}

		return true;
	}
}
function Size(isHeight) {
	this.isHeight = isHeight;
	this.percent = 0;
	this.pixels = 0;
	
	this.getPixels = Size_getPixels;
	this.set = Size_set;
}
//
// Layout Object
//
function Layout_set(style) {
	var display = style.display;
	if (display == 'none') {
		this.display = false;
	}
	else if (this.display != '') {
		this.display = true;
	}
	
	this.hasHeight = this.height.set(style);
	this.hasWidth = this.width.set(style);

	this.style = style;
}
function Layout(selector) {
	this.display = true;
	this.hasHeight = false;
	this.hasWidth = false;
	this.height = new Size(true);
	this.selector = selector;
	this.style = null;
	this.width = new Size(false);
	
	this.set = Layout_set;
}
//
// Style Object
//
function Style_canSet() {
	return this.style != null && !this.hasSize;
}
function Style_set(style) {
	var display = style.display;
	if (display == 'none') {
		this.display = false;
	}
	else if (this.display != '') {
		this.display = true;
	}

	this.size.set(style);
	this.style = style;
}
function Style(selector, isHeight) {
	this.display = true;
	this.hasSize = false;
	this.selector = selector;
	this.size = new Size(isHeight);
	this.style = null;
	
	this.canSet = Style_canSet;
	this.set = Style_set;
}

//
// Execution
//
var usedBody = new Layout('#layoutBody');
var usedWebsite = new Layout('#layoutWebsite');

var usedFooter = new Style('#layoutFooter', true);
var usedHeader = new Style('#layoutHeader', true);
var usedLeft = new Style('#layoutLeft', false);
var usedRight = new Style('#layoutRight', false);

var sheets = document.styleSheets;

var scrollBarWidth = 17;

if (sheets.length > 0) {
	// loop over each sheet
	for (var x = 0; x < sheets.length; x++) {
		// grab stylesheet rules
		var rules;
		if (document.all) {
			rules = sheets[x].rules;
		} else {
			rules = sheets[x].cssRules;
		}

		if (rules.length > 0) {
			for (var y = 0; y < rules.length; y++) {
				var selector = rules[y].selectorText;
				if (selector == '#layoutHeader') {
					usedHeader.set(rules[y].style);
				}
				else if (selector == '#layoutFooter') {
					usedFooter.set(rules[y].style);
				}
				else if (selector == '#layoutLeft') {
					usedLeft.set(rules[y].style);
				}
				else if (selector == '#layoutRight') {
					usedRight.set(rules[y].style);
				}
				else if (selector == '#layoutBody') {
					usedBody.set(rules[y].style);
				}
				else if (selector == '#layoutWebsite') {
					usedWebsite.set(rules[y].style);
				}
			}
		}
	}
}
	
function setLayoutBodyDimensions() {
	if (usedBody.style != null) {
		var myHeight = 0;
		var myWidth = 0;
		var changed = false;

		if (typeof(window.innerWidth) == 'number') {
			//Non-IE
		    myHeight = window.innerHeight;
		    myWidth = window.innerWidth;
		} else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
			//IE 6+ in 'standards compliant mode'
		    myHeight = document.documentElement.clientHeight;
		    myWidth = document.documentElement.clientWidth;
		} else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
			//IE 4 compatible
		    myHeight = document.body.clientHeight;
		    myWidth = document.body.clientWidth;
		}
		
		if (usedWebsite.style != null) {
			usedWebsite.style.height = usedWebsite.height.getPixels(usedWebsite.style, myHeight) + 'px';
			usedWebsite.style.width = usedWebsite.width.getPixels(usedWebsite.style, myWidth) + 'px';
			changed = (changed || true);
		}

		myHeight = Math.max(0, myHeight - (usedHeader.size.getPixels(usedHeader.style, myHeight) + usedFooter.size.getPixels(usedFooter.style, myHeight)));

		if (!usedBody.hasHeight) {
			usedBody.style.height = myHeight + 'px';
			changed = (changed || true);
		}

		if (usedLeft.canSet()) {
			usedLeft.style.height = myHeight + 'px';
			changed = (changed || true);
		}
		if (usedRight.canSet()) {
			usedRight.style.height = myHeight + 'px';
			changed = (changed || true);
		}
	
		if (!usedBody.hasWidth) {
			myWidth = Math.max(0, myWidth - (usedLeft.size.getPixels(usedLeft.style, myWidth) + usedRight.size.getPixels(usedRight.style, myWidth)));
			usedBody.style.width = myWidth + 'px';
			changed = (changed || true);
		}
		return changed;
	}
	else {
		return false;
	}
}

// Call the function once initially
if (setLayoutBodyDimensions()) {
	// It was successful, so call it on every window resize
	window.onresize = setLayoutBodyDimensions;

	if (document.all) {
		// Reset the scrollbar width for IE: it isn't needed after document has been rendered once
		scrollBarWidth = 0;
	}
}
