/* Simple javascript library */
/* CardBoardFish 2007        */

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (elt /*, from*/) {
        var len = this.length;

        var from = Number(arguments[1]) || 0;
        from = (from < 0) ? Math.ceil(from) : Math.floor(from);
        if (from < 0) {
            from += len;
        }
    
        for (; from < len; from++) {
            if (from in this && this[from] === elt) {
                return from;
            }
        }
        return -1;
    };
}

if (!String.prototype.split) {
    String.prototype.split = function (on) {
        var len = this.length;
        var i;

        var to_return = [];

        var top = 0;
        var part;
        for (i = 0; i < len; i++) {
            part = this.substring(i, i + on.length);
            if (part === on) {
                to_return.push(this.substring(top, i));
                top = i;
            }
        }
        return to_return;
    };
}

function easyXHR() {
    var req;
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
            req = new window.ActiveXObject("Msxml2.XMLHTTP.6.0");
        } catch (e) {
            try {
                req = new window.ActiveXObject("Msxml2.XMLHTTP.3.0");
            } catch (e2) {
                try {
                    req = new window.ActiveXObject("Msxml2.XMLHTTP");
                } catch (e3) {
                    try {
                        req = new window.ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e4) {
                        alert("No ActiveX XHR useable. Aborting.");
                        return;
                    }
                }
            }
        }
    } else {
        alert("Failed to create XHR object. Aborting AJAX code.");
    }
    return req;
}

function getRadioValue(radio) {
    var i;
    for (i = 0; i < radio.length; i++) {
        if (radio[i].checked) {
            return radio[i].value;
        }
    }
}

function setRadioValue(radio, value) {
    var i;
    for (i = 0; i < radio.length; i++) {
        if (radio[i].value === "" + value) {
            radio[i].checked = true;
            break;
        } 
    }
}

function cleanOut(node) {
    if (node) {
        while (node.firstChild) {
            node.removeChild(node.firstChild);
        }
    }
}

function debug(errstr) {
    var dbg = document.getElementById('debug');
    if (dbg) {
        if (errstr !== null) {
            dbg.innerHTML += errstr + "<br />";
        } else {
            return (dbg.innerHTML ? dbg.innerHTML : '');
        }
    }
}

function mouseCoords(ev) {
    if (ev.pageX && ev.pageY) {
        return {x: ev.pageX, y: ev.pageY};
    }
    return {
        x: ev.clientX + document.body.scrollLeft - document.body.clientLeft,
        y: ev.clientY + document.body.scrollTop  - document.body.clientTop
    };
}

function elementCSSid(e) {
    if (!e.tagName) {
        return;
    }
    var html = e.tagName.toLowerCase();
    var eclass = e.className;
    var eid = e.id;

    return html + (eid ? "#" + eid : "") + (eclass ? "." + eclass : "");
}

function getPosition(e) {
    var left = 0;
    var top  = 0;
    var ref = e;

    while (ref.offsetParent) {
        left += ref.offsetLeft;
        top  += ref.offsetTop;
        ref     = ref.offsetParent;
    }

    return {x: left, y: top};
}

function selfDestruct(o) {
    if (o && o.parentNode) {
        o.parentNode.removeChild(o);
    }
}

function getMouseOffset(target, ev) {
    var docPos    = getPosition(target);
    var mousePos  = mouseCoords(ev);
    var content = document.getElementById("content");
    if (content.scrollTop) {
        return {x: mousePos.x - docPos.x + content.scrollLeft, y: mousePos.y - docPos.y + content.scrollTop};
    } else {
        return {x: mousePos.x - docPos.x, y: mousePos.y - docPos.y};
    }
}

function waitMessage() {
    var wm = document.getElementById("waitMessage");

    if (wm) {
        wm.className = "";
    }
}

function noWaitMessage() {
    var wm = document.getElementById("waitMessage");

    if (wm) {
        wm.className = "hide";
    }
}

window.alphabet = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G',
                    'H', 'I', 'J', 'K', 'L', 'M', 'N',
                    'O', 'P', 'Q', 'R', 'S', 'T', 'U',
                    'V', 'W', 'X', 'Y', 'Z'];

function switchToHide(element) {
    if (!element) {
        return;
    }
    var oldclass = element.className;
    if (oldclass) {
        element.setAttribute("oldclass", oldclass);
        element.className = "hide";
    } else {
        element.className = "hide";
    }
}

function switchToShow(element) {
    if (!element) {
        return;
    }
    var oldclass = element.getAttribute("oldclass");
    if (oldclass) {
        element.className = oldclass;
    } else {
        if (element.className === "hide") {
            element.className = "";
        } else {
            element.className = "show";
        }
    }
}

function fetch(url) {
    var req = easyXHR();
    if (!req) {
        return;
    }

    req.open("GET", url, false);
    req.send(null);
    return req.responseText;
}

function loadIntoElement(elem, url) {
    if (!elem) {
        return;
    }

    elem.innerHTML = fetch(url);
}

function loadIntoID(id, url) {
    var elem = document.getElementById(id);
    if (!elem) {
        return;
    }
    loadIntoElement(elem, url);
}

// Author: Mihai Bazon, 2006
// http://www.bazon.net/mishoo/
// This code is (c) Dynarch.com, 2006.
//
// Permission is hereby granted to use this code 
// under the terms of the GNU LGPL. (www.gnu.org/licenses/lgpl.html)

var is_gecko = /gecko/i.test(navigator.userAgent);
var is_ie    = /MSIE/.test(navigator.userAgent);

function setSelectionRange(input, start, end) {
	if (is_gecko) {
		input.setSelectionRange(start, end);
	} else {
		// assumed IE
		var range = input.createTextRange();
		range.collapse(true);
		range.moveStart("character", start);
		range.moveEnd("character", end - start);
		range.select();
	}
};

function getSelectionStart(textar) {
	if (is_gecko) {
		return textar.selectionStart;
    }
    textar.focus();
	var range = document.selection.createRange().duplicate();
    var storedrange = document.body.createTextRange();
    storedrange.moveToElementText(textar);
    storedrange.setEndPoint("EndToEnd", range);
    var ss = storedrange.text.length - range.text.length;
    return ss;
};

function getSelectionEnd(textar) {
	if (is_gecko) {
		return textar.selectionStart;
    }
    textar.focus();
	var range = document.selection.createRange().duplicate();
    var ss = getSelectionStart(textar) + range.text.length;
    return ss;
};

function setCursorPosition(textar, pos) {
    if (is_gecko) {
        textar.setSelectionRange(pos, pos);
        return;
    }
    textar.focus();
    var sel = textar.createTextRange();
    var nonewlines = textar.value.substring(0, pos).replace(/\n/g, "").length;
    var newlines = textar.value.substring(0, pos).length;
    /* alert((newlines - nonewlines) + " = " + newlines + " - " + nonewlines); */
    sel.move("character", pos - (newlines - nonewlines));
    sel.select();
}
