function documentHeight () {
	var r = 0;
	var heights = {dh: $(document).height(), wh: $(window).height(), bh: $(document.body).outerHeight(true)};
	if ($.browser.msie) {
		r = (heights.dh == heights.bh) ? heights.wh : heights.dh;
	} else {		
		r = (heights.dh > heights.wh) ? ((heights.dh > heights.bh) ? heights.dh : heights.bh) : ((heights.wh > heights.bh) ? heights.wh : heights.bh);
	}
	return r;
}

function documentWidth () {
	var r = 0;
	var widths = {dw: $(document).width(), ww: $(window).width(), bw: $(document.body).outerWidth(true)};
	if ($.browser.msie) {
		r = (widths.dw == widths.bw) ? widths.ww : widths.dw;
	} else {		
		r = (widths.dw > widths.ww) ? ((widths.dw > widths.bw) ? widths.dw : widths.bw) : ((widths.ww > widths.bw) ? widths.ww : widths.bw);
	}
	return r;
}

function viewportHeight () {
	var r = 0;
	if ($.browser.msie) {
		r = document.body.clientHeight;
	} else {
		var heights = {dh: $(document).height(), wh: $(window).height()};		
		r = (heights.dh < heights.wh) ? heights.dh : heights.wh;
	}
	return r;
}

function viewportWidth () {
	var r = 0;
	if ($.browser.msie) {
		r = document.body.clientWidth;
	} else {
		var widths = {dw: $(document).width(), ww: $(window).width()};		
		r = (widths.dw < widths.ww) ? widths.dw : widths.ww;
	}
	return r;
}

function viewportPos () {
	var sl = $(window).scrollLeft();
	var st = $(window).scrollTop();
	var r = new Square(sl, st, sl + viewportWidth(), st + viewportHeight());
	return r;
}

function Square (x1, y1, x2, y2) {
	this.x1 = parseInt(x1);
	this.y1 = parseInt(y1);
	this.x2 = parseInt(x2);
	this.y2 = parseInt(y2);
	if (isNaN(this.x1)) {this.x1 = 0;}
	if (isNaN(this.y1)) {this.y1 = 0;}
	if (!(this.x2 > this.x1)) {this.x2 = 9999999999999;}
	if (!(this.y2 > this.y1)) {this.y2 = 9999999999999;}
	
	this.moveBy = function (x, y) {
		this.x1 += x; this.x2 += x; this.y1 += y; this.y2 += y;
		return this;
	}
	
	this.moveTo = function (x, y) {
		var x1 = this.x1;
		var y1 = this.y1;
		this.x1 = x;
		this.x2 = this.x2 - x1 + x;
		this.y1 = y;
		this.y2 = this.y2 - y1 + y;
		return this;
	}
	
	this.intersect = function (sqr) {
		if (typeof sqr == 'object' && sqr.constructor == Square) {
			if (this.x1 < sqr.x1) { this.x1 = sqr.x1; }
			if (this.y1 < sqr.y1) { this.y1 = sqr.y1; }
			if (this.x2 > sqr.x2) { this.x2 = sqr.x2; }
			if (this.y2 > sqr.y2) { this.y2 = sqr.y2; }
		}
		return this;
	}
	
	this.moveIn = function (sqr) {
		if (typeof sqr == 'object' && sqr.constructor == Square) {
			var x1 = sqr.x1 - this.x1;
			var y1 = sqr.y1 - this.y1;
			var x2 = sqr.x2 - this.x2;
			var y2 = sqr.y2 - this.y2;
			x1 = (x1 > 0) ? x1 : 0;
			y1 = (y1 > 0) ? y1 : 0; 
			x2 = (x2 < 0) ? x2 : 0;
			y2 = (y2 < 0) ? y2 : 0;
			this.moveBy(x2, y2);
			this.moveBy(x1, y1);
		}
		return this;
	}
}
