
var styleSwitcherCookieName       = 'styleSwitcher';
var styleSwitcherCookieLifeInDays = 365;

var styleSwitcherDefaultSize = 13;
var styleSwitcherDefaultFont = 'verdana';

var styleSwitcherMinSize     = 12;
var styleSwitcherMaxSize     = 14;

var updateMainHeight;

//----------------------------------------------------------

function getDefaultStyleSheets ()
{
    return styleSwitcherDefaultFont + '|size' + styleSwitcherDefaultSize;
}

//----------------------------------------------------------

// Loop over all stylesheets with the attribute "title"
// and either enable or disable them depending on the
// current settings.
//
function setActiveStyleSheets (styleSheets)
{
    if (! styleSheets) return;

    var styleSheetsParts = styleSheets.split('|');

    var partsHash = {};
    for (var i = 0, len = styleSheetsParts.length; i < len; i++) {
        partsHash[styleSheetsParts[i]] = 1;
    }

    var links = document.getElementsByTagName('link');

    for (var i = 0, len = links.length; i < len; i++) {
        var link = links[i];

        // Skip if no title:
        var title = link.getAttribute('title');
        if (! title) continue;

        // Skip if not a stylesheet:
        if (link.getAttribute('rel').indexOf('stylesheet') == -1) continue;

        link.disabled = partsHash[title] ? false : true;
    }

    if (updateMainHeight) updateMainHeight();
}

// Loop over all stylesheets with the attribute "title"
// and collect the titles of all of them that are active
// (i.e. not disabled).
//
function getActiveStyleSheets ()
{
    var styleSheetsParts = new Object();

    var links = document.getElementsByTagName('link');

    for (var i = 0, len = links.length; i < len; i++) {
        var link = links[i];

        // Skip if no title:
        var title = link.getAttribute('title');
        if (! title) continue;

        // Skip if not a stylesheet:
        if (link.getAttribute('rel').indexOf('stylesheet') == -1) continue;

        // Skip if disabled:
        if (link.disabled) continue;

        styleSheetsParts[title] = 1;
    }

    var styleSheets = new Array();
    for (var part in styleSheetsParts) {
        styleSheets.push(part);
    }

    return styleSheets.join('|');
}

//----------------------------------------------------------

// Loop over all stylesheets with the attribute "title"
// and collect the titles of all of them that are set up
// as "stylesheet" (not "alternate stylesheet").
//
// Should only be called at initial page load.
//
function getPreferredStyleSheets ()
{
    var styleSheetsParts = new Object();

    var links = document.getElementsByTagName('link');

    for (var i = 0, len = links.length; i < len; i++) {
        var link = links[i];

        // Skip if no title:
        var title = link.getAttribute('title');
        if (! title) continue;

        // Skip if not a stylesheet:
        if (link.getAttribute('rel').indexOf('stylesheet') == -1) continue;

        // Skip if an alternate stylesheet:
        if (link.getAttribute('rel').indexOf('alternate') != -1) continue;

        styleSheetsParts[title] = 1;
    }

    var styleSheets = new Array();
    for (var part in styleSheetsParts) {
        styleSheets.push(part);
    }

    return styleSheets.join('|');
}

//----------------------------------------------------------

function setStyleSwitcherCookie (value, days)
{
    var expires = '';
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = '; expires=' + date.toGMTString();
    }

    document.cookie = styleSwitcherCookieName + '=' + value
                                                    + expires
                                                    + '; path=/';
}

function getStyleSwitcherCookie ()
{
    var nameEQ = styleSwitcherCookieName + '=';

    var cookies = document.cookie.split(';');

    for (var i = 0, len = cookies.length; i < len; i++) {
        var c = cookies[i];

        while (c.charAt(0) == ' ') c = c.substring(1, c.length);

        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }

    return '';
}

//----------------------------------------------------------

function increaseSize()
{
    styleSwitcherChangeSize(1);
}

function decreaseSize()
{
    styleSwitcherChangeSize(-1);
}

function styleSwitcherChangeSize (delta)
{
    var styleSheets = getActiveStyleSheets();
    if (!styleSheets) styleSheets = getDefaultStyleSheets;

    var styleSheetsParts = styleSheets.split('|');

    var sizeRegex = new RegExp('^size');

    var newParts = new Object();

    var partsChanged = 0;

    var size = 0;

    for (var i = 0, len = styleSheetsParts.length; i < len; i++) {

        var part = styleSheetsParts[i];

        if (sizeRegex.test(part)) {
            if (size) {
                partsChanged = 1;    // skip extra size part
                continue;
            }

            var originalSize = parseInt(part.replace(/^size/, ''));

            var size = delta + originalSize;
            if (size < styleSwitcherMinSize) {
                size = styleSwitcherMinSize;
            }
            else if (size > styleSwitcherMaxSize) {
                size = styleSwitcherMaxSize;
            }

            if (size != originalSize) {
                newParts['size' + size] = 1;
                partsChanged = 1;
            }
        }
        else {
            newParts[part] = 1;    // keep non-size part
        }
    }

    if (! size) {
        size = styleSwitcherDefaultSize;
        newParts['size' + size] = 1;
        partsChanged = 1;
    }

    if (partsChanged) {
        var styleSheets = new Array();
        for (var part in newParts) {
            styleSheets.push(part);
        }
        setActiveStyleSheets(styleSheets.join('|'));
    }

    if (size == styleSwitcherMinSize) {
        if ($('increaseSize')) {
            $('increaseSize').removeClassName('disabledLink');
        }
        if ($('decreaseSize')) {
            $('decreaseSize').addClassName('disabledLink');
        }
    }
    else if (size == styleSwitcherMaxSize) {
        if ($('increaseSize')) {
            $('increaseSize').addClassName('disabledLink');
        }
        if ($('decreaseSize')) {
            $('decreaseSize').removeClassName('disabledLink');
        }
    }
    else {
        if ($('increaseSize')) {
            $('increaseSize').removeClassName('disabledLink');
        }
        if ($('decreaseSize')) {
            $('decreaseSize').removeClassName('disabledLink');
        }
    }

    if (updateMainHeight) updateMainHeight();
}

//----------------------------------------------------------

YAHOO.util.Event.onDOMReady(function ()
    {
        var styleSheets = getStyleSwitcherCookie();
        if (! styleSheets) styleSheets = getPreferredStyleSheets();
        if (! styleSheets) styleSheets = getDefaultStyleSheets();
        setActiveStyleSheets(styleSheets);

        // This will fix size settings if anything is wrong,
        // it's a no-op otherwise:
        styleSwitcherChangeSize(0);
    }
);

YAHOO.util.Event.addListener(window, 'unload', function ()
    {
        var styleSheets = getActiveStyleSheets();
        setStyleSwitcherCookie(styleSheets, styleSwitcherCookieLifeInDays);
    }
);

