/*************************************************************************
 Generic Helper Functions
 *************************************************************************/
function getX(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 getY(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent) {
            curtop += obj.offsetTop;
            curtop -= obj.parentNode.scrollTop;
            obj = obj.offsetParent;
        }
    }
    else if (obj.y) {
        curtop += obj.y;
    }
    return curtop;
}

function $(id) {
    return document.getElementById(id);
}

function getElementsByClass(searchClass,node,tag) {
    
    var classElements = new Array();
    if ( node == null ) 
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
}

function hasParent(el, parent) {
    if ((el == null) || (parent == null)) 
        return false;
    else if (el == parent)
        return true;
    else
        return hasParent(el.parentNode, parent);
}

function whichElement(e) {
    if (!e) var e = window.event;
    var el;
    if (e.target) el = e.target;
    else if (e.srcElement) el = e.srcElement;
    return el;
}

function addEvent(elm, evType, fn, useCapture) {
    
    if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
    } else if (elm.attachEvent) {
        var r = elm.attachEvent("on"+evType, fn);
        return r;
    } else {
        alert("Handler could not be set");
    }
} 

function removeEvent(obj, evType, fn, useCapture){
    if (obj.removeEventListener){
        obj.removeEventListener(evType, fn, useCapture);
        return true;
    } else if (obj.detachEvent){
        var r = obj.detachEvent("on"+evType, fn);
        return r;
    } else {
        alert("Handler could not be removed");
    }
}

function addToArray(array, collection) {
    for (i=0; i< collection.length; i++) {
        array.push(collection[i]);
    }
}

function addClass(el, addClass) {
    if (!hasClass(el,addClass)) {
        if (el.className == '') {
            el.className = addClass;
        } else {
            el.className += (' ' + addClass);
        }
    }
}

function removeClass(el, removeClass) {
    var pattern = new RegExp("(^|\\s)" + removeClass + "(\\s|$)");
    el.className = el.className.replace(pattern,' ').replace(/^\s+|\s+$/g,'');
}

function hasClass(el, fclass) {
    var pattern = new RegExp("(^|\\s)"+fclass+"(\\s|$)");
    return pattern.test(el.className);
}

function confirmDelete(message,url) {
    message = 'Are you sure you want to delete\n\n"' + message + '"\n\n This action cannot be undone.';
    if (confirm(message)) {
        location.href = url;
    }
}

/*************************************************************************
 Extension Functions
 *************************************************************************/

String.prototype.escapeHTML = function () {
    return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}

String.prototype.unescapeHTML = function () {

    return this.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
}

Array.prototype.indexOf = function( v) {
    for (var i=0, l=this.length; i < l; i++ ) {
        if (this[i]==v) { 
            return i; 
        }
    }
    return -1;
}