    /* sys funcs */

    function $(n) {
        return document.getElementById(n);
    }

    function $hide(id) {
        $(id).style.display = "none";
    }

    function $show(id) {
        $(id).style.display = "";
    }


    function getScroll() {
        var doc=document.documentElement;
        var r = {
            left: self.pageXOffset||(doc&&doc.scrollLeft)||document.body.scrollLeft,
            top: self.pageYOffset||(doc&&doc.scrollTop)||document.body.scrollTop
        }
        return r;
    }

    function getElPos(el, skip_scroll) {
        if(el.getBoundingClientRect) {
            var rect = el.getBoundingClientRect();
            var ofs = {
                left: document.documentElement.clientLeft || document.body.clientLeft || 0,
                top: document.documentElement.clientTop || document.body.clientTop || 0
            }
            var res = { 
                top: Math.round(rect.top) - ofs.top, 
                left: Math.round(rect.left) - ofs.left
            }
            if(!skip_scroll) {
                var scroll = getScroll();
                res.top += scroll.top;
                res.left += scroll.left;
            }
        } else {
            var res = { 
                top: 0, 
                left: 0 
            }
            while(el) {
                res.top += parseInt(el.offsetTop);
                res.left += parseInt(el.offsetLeft);
                el = el.offsetParent;
            }
        }
        return res;
    }


    function isChildElement(el, parent) {
        if(!el || !parent) {
            return false;
        }
        while(el != document.body) {
            if(el == parent) {
                return true;
            } else if(el.parentNode) {
                el = el.parentNode;
            } else {
                return false;
            }
        }
    }


// String adds

String.prototype.jsEscape = function() {
    return this.replace(/\%/g, "%jcp").replace(/\n/g, "%jcn").replace(/\r/g, "%jcr").replace(/"/g, "%jcqq").replace(/'/g, "%jcq").replace(/\\/g, "%jcbs");
}

String.prototype.jsUnescape = function() {
    return this.replace(/\%jcr/g, "\r").replace(/\%jcn/g, "\n").replace(/\%jcqq/g, "\"").replace(/\%jcq/g, "'").replace(/\%jcbs/g, "\\").replace(/\%jcp/g, "%");
}


String.prototype.fromSanitizedHtml = function() {
    return this.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&#37;/g, '%').replace(/&#40;/g, '(').replace(/&#41;/g, ')').replace(/&#43;/g, '+').replace(/&#45;/g, '-');
}

String.prototype.nl2br = function() {
    return this.replace(/\n/g, "<br/>");
}

String.prototype.addSlashes = function() {
    return this.replace(/\'/g,'\\\'').replace(/\"/g,'\\"').replace(/\\/g,'\\\\').replace(/\0/g,'\\0').replace(/\n/g,'\\n');
}


function selectInnerHTML(objeto, innerHTML) {
	/******
	* select_innerHTML - innerHTML to add option(s) to select(s)
	* Problem: http://support.microsoft.com/default.aspx?scid=kb;en-us;276228
	* Parametros:
	* objeto(tipo object): the select
	* innerHTML(tipo string): the new innerHTML
	*******/
	    objeto.innerHTML = ""
	    //creating phantom element to receive temp innerHTML
	    var selTemp = document.createElement("micoxselect")
	    var opt;
	    selTemp.id="micoxselect1"
	    document.body.appendChild(selTemp)
	    selTemp = document.getElementById("micoxselect1")
	    selTemp.style.display="none"
	    if(innerHTML.toLowerCase().indexOf("<option")<0){//if not option, convert do option
	        innerHTML = "<option>" + innerHTML + "</option>"
	    }
	    innerHTML = innerHTML.replace(/<option/g,"<span").replace(/<\/option/g,"</span")
	    selTemp.innerHTML = innerHTML
	    //transfering childs of phantom element to options
	    for(var i=0;i<selTemp.childNodes.length;i++){
	        if(selTemp.childNodes[i].tagName){
	            opt = document.createElement("OPTION")
	            for(var j=0;j<selTemp.childNodes[i].attributes.length;j++){				
	                opt.setAttributeNode(selTemp.childNodes[i].attributes[j].cloneNode(true))
	            }
	            opt.value = selTemp.childNodes[i].getAttribute("value")
	            opt.text = selTemp.childNodes[i].innerHTML
	            if(document.all){ //IEca
	                objeto.add(opt)
	            }else{
	                objeto.appendChild(opt)
	            }                    
	        }    
	    }
	    //clear phantom
	    document.body.removeChild(selTemp)
	    selTemp = null
	}


// Request method

RTYPE_JSON = 1;
RTYPE_TEXT = 2;


// data = {url: "", params = null || {}, callback = func, type = RTYPE_JSON | RTYPE_TEXT}
function AJAX_Request(data) {

    if(!data["type"]) {
        data["type"] = RTYPE_JSON;
    }

    function getTransport() {
        var transport = null;   
        if(window.XMLHttpRequest) {
            try { transport = new XMLHttpRequest() } catch(e) {}
        } else if(window.ActiveXObject) {
            try { transport = new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
            if(!transport) {
                try { transport = new ActiveXObject("Msxml2.XMLHTTP") } catch (e) {}
            }
        }
        if(!transport) {
            alert("Can't init transport object.");
        }
        return transport;
    }



    function toValueParseEscapes(d) {
        switch(typeof(d)) {
            case "string":
                return d.jsUnescape();
                break;

            case "object":
                for(var i in d) {
                    if( d.hasOwnProperty(i) ) {
                        d[i] = toValueParseEscapes(d[i]);
                    }
                }
                return d;
                break;
        }
        return d;
    }


    function toValue(str) {
        if(str) {
            eval("var r = " + str);
            r = toValueParseEscapes(r);
            return r;
        } else {
            return {}
        }
    }


    var t = getTransport();
    var nc = "&_nc=" + (""+Math.random()).slice(2, 6);
    if(data["params"]) {
        var uri = [];
        for(var i in data.params) {
            uri.push(i + "=" + escape(data.params[i]));
        }
        uri = "?" + uri.join("&");
    } else {
        var uri = "?";
    }


    t.onreadystatechange = function() {
        if(t.readyState == 4 && t.status < 400) {
            data.callback(data.type == window.RTYPE_JSON ? toValue(t.responseText) : t.responseText);
            t = null;
        }
    }

    t.open("GET", data.url + uri + nc, true);
    t.send(null);

}




// Helpers

function varp(v) {
    alert(Dump(v));
}

function info(v) {
    var s ='';
    for(var i in v) {
        s+=i + '; ';
    } 
    alert(s);
}


function Dump(d,l) {
    if (l == null) l = 1;
    var s = '';
    var sPrefix = '';

    for(var i=1; i<l; i++) {
        sPrefix += "    ";
    }

    if(d == null) {
        s = "NULL";
    } else if(d == undefined) {
        s = "UNDEFINED";
    } else if (typeof(d) == "object") {
        s += "{\n";
        for(var k in d) {
             s += sPrefix;
             s += k+": " + Dump(d[k],l+1);
        }
        s += "\n" + sPrefix + "}\n"
    } else {
        s += "" + d + "\n";
    }
    return s;
}

function isEmpty(x){
   if (typeof(x)=="undefined" || (x=="") || (x==""&&!isNaN(x)) || (/^\s*$/.test(x))){
      return true;
   }else{
      return false;
   }
}
