opera_nav = (navigator.userAgent.indexOf('Opera') != -1) ? true : false;
ie_nav = (navigator.userAgent.indexOf('MSIE') != -1 && !opera_nav) ? true : false;
mozilla_nav = (navigator.userAgent.indexOf('Gecko') != -1) ? true : false;


system = {
    getWindowRect: function() {
        if(opera_nav || mozilla_nav) {
        /*
            var res = { width: window.innerWidth,
                        height: window.innerHeight,
                        left: window.pageXOffset,
                        top: window.pageYOffset }
                        */
            var res = { width: document.body.offsetWidth,
                        height: document.body.offsetHeight,
                        left: window.pageXOffset,
                        top: window.pageYOffset }

        } else {
            var res = { width:  document.body.clientWidth,
                        height: document.body.offsetHeight,
                        left: document.body.scrollLeft,
                        top: document.body.scrollTop }
        }
        return res;
    },

    setElementRect: function(el, rect) {
        for(var i in rect) {
            el.style[i] = rect[i] + "px";
        }
    },




    startFadeIn: function(el,t) {
        //el.opacityLevel = 70;
        el.opacityLevel = 70;
        if(ie_nav) {
                el.style.filter = "alpha(opacity="+(el.opacityLevel)+")"
            } else {
                el.style.opacity = el.opacityLevel / 100;
            }
        return;
        var f = function() {

            if(ie_nav) {
                el.style.filter = "alpha(opacity="+(el.opacityLevel)+")"
            } else {
                el.style.opacity = el.opacityLevel / 100;
            }

            if(el.opacityLevel < 70) {
                el.opacityLevel += 10;
                setTimeout(f, 25);
            }
        }
        setTimeout(f, 25);
    },

    startFadeOut: function(el,t) {
        //el.opacityLevel = 70;
        el.opacityLevel = 0;
                if(ie_nav) {
                el.style.filter = "alpha(opacity="+(el.opacityLevel)+")"
            } else {
                el.style.opacity = el.opacityLevel / 100;
            }
        hideEl(el);
        return;


        var f = function() {

            if(ie_nav) {
                el.style.filter = "alpha(opacity="+(el.opacityLevel)+")"
            } else {
                el.style.opacity = el.opacityLevel / 100;
            }

            if(el.opacityLevel > 10) {
                el.opacityLevel -= 10;
                setTimeout(f, 25);
            } else {
                hideEl(el);
            }
        }
        setTimeout(f, 25);
    }

}



function getWindowRect() {
    if(opera_nav || mozilla_nav) {
        var res = { width: window.innerWidth,
                    height: window.innerHeight,
                    left: window.pageXOffset,
                    top: window.pageYOffset }
    } else {
        var res = { width:  document.body.clientWidth,
                    height: document.body.offsetHeight,
                    left: document.body.scrollLeft,
                    top: document.body.scrollTop }
    }
    return res;
}


function getWindowScroll() {
    if(opera_nav || mozilla_nav) {
        var res = { left: window.pageXOffset,
                    top: window.pageYOffset }
    } else {
        var res = { left: document.body.scrollWidth,
                    top: document.body.scrollTop }
    }
    return res;
}



function setElRect(el, rect) {
    el.style.top = rect.top + "px";
    el.style.left = rect.left + "px";
    if(rect.width) {
        el.style.width = rect.width + "px";
    }
    if(rect.height) {
        el.style.height = rect.height + "px";
    }
}


function preloadImg(imgEl, src) {
    var img = document.createElement("img");
    img.src = src;
    img.onload = function() {
        imgEl.src = img.src;
        imgEl.onload = null;
    };
    imgEl.style.display = 'inline';
}


function getIcoSrc(url) {
//    return ie_nav ? "icoproxy.php?url=" + escape(url) : url;
    return url;
}

function clone(obj) {
    if((typeof(obj) != 'object') || (obj == null)) {
        return obj;
    }

    if(obj.length == undefined) {
        var newObj = {}
        for(var i in obj) {
            newObj[i] = clone(obj[i]);
        }
    } else {
        var newObj = []
        for(var i=0; i<obj.length; i++) {
            newObj[i] = clone(obj[i]);
        }
    }
    return newObj;
}



function elById(id) {
    return document.getElementById(id);
}

function showEl(el) {
    el.style.display = 'block';
}

function hideEl(el) {
    if(el) {
        el.style.display = 'none';
    }
}

function clearEl(el) {
    el.innerHTML = '';
}

function info(txt) {
    document.getElementById("info").innerHTML = txt;
}



function px2int(px) {
    return parseInt(px.substring(0,px.length-2));
}

function getMousePos(e) {
    var px;
    var py;
    if (mozilla_nav) {
        px = e.pageX;
        py = e.pageY;
    } else {
        px = event.clientX + document.body.scrollLeft;
        py = event.clientY + document.body.scrollTop;
    }
    return {left:px, top:py};
}


function isPosInObj(pos, obj) {

    var left = getLeft(obj);
    var top = getTop(obj);

    if((pos.left > left) &&
       (pos.left < obj.offsetWidth + left) &&
       (pos.top > top) &&
       (pos.top < obj.offsetHeight + top)) {
        return true;
        }

    return false;
}


function getLeft(obj) {
    var curleft = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curleft += obj.offsetLeft;
            obj = obj.offsetParent;
        }
    } else if (obj.x) curleft += obj.x;
    return curleft;
}

function getTop(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curtop += obj.offsetTop;
            obj = obj.offsetParent;
        }
    } else if (obj.y) curtop += obj.y;
    return curtop;
}


function getElPos(el) {
    var left = 0;
    var top = 0;
    if (el.offsetParent) {
        while (el.offsetParent) {
            left += el.offsetLeft;
            top += el.offsetTop;
            el = el.offsetParent;
        }
    } else
        if (el.y) {
            left += el.x;
            top += el.y;
        }
    return {left:left, top:top};
}


function setElPos(el, pos) {
    el.style.left = pos.left;
    el.style.top = pos.top;
}


function setElPosition(el, pos) {
    el.style.top = pos.top + "px";
    el.style.left = pos.left + "px";
    el.style.width = pos.width + "px";
    el.style.height = pos.height + "px";
}


function deleteEl(el) {
    if(el.parentNode) {
        el.parentNode.removeChild(el);
        el = null;
    }
}

function varp(v) {
    alert(Dump(v,0));
}


function varpw(v) {
    win = open("", "varp", "width=700,toolbar=no,status=no,titlebar=no");
    win.document.write("<html><body><pre style='font-family: Tahoma, Verdana, Arial; font-size: 11px;'>"+Dump(v)+"</pre></body></html>");
}


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 = '';
    if (typeof(d) == "object") {
        s += " {\n";
        for (var k in d) {
            for (var i=0; i<l; i++) s += "  ";
            s += k+": " + Dump(d[k],l+1);
        }
        for (var i=0; i<l-1; i++) s += "  ";
        s += "}\n"
    } else {
        s += "" + d + "\n";
    }
    return s;
}


function toCode(d,l) {
    if (l == null) l = 1;
    var s = '';
    if (typeof(d) == "object") {
        var items = [];
        var i = 0;
        if(d) {
            var isList = d.length != undefined;
        } else {
            var isList = false;
        }
        for (var k in d) {
            switch(typeof(d[k])) {
            case "integer":
                var v = parseInt(d[k]);
                break;
            case "string":
                var v = "'" + d[k] + "'";
                break;
            default:
                var v = toCode(d[k],l+1);
                break;
            }
            items[i] = isList ? v : (k + ":" + v);
            i++;
        }
        if(isList) {
            s += "[" + items.join(",") + "]";
        } else {
            s += "{" + items.join(",") + "}";
        }

    } else {
        s += "" + d;
    }
    return s;
}


function toValue(str) {
    if(str) {
        eval("var r = "+str);
        return r;
    } else {
        return {}
    }
}


function trim(s) {
    return s.replace(/^\s*(.+?)\s*$/, "$1");
}


function isInArray(needle, data) {
    for(var i in data) {
        if(data[i] == needle) {
            return true;
        }
    }
    return false;
}

function arrayFirstFree(data) {
    var id = arraySearch(undefined, data);
    if(id != undefined) {
        return id;
    } else {
        return data.length;
    }
}


function text2html(txt) {
    txt = txt.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\n/g, "<br>");
    return txt;
}


function html2text(html) {
    html = html.replace(/&amp;/g,"&").replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/<br>/g,"\n");
    return html;
}

function getDir(url) {
    return url.substring(0, url.lastIndexOf("/"));
}

function getDomain(url) {
    return url.split("//")[1].split("/")[0];
}

function wordWrap(txt) {
    var w = txt.split(" ");
    var r = [];
    for(var i=0; i<w.length; i++) {
        if(w[i].length>40) {
            var stops = Math.ceil(w[i].length / 40) + 1;
            for(j=0; j<stops; j++) {
                r[i] += w[i].substr(stops, 40) + " ";
            }
        } else {
            r[i] = w[i];
        }
    }
    return r.join(" ");
}


String.prototype.wordWrap = function(w, b, c){
    var i, j, s, r = this.split("\n");
    if(w > 0) for(i in r){
        for(s = r[i], r[i] = ""; s.length > w;
                j = c ? w : (j = s.substr(0, w).match(/\S*$/)).input.length - j[0].length
                || j.input.length + (j = s.substr(w).match(/^\S*/)).input.length + j[0].length,
                r[i] += s.substr(0, j) + ((s = s.substr(j)).length ? b : "")
            );
        r[i] += s;
    }
    return r.join("\n");
};

function bool2int(fl) {
    return fl ? 1 : 0;
}

function parseUrl(data) {
         var e=/((http|ftp):\/)?\/?([^:\/\s]+)((\/[\s\S]+)*)/;

         if (data.match(e)) {
             return  {url: RegExp['$&'],
                     protocol: RegExp.$2,
                     host:RegExp.$3,
                     path:RegExp.$4,file:
                     RegExp.$5,hash:RegExp.$6};
         }
         else {
             return  {url:"", protocol:"",host:"",path:"",file:"",hash:""};
         }
}

