function pushEventListener(src, ev, fcnt, capture) {
	if (src.addEventListener) {
		src.addEventListener(ev, fcnt, capture);		
	} else {
		//INTERNET EXPLORER
		src.attachEvent("on"+ev, fcnt);		
	}
}

function popEventListener(src, ev, fcnt) {
	if (src.removeEventListener) {
		src.removeEventListener(ev, fcnt, true);		
	} else {
		//INTERNET EXPLORER
		src.detachEvent("on"+ev, fcnt);		
	}
}

function bind(fnct, obj) {
	if ((!obj) || (!fnct))
		throw new Error("Invalid input parameters");
		
	var ret = function() {
		fnct.apply(obj, arguments);
	}
	
	return ret;
}

function bodySize() {
	var r = {w: window.innerWidth, h: window.innerHeight};	
	
	if (_is_ie) {
		//alert(document.documentElement.offsetWidth+"-"+document.documentElement.offsetHeight);
		//alert(document.body.clientWidth+"-"+document.body.clientHeight);
		
		//CI FOSSE UNA VOLTA CHE RISPETTI LO STANDARD (VEDERE BOX MODEL)
		//r = new rect(0, 0, parseFloat(document.documentElement.offsetWidth)-17, parseFloat(document.documentElement.offsetHeight)-4);
		r.w = parseFloat(document.documentElement.offsetWidth);
		r.h = parseFloat(document.documentElement.offsetHeight);
		
		if (_version < 7) {
			var w_off = 0;//21;//oscilla tra 17 e 21 compresi a seconda del tipo di layout che uno imposta !!!!
			var h_off = 4;
			r.w -= w_off;
			r.h -= h_off;
		}
	}
	
	if (_is_opera) {
		r.w = document.body.clientWidth;
		r.h = Math.max( document.body.clientHeight, window.innerHeight);
	}
		    
    return r;    		                
}

var _is_gecko = false;
var _is_mozilla = false;
var _is_netscape = false;
var _is_opera = false;
var _is_safari = false;
var _is_ie = false;
var _is_chrome = false;

var _version = null;

function getVersion() {
	initVars();
	
	if (_version)
		return _version;
	
	var ver_str = "";
	if (_is_ie) {
		var params = navigator.appVersion.split("MSIE ");
		params = params[1].split("; ");
		ver_str = params[0];
	}
	
	if (_is_chrome) {
		var params = navigator.userAgent.split("Chrome/");
		params = params[1].split(" ");
		browser_info._version = params[0];
		return browser_info._version;
	}
	
	if (_is_safari) {
		var params = navigator.userAgent.split("Safari/");
		params = params[0].split("Version/");
		params = params[1].split(" ");
		browser_info._version = params[0];
		return browser_info._version;
	}
	
	if (_is_gecko) {
		var params = navigator.userAgent.split("Navigator/");
		if (params.length > 1) {
			params = params[1].split(" ");
			ver_str = params[0];
		} else {
			params = navigator.userAgent.split("Netscape/");
			if (params.length > 1) {
				params = params[1].split(" ");
				ver_str = params[0];
			} else {
				params = navigator.userAgent.split("Firefox/");
				if (params.length > 1) {
					params = params[1].split(" ");
					ver_str = params[0];
				} else {
					params = navigator.userAgent.split("Mozilla/");
					if (params.length > 1) {
						params = params[1].split(" ");
						ver_str = params[0];
					}
				}
			}
		}
	}
	
	if (_is_opera)
		ver_str = parseFloat( navigator.appVersion.toString() );
	
	if (ver_str != "") {
		_version = ver_str;
		return _version;
	} else	
		throw Error("Unsupported Browser");
}

function initVars() {
	if ((!window.navigator.userAgent) && (!window.navigator.appName))
		throw new Error("Unknown Browser !");
	
	var agent = window.navigator.userAgent.toUpperCase();
	var name = window.navigator.appName.toUpperCase();
	
	_is_gecko = false;
	_is_mozilla = false;
	_is_netscape = false;
	_is_opera = false;
	_is_safari = false;
	_is_ie = false;
	_is_chrome = false;
	
	if (agent.indexOf("CHROME/") != -1) {
		_is_chrome = true;
		return;
	}
	if (agent.indexOf("OPERA/") != -1) {
		_is_opera = true;
		return;
	}
	if (agent.indexOf("SAFARI") != -1) {
		_is_safari = true;
		return;
	}	
	if ((agent.indexOf("NETSCAPE/") != -1) ||
		(agent.indexOf("NAVIGATOR/") != -1) ) {
		_is_gecko = true;
		_is_netscape = true;
		return;
	}
	if (agent.indexOf("FIREFOX/") != -1) {
		_is_gecko = true;
		_is_firefox = true;
		return;
	}	
	if (name.indexOf("MICROSOFT") != -1) {
		_is_ie = true;
		return;
	}
	if (agent.indexOf("MOZILLA/") != -1) {
		_is_mozilla = true;
		_is_gecko = true;
		return;
	}
}

getVersion();
