////////////////////////////////////////////////////////////////////////////////
// written by Dean Edwards, 2005
// with input from Tino Zijdel - crisp@xs4all.nl
// http://dean.edwards.name/weblog/2005/10/add-event/
function addEvent(element, type, handler) {
    if (element.addEventListener)
        element.addEventListener(type, handler, false);
    else {
        if (!handler.$$guid) handler.$$guid = addEvent.guid++;
        if (!element.events) element.events = {};
        var handlers = element.events[type];
        if (!handlers) {
            handlers = element.events[type] = {};
            if (element['on' + type]) handlers[0] = element['on' + type];
            element['on' + type] = handleEvent;
        }

        handlers[handler.$$guid] = handler;
    }
}
addEvent.guid = 1;

function removeEvent(element, type, handler) {
    if (element.removeEventListener)
        element.removeEventListener(type, handler, false);
    else if (element.events && element.events[type] && handler.$$guid)
        delete element.events[type][handler.$$guid];
}

function handleEvent(event) {
    event = event || fixEvent(window.event);
    var returnValue = true;
    var handlers = this.events[event.type];

    for (var i in handlers) {
        if (!Object.prototype[i]) {
            this.$$handler = handlers[i];
            if (this.$$handler(event) === false) returnValue = false;
        }
    }

    if (this.$$handler) this.$$handler = null;

    return returnValue;
}

function fixEvent(event) {
    event.preventDefault = fixEvent.preventDefault;
    event.stopPropagation = fixEvent.stopPropagation;
    return event;
}

fixEvent.preventDefault = function () { this.returnValue = false; }
fixEvent.stopPropagation = function () { this.cancelBubble = true; }

//// This little snippet fixes the problem that the onload attribute on the body-element will overwrite
//// previous attached events on the window object for the onload event
//if (!window.addEventListener) {
//	document.onreadystatechange = function() {
//		if (window.onload && window.onload != handleEvent) {
//			addEvent(window, 'load', window.onload);
//			window.onload = handleEvent;
//		}
//	}
//}

//------------------------------------------------------------------

var mouseX = 0;
var mouseY = 0;

function trackMouse(e) {
    if (!e) { e = window.event || window.Event };
    if (!e) { return; }

    if (typeof (e.pageX) == 'number') {
        mouseX = e.pageX;
        mouseY = e.pageY;
    } else if (typeof (e.clientX) == 'number') {
        mouseX = e.clientX;
        mouseY = e.clientY;
        if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
            mouseX += document.body.scrollLeft;
            mouseY += document.body.scrollTop;
        } else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
            mouseX += document.documentElement.scrollLeft;
            mouseY += document.documentElement.scrollTop;
        }
    }
}

addEvent(document, 'mousemove', trackMouse);

// insertAdjacentHTML(), insertAdjacentText() and insertAdjacentElement()
// for Netscape 6/Mozilla by Thor Larholm me@jscript.dk
if (typeof HTMLElement != "undefined" && !HTMLElement.prototype.insertAdjacentElement) {

    HTMLElement.prototype.insertAdjacentElement= function (where, parsedNode) {

        switch (where.toString().toLowerCase()) {
            case 'beforebegin':
                this.parentNode.insertBefore(parsedNode, this)
                break;
            case 'afterbegin':
                this.insertBefore(parsedNode, this.firstChild);
                break;
            case 'beforeend':
                this.appendChild(parsedNode);
                break;
            case 'afterend':
                if (this.nextSibling)
                    this.parentNode.insertBefore(parsedNode, this.nextSibling);
                else
                    this.parentNode.appendChild(parsedNode);
                break;
        }
    }

    HTMLElement.prototype.insertAdjacentHTML = function (where, htmlStr) {
        var r = this.ownerDocument.createRange();
        r.setStartBefore(this);
        var parsedHTML = r.createContextualFragment(htmlStr);
        this.insertAdjacentElement(where, parsedHTML)
    }


    HTMLElement.prototype.insertAdjacentText = function (where, txtStr) {
        var parsedText = document.createTextNode(txtStr)
        this.insertAdjacentElement(where, parsedText)
    }
}

function listen(type, el, func) { addEvent(el, type, func); }

function GetRelativePosition(objSourceElement) {
    var arrOffsets = { x: 0, y: 0 };
    var oParent = objSourceElement.offsetParent;

    while ((objSourceElement != null) && (objSourceElement != oParent)) {
        arrOffsets.x += objSourceElement.offsetLeft;
        arrOffsets.y += objSourceElement.offsetTop;
        objSourceElement = objSourceElement.offsetParent;
    }

    return arrOffsets;
}

function SetLocation(objTargetWindow, strURL) {
    objTargetWindow.location.href = strURL;
}

function GetElementPosition(objElement) {
    var arrCoordinates = { x: 0, y: 0 };
    var oParent = objElement.offsetParent;

    while ((objElement) && (objElement != oParent)) {
        arrCoordinates.x += objElement.offsetLeft;
        arrCoordinates.y += objElement.offsetTop;
        objElement = objElement.offsetParent;
    }

    return arrCoordinates;
}

function GetElementRelativePosition(objSourceElement, objTargetElement) {
    var arrCoordinates = { x: 0, y: 0 };

    while (objSourceElement) {
        if (objSourceElement != objTargetElement) {
            arrCoordinates.x += objSourceElement.offsetLeft;
            arrCoordinates.y += objSourceElement.offsetTop;
        }
        objSourceElement = objSourceElement.offsetParent;
    }

    return arrCoordinates;
}

function GetElementParentTag(objElement, strTagName) {
    var objParentTag = objElement;

    while (objParentTag) {
        if (objParentTag.tagName == strTagName.toUpperCase()) {
            return objParentTag;
        }
        objParentTag = objParentTag.parentNode;
    }
    return null;
}

function GetMousePosition(intOffsetX, intOffsetY) {
    var arrCoordinates = { x: 0, y: 0 };
    arrCoordinates.x = mouseX;
    arrCoordinates.y = mouseY;
    return arrCoordinates;
}

function ToggleClass(obj, strClass) {
    if (obj != null) {
        obj.className = strClass;
    }
}

function ToggleTreeBranch(strImageID, strObjectID) {
    var objImageControl = document.getElementById(strImageID);
    var objControl = document.getElementById(strObjectID);

    if (objControl != null) {
        if (objControl.style.display == "none") {
            objControl.style.display = "";
            objImageControl.src = "../Images/treeview_minus.gif";
        } else {
            objControl.style.display = "none";
            objImageControl.src = "../Images/treeview_plus.gif";
        }
    }
}


function HighlightRow(objRow, strBGColour) {
    if (objRow != null) {
        for (var i = 0; i < objRow.cells.length; i++) {
            objRow.cells[i].style.backgroundColor = strBGColour;
        }
    }
}

function CentreElement(element) {
    var clientWidth = document.body.clientWidth;
    var clientHeight = document.body.clientHeight;

    var newTop = (clientHeight - parseInt(element.style.height)) / 2;
    var newLeft = (clientWidth - parseInt(element.style.width)) / 2;

    if (newTop < 0) {
        newTop = 1;
    }

    if (newLeft < 0) {
        newLeft = 1;
    }

    element.style.top = newTop;
    element.style.left = newLeft;
    element.style.position = "absolute";
}

//moved from FrameFix.js
function GetWindow(params) {
    var page = null;

    if (params != null) {
        for (idx = 0; idx < params.length; idx++) {
            if (page == null)
                page = document.getElementById(params[idx]);
            else
                page = page.document.getElementById(params[idx]);
            page = (page.contentWindow || page.contentDocument);
        }
    }

    return page;
}
