//
//
//  This file includes a copy of the Prototype JavaScript framework:
//
//  Prototype JavaScript framework, version 1.5.0
//  (c) 2005-2007 Sam Stephenson
//
//  Prototype is freely distributable under the terms of an MIT-style license.
//  For details, see the Prototype web site: http://prototype.conio.net/

function initMain()
{
    fixAllIEPNGs('/js/transparent.gif');
    fixupAllIEPNGBGs();
    performPostEffectsFixups();

    return true;

}

try
{
    if (NodeList && NodeList.prototype && !NodeList.prototype._each)
    {
        Object.extend(NodeList.prototype, {_each:function(iterator) {
            for (var i = 0,length = this.length; i < length; ++i)
                iterator(this[i]);
        }});
        Object.extend(NodeList.prototype, Enumerable);
    }
}
catch(exception)
{
}
var windowsInternetExplorer = false;
var isGecko = false;
var isMozilla = false;
var isFirefox = false;
var isCamino = false;
var isSafari = false;
var isNS = false;
var isWebKit = false;
var isOpera = false;
var isiPhone = false;
var isEarlyWebKitVersion = false;
var browserDetected = false;
var listOfIE7FloatsFix = [];
function detectBrowser()
{
    if (browserDetected === false)
    {
        windowsInternetExplorer = false;
        var appVersion = navigator.appVersion;
        if ((appVersion.indexOf("MSIE") != -1) && (appVersion.indexOf("Macintosh") == -1))
        {
            var temp = appVersion.split("MSIE");
            browserVersion = parseFloat(temp[1]);
            windowsInternetExplorer = true;
            if (typeof(Node) == "undefined")
            {
                Node = {};
                Node.ELEMENT_NODE = 1;
                Node.ATTRIBUTE_NODE = 2;
                Node.TEXT_NODE = 3;
                Node.CDATA_SECTION_NODE = 4;
                Node.ENTITY_REFERENCE_NODE = 5;
                Node.ENTITY_NODE = 6;
                Node.PROCESSING_INSTRUCTION_NODE = 7;
                Node.COMMENT_NODE = 8;
            }
        }
        else
        {
            var ua = navigator.userAgent.toLowerCase();
            isGecko = (ua.indexOf('gecko') != -1);
            isMozilla = (this.isGecko && ua.indexOf("gecko/") + 14 == ua.length);
            isFirefox = (this.isGecko && ua.indexOf("firefox") != -1);
            isCamino = (this.isGecko && ua.indexOf("camino") != -1);
            isSafari = (this.isGecko && ua.indexOf("safari") != -1);
            isNS = ((this.isGecko) ? (ua.indexOf('netscape') != -1) : ((ua.indexOf('mozilla') != -1) && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1)));
            isOpera = !!window.opera;
            var matchResult = ua.match(/applewebkit\/(\d+)/);
            if (matchResult)
            {
                isiPhone = (ua.indexOf("mobile/") != -1);
                isWebKit = true;
                webKitVersion = parseInt(matchResult[1]);
                isEarlyWebKitVersion = (webKitVersion < 522);
            }
        }
        browserDetected = true;
    }
}
function shouldApplyCSSBackgroundPNGFix()
{
    detectBrowser();
    return(windowsInternetExplorer && (browserVersion < 7));
}
function photocastHelper(url)
{
    var feed = new IWURL(url);
    var iPhotoVersionMin = 600;
    var iPhotoMimeTypePlugin = "application/photo";
    if (navigator.mimeTypes && navigator.mimeTypes.length > 0)
    {
        var iPhoto = navigator.mimeTypes[iPhotoMimeTypePlugin];
        if (iPhoto)
        {
            var description = iPhoto.description;
            try
            {
                var components = description.split(" ");
                if (components && components.length > 1)
                {
                    var pluginVersion = components[1];
                    if (pluginVersion >= iPhotoVersionMin)
                    {
                        feed.mProtocol = "photo";
                    }
                }
            }
            catch(exception)
            {
            }
        }
    }
    window.location = feed.toURLString();
}
function loadCSS(file)
{
    var cssNode = document.createElement('link');
    cssNode.setAttribute('rel', 'stylesheet');
    cssNode.setAttribute('type', 'text/css');
    cssNode.setAttribute('href', file);
    document.getElementsByTagName('head')[0].appendChild(cssNode);
}
function loadMozillaCSS(file)
{
    detectBrowser();
    if ((isMozilla) || (isFirefox) || (isCamino))
    {
        loadCSS(file);
    }
}
function utf8sequence(c)
{
    if (c <= 0x0000007f)return[c];
    if (c <= 0x000007ff)return[(0xc0 | (c >>> 6)),(0x80 | (c & 0x3f))];
    if (c <= 0x0000ffff)return[(0xe0 | (c >>> 12)),(0x80 | ((c >>> 6) & 0x3f)),(0x80 | (c & 0x3f))];
    if (c <= 0x001fffff)return[(0xf0 | (c >>> 18)),(0x80 | ((c >>> 12) & 0x3f)),(0x80 | ((c >>> 6) & 0x3f)),(0x80 | (c & 0x3f))];
    if (c <= 0x03ffffff)return[(0xf8 | (c >>> 24)),(0x80 | ((c >>> 18) & 0x3f)),(0x80 | ((c >>> 12) & 0x3f)),(0x80 | ((c >>> 6) & 0x3f)),(0x80 | (c & 0x3f))];
    if (c <= 0x7fffffff)return[(0xfc | (c >>> 30)),(0x80 | ((c >>> 24) & 0x3f)),(0x80 | ((c >>> 18) & 0x3f)),(0x80 | ((c >>> 12) & 0x3f)),(0x80 | ((c >>> 6) & 0x3f)),(0x80 | (c & 0x3f))];
    return[];
}
function utf8encode(s)
{
    var result = [];
    var firstSurrogate = 0;
    for (var i = 0; i < s.length; ++i)
    {
        var code = s.charCodeAt(i);
        if (firstSurrogate != 0)
        {
            if ((code >= 0xDC00) && (code <= 0xDFFF))
            {
                code = (firstSurrogate - 0xD800) * 0x400 + (code - 0xDC00) + 0x10000;
                firstSurrogate = 0;
            }
        }
        else
        {
            if ((code < 0xD800) || (code > 0xDFFF))
            {
            }
            else if ((code >= 0xD800) && (code < 0xDC00))
            {
                firstSurrogate = code;
                continue;
            }
            else
            {
                continue;
            }
        }
        result = result.concat(utf8sequence(code));
    }
    var resultString = "";
    for (i = 0; i < result.length; ++i)
    {
        resultString += String.fromCharCode(result[i]);
    }
    return resultString;
}
function IELatin1Munge(UTF8String)
{
    var munged = "";
    for (var i = 0; i < UTF8String.length; i++)
    {
        var c = UTF8String.charCodeAt(i);
        switch (c) {case 0x0080:c = 0x20AC;break;case 0x0081:break;case 0x0082:c = 0x201A;break;case 0x0083:c = 0x0192;break;case 0x0084:c = 0x201E;break;case 0x0085:c = 0x2026;break;case 0x0086:c = 0x2020;break;case 0x0087:c = 0x2021;break;case 0x0088:c = 0x02C6;break;case 0x0089:c = 0x2030;break;case 0x008A:c = 0x0160;break;case 0x008B:c = 0x2039;break;case 0x008C:c = 0x0152;break;case 0x008D:break;case 0x008E:c = 0x017D;break;case 0x008F:break;case 0x0090:break;case 0x0091:c = 0x2018;break;case 0x0092:c = 0x2019;break;case 0x0093:c = 0x201C;break;case 0x0094:c = 0x201D;break;case 0x0095:c = 0x2022;break;case 0x0096:c = 0x2013;break;case 0x0097:c = 0x2014;break;case 0x0098:c = 0x02DC;break;case 0x0099:c = 0x2122;break;case 0x009A:c = 0x0161;break;case 0x009B:c = 0x203A;break;case 0x009C:c = 0x0153;break;case 0x009D:break;case 0x009E:c = 0x017E;break;case 0x009F:c = 0x0178;break;}
        munged += String.fromCharCode(c);
    }
    return munged;
}
function IEConvertURLForPNGFix(urlString)
{
    var result = urlString;
    detectBrowser();
    if (windowsInternetExplorer)
    {
        var decoded = decodeURI(urlString);
        if (decoded.match(/[^\x00-\x7f]/))
        {
            result = IELatin1Munge(utf8encode(decodeURI(urlString)));
        }
    }
    return result;
}
function fixAllIEPNGs(transparentGif)
{
    detectBrowser();
    if (windowsInternetExplorer)
    {
        for (var i = 0; i < document.images.length; ++i)
        {
            if (document.images[i].src.slice(-4).toLowerCase() == ".png")
            {
                var img = $(document.images[i]);
                var fixPng = function(img)
                {
                    if (!img.originalSrc)
                    {
                        if ((img.style.width == "") && (img.style.height == ""))
                        {
                            var width = img.width;
                            var height = img.height;
                            img.style.width = width + "px";
                            img.style.height = height + "px";
                        }
                        var filterName = 'progid:DXImageTransform.Microsoft.AlphaImageLoader';
                        var filterParams = 'src="' + IEConvertURLForPNGFix(img.src) + '", sizingMethod="scale"';
                        img.setFilter(filterName, filterParams);
                        img.originalSrc = img.src;
                        img.src = transparentGif;
                    }
                };
                if (img.complete)
                {
                    fixPng(img);
                }
                else
                {
                    img.onload = fixPng.bind(null, img);
                }
            }
        }
    }
}
function toPixels(value)
{
    var converted = 0;
    var px_per_pt = window.screen.logicalXDPI ? (window.screen.logicalXDPI / 72.0) : 1.3333;
    if (value.indexOf("px") > 0)
    {
        converted = parseFloat(value);
    }
    else if (value.indexOf("pt") > 0)
    {
        converted = px_per_pt * parseFloat(value);
    }
    else if (value.indexOf("in") > 0)
        {
            converted = 72 * px_per_pt * parseFloat(value);
        }
        else if (value.indexOf("pc") > 0)
            {
                converted = 12 * px_per_pt * parseFloat(value);
            }
            else if (value.indexOf("mm") > 0)
                {
                    converted = 2.83465 * px_per_pt * parseFloat(value);
                }
                else if (value.indexOf("cm") > 0)
                    {
                        converted = 28.3465 * px_per_pt * parseFloat(value);
                    }
    return converted;
}
function toPixelsAtElement(element, value, vertical)
{
    var converted = 0;
    if (value.indexOf("%") > 0)
    {
        var containerSize = 0;
        if (vertical)
        {
            containerSize = $(element.parentNode).getHeight();
        }
        else
        {
            containerSize = $(element.parentNode).getWidth();
        }
        converted = containerSize * parseFloat(value) / 100.0;
    }
    else if (value.indexOf("em") > 0)
    {
        converted = parseFloat(value) * toPixels(Element.getStyle(element, 'fontSize'));
    }
    else
    {
        converted = toPixels(value);
    }
    return converted;
}
function backgroundPositionDimension(oBlock, currentBGPosition, blockDimension, imageDimension)
{
    var position = 0;
    if (currentBGPosition === 'center')
    {
        position = (blockDimension / 2) - (imageDimension / 2);
    }
    else if ((currentBGPosition === 'right') || (currentBGPosition === 'bottom'))
    {
        position = blockDimension - imageDimension;
    }
    else if ((currentBGPosition === 'left') || (currentBGPosition === 'top'))
        {
            position = 0;
        }
        else if (currentBGPosition.indexOf("px") > 0)
            {
                position = parseFloat(currentBGPosition);
            }
            else if (currentBGPosition.indexOf("em") > 0)
                {
                    position = parseFloat(currentBGPosition) * toPixels(oBlock.currentStyle.fontSize);
                }
                else if (currentBGPosition.indexOf("%") > 0)
                    {
                        position = parseFloat(currentBGPosition) * blockDimension / 100.0;
                    }
                    else if ((currentBGPosition.indexOf("pt") > 0) || (currentBGPosition.indexOf("in") > 0) || (currentBGPosition.indexOf("pc") > 0) || (currentBGPosition.indexOf("cm") > 0) || (currentBGPosition.indexOf("mm") > 0))
                        {
                            position = toPixels(currentBGPosition);
                        }
    return position;
}
function elementHasCSSBGPNG(element)
{
    return(element.currentStyle && element.currentStyle.backgroundImage && (element.currentStyle.backgroundImage.indexOf('url(') != -1) && (element.currentStyle.backgroundImage.indexOf('.png")') != -1));
}
function fixupIEPNGBG(oBlock)
{
    if (oBlock)
    {
        if (elementHasCSSBGPNG(oBlock))
        {
            var currentBGImage = oBlock.currentStyle.backgroundImage;
            var currentBGRepeat = oBlock.currentStyle.backgroundRepeat;
            var currentBGPositionX = oBlock.currentStyle.backgroundPositionX;
            var currentBGPositionY = oBlock.currentStyle.backgroundPositionY;
            var urlStart = currentBGImage.indexOf('url(');
            var urlEnd = currentBGImage.indexOf(')', urlStart);
            var imageURL = currentBGImage.substring(urlStart + 4, urlEnd);
            if (imageURL.charAt(0) == '"')
            {
                imageURL = imageURL.substring(1);
            }
            if (imageURL.charAt(imageURL.length - 1) == '"')
            {
                imageURL = imageURL.substring(0, imageURL.length - 1);
            }
            imageURL = IEConvertURLForPNGFix(imageURL);
            var overrideRepeat = false;
            var filterStyle = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
                              imageURL + "', sizingMethod='crop');";
            if (RegExp("/C[0-9A-F]{8}.png$").exec(imageURL) !== null)
            {
                filterStyle = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" +
                              imageURL + "', sizingMethod='scale');";
                overrideRepeat = true;
            }
            var fixupIEPNGBG_helper = function(img)
            {
                var tileWidth = img.width;
                var tileHeight = img.height;
                var blockWidth = 0;
                var blockHeight = 0;
                if (oBlock.style.width)
                {
                    blockWidth = parseInt(oBlock.style.width, 10);
                }
                else
                {
                    blockWidth = oBlock.offsetWidth;
                }
                if (oBlock.style.height)
                {
                    blockHeight = parseInt(oBlock.style.height, 10);
                }
                else
                {
                    blockHeight = oBlock.offsetHeight;
                }
                var blockPaddingLeft = parseInt(oBlock.style.paddingLeft || 0, 10);
                if ((blockWidth === 0) || (blockHeight === 0))
                {
                    return;
                }
                var wholeRows = 1;
                var wholeCols = 1;
                var extraHeight = 0;
                var extraWidth = 0;
                if ((currentBGRepeat.indexOf("no-repeat") != -1) || ((tileWidth === 0) && (tileHeight === 0)) || overrideRepeat)
                {
                    tileWidth = blockWidth;
                    tileHeight = blockHeight;
                }
                else if ((currentBGRepeat.indexOf("repeat-x") != -1) || (tileHeight === 0))
                {
                    wholeCols = Math.floor(blockWidth / tileWidth);
                    extraWidth = blockWidth - (tileWidth * wholeCols);
                    tileHeight = blockHeight;
                }
                else if (currentBGRepeat.indexOf("repeat-y") != -1)
                    {
                        wholeRows = Math.floor(blockHeight / tileHeight);
                        extraHeight = blockHeight - (tileHeight * wholeRows);
                        tileWidth = blockWidth;
                    }
                    else
                    {
                        wholeCols = Math.floor(blockWidth / tileWidth);
                        wholeRows = Math.floor(blockHeight / tileHeight);
                        extraWidth = blockWidth - (tileWidth * wholeCols);
                        extraHeight = blockHeight - (tileHeight * wholeRows);
                    }
                var wrappedContent = document.createElement("div");
                var pngBGFixIsWrappedContentEmpty = true;
                wrappedContent.style.position = "relative";
                wrappedContent.style.zIndex = "1";
                wrappedContent.style.left = "0px";
                wrappedContent.style.top = "0px";
                wrappedContent.style.background = "transparent";
                if (!isNaN(parseInt(oBlock.style.width, 10)))
                {
                    wrappedContent.style.width = "" + blockWidth + "px";
                }
                if (!isNaN(parseInt(oBlock.style.height, 10)))
                {
                    wrappedContent.style.height = "" + blockHeight + "px";
                }
                while (oBlock.hasChildNodes())
                {
                    if (oBlock.firstChild.nodeType == 3)
                    {
                        if (RegExp("^ *$").exec(oBlock.firstChild.data) === null)
                        {
                            pngBGFixIsWrappedContentEmpty = false;
                        }
                    }
                    else
                    {
                        pngBGFixIsWrappedContentEmpty = false;
                    }
                    wrappedContent.appendChild(oBlock.firstChild);
                }
                if (pngBGFixIsWrappedContentEmpty)
                {
                    wrappedContent.style.lineHeight = "0px";
                }
                var bgPositionX = backgroundPositionDimension(oBlock, currentBGPositionX, blockWidth, img.width);
                var bgPositionY = backgroundPositionDimension(oBlock, currentBGPositionY, blockHeight, img.height);
                bgPositionX -= blockPaddingLeft;
                var newMarkup = "";
                for (var currentRow = 0; currentRow < wholeRows; currentRow++)
                {
                    for (currentCol = 0; currentCol < wholeCols; currentCol++)
                    {
                        newMarkup += "<div class='pngtile' style=" + "\"position: absolute; line-height: 0px; " + "width: " + tileWidth + "px; " + "height: " + tileHeight + "px; " + "left:" + (bgPositionX + (currentCol * tileWidth)) + "px; " + "top:" + (bgPositionY + (currentRow * tileHeight)) + "px; " + "filter:" + filterStyle + "\" > </div>";
                    }
                    if (extraWidth !== 0)
                    {
                        newMarkup += "<div class='pngtile' style=" + "\"position: absolute; line-height: 0px; " + "width: " + extraWidth + "px; " + "height: " + tileHeight + "px; " + "left:" + (bgPositionX + (currentCol * tileWidth)) + "px; " + "top:" + (bgPositionY + (currentRow * tileHeight)) + "px; " + "filter:" + filterStyle + "\" > </div>";
                    }
                }
                if (extraHeight !== 0)
                {
                    for (currentCol = 0; currentCol < wholeCols; currentCol++)
                    {
                        newMarkup += "<div class='pngtile' style=" + "\"position: absolute; line-height: 0px; " + "width: " + tileWidth + "px; " + "height: " + extraHeight + "px; " + "left:" + (bgPositionX + (currentCol * tileWidth)) + "px; " + "top:" + (bgPositionY + (currentRow * tileHeight)) + "px; " + "filter:" + filterStyle + "\" > </div>";
                    }
                    if (extraWidth !== 0)
                    {
                        newMarkup += "<div class='pngtile' style=" + "\"position: absolute; line-height: 0px; " + "width: " + extraWidth + "px; " + "height: " + extraHeight + "px; " + "left:" + (bgPositionX + (currentCol * tileWidth)) + "px; " + "top:" + (bgPositionY + (currentRow * tileHeight)) + "px; " + "filter:" + filterStyle + "\" > </div>";
                    }
                }
                oBlock.innerHTML = newMarkup;
                if (!pngBGFixIsWrappedContentEmpty)
                {
                    oBlock.appendChild(wrappedContent);
                }
                oBlock.style.background = "";
            }
            var backgroundImage = new Image();
            backgroundImage.src = imageURL;
            if (backgroundImage.complete)
            {
                fixupIEPNGBG_helper(backgroundImage);
            }
            else
            {
                backgroundImage.onload = fixupIEPNGBG_helper.bind(null, backgroundImage);
            }
        }
    }
}
function fixupIEPNGBGsInTree(oAncestor, forceAutoFixup)
{
    if (shouldApplyCSSBackgroundPNGFix())
    {
        try
        {
            var allDivs = $A(oAncestor.getElementsByTagName('DIV'));
            if (isDiv(oAncestor))
            {
                allDivs.push(oAncestor);
            }
            allDivs.each(function(oNode)
            {
                if (!$(oNode).hasClassName("noAutoPNGFix") || forceAutoFixup)
                {
                    fixupIEPNGBG(oNode);
                }
            });
        }
        catch(e)
        {
        }
    }
}
function fixupAllIEPNGBGs()
{
    setTimeout(fixupIEPNGBGsInTree.bind(null, document), 1);
}
function optOutOfCSSBackgroundPNGFix(element)
{
    if (shouldApplyCSSBackgroundPNGFix())
    {
        var allDivs = $A(element.getElementsByTagName("DIV"));
        allDivs.each(function(item)
        {
            if (elementHasCSSBGPNG(item))
            {
                $(item).addClassName("noAutoPNGFix");
            }
        });
    }
}
function fixupIECSS3Opacity(strElementID)
{
    detectBrowser();
    if (windowsInternetExplorer)
    {
        var oNode = $(strElementID);
        if (oNode && (oNode.getStyle('opacity') < 1))
        {
            var opacity = oNode.getStyle('opacity');
            oNode.style.height = '' + oNode.offsetHeight + 'px';
            var targetNode = oNode;
            if (oNode.tagName.toLowerCase() == 'img')
            {
                targetNode = $(document.createElement('div'));
                targetNode.style.position = oNode.style.position;
                targetNode.style.top = oNode.style.top;
                targetNode.style.left = oNode.style.left;
                targetNode.style.width = oNode.style.width;
                targetNode.style.height = oNode.style.height;
                targetNode.style.opacity = oNode.style.opacity;
                targetNode.style.zIndex = oNode.style.zIndex;
                oNode.style.left = '0px';
                oNode.style.top = '0px';
                oNode.style.opacity = '';
                if (oNode.parentNode.tagName.toLowerCase() == 'a')
                {
                    var anchor = oNode.parentNode;
                    anchor.parentNode.insertBefore(targetNode, anchor);
                    targetNode.appendChild(anchor);
                }
                else
                {
                    oNode.parentNode.insertBefore(targetNode, oNode);
                    targetNode.appendChild(oNode);
                }
            }
            else if (oNode.tagName.toLowerCase() == 'div')
            {
                var bufferWidth = 100;
                var oNodeWidth = oNode.offsetWidth;
                var oNodeHeight = oNode.offsetHeight;
                extents = new IWExtents(-bufferWidth, -bufferWidth, oNodeWidth + bufferWidth, oNodeHeight * 2 + bufferWidth);
                var positionStyleVal = oNode.getStyle("position");
                var floatStyleVal = oNode.getStyle("float");
                var positioned = ((positionStyleVal == "relative") || (positionStyleVal == "absolute"));
                var absolutelyPositioned = (positionStyleVal == "absolute" && (floatStyleVal == "none"));
                targetNode = $(document.createElement('div'));
                var classString = oNode.className;
                classString = classString.replace(/(shadow_\d+)/g, '');
                classString = classString.replace(/(stroke_\d+)/g, '');
                classString = classString.replace(/(reflection_\d+)/g, '');
                targetNode.className = classString;
                targetNode.style.position = positioned ? positionStyleVal : "relative";
                targetNode.style.styleFloat = floatStyleVal;
                targetNode.style.clear = oNode.getStyle("clear");
                targetNode.style.width = extents.right - extents.left + "px";
                targetNode.style.height = extents.bottom - extents.top + "px";
                targetNode.style.opacity = oNode.style.opacity;
                targetNode.style.zIndex = oNode.style.zIndex;
                if (absolutelyPositioned)
                {
                    targetNode.style.top = (parseFloat(oNode.getStyle("top")) || 0) + extents.top + "px";
                    targetNode.style.left = (parseFloat(oNode.getStyle("left")) || 0) + extents.left + "px";
                }
                else
                {
                    targetNode.style.marginTop = (parseFloat(oNode.getStyle("marginTop")) || 0) + extents.top + "px";
                    targetNode.style.marginLeft = (parseFloat(oNode.getStyle("marginLeft")) || 0) + extents.left + "px";
                    targetNode.style.marginBottom = (parseFloat(oNode.getStyle("marginBottom")) || 0) -
                                                    (extents.bottom - oNodeHeight) + "px";
                    targetNode.style.marginRight = (parseFloat(oNode.getStyle("marginRight")) || 0) -
                                                   (extents.right - oNodeWidth) + "px";
                }
                oNode.style.position = "absolute";
                oNode.style.styleFloat = "none";
                oNode.style.clear = "none";
                oNode.style.left = -extents.left + "px";
                oNode.style.top = -extents.top + "px";
                oNode.style.margin = '0px';
                oNode.style.verticalAlign = 'baseline';
                oNode.style.display = 'block';
                oNode.style.opacity = '';
                if (browserVersion < 7)
                {
                    oNode.className = oNode.className.replace(/(shadow_\d+)/g, '');
                }
                oNode.parentNode.insertBefore(targetNode, oNode);
                targetNode.appendChild(oNode);
            }
            $(targetNode).setFilter('progid:DXImageTransform.Microsoft.BasicImage', 'opacity=' + opacity);
        }
    }
}
function IWSetDivOpacity(div, fraction, suppressFilterRemoval)
{
    if (windowsInternetExplorer)
    {
        if (fraction < .99 || (suppressFilterRemoval == true))
        {
            $(div).setFilter('alpha', 'opacity=' + fraction * 100);
        }
        else
        {
            $(div).killFilter('alpha');
        }
    }
    else
    {
        div.style.opacity = fraction;
    }
}
function IMpreload(path, name, areaIndex)
{
    var rolloverName = name + '_rollover_' + areaIndex;
    var rolloverPath = path + '/' + rolloverName + '.png';
    self[rolloverName] = new Image();
    self[rolloverName].src = rolloverPath;
    var linkName = name + '_link_' + areaIndex;
    var linkPath = path + '/' + linkName + '.png';
    self[linkName] = new Image();
    self[linkName].src = linkPath;
    return true;
}
function swapAlphaImageLoaderFilterSrc(img, src)
{
    var filterName = 'progid:DXImageTransform.Microsoft.AlphaImageLoader';
    var filterParams = 'src="' + IEConvertURLForPNGFix(src) + '", sizingMethod="scale"';
    img.setFilter(filterName, filterParams);
    img.originalSrc = img.src;
}
function IMmouseover(name, areaIndex)
{
    var rolloverName = name + '_rollover_' + areaIndex;
    var linkName = name + '_link_' + areaIndex;
    var img = document.getElementById(linkName);
    if (img)
    {
        detectBrowser();
        if (windowsInternetExplorer && img.originalSrc)
        {
            swapAlphaImageLoaderFilterSrc(img, self[rolloverName].src);
        }
        else
        {
            img.src = self[rolloverName].src;
        }
    }
    return true;
}
function IMmouseout(name, areaIndex)
{
    var linkName = name + '_link_' + areaIndex;
    var img = document.getElementById(linkName);
    if (img)
    {
        detectBrowser();
        if (windowsInternetExplorer && img.originalSrc)
        {
            swapAlphaImageLoaderFilterSrc(img, self[linkName].src);
        }
        else
        {
            img.src = self[linkName].src;
        }
    }
    return true;
}
var quicktimeAvailable = false;
var quicktimeVersion702 = false;
var isQuicktimeDetectionInitialized = false;
var minVersionNum = 0x7028000;
var minVersionArray = ['7','0','2'];
function initializeQuicktimeDetection()
{
    if ((navigator.plugins !== null) && (navigator.plugins.length > 0))
    {
        for (i = 0; i < navigator.plugins.length; i++)
        {
            var plugin = navigator.plugins[i];
            if (plugin.name.toLowerCase().indexOf('quicktime plug-in ') != -1)
            {
                quicktimeAvailable = true;
                quicktimeVersionString = plugin.name.substring(18);
                var qtVersionArray = quicktimeVersionString.split('.');
                for (j = 0; j < minVersionArray.length && j < qtVersionArray.length; j++)
                {
                    var qtVersionComponent = qtVersionArray[j];
                    var minVersionComponent = minVersionArray[j];
                    if ((qtVersionComponent > minVersionComponent) || ((qtVersionComponent == minVersionComponent) && (j == minVersionArray.length - 1)))
                    {
                        quicktimeVersion702 = true;
                        break;
                    }
                    else if (qtVersionComponent < minVersionComponent)
                    {
                        break;
                    }
                }
                break;
            }
        }
    }
    else if (window.ActiveXObject)
    {
        try
        {
            quicktimeObj = new ActiveXObject('QuickTimeCheckObject.QuickTimeCheck.1');
            if (quicktimeObj !== null)
            {
                quicktimeAvailable = true;
                quicktimeVersionNum = quicktimeObj.QuickTimeVersion;
                if (quicktimeVersionNum >= minVersionNum)
                {
                    quicktimeVersion702 = true;
                }
            }
        }
        catch(e)
        {
        }
    }
    isQuicktimeDetectionInitialized = true;
}
function fixupPodcast(mediaId, anchorId)
{
    if (!isQuicktimeDetectionInitialized)
    {
        initializeQuicktimeDetection();
    }
    if (!quicktimeVersion702)
    {
        var oMediaElem = document.getElementById(mediaId);
        var oAnchorElem = document.getElementById(anchorId);
        if (oMediaElem && oAnchorElem)
        {
            oAnchorElem.style.display = 'inline';
            oMediaElem.parentNode.removeChild(oMediaElem);
        }
    }
}
function allListBulletImagesContainedBy(node)
{
    var result = [];
    for (var i = 0; i < node.childNodes.length; ++i)
    {
        var child = node.childNodes[i];
        if ((child.nodeName == "IMG") && ((node.nodeName == "SPAN") || (node.nodeName == "A")) && (node.parentNode != null) && (node.parentNode.nodeName == "P") && (node.parentNode.parentNode != null) && (node.parentNode.parentNode.nodeName == "LI"))
        {
            result = result.concat([child]);
        }
        result = result.concat(allListBulletImagesContainedBy(child));
    }
    return result;
}
function hideAllListBulletImagesContainedBy(node)
{
    var images = allListBulletImagesContainedBy(node);
    for (var i = 0; ((images != null) && (i < images.length)); ++i)
    {
        images[i].style.display = "none";
    }
}
function showAllListBulletImagesContainedBy(node)
{
    var images = allListBulletImagesContainedBy(node);
    for (var i = 0; ((images != null) && (i < images.length)); ++i)
    {
        images[i].style.display = "";
    }
}
function getChildOfType(oParent, sNodeName, requestedIndex)
{
    var childrenOfType = oParent.getElementsByTagName(sNodeName);
    return(requestedIndex < childrenOfType.length) ? childrenOfType.item(requestedIndex) : null;
}
function isDescendantInsideFixedHeightDescendantOfAncestor(oDescendant, oAncestor)
{
    if (oDescendant === oAncestor || oDescendant == null)
    {
        return false;
    }
    else if (parseFloat(oDescendant.style.height) > 0)
    {
        return true;
    }
    else
    {
        return isDescendantInsideFixedHeightDescendantOfAncestor(oDescendant.parentNode, oAncestor);
    }
}
function getShrinkableParaDescendants(oAncestor)
{
    var oParaDescendants = [];
    var oPotentialParagraphs = oAncestor.getElementsByTagName('DIV');
    for (var iIndex = 0; iIndex < oPotentialParagraphs.length; iIndex++)
    {
        var oNode = oPotentialParagraphs.item(iIndex);
        if (oNode.className.lastIndexOf('paragraph') != -1)
        {
            if (isDescendantInsideFixedHeightDescendantOfAncestor(oNode, oAncestor))
            {
                continue;
            }
            oParaDescendants.push(oNode);
        }
    }
    var oPotentialParagraphs = oAncestor.getElementsByTagName('P');
    for (var iIndex = 0; iIndex < oPotentialParagraphs.length; iIndex++)
    {
        var oNode = oPotentialParagraphs.item(iIndex);
        if (isDescendantInsideFixedHeightDescendantOfAncestor(oNode, oAncestor))
        {
            continue;
        }
        oParaDescendants.push(oNode);
    }
    return oParaDescendants;
}
var MINIMUM_FONT = "10";
var UNITS = "";
function elementFontSize(element)
{
    var fontSize = MINIMUM_FONT;
    if (document.defaultView)
    {
        var computedStyle = document.defaultView.getComputedStyle(element, null);
        if (computedStyle)
        {
            fontSize = computedStyle.getPropertyValue("font-size");
        }
    }
    else if (element.currentStyle)
    {
        fontSize = element.currentStyle.fontSize;
    }
    if ((UNITS.length === 0) && (fontSize != MINIMUM_FONT))
    {
        UNITS = fontSize.substring(fontSize.length - 2, fontSize.length);
    }
    return parseFloat(fontSize);
}
function isExceptionToOneLineRule(element)
{
    return($(element).hasClassName("Header"))
}
var HEIGHT_ERROR_MARGIN = 2;
function adjustFontSizeIfTooBig(idOfElement)
{
    var oParagraphDiv;
    var oSpan;
    var oTextBoxInnerDiv;
    var oTextBoxOuterDiv = document.getElementById(idOfElement);
    if (oTextBoxOuterDiv)
    {
        oTextBoxInnerDiv = getElementsByTagAndClassName(oTextBoxOuterDiv, "DIV", "text-content")[0];
        if (oTextBoxInnerDiv)
        {
            hideAllListBulletImagesContainedBy(oTextBoxInnerDiv);
            var offsetHeight = oTextBoxInnerDiv.offsetHeight;
            var specifiedHeight = offsetHeight;
            if (oTextBoxOuterDiv.style.height !== "")
            {
                specifiedHeight = parseFloat(oTextBoxOuterDiv.style.height);
            }
            if (offsetHeight > (specifiedHeight + HEIGHT_ERROR_MARGIN))
            {
                var smallestFontSize = 200;
                var aParaChildren = getShrinkableParaDescendants(oTextBoxInnerDiv);
                var oneLine = false;
                var exceptionToOneLineRule = false;
                for (i = 0; i < aParaChildren.length; i++)
                {
                    oParagraphDiv = aParaChildren[i];
                    var lineHeight = elementLineHeight(oParagraphDiv);
                    if (!isNaN(lineHeight))
                    {
                        oneLine = oneLine || (lineHeight * 1.5 >= specifiedHeight);
                        exceptionToOneLineRule = oneLine && isExceptionToOneLineRule(oParagraphDiv);
                    }
                    var fontSize = elementFontSize(oParagraphDiv);
                    if (!isNaN(fontSize))
                    {
                        smallestFontSize = Math.min(smallestFontSize, fontSize);
                    }
                    for (j = 0; j < oParagraphDiv.childNodes.length; j++)
                    {
                        oSpan = oParagraphDiv.childNodes[j];
                        if ((oSpan.nodeName == "SPAN") || (oSpan.nodeName == "A"))
                        {
                            fontSize = elementFontSize(oSpan);
                            if (!isNaN(fontSize))
                            {
                                smallestFontSize = Math.min(smallestFontSize, fontSize);
                            }
                        }
                    }
                }
                var minimum = parseFloat(MINIMUM_FONT);
                var count = 0;
                while ((smallestFontSize > minimum) && (offsetHeight > (specifiedHeight + HEIGHT_ERROR_MARGIN)) && (count < 10))
                {
                    ++count;
                    if (oneLine && !exceptionToOneLineRule)
                    {
                        var oldWidth = parseInt(oTextBoxOuterDiv.style.width, 10);
                        oTextBoxInnerDiv.style.width = "" + oldWidth * Math.pow(1.05, count) + "px";
                    }
                    else
                    {
                        var scale = Math.max(0.95, minimum / smallestFontSize);
                        for (i = 0; i < aParaChildren.length; i++)
                        {
                            oParagraphDiv = aParaChildren[i];
                            var paraFontSize = elementFontSize(oParagraphDiv) * scale;
                            var paraLineHeight = elementLineHeight(oParagraphDiv) * scale;
                            for (j = 0; j < oParagraphDiv.childNodes.length; j++)
                            {
                                oSpan = oParagraphDiv.childNodes[j];
                                if ((oSpan.nodeName == "SPAN") || (oSpan.nodeName == "A"))
                                {
                                    var spanLineHeight = elementLineHeight(oSpan) * scale;
                                    if (!isNaN(spanLineHeight))
                                    {
                                        oSpan.style.lineHeight = spanLineHeight + UNITS;
                                    }
                                    var spanFontSize = elementFontSize(oSpan) * scale;
                                    if (!isNaN(spanFontSize))
                                    {
                                        oSpan.style.fontSize = spanFontSize + UNITS;
                                        smallestFontSize = Math.min(smallestFontSize, spanFontSize);
                                    }
                                }
                            }
                            if (!isNaN(paraLineHeight))
                            {
                                oParagraphDiv.style.lineHeight = paraLineHeight + UNITS;
                            }
                            if (!isNaN(paraFontSize))
                            {
                                oParagraphDiv.style.fontSize = paraFontSize + UNITS;
                                smallestFontSize = Math.min(smallestFontSize, paraFontSize);
                            }
                        }
                    }
                    offsetHeight = oTextBoxInnerDiv.offsetHeight;
                }
            }
            showAllListBulletImagesContainedBy(oTextBoxInnerDiv);
        }
    }
}
function elementLineHeight(element)
{
    var lineHeight = MINIMUM_FONT;
    if (document.defaultView)
    {
        var computedStyle = document.defaultView.getComputedStyle(element, null);
        if (computedStyle)
        {
            lineHeight = computedStyle.getPropertyValue("line-height");
        }
    }
    else if (element.currentStyle)
    {
        lineHeight = element.currentStyle.lineHeight;
    }
    if ((UNITS.length === 0) && (lineHeight != MINIMUM_FONT))
    {
        UNITS = lineHeight.substring(lineHeight.length - 2, lineHeight.length);
    }
    return parseFloat(lineHeight);
}
function adjustLineHeightIfTooBig(idOfElement)
{
    var oTextBoxInnerDiv;
    var oTextBoxOuterDiv = document.getElementById(idOfElement);
    if (oTextBoxOuterDiv)
    {
        oTextBoxInnerDiv = getElementsByTagAndClassName(oTextBoxOuterDiv, "DIV", "text-content")[0];
        if (oTextBoxInnerDiv)
        {
            hideAllListBulletImagesContainedBy(oTextBoxInnerDiv);
            var offsetHeight = oTextBoxInnerDiv.offsetHeight;
            var specifiedHeight = offsetHeight;
            if (oTextBoxOuterDiv.style.height !== "")
            {
                specifiedHeight = parseFloat(oTextBoxOuterDiv.style.height);
            }
            if (offsetHeight > (specifiedHeight + HEIGHT_ERROR_MARGIN))
            {
                var adjusted = true;
                var count = 0;
                while ((adjusted) && (offsetHeight > (specifiedHeight + HEIGHT_ERROR_MARGIN)) && (count < 10))
                {
                    adjusted = false;
                    ++count;
                    var aParaChildren = getShrinkableParaDescendants(oTextBoxInnerDiv);
                    for (i = 0; i < aParaChildren.length; i++)
                    {
                        var fontSize;
                        var lineHeight;
                        var oParagraphDiv = aParaChildren[i];
                        fontSize = elementFontSize(oParagraphDiv);
                        lineHeight = elementLineHeight(oParagraphDiv) * 0.95;
                        if (!isNaN(lineHeight) && lineHeight >= (fontSize * 1.1))
                        {
                            oParagraphDiv.style.lineHeight = lineHeight + UNITS;
                            adjusted = true;
                        }
                        for (j = 0; j < oParagraphDiv.childNodes.length; j++)
                        {
                            var oSpan = oParagraphDiv.childNodes[j];
                            if ((oSpan.nodeName == "SPAN") || (oSpan.nodeName == "A"))
                            {
                                fontSize = elementFontSize(oSpan);
                                lineHeight = elementLineHeight(oSpan) * 0.95;
                                if (!isNaN(lineHeight) && lineHeight >= (fontSize * 1.1))
                                {
                                    oSpan.style.lineHeight = lineHeight + UNITS;
                                    adjusted = true;
                                }
                            }
                        }
                    }
                    offsetHeight = oTextBoxInnerDiv.offsetHeight;
                }
            }
            showAllListBulletImagesContainedBy(oTextBoxInnerDiv);
        }
    }
}
function isDiv(node)
{
    return(node.nodeType == Node.ELEMENT_NODE) && (node.tagName == "DIV");
}
function fixupAllMozInlineBlocks()
{
    detectBrowser();
    if (isFirefox || isCamino)
    {
        var oInlineBlocks = getElementsByTagAndClassName(document.body, "DIV", "inline-block");
        for (var i = 0,inlineBlocksLength = oInlineBlocks.length; i < inlineBlocksLength; ++i)
        {
            var oInlineBlock = oInlineBlocks[i];
            var oInterposingDiv = document.createElement("div");
            oInterposingDiv.style.position = "relative";
            oInterposingDiv.style.overflow = "visible";
            for (var j = 0,childNodesLength = oInlineBlock.childNodes.length; j < childNodesLength; ++j)
            {
                var oChildNode = oInlineBlock.childNodes[0];
                oInlineBlock.removeChild(oChildNode);
                oInterposingDiv.appendChild(oChildNode);
            }
            oInlineBlock.appendChild(oInterposingDiv);
        }
    }
}
function getWidthDefiningAncestor(elem)
{
    var ancestor = elem.up('[style~="width:"]');
    if (!ancestor)
    {
        ancestor = $$('body')[0];
    }
    return ancestor;
}
function updateListOfIE7FloatsFix(div)
{
    var div = $(div);
    var floatValue = div.getStyle("float");
    if (floatValue == "left" || floatValue == "right")
    {
        var commonAncestor = getWidthDefiningAncestor(div);
        var floatDescendants = commonAncestor.getElementsBySelector('[style~="float:"]');
        while (floatDescendants.length > 0)
        {
            var floatElem = floatDescendants.shift();
            floatValue = floatElem.getStyle("float");
            if (floatValue == "left" || floatValue == "right")
            {
                var floatAncestor = getWidthDefiningAncestor(floatElem);
                if (floatAncestor === commonAncestor)
                {
                    if (!listOfIE7FloatsFix.include(floatElem))
                    {
                        listOfIE7FloatsFix.push(floatElem);
                    }
                }
            }
        }
    }
}
function fixupFloatsIfIE7()
{
    detectBrowser();
    if (windowsInternetExplorer && browserVersion == 7)
    {
        if (listOfIE7FloatsFix.length > 0)
        {
            var floatsToRestore = [];
            var floatElem;
            var displayStyle;
            while (listOfIE7FloatsFix.length > 0)
            {
                floatElem = listOfIE7FloatsFix.shift();
                displayStyle = floatElem.getStyle("display");
                floatElem.setStyle({"display":"none"});
                floatsToRestore.push({element:floatElem,displayStyle:displayStyle});
            }
            while (floatsToRestore.length > 0)
            {
                var queueEntry = floatsToRestore.shift();
                floatElem = queueEntry.element;
                displayStyle = queueEntry.displayStyle;
                floatElem.setStyle({"display":displayStyle});
            }
        }
    }
}
function performPostEffectsFixups()
{
    fixupAllMozInlineBlocks();
    fixupFloatsIfIE7();
}
function reduceLeftMarginIfIE6(element)
{
    detectBrowser();
    if (windowsInternetExplorer && browserVersion < 7)
    {
        $(element).style.marginLeft = px(parseFloat($(element).style.marginLeft || 0) - 1);
    }
}
function reduceRightMarginIfIE6(element)
{
    detectBrowser();
    if (windowsInternetExplorer && browserVersion < 7)
    {
        $(element).style.marginRight = px(parseFloat($(element).style.marginRight || 0) - 1);
    }
}
if (Object.keys === undefined)
{
    Object.keys = function(obj)
    {
        var result = [];
        for (attr in obj)
            result.push(attr);
        return result;
    }
}
Object.objectType = function(obj)
{
    var result = typeof obj;
    if (result == "object")
    {
        if (obj.constructor == Array)
            result = "Array";
    }
    return result;
}
Array.prototype.contains = function(value)
{
    for (var i = 0; i < this.length; ++i)
    {
        if (this[i] == value)
        {
            return true;
        }
    }
    return false;
};
Array.prototype.forEach = function(f)
{
    for (var i = 0; i < this.length; ++i)
    {
        f(this[i]);
    }
};
Array.prototype.isEqual = function(that)
{
    if (this.length == that.length)
    {
        for (var i = 0; i < this.length; ++i)
        {
            if (this[i] != that[i])
                return false;
        }
        return true;
    }
    return false;
}
Array.prototype.minusArray = function(that)
{
    var i = 0;
    while (i < this.length)
    {
        if (that.contains(this[i]))
            this.splice(i, 1); else
            ++i;
    }
}
String.stringWithFormat = function(format)
{
    var formatted = "";
    var nextArgument = 1;
    var formatPattern = /%((\d+)\$)?([%s])?/;
    while (true)
    {
        foundIndex = format.search(formatPattern);
        if (foundIndex == -1)
        {
            formatted += format;
            break;
        }
        if (foundIndex > 0)
        {
            formatted += format.substring(0, foundIndex)
        }
        var matchInfo = format.match(formatPattern);
        var formatCharacter = matchInfo[3];
        if (formatCharacter == "%")
        {
            formatted += "%";
        }
        else
        {
            if (matchInfo[2])
            {
                argumentNumber = parseInt(matchInfo[2]);
            }
            else
            {
                argumentNumber = nextArgument++;
            }
            argument = (argumentNumber < arguments.length) ? arguments[argumentNumber] : "";
            if (formatCharacter == "s")
            {
                formatted += argument;
            }
        }
        format = format.substring(foundIndex + matchInfo[0].length);
    }
    return formatted;
}
String.prototype.hasSuffix = function(suffix)
{
    return this.slice(-1 * suffix.length) == suffix;
};
String.prototype.hasPrefix = function(prefix)
{
    return this.substr(0, prefix.length) == prefix;
}
String.prototype.lastPathComponent = function()
{
    return this.substr(this.lastIndexOf("/") + 1);
};
String.prototype.stringByDeletingLastPathComponent = function()
{
    return this.substr(0, this.lastIndexOf("/"));
};
String.prototype.stringByDeletingPathExtension = function()
{
    var lastSeparatorIndex = this.lastIndexOf("/");
    var lastDotIndex = this.lastIndexOf(".");
    if ((lastDotIndex > lastSeparatorIndex + 1) && lastDotIndex > 0)
        return this.slice(0, lastDotIndex);
    return this;
}
String.prototype.stringByAppendingPathComponent = function(component)
{
    if (this.hasSuffix("/"))
    {
        return this + component;
    }
    return this + "/" + component;
};
String.prototype.stringByAppendingAsQueryString = function(parameters)
{
    var result = this;
    if (parameters)
    {
        var prependChar = "?";
        Object.keys(parameters).forEach(function(key)
        {
            if (parameters.hasOwnProperty(key))
            {
                result += prependChar + escape(key) + "=" + escape(parameters[key]);
                prependChar = "&";
            }
        });
    }
    return result;
};
String.prototype.stringByUnescapingXML = function()
{
    var str = this.replace(/&lt;/g, '<');
    str = str.replace(/&gt;/g, '>');
    str = str.replace(/&quot;/g, '"');
    str = str.replace(/&apos;/g, "'");
    str = str.replace(/&amp;/g, '&');
    return str;
};
String.prototype.stringByEscapingXML = function(escapeAdditionalCharacters)
{
    var str = this.replace(/&/g, '&amp;');
    str = str.replace(/</g, '&lt;');
    if (escapeAdditionalCharacters)
    {
        str = str.replace(/>/g, '&gt;');
        str = str.replace(/"/g, '&quot;');
        str = str.replace(/'/g, '&apos;');
    }
    return str;
};
String.prototype.stringByConvertingNewlinesToBreakTags = function()
{
    return this.replace(/\n\r|\n|\r/g, '<br />');
};
String.prototype.urlStringByDeletingQueryAndFragment = function()
{
    var result = this;
    var lastIndex = result.lastIndexOf("?");
    if (lastIndex > 0)
        return result.substr(0, lastIndex);
    lastIndex = result.lastIndexOf("#");
    if (lastIndex > 0)
        result = result.substr(0, lastIndex);
    return result;
}
String.prototype.toRelativeURL = function(baseURL)
{
    var result = this;
    if (baseURL && this.indexOf(baseURL) == 0)
    {
        var chop = baseURL.length;
        if (this.charAt(chop) == '/')
            ++chop;
        result = this.substring(chop);
    }
    return result;
}
String.prototype.toAbsoluteURL = function()
{
    var result = this;
    if (this.indexOf(":/") == -1)
    {
        var pageURL = document.URL.urlStringByDeletingQueryAndFragment();
        var pathURL = pageURL.stringByDeletingLastPathComponent();
        result = pathURL.stringByAppendingPathComponent(this);
    }
    return result;
}
String.prototype.toRebasedURL = function(baseURL)
{
    return this.toRelativeURL(baseURL).toAbsoluteURL();
}
String.prototype.replaceStringWithString = function(target, replacement, global)
{
    var result = this;
    while (true)
    {
        var pos = result.indexOf(target);
        if (pos == -1)
            break;
        result = result.substr(0, pos) + replacement + result.substr(pos + target.length);
        pos += replacement.length;
        if (pos >= result.length || !global)
            break;
    }
    return result;
}
var trace = function() {
};
function ajaxRequest(url, func, obj)
{
    if (window.XMLHttpRequest)
    {
        var req = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        isIE = true;
        try
        {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    if (func)
    {
        req.onreadystatechange = function() {
            func(req, obj);
        }
    }
    req.open('GET', url, true);
    req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    if (req.overrideMimeType)
    {
        req.overrideMimeType("text/xml");
    }
    req.send(null);
    return false;
}
function isAjaxRequestReady(req)
{
    var result = req.readyState == 4 && (req.status == null || req.status == 0 || req.status == 200);
    return result;
}
function ajaxGetDocumentElement(req)
{
    var elem = null;
    if (req.responseXML.documentElement)
    {
        elem = req.responseXML.documentElement;
    }
    else
    {
        var dom = new ActiveXObject("MSXML.DOMDocument");
        dom.loadXML(req.responseText);
        elem = dom.documentElement;
    }
    return elem;
}
function iWLog(str)
{
    if (window.console)
    {
        window.console.log(str);
    }
    else if (window.dump)
    {
        window.dump(str + "\n");
    }
}
function position(abs, left, top, width, height)
{
    var pos = "";
    if (abs)
        pos = "position: absolute; ";
    var size = "";
    if (width && height)
        size = ' width: ' + width + 'px; height: ' + height + 'px;';
    return pos + 'left: ' + left + 'px; top: ' + top + 'px;' + size;
}
var gIWUtilsTransparentGifURL = "";
function setTransparentGifURL(url)
{
    if (gIWUtilsTransparentGifURL == "")
    {
        gIWUtilsTransparentGifURL = url;
    }
}
function transparentGifURL()
{
    (function() {
        return gIWUtilsTransparentGifURL != ""
    }).assert("Transparent image URL not set");
    return gIWUtilsTransparentGifURL;
}
function imgMarkup(src, style, attributes, alt)
{
    var markup = "";
    if (src)
    {
        if (style == null)
        {
            style = "";
        }
        if (attributes == null)
        {
            attributes = "";
        }
        if (alt == null)
        {
            alt = "";
        }
        detectBrowser();
        if (windowsInternetExplorer)
        {
            style += " filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + IEConvertURLForPNGFix(src) + "', sizingMethod='scale');";
            src = gIWUtilsTransparentGifURL;
        }
        if (style.length > 0)
        {
            style = ' style="' + style + '"';
        }
        if (attributes.length > 0)
        {
            attributes = ' ' + attributes;
        }
        if (alt.length > 0)
        {
            alt = ' alt="' + alt.stringByEscapingXML(true) + '"';
        }
        markup = '<img src="' + src + '"' + style + attributes + alt + ' />';
    }
    return markup;
}
function setImgSrc(imgElement, src)
{
    detectBrowser();
    if (windowsInternetExplorer && src.slice(-4).toLowerCase() == ".png")
    {
        $(imgElement).setFilter('progid:DXImageTransform.Microsoft.AlphaImageLoader', 'src="' + IEConvertURLForPNGFix(src) + '", sizingMethod="scale"');
        imgElement.src = gIWUtilsTransparentGifURL;
    }
    else
    {
        imgElement.src = src;
    }
}
function iWOpacity(opacity)
{
    var style = "";
    detectBrowser();
    if (windowsInternetExplorer)
    {
        style = " progid:DXImageTransform.Microsoft.Alpha(opacity=" + opacity * 100 + "); ";
    }
    else
    {
        style = " opacity: " + opacity + "; ";
    }
    return style;
}
function getElementsByTagAndClassName(that, tagName, className)
{
    var elementsByClassAndTag = [];
    var elementsByClass = $(that).select('.' + className);
    if (tagName == '*')
    {
        elementsByClassAndTag = elementsByClass;
    }
    else
    {
        tagName = tagName.toLowerCase();
        for (var i = 0,len = elementsByClass.length; i < len; ++i)
        {
            if (elementsByClass[i].tagName.toLowerCase() == tagName)
            {
                elementsByClassAndTag.push(elementsByClass[i]);
            }
        }
    }
    return elementsByClassAndTag;
}
function getArgs()
{
    var args = new Object();
    var query = location.search.substring(1);
    var pairs = query.split("&");
    for (var i = 0; i < pairs.length; ++i)
    {
        var pair = pairs[i];
        var pos = pair.indexOf('=');
        if (pos > 0)
        {
            var argname = decodeURIComponent(pair.substring(0, pos));
            var value = decodeURIComponent(pair.substring(pos + 1));
            args[argname] = value;
        }
    }
    return args;
}
function IWRange(location, length)
{
    this.setLocation(location);
    this.setLength(length);
}
IWRange.prototype.length = function()
{
    return this.p_length;
}
IWRange.prototype.setLength = function(length)
{
    this.p_length = parseFloat(length);
}
IWRange.prototype.location = function()
{
    return this.p_location;
}
IWRange.prototype.setLocation = function(location)
{
    this.p_location = parseFloat(location);
}
IWRange.prototype.max = function()
{
    return this.location() + this.length();
}
IWRange.prototype.min = function()
{
    return this.location();
}
IWRange.prototype.shift = function(amount)
{
    this.setLocation(this.location() + amount);
}
IWRange.prototype.containsLocation = function(location)
{
    return((location >= this.min()) && (location < this.max()));
}
function IWPageRange(location, length)
{
    IWRange.apply(this, arguments);
}
IWPageRange.prototype = new IWRange();
IWPageRange.prototype.constructor = IWRange;
IWPageRange.prototype.setMax = function(newMax)
{
    var maxLength = this.p_lengthForMax(newMax);
    this.setLocation(Math.max(newMax - maxLength, 0))
    this.setLength(newMax - this.location());
}
IWPageRange.prototype.shift = function(amount)
{
    IWRange.prototype.shift.call(this, amount);
    this.setMax(this.max());
}
IWPageRange.prototype.p_lengthForMax = function(max)
{
    return(max <= 9) ? 5 : 3;
}
function px(s)
{
    return s.toString() + "px";
}
function depx(s)
{
    return parseInt(s || 0);
}
function globalOriginOfDivNode(div)
{
    (function() {
        return div !== null;
    }).assert("div must not be null");
    (function() {
        return div.offsetParent !== null;
    }).assert("div has null offset parent, maybe hidden?");
    var p = Position.cumulativeOffset(div);
    return new IWPoint(p[0], p[1]);
}
function globalRectOfDivNode(div)
{
    var globalOrigin = globalOriginOfDivNode(div);
    var size = new IWSize(div.offsetWidth, div.offsetHeight);
    return new IWRect(globalOrigin, size);
}
function pageSetBodyLayerResidentRectangle(divId, rectangle)
{
    var div = $(divId);
    if (div)
    {
        if (window.bodyLayerResidents === undefined)
        {
            window.bodyLayerResidents = new Hash({});
        }
        if (rectangle === null)
        {
            bodyLayerResidents.remove(divId);
        }
        else
        {
            bodyLayerResidents[divId] = rectangle;
        }
        var desiredBottom = 0;
        bodyLayerResidents.each(function(pair)
        {
            var itemBottom = pair.value.origin.y + pair.value.size.height;
            desiredBottom = Math.max(desiredBottom, itemBottom);
        });
        var bodyLayer = $('body_layer');
        if (bodyLayer)
        {
            var bodyLayerSpacer = bodyLayer.selectFirst('.spacer');
            if (bodyLayerSpacer)
            {
                var bodySpacerRect = globalRectOfDivNode(bodyLayerSpacer);
                var desiredHeight = desiredBottom - bodySpacerRect.origin.y;
                bodyLayerSpacer.style.height = px(desiredHeight);
            }
        }
    }
}
function locationHRef()
{
    var result = window.location.href;
    if (result.match(/file:\/[^\/]/))
    {
        result = "file://" + result.substr(5);
    }
    return result;
}
function IWSize(width, height)
{
    this.width = width;
    this.height = height;
}
function IWZeroSize()
{
    return new IWSize(0, 0);
}
IWSize.prototype.scale = function(hscale, vscale, round)
{
    if (round === undefined)round = false;
    if (vscale === undefined)vscale = hscale;
    var scaled = new IWSize(this.width * hscale, this.height * vscale);
    if (round)
    {
        scaled.width = Math.round(scaled.width);
        scaled.height = Math.round(scaled.height);
    }
    return scaled;
}
IWSize.prototype.round = function()
{
    return this.scale(1, 1, true);
}
IWSize.prototype.toString = function()
{
    return"Size(" + this.width + ", " + this.height + ")";
}
IWSize.prototype.aspectRatio = function()
{
    return this.width / this.height;
}
IWSize.prototype.subtractSize = function(s)
{
    return new IWSize(this.width - s.width, this.height - s.height);
}
function IWPoint(x, y)
{
    this.x = x;
    this.y = y;
}
function IWZeroPoint()
{
    return new IWPoint(0, 0);
}
IWPoint.prototype.scale = function(hscale, vscale, round)
{
    if (round === undefined)round = false;
    if (vscale === undefined)vscale = hscale;
    var scaled = new IWPoint(this.x * hscale, this.y * vscale);
    if (round)
    {
        scaled.x = Math.round(scaled.x);
        scaled.y = Math.round(scaled.y);
    }
    return scaled;
}
IWPoint.prototype.round = function()
{
    return this.scale(1, 1, true);
}
IWPoint.prototype.offset = function(deltaX, deltaY)
{
    return new IWPoint(this.x + deltaX, this.y + deltaY);
}
IWPoint.prototype.toString = function()
{
    return"Point(" + this.x + ", " + this.y + ")";
}
function IWRect()
{
    if (arguments.length == 1)
    {
        this.origin = arguments[0].origin;
        this.size = arguments[0].size;
    }
    else if (arguments.length == 2)
    {
        this.origin = arguments[0];
        this.size = arguments[1];
    }
    else if (arguments.length == 4)
        {
            this.origin = new IWPoint(arguments[0], arguments[1]);
            this.size = new IWSize(arguments[2], arguments[3]);
        }
}
IWRect.prototype.clone = function()
{
    return new IWRect(this.origin.x, this.origin.y, this.size.width, this.size.height);
}
function IWZeroRect()
{
    return new IWRect(0, 0, 0, 0);
}
IWRect.prototype.toString = function()
{
    return"Rect(" + this.origin.toString() + ", " + this.size.toString() + ")";
}
IWRect.prototype.maxX = function()
{
    return this.origin.x + this.size.width;
}
IWRect.prototype.maxY = function()
{
    return this.origin.y + this.size.height;
}
IWRect.prototype.union = function(that)
{
    var minX = Math.min(this.origin.x, that.origin.x);
    var minY = Math.min(this.origin.y, that.origin.y);
    var maxX = Math.max(this.maxX(), that.maxX());
    var maxY = Math.max(this.maxY(), that.maxY());
    return new IWRect(minX, minY, maxX - minX, maxY - minY);
}
IWRect.prototype.intersection = function(that)
{
    var intersectionRect;
    var minX = Math.max(this.origin.x, that.origin.x);
    var minY = Math.max(this.origin.y, that.origin.y);
    var maxX = Math.min(this.maxX(), that.maxX());
    var maxY = Math.min(this.maxY(), that.maxY());
    if ((minX < maxX) && (minY < maxY))
    {
        intersectionRect = new IWRect(minX, minY, maxX - minX, maxY - minY);
    }
    else
    {
        intersectionRect = new IWRect(0, 0, 0, 0);
    }
    return intersectionRect;
}
IWRect.prototype.scale = function(hscale, vscale, round)
{
    if (round === undefined)round = false;
    if (vscale === undefined)vscale = hscale;
    var scaledOrigin = this.origin.scale(hscale, vscale, round);
    var scaledSize = this.size.scale(hscale, vscale, round);
    return new IWRect(scaledOrigin.x, scaledOrigin.y, scaledSize.width, scaledSize.height);
}
IWRect.prototype.scaleSize = function(hscale, vscale, round)
{
    var scaledSize = this.size.scale(hscale, vscale, round);
    return new IWRect(this.origin.x, this.origin.y, scaledSize.width, scaledSize.height);
}
IWRect.prototype.round = function()
{
    return this.scale(1, 1, true);
}
IWRect.prototype.offset = function(deltaX, deltaY)
{
    var offsetOrigin = this.origin.offset(deltaX, deltaY);
    return new IWRect(offsetOrigin.x, offsetOrigin.y, this.size.width, this.size.height);
}
IWRect.prototype.offsetToOrigin = function()
{
    return this.offset(-this.origin.x, -this.origin.y)
}
IWRect.prototype.centerPoint = function()
{
    return this.offset(this.size.width / 2, this.size.height / 2);
}
IWRect.prototype.position = function()
{
    return"position: absolute; left: " + this.origin.x + "px; top: " + this.origin.y + "px; width: " + this.size.width + "px; height: " + this.size.height + "px; ";
}
IWRect.prototype.clip = function()
{
    return"clip: rect(" + this.origin.y + "px, " + this.maxX() + "px, " + this.maxY() + "px, " + this.origin.x + "px);";
}
IWRect.prototype.toExtents = function()
{
    return new IWExtents(this.origin.x, this.origin.y, this.origin.x + this.size.width, this.origin.y + this.size.height);
}
IWRect.prototype.paddingToRect = function(padded)
{
    return new IWPadding(this.origin.x - padded.origin.x, this.origin.y - padded.origin.y, padded.maxX() - this.maxX(), padded.maxY() - this.maxY());
}
function IWExtents(left, top, right, bottom)
{
    this.left = left;
    this.top = top;
    this.right = right;
    this.bottom = bottom;
}
IWExtents.prototype.clone = function()
{
    return new IWExtents(this.left, this.top, this.right, this.bottom);
}
IWExtents.prototype.toRect = function()
{
    return new IWRect(this.left, this.top, this.right - this.left, this.bottom - this.top);
}
function IWPadding(left, top, right, bottom)
{
    this.left = left;
    this.top = top;
    this.right = right;
    this.bottom = bottom;
}
IWRect.prototype.fill = function(context)
{
    context.fillRect(this.origin.x, this.origin.y, this.size.width, this.size.height);
}
IWRect.prototype.clear = function(context)
{
    context.clearRect(this.origin.x, this.origin.y, this.size.width, this.size.height);
}
var NotificationCenter = new IWNotificationCenter();
function IWNotificationCenter()
{
    this.mDispatchTable = new Array();
}
IWNotificationCenter.prototype.addObserver = function(observer, method, name, object)
{
    this.p_observersForName(name).push(new Array(observer, method, object));
}
IWNotificationCenter.prototype.removeObserver = function(observer)
{
}
IWNotificationCenter.prototype.postNotification = function(notification)
{
    if (notification.name() != null)
    {
        var observersForName = this.mDispatchTable[notification.name()];
        this.p_postNotificationToObservers(notification, observersForName);
    }
    var observersForNullName = this.mDispatchTable[null];
    this.p_postNotificationToObservers(notification, observersForNullName);
}
IWNotificationCenter.prototype.postNotificationWithInfo = function(name, object, userInfo)
{
    this.postNotification(new IWNotification(name, object, userInfo));
}
IWNotificationCenter.prototype.p_postNotificationToObservers = function(notification, observers)
{
    if (notification != null && observers != null)
    {
        for (var i = 0; i < observers.length; i++)
        {
            var observer = observers[i][0];
            var method = observers[i][1];
            var obj = observers[i][2];
            if (obj == null || obj === notification.object())
            {
                method.call(observer, notification);
            }
        }
    }
}
IWNotificationCenter.prototype.p_observersForName = function(name)
{
    if (this.mDispatchTable[name] === undefined)
    {
        this.mDispatchTable[name] = new Array();
    }
    return this.mDispatchTable[name];
}
function IWNotification(name, object, userInfo)
{
    this.mName = name;
    this.mObject = object;
    this.mUserInfo = userInfo;
}
IWNotification.prototype.name = function()
{
    return this.mName;
}
IWNotification.prototype.object = function()
{
    return this.mObject;
}
IWNotification.prototype.userInfo = function()
{
    return this.mUserInfo;
}
var IWAssertionsEnabled = true;
function IWAssert(func, description)
{
    if (IWAssertionsEnabled)
    {
        function IWAssertionFailed(func, description)
        {
            var formatter = new RegExp("return[\t\r ]*([^};\r]*)");
            var assertionText = func.toString().match(formatter)[1];
            var message = 'Assertion failed: "' + assertionText + '"';
            if (description != null)
                message += '.  ' + description;
            iWLog(message);
        }
        function IWCoreAssert(func, description)
        {
            if (func() == false)
            {
                IWAssertionFailed(func, description);
            }
        }
        IWCoreAssert(function() {
            return typeof(func) == 'function'
        }, "IWAssert requires its first argument to be a function.  " + "Try wrapping your assertion in function(){return ... }");
        var result = func();
        IWCoreAssert(function() {
            return result != null
        }, "The result of your assertion function is null; " + "did you remember your return statement?");
        IWCoreAssert(function() {
            return result == true || result == false
        }, "The result of your assertion function is neither true nor false");
        if (result == false)
        {
            IWAssertionFailed(func, description);
        }
    }
}
Function.prototype.assert = function(description)
{
    IWAssert(this, description);
}
function makeAjaxHandler(callback)
{
    return function(request)
    {
        if (request.readyState == 4)
        {
            callback(request, (request.status == 200) || (request.status === undefined) || (request.status == 0));
        }
    };
}
function makeXmlHttpRequest(url, handler)
{
    var request = false;
    if (window.XMLHttpRequest)
    {
        request = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        try
        {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            request = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    if (!request)
    {
        return false;
    }
    if (handler)
    {
        request.onreadystatechange = function() {
            handler(request);
        };
    }
    try
    {
        request.open('GET', url, true);
        request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        request.setRequestHeader('If-Modified-Since', 'Wed, 15 Nov 1995 00:00:00 GMT');
        if (request.overrideMimeType)
        {
            request.overrideMimeType('text/xml');
        }
        request.send(null);
    }
    catch(e)
    {
        return false;
    }
    return true;
}
function getTextFromNode(node)
{
    var result = "";
    if (node.nodeType == Node.ELEMENT_NODE)
    {
        var children = node.childNodes;
        for (var i = 0; i < children.length; ++i)
        {
            result = result + getTextFromNode(children[i]);
        }
    }
    else if (node.nodeType == Node.TEXT_NODE)
    {
        return node.nodeValue;
    }
    return result;
}
function getChildElementsByTagName(node, name)
{
    var result = [];
    for (var i = 0; i < node.childNodes.length; ++i)
    {
        if (node.childNodes[i].tagName == name)
        {
            result.push(node.childNodes[i]);
        }
    }
    return result;
}
function getChildElementsByTagNameNS(node, ns, nsPrefix, localName)
{
    var result = [];
    for (var i = 0; i < node.childNodes.length; ++i)
    {
        var childNode = node.childNodes[i];
        if (childNode.namespaceURI)
        {
            if (childNode.namespaceURI == ns)
            {
                if (childNode.localName && (childNode.localName == localName))
                {
                    result.push(childNode);
                }
                else if (childNode.tagName == (nsPrefix + ":" + localName))
                {
                    result.push(childNode);
                }
            }
        }
        else
        {
            if ((ns == "") && (childNode.tagName == localName))
            {
                result.push(childNode);
            }
        }
    }
    return result;
}
function getFirstChildElementByTagNameNS(node, ns, nsPrefix, localName)
{
    var children = getChildElementsByTagNameNS(node, ns, nsPrefix, localName);
    if (children.length > 0)
        return children[0];
    return null;
}
function getFirstChildElementByTagName(node, name)
{
    for (var i = 0; i < node.childNodes.length; ++i)
    {
        if (node.childNodes[i].tagName == name)
        {
            return node.childNodes[i];
        }
    }
    return null;
}
function getChildElementTextByTagName(node, tagName)
{
    var result = "";
    if (node !== null)
    {
        var children = getChildElementsByTagName(node, tagName);
        if (children.length > 1)
        {
            throw"MultipleResults";
        }
        if (children.length == 1)
        {
            result = getTextFromNode(children[0]);
        }
    }
    return result;
}
function getChildElementTextByTagNameNS(node, ns, nsPrefix, localName)
{
    var result = "";
    if (node)
    {
        var children = getChildElementsByTagNameNS(node, ns, nsPrefix, localName);
        if (children.length > 1)
            throw"MultipleResults";
        if (children.length == 1)
        {
            result = getTextFromNode(children[0]);
        }
    }
    return result;
}
function getChildElements(node)
{
    var result = [];
    for (var i = 0; i < node.childNodes.length; ++i)
    {
        var child = node.childNodes[i];
        if (child.nodeType == Node.ELEMENT_NODE)
            result.push(child);
    }
    return result;
}
function adjustNodeIds(node, suffix)
{
    var undefined;
    if (node.id != "")
    {
        node.id += ("$" + suffix);
    }
    var childElements = getChildElements(node);
    for (var i = 0; i < childElements.length; ++i)
    {
        adjustNodeIds(childElements[i], suffix);
    }
}
function removeAllChildNodes(node)
{
    while (node.childNodes.length > 0)
    {
        node.removeChild(node.childNodes[0]);
    }
}
function nodeIsChildOf(node, ancestor)
{
    if (node)
    {
        if (node.parentNode == ancestor)
            return true; else
            return nodeIsChildOf(node.parentNode, ancestor)
    }
    return false;
}
function substituteSpans(parentNode, replacements)
{
    Object.keys(replacements).forEach(function(key)
    {
        var spans = getElementsByTagAndClassName(parentNode, "span", key);
        spans.forEach(function(node)
        {
            var contentType = replacements[key][0];
            var newContent = replacements[key][1];
            if (contentType == "text")
            {
                removeAllChildNodes(node);
                node.appendChild(document.createTextNode(newContent));
            }
            else if (contentType == "html")
            {
                node.innerHTML = newContent;
            }
        });
    });
}
Element.addMethods({selectFirst:function(element, tag_name) {
    var elements = $(element).select(tag_name);
    return(elements.length > 0) ? $(elements[0]) : null;
},appendChildrenFromMarkup:function(element, markup)
{
    element = $(element);
    try
    {
        detectBrowser();
        if (windowsInternetExplorer && browserVersion == 7)
        {
            element.insertAdjacentHTML("beforeEnd", markup);
        }
        else
        {
            var dummyDiv = $(document.createElement('div'));
            dummyDiv.innerHTML = markup;
            dummyDiv.immediateDescendants().each(function(child) {
                element.appendChild(child);
            });
        }
    }
    catch(e)
    {
    }
    return element;
},ensureHasLayoutForIE:function(element)
{
    element = $(element);
    detectBrowser();
    if (windowsInternetExplorer && browserVersion < 7)
    {
        if (!element.currentStyle.hasLayout)
        {
            element.style.zoom = 1;
        }
    }
},setFilter:function(element, filterName, filterParams)
{
    element = $(element);
    var regex = new RegExp(filterName + '\\([^\\)]*\\);', 'gi');
    element.style.filter = element.style.filter.replace(regex, '') +
                           filterName + '(' + filterParams + '); ';
    return element;
},killFilter:function(element, filterName)
{
    element = $(element);
    var regex = new RegExp(filterName + '\\([^\\)]*\\);', 'gi');
    element.style.filter = element.style.filter.replace(regex, '');
    return element;
}});
function IWURL(urlString)
{
    try
    {
        if ((arguments.length == 0) || (arguments.length == 1 && (urlString == "" || urlString == null)))
        {
            this.p_initWithParts(null, null, null, null, null);
        }
        else if (arguments.length == 1)
        {
            urlString.replace("file://localhost/", "file:///");
            var urlParts = urlString.match('/^([A-Z]+):\/\/([^/]*)((\/[^?#]*)(\?([^#]*))?(#(.*))?)?/i');
            if (urlParts)
            {
                this.p_initWithParts(urlParts[1], urlParts[2], urlParts[4] || "/", urlParts[6] || null, urlParts[8] || null);
            }
            else
            {
                urlParts = urlString.match(/^([^?#]*)(\?([^#]*))?(#(.*))?/);
                if (urlParts)
                {
                    this.p_initWithParts(null, null, urlParts[1], urlParts[3] || null, urlParts[5] || null);
                }
                else
                {
                }
            }
        }
    }
    catch(e)
    {
        print("Exception Parsing URL:" + e);
    }
}
Object.extend(IWURL, {p_normalizePathComponents:function(components)
{
    var index = 0;
    while (index < components.length)
    {
        var component = components[index];
        if (component == "" || component == ".")
        {
            components.splice(index, 1);
        }
        else if (component == "..")
        {
            if (index > 0)
            {
                var previousComponent = components[index - 1];
                if (previousComponent == "/")
                {
                    components.splice(index, 1);
                }
                else if (previousComponent != "..")
                {
                    components.splice(index - 1, 2);
                    index -= 1;
                }
                else
                {
                    index += 1;
                }
            }
            else
            {
                index += 1;
            }
        }
        else
        {
            index += 1;
        }
    }
    return components;
}});
Object.extend(IWURL.prototype, {p_initWithParts:function(inProtocol, inAuthority, inPath, inQuery, inFragment)
{
    this.mProtocol = inProtocol;
    this.mAuthority = inAuthority;
    this.mQuery = inQuery;
    this.mFragment = inFragment;
    this.mPathComponents = null;
    if (inPath)
    {
        this.mPathComponents = inPath.split('/');
        if (this.mPathComponents[0] == "")
            this.mPathComponents[0] = '/';
        for (var i = 0; i < this.mPathComponents.length; ++i)
        {
            this.mPathComponents[i] = decodeURIComponent(this.mPathComponents[i]);
        }
        this.mPathComponents = IWURL.p_normalizePathComponents(this.mPathComponents);
    }
},copy:function()
{
    var copy = new IWURL();
    copy.mProtocol = this.mProtocol;
    copy.mAuthority = this.mAuthority;
    copy.mQuery = this.mQuery;
    copy.mFragment = this.mFragment;
    copy.mPathComponents = null;
    if (this.mPathComponents)
    {
        copy.mPathComponents = [];
        for (var i = 0; i < this.mPathComponents.length; ++i)
        {
            copy.mPathComponents[i] = String(this.mPathComponents[i]);
        }
    }
    return copy;
},toString:function()
{
    var path = "null";
    if (this.mPathComponents)
    {
        path = "";
        this.mPathComponents.each(function(component)
        {
            if (path == "")
                path = "[ " + component; else
                path += ", " + component;
        });
        if (path == "")
            path = "[]"; else
            path += " ]";
    }
    var result = "{" + this.mProtocol + ", " + this.mAuthority + ", " + path + ", " + this.mQuery + ", " + this.mFragment + "}";
    return result;
},isAbsolute:function()
{
    return(this.mPathComponents && this.mPathComponents.length && this.mPathComponents[0] == "/");
},isRelative:function()
{
    return(this.mProtocol == null);
},encodedPathComponents:function()
{
    var result = [];
    var index = 0;
    while (index < this.mPathComponents.length)
    {
        if ((index == 0) && (this.mPathComponents[0] == "/"))
        {
            result.push("/");
        }
        else
        {
            result.push(encodeURIComponent(this.mPathComponents[index]));
        }
        index += 1;
    }
    return result;
},encodedPath:function()
{
    if (this.isAbsolute())
    {
        return"/" + this.encodedPathComponents().slice(1).join("/");
    }
    else
    {
        return this.encodedPathComponents().join("/");
    }
},toURLString:function()
{
    if (this.isRelative())
    {
        return this.encodedPath() +
               (this.mQuery ? "?" + this.mQuery : "") +
               (this.mFragment ? "#" + this.mFragment : "");
    }
    else
    {
        return this.mProtocol + ":" + "//" + this.mAuthority + this.encodedPath() +
               (this.mQuery ? "?" + this.mQuery : "") +
               (this.mFragment ? "#" + this.mFragment : "");
    }
},isEqual:function(that)
{
    var pathMatches = true;
    if ((this.mPathComponents) && (that.mPathComponents) && (this.mPathComponents.length == that.mPathComponents.length))
    {
        for (var index = 0; index < this.mPathComponents.length; ++index)
        {
            if (this.mPathComponents[index] != that.mPathComponents[index])
            {
                pathMatches = false;
                break;
            }
        }
    }
    else
    {
        pathMatches = false;
    }
    return(this.mProtocol == that.mProtocol) && (this.mAuthority == that.mAuthority) && pathMatches && (this.mQuery == that.mQuery) && (this.mFragment == that.mFragment);
},resolve:function(base)
{
    if (!this.isRelative())
        return new IWURL(this.toURLString());
    var resolved = base.copy();
    resolved.mQuery = null;
    resolved.mFragment = null;
    if (resolved.mPathComponents == null)
    {
        resolved.mPathComponents = [];
    }
    this.mPathComponents.each(function(component)
    {
        resolved.mPathComponents.push(component);
    });
    resolved.mPathComponents = IWURL.p_normalizePathComponents(resolved.mPathComponents);
    return resolved;
},relativize:function(base)
{
    if (base && (base.mPathComponents && base.mPathComponents.length > 0) && (this.mProtocol == base.mProtocol) && (this.mAuthority == base.mAuthority))
    {
        var commonAncestorIndex = 0;
        for (var index = 0; index < Math.min(this.mPathComponents.length, base.mPathComponents.length); ++index)
        {
            if (this.mPathComponents[index] == base.mPathComponents[index])
                commonAncestorIndex = index; else
                break;
        }
        var relativePath = [];
        for (var up = base.mPathComponents.length - 1; up > commonAncestorIndex; --up)
        {
            relativePath.push("..");
        }
        for (var down = commonAncestorIndex + 1; down < this.mPathComponents.length; ++down)
        {
            relativePath.push(this.mPathComponents[down]);
        }
        var relativized = new IWURL();
        relativized.mPathComponents = IWURL.p_normalizePathComponents(relativePath);
        relativized.mQuery = this.mQuery;
        relativized.mFragment = this.mFragment;
        return relativized;
    }
    else
    {
        return this.copy();
    }
}});
