var windowResizeFunctions = [];
var windowScrollFunctions = [];

var windowResizeMinDelay = -1;
var windowResizeLastExecution = 0;
var resizeTimeoutID = -1;

window.onresize = windowResize;
window.onscroll = windowScroll;

function windowResize(e) {
	//alert($time());
	var curTime = $time();
	if (windowResizeMinDelay > 0) {
		var delaySinceLast = curTime - windowResizeLastExecution;
		if (delaySinceLast < windowResizeMinDelay) {
			if (resizeTimeoutID == -1) {
				resizeTimeoutID = window.setTimeout("windowResize(null)", windowResizeMinDelay - delaySinceLast);
			}
			return;
		}
	}

	if (resizeTimeoutID != -1) {
		window.clearTimeout(resizeTimeoutID);
		resizeTimeoutID = -1;
	}

	var origWidth = window.getWidth();
	var origHeight = window.getHeight();
	var origOnifinWidth = window.getWidth();
	var origOnifinHeight = window.getHeight();

	windowResizeFunctions.each(function(fn, i) {
		fn.call(null, e);
	});

	var newWidth = window.getWidth();
	var newHeight = window.getHeight();
	var newOnifinWidth = window.getWidth();
	var newOnifinHeight = window.getHeight();

	if (origWidth != newWidth || origHeight != newHeight
		|| origOnifinWidth != newOnifinWidth || origOnifinHeight != newOnifinHeight) {

		// Let's give it a second try.
		windowResizeFunctions.each(function(fn, i) {
			fn.call(null, e);
		});
	}

	if (mustSendDimsToServer == true) {
		sendDimsToServer(newOnifinWidth, newOnifinHeight);
	}

	windowResizeLastExecution = $time();
}
function windowScroll(e) {
	windowScrollFunctions.each(function(fn, i) {
		fn.call(null, e);
	});
}

Element.Events.windowResized = {
	onAdd: function(fn){
		windowResizeFunctions.include(fn);
	}
};
Element.Events.windowScrolled = {
	onAdd: function(fn){
		windowScrollFunctions.include(fn);
	}
};

function forceWindowResizeEvent() {
	windowResize(null);
}

var mustSendDimsToServer = false;
var dimsServerAddr = null;
var delayDimsToServer = -1;
var dimsToServerTimeoutId = -1;
var lastWidthSentToServer = null;
var lastHeightSentToServer = null;


function realSendDimsToServer(width, height) {
	if (mustSendDimsToServer != true) {
		return;
	}
	if ($type(dimsServerAddr) != 'string') {
		return;
	}
	if (width == lastWidthSentToServer && height == lastHeightSentToServer) {
		return;
	}
	var myAjax = new Ajax(dimsServerAddr, {method: 'post', data: {
		width : width,
		height: height
	}, onComplete: function(result) {
		//alert(result);
		lastWidthSentToServer = width;
		lastHeightSentToServer = height;
	} }).request();
}


function sendDimsToServer(width, height) {
	if ($type(delayDimsToServer) != 'number' || delayDimsToServer <= 0) {
		realSendDimsToServer(width, height);
		return;
	}

	if (dimsToServerTimeoutId != -1) {
		window.clearTimeout(dimsToServerTimeoutId);
		dimsToServerTimeoutId = -1;
	}

	dimsToServerTimeoutId = window.setTimeout("realSendDimsToServer("+width+", "+height+")", delayDimsToServer);
}
