function addEvent(element, event, action) {
	if(element.addEventListener) element.addEventListener(event, action, false);
	else if(element.attachEvent) element.attachEvent("on" + event, action);
}

function removeEvent(element, event, action) {
	if(element.removeEventListener) element.removeEventListener(event, action, true);
	else if(element.detachEvent) element.detachEvent("on" + event, action);
}

function stopEvent(event) {
	if(event.stopPropagation) event.stopPropagation();
	else if(event.cancelBubble) event.cancelBubble();
}

function target(event) {
	if(event.target) return event.target;
	else if(event.srcElement) return event.srcElement;
}

function trim(string, what) {
	var trimmed = string;
	if(!what) what = " ";

	var regExLeft = eval("/^(" + what + ")+/");
	var regExRight = eval("/(" + what + ")+$/");

	trimmed = trimmed.replace(regExLeft, "");
	trimmed = trimmed.replace(regExRight, "");

	return trimmed;
}

function getScrollXY() {
	var scrOfX = 0, scrOfY = 0;
	
	if(typeof(window.pageYOffset) == "number" ) {
		//Netscape compliant
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		//DOM compliant
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	
	return {x: scrOfX, y: scrOfY};
}

function setCookie(name, value, expire, path) {
	var cookie = name + "=" + value;
	
	if(expire) {
		var date = new Date();
		date.setTime(date.getTime() + (expire * 24 * 60 * 60 * 1000));
		
		cookie = cookie + "; expires=" + date.toGMTString();
	}
	if(path) cookie = cookie + "; path=" + path;
	
	document.cookie = cookie;
}

function getCookie(name) {
	var cookies = document.cookie.split(";");
	for(cookie in cookies) {
		var splittedCookie = trim(cookies[cookie]).split("=");
		var cookieName = splittedCookie[0];
		var cookieValue = splittedCookie[1];
		
		if(cookieName == name) return cookieValue;
	}

	return false;
}

function urlencode(str) {
    str = (str+'').toString();
    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+').replace(/~/g, '%7E');
}

function AjaxRequest(method, url, params, callback, failure) {
	var _req;
    var _params = new Array();
    var _send = "";
    var _method = "";
    var _url = "";
    
    if(params) {
        for(var k in params) {
            if(typeof params[k] == "string" || typeof params[k] == "number") _params.push(k + "=" + urlencode(params[k]));
            else if(params[k] instanceof Array) {
            	var array = params[k];
            	for(var i = 0; i < array.length; i++) {
            		if(typeof array[i] == "string" || typeof array[i] == "number") _params.push(k + "=" + urlencode(array[i]));
            		else throw(new Error("Parametri non validi. Usa la forma {param1: value1, param2: value2}"));
            	}
            } else throw(new Error("Parametri non validi. Usa la forma {param1: value1, param2: value2}"));
        }
    }

    if(_params.length) _params = _params.join("&");
    else _params = "";

    if(typeof url != "string") throw(new Error("Url non valido"));
    else _url = url;
    
    if(method.toLowerCase() == "get") {
        _method = "get";
        
        if(_params) _url += "?" + _params;
    } else if(method.toLowerCase() == "post") {
        _method = "post";
        _send = _params;
    } else throw(new Error("Metodo non valido"));
    
	function _processReqChange() {
	    if (_req.readyState == 4) {
	        if (_req.status == 200) {
	            if(callback) {
	               if(typeof callback == "function") callback(_req.responseText);
	               else throw(new Error("Funzione callback non valida"));
	            }
	        } else {
                if(failure) {
    	            if(typeof failure == "function") failure();
    	            else throw(new Error("Funzione failure non valida"));
    	        }
	        }
	    }
	}

	if(window.XMLHttpRequest && !(window.ActiveXObject)) {
        try {
            _req = new XMLHttpRequest();
        } catch(e) {
            _req = false;
        }
    } else if(window.ActiveXObject) {
        try {
            _req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                _req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                _req = false;
            }
        }
    }

    this.send = function() {
        if(_req) {
        	_req.onreadystatechange = _processReqChange;
            _req.open(_method, _url, true);
            
            if(_method == "post") {
                _req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                _req.setRequestHeader("Content-length", _send.length);
                _req.setRequestHeader("Connection", "close");
            }
            
            _req.send(_send);
        }
    };
}
