/* Copyright (C) 2002-2011 by Home of the Brave
   Web http://home.of.the.brave.de
   E-Mail info@brave.de */
/* $Revision: 1.7 $ $Date: 2011/03/31 10:45:11 $ */

/*
 * ------ Global body event-handler wrapper -------------
 * usage: var id = BodyEvents.addListener('scroll',function () {...});
 *        var id = BodyEvents.createDynamicBlock(function (node,args) {...}, args);
 *        BodyEvents.removeListener(id);
 *        var id = BodyEvents.addInterval(function (args) {//return false to break}, 100, maxCalls, args);
 *        BodyEvents.removeInterval(id);
 * notes: If a function is attached to 'load' after loading
 *        completed, it is called immediately.
 * owner: Simon.Leidig@brave.de
 * ------------------------------------------------------
 *
 */

var BodyEvents = {
	Listeners:	{},
	Intervals:	{},
	IDMap:		{},
	Count:		0,
	Loaded:		false,
	IE:			navigator.userAgent.indexOf('MSIE')                != -1 &&
				navigator.userAgent.toLowerCase().indexOf('opera') == -1
};
BodyEvents.addListener = function (event,func) {
	var id = 'ID' + ++BodyEvents.Count;
	if (BodyEvents.Listeners[event]) {
		BodyEvents.Listeners[event].push([id,func]);
	} else {
		BodyEvents.Listeners[event] = [[id,func]];
		if (BodyEvents.Loaded) BodyEvents.setListener(event);
	}
	if (BodyEvents.Loaded && event == 'load') func();
	BodyEvents.IDMap[id] = BodyEvents.Listeners[event];
	return id;
}
BodyEvents.removeListener = function (id) {
	var i = BodyEvents.IDMap[id].length;
	while (i-- > 0) {
		if (BodyEvents.IDMap[id][i][0] == id) {
			BodyEvents.IDMap[id].splice(i,1);
			return true;
		}
	}
	return false;
}
BodyEvents.setListener = function (event) {
	if (BodyEvents.IE) {
		document.body['on'+event] = function () { BodyEvents.call(event) };
	} else {
		document.body.setAttribute('on'+event,"BodyEvents.call('"+event+"')");
	}
}
BodyEvents.call = function (event) {
	for (var i = 0; i < BodyEvents.Listeners[event].length; i++) BodyEvents.Listeners[event][i][1]();
}
BodyEvents.load = function () {
	BodyEvents.Loaded = true;
	for (var event in BodyEvents.Listeners) BodyEvents.setListener(event);
	if (BodyEvents.Listeners['load']) BodyEvents.call('load');
	return true;
}
BodyEvents.createDynamicBlock = function (func,args) {
	var id = 'g'+(''+Math.random()).substr(2);
	document.write('<div id="'+id+'"></div>');
	return BodyEvents.addListener('load',function () { func(document.getElementById(id),args) });
}
BodyEvents.addInterval = function (func,interval,maxCalls,args) {
	var v = [0,1];
	v[0] = ''+window.setInterval(function () {
		if (!func(args) || maxCalls > 0 && ++v[1] > maxCalls) BodyEvents.removeInterval(v[0])
	},interval);
	BodyEvents.Intervals[v[0]] = true;
	return v[0];
}
BodyEvents.removeInterval = function (id) {
	if (!BodyEvents.Intervals[id]) return false;
	delete BodyEvents.Intervals[id];
	window.clearInterval(id);
	return true;
}

