var ie = document.all != null;
var moz = !ie && document.getElementById != null && document.layers == null;
function bs_isNull(theVar)
{
    if (typeof(theVar) == 'undefined') return true;
    if (theVar == null) return true;
    return false;
}
function bs_isObject(theVar)
{
    ret = false;
    if (typeof(theVar) == 'object')
    {
        ret = !bs_isNull(theVar);
    }
    return ret;
}
function bs_isEmpty(theVar)
{
    if (bs_isNull(theVar)) return true;
    if (theVar == '') return true;
    return false;
}
function bs_typeOf(theVar)
{
    ret = 'undefined';
    switch (typeof(theVar))
            {
        case 'boolean':  ret = 'boolean';  break;case 'number':   ret = 'number';   break;case 'string':   ret = 'string';   break;case 'function': ret = 'function'; break;case 'object':
        if (bs_isNull(theVar))
        {
            ret = 'null';
            break;
        }
        if (theVar.concat && theVar.join && theVar.sort && theVar.pop)
        {
            ret = 'array';
            break;
        }
        break;case 'undefined':
        default:
            ret = 'undefined';}
    return ret;
}
function bs_arrayMerge(obj1, obj2)
{
    if (!bs_isObject(obj1) || !bs_isObject(obj2)) return false;
    for (var key in obj2)
    {
        obj1[key] = obj2[key];
    }
    return obj1;
}
function bs_arrayFlip(aArray)
{
    var aHash = new Object();
    type = bs_typeOf(aArray);
    if (type == 'array')
    {
        for (var i = 0; i < aArray.length; i++)
        {
            aHash[aArray[i]] = true;
        }
    }
    else if (type == 'string')
    {
        if (aArray != '')
        {
            aHash[aArray] = true;
        }
    }
    return aHash;
}
function queryStringToHash(queryString)
{
    if (typeof(queryString) == 'undefined')
    {
        var queryString = window.location.search;
    }
    var ret = new Array;
    if (bs_isEmpty(queryString)) return ret;
    queryString = queryString.substr(1);
    if (bs_isEmpty(queryString)) return ret;
    var junks = queryString.split('&');
    for (var i = 0; i < junks.length; i++)
    {
        var x = junks[i].split('=');
        if (x.length == 2)
        {
            ret[x[0]] = x[1];
        }
        else
        {
            ret[x[0]] = '';
        }
    }
    return ret;
}
function dump(theVar, doReturn, showFunctions, _out, _indent, _numCall)
{
    if (!_indent)
    {
        _indent = ' ';
        _bsDumpOverallNumCall = 1;
    }
    else
    {
        _indent += ' ';
        _bsDumpOverallNumCall++;
    }
    if (_bsDumpOverallNumCall < 8)
    {
        if (_out)
        {
            var isInternal = true;
        }
        else
        {
            _out = '';
            _numCall = 1;
        }
        var goOn = true;
        if (_numCall > 10)
        {
            goOn = false;
            if (!doReturn)
            {
                goOn = confirm("There have been 10 recursive calls so far. Maybe you have an endless loop. Do you want to continue?");
            }
            if (!goOn)
            {
                _out += _indent + "error/warning: nesting levels too deep (>10 times)!\n";
            }
            else
            {
                _numCall = 0;
            }
        }
        if (goOn)
        {
            switch (typeof(theVar))
                    {
                case 'object':
                    for (var key in theVar)
                    {
                        switch (typeof(theVar[key]))
                                {
                            case 'function':
                                if (typeof(showFunctions) == 'boolean')
                                {
                                    if (showFunctions)
                                    {
                                        _out += _indent + 'function "' + key + '" => ' + theVar[key] + "\n";
                                    }
                                    else
                                    {
                                        _out += _indent + 'function "' + key + "\n";
                                    }
                                }
                                else
                                {
                                    if (showFunctions == 2)
                                    {
                                        _out += _indent + 'function "' + key + '" => ' + theVar[key] + "\n";
                                    }
                                    else if (showFunctions == 1)
                                    {
                                        _out += _indent + 'function "' + key + "\n";
                                    }
                                    else
                                    {
                                    }
                                }
                                break;case 'undefined':
                            break;case 'object':
                            _out += _indent + key;if (theVar[key] instanceof Array)
                        {
                            _out += ' (Array) => \n';
                        }
                        else if (theVar[key] instanceof Date)
                        {
                            _out += ' (Date) => ' + theVar[key] + '\n';
                        }
                        else
                        {
                            _out += ' (Object) => \n';
                        }
                            _out = dump(theVar[key], doReturn, showFunctions, _out, _indent + "    ", _numCall + 1);break;case 'number':
                            if (theVar instanceof Date) alert('date');default:
                            _out += _indent + typeof(theVar[key]) + ' "' + key + '" => ' + theVar[key] + "\n";}
                    }
                    break;default:
                _out += _indent + typeof(theVar) + ' => ' + theVar + "\n";}
        }
    }
    if (isInternal || doReturn)
    {
        return _out;
    }
    else
    {
        alert(_out);
        return;
    }
}
function Position(x, y)
{
    this.x = x;
    this.y = y;
}
;
function getAbsolutePos(el, stopIfAbsolute)
{
    if (bs_isNull(el))
    {
        var res = new Position(0, 0);
        return res;
    }
    var res = new Position(el.offsetLeft, el.offsetTop);
    if (el.offsetParent)
    {
        if ((stopIfAbsolute != true ) || ((el.offsetParent.currentStyle.position != 'absolute') && (el.offsetParent.currentStyle.position != 'relative') && (el.offsetParent.currentStyle.overflow != 'auto') && (el.offsetParent.currentStyle.overflow != 'scroll')))
        {
            var tmp = getAbsolutePos(el.offsetParent, stopIfAbsolute);
            res.x += tmp.x;
            res.y += tmp.y;
        }
    }
    return res;
}
;
if ("undefined" != typeof(HTMLElement))
{
    if ("undefined" == typeof(HTMLElement.insertAdjacentElement))
    {
        HTMLElement.prototype.insertAdjacentElement = function(where, parsedNode)
        {
            switch (where)
                    {
                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;}
        }
    }
}
if (moz)
{
    extendEventObject();
    emulateAttachEvent();
    emulateEventHandlers(["click", "dblclick", "mouseover", "mouseout",
            "mousedown", "mouseup", "mousemove",
            "keydown", "keypress", "keyup"]);
    emulateCurrentStyle(["left", "right", "top", "bottom", "width", "height"]);
    emulateHTMLModel();
    Event.LEFT = 1;
    Event.MIDDLE = 2;
    Event.RIGHT = 3;
}
else
{
    Event = {};
    Event.LEFT = 1;
    Event.MIDDLE = 4;
    Event.RIGHT = 2;
}
function extendEventObject()
{
    Event.prototype.__defineSetter__("returnValue", function (b)
    {
        if (!b) this.preventDefault();
        return b;
    });
    Event.prototype.__defineSetter__("cancelBubble", function (b)
    {
        if (b) this.stopPropagation();
        return b;
    });
    Event.prototype.__defineGetter__("srcElement", function ()
    {
        var node = this.target;
        while (node.nodeType != 1) node = node.parentNode;
        return node;
    });
    Event.prototype.__defineGetter__("fromElement", function ()
    {
        var node;
        if (this.type == "mouseover")
            node = this.relatedTarget;
        else if (this.type == "mouseout")
            node = this.target;
        if (!node) return;
        while (node.nodeType != 1) node = node.parentNode;
        return node;
    });
    Event.prototype.__defineGetter__("toElement", function ()
    {
        var node;
        if (this.type == "mouseout")
            node = this.relatedTarget;
        else if (this.type == "mouseover")
            node = this.target;
        if (!node) return;
        while (node.nodeType != 1) node = node.parentNode;
        return node;
    });
    Event.prototype.__defineGetter__("offsetX", function ()
    {
        return this.layerX;
    });
    Event.prototype.__defineGetter__("offsetY", function ()
    {
        return this.layerY;
    });
}
function emulateAttachEvent()
{
    HTMLDocument.prototype.attachEvent =
    HTMLElement.prototype.attachEvent = function (sType, fHandler)
    {
        var shortTypeName = sType.replace(/on/, "");
        fHandler._ieEmuEventHandler = function (e)
        {
            window.event = e;
            return fHandler();
        };
        this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
    };
    HTMLDocument.prototype.detachEvent =
    HTMLElement.prototype.detachEvent = function (sType, fHandler)
    {
        var shortTypeName = sType.replace(/on/, "");
        if (typeof fHandler._ieEmuEventHandler == "function")
            this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
        else
            this.removeEventListener(shortTypeName, fHandler, true);
    };
}
function emulateEventHandlers(eventNames)
{
    for (var i = 0; i < eventNames.length; i++)
    {
        document.addEventListener(eventNames[i], function (e)
        {
            window.event = e;
        }, true);
    }
}
function emulateAllModel()
{
    var allGetter = function ()
    {
        var a = this.getElementsByTagName("*");
        var node = this;
        a.tags = function (sTagName)
        {
            return node.getElementsByTagName(sTagName);
        };
        return a;
    };
    HTMLDocument.prototype.__defineGetter__("all", allGetter);
    HTMLElement.prototype.__defineGetter__("all", allGetter);
}
function extendElementModel()
{
    HTMLElement.prototype.__defineGetter__("parentElement", function ()
    {
        if (this.parentNode == this.ownerDocument) return null;
        return this.parentNode;
    });
    HTMLElement.prototype.__defineGetter__("children", function ()
    {
        var tmp = [];
        var j = 0;
        var n;
        for (var i = 0; i < this.childNodes.length; i++)
        {
            n = this.childNodes[i];
            if (n.nodeType == 1)
            {
                tmp[j++] = n;
                if (n.name)
                {
                    if (!tmp[n.name])
                        tmp[n.name] = [];
                    tmp[n.name][tmp[n.name].length] = n;
                }
                if (n.id)
                    tmp[n.id] = n
            }
        }
        return tmp;
    });
    HTMLElement.prototype.contains = function (oEl)
    {
        if (oEl == this) return true;
        if (oEl == null) return false;
        return this.contains(oEl.parentNode);
    };
}
function emulateCurrentStyle(properties)
{
    HTMLElement.prototype.__defineGetter__("currentStyle", function ()
    {
        var cs = {};
        var el = this;
        for (var i = 0; i < properties.length; i++)
        {
            cs.__defineGetter__(properties[i], encapsulateObjects(el, properties[i]));
        }
        return cs;
    });
}
function encapsulateObjects(el, sProperty)
{
    return function ()
    {
        return document.defaultView.getComputedStyle(el, null).getPropertyValue(sProperty);
    };
}
function emulateHTMLModel()
{
    function convertTextToHTML(s)
    {
        s = s.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\n/g, "<BR>");
        while (/\s\s/.test(s))
            s = s.replace(/\s\s/, "&nbsp; ");
        return s.replace(/\s/g, " ");
    }
    HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML)
    {
        var df;
        var r = this.ownerDocument.createRange();
        switch (String(sWhere).toLowerCase())
                {
            case "beforebegin":
                r.setStartBefore(this);df = r.createContextualFragment(sHTML);this.parentNode.insertBefore(df, this);break;case "afterbegin":
            r.selectNodeContents(this);r.collapse(true);df = r.createContextualFragment(sHTML);this.insertBefore(df, this.firstChild);break;case "beforeend":
            r.selectNodeContents(this);r.collapse(false);df = r.createContextualFragment(sHTML);this.appendChild(df);break;case "afterend":
            r.setStartAfter(this);df = r.createContextualFragment(sHTML);this.parentNode.insertBefore(df, this.nextSibling);break;}
    };
    HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML)
    {
        var r = this.ownerDocument.createRange();
        r.setStartBefore(this);
        var df = r.createContextualFragment(sHTML);
        this.parentNode.replaceChild(df, this);
        return sHTML;
    });
    HTMLElement.prototype.__defineGetter__("canHaveChildren", function ()
    {
        switch (this.tagName)
                {
            case "AREA":
            case "BASE":
            case "BASEFONT":
            case "COL":
            case "FRAME":
            case "HR":
            case "IMG":
            case "BR":
            case "INPUT":
            case "ISINDEX":
            case "LINK":
            case "META":
            case "PARAM":
                return false;}
        return true;
    });
    HTMLElement.prototype.__defineGetter__("outerHTML", function ()
    {
        var attr, attrs = this.attributes;
        var str = "<" + this.tagName;
        for (var i = 0; i < attrs.length; i++)
        {
            attr = attrs[i];
            if (attr.specified)
                str += " " + attr.name + '="' + attr.value + '"';
        }
        if (!this.canHaveChildren)
            return str + ">";
        return str + ">" + this.innerHTML + "</" + this.tagName + ">";
    });
    HTMLElement.prototype.__defineSetter__("innerText", function (sText)
    {
        this.innerHTML = convertTextToHTML(sText);
        return sText;
    });
    var tmpGet;
    HTMLElement.prototype.__defineGetter__("innerText", tmpGet = function ()
    {
        var r = this.ownerDocument.createRange();
        r.selectNodeContents(this);
        return r.toString();
    });
    HTMLElement.prototype.__defineSetter__("outerText", function (sText)
    {
        this.outerHTML = convertTextToHTML(sText);
        return sText;
    });
    HTMLElement.prototype.__defineGetter__("outerText", tmpGet);
    HTMLElement.prototype.insertAdjacentText = function (sWhere, sText)
    {
        this.insertAdjacentHTML(sWhere, convertTextToHTML(sText));
    };
}

