Daisuke Murase - CSS.Change-0.02

Documentation | Source

NAME

CSS.Change - Change Stylesheet to altenative one.

SYNOPSIS

    // in HTML <head>
    <link rel="stylesheet" type="text/css" href="style1.css" title="default" />
    <link rel="alternate stylesheet" type="text/css" href="style2.css" title="style2" />
    <link rel="alternate stylesheet" type="text/css" href="style3.css" title="style3" />

    // in javascript
    var css = new CSS.Change({
        cookie_name : 'css',
        cookie_expires : 0
    });

    // and in HTML
    <a href="javascript:css.change('style2')">style2</a>
    <a href="javascript:css.change('style3')">style3</a>

DESCRIPTION

CSS.Change is a class for changing main stylesheet to other altenate it.

SEE ALSO

HTTP.Cookies

AUTHOR

Daisuke Murase, <typester@cpan.org>

COPYRIGHT

Copyright 2005 Daisuke Murase. All rights reserved.

LICENSE

This library is free software; you can redistribute it and/or modify it under the terms of the "Artistic License": http://dev.perl.org/licenses/artistic.html.

try {
    JSAN.use('HTTP.Cookies');
} catch (e) {
    throw 'HTTP.Cookies requires JSAN to be loaded';
}


if (!CSS) var CSS = {};

CSS.Change = function(settings) {
    this._cookie = new HTTP.Cookies();
    this._styles = [];

    this._settings = {
        cookie_name : 'css',
        cookie_expire : 'now',
        cookie_path : '/index.html'
    };

    if (settings) this.setting(settings);

    this._getStyles();

    var cookie_name = this._cookie.read(this._settings.cookie_name);
    if (cookie_name) this.change(cookie_name);

    if (window.addEventListener && !window.opera) {
        // event set for gecko css selecter
        var self = this;
        window.addEventListener('unload', function(e){ return self._onunload(e) }, true);
    }
};

CSS.Change.VERSION = '0.02';

CSS.Change.prototype = {

    setting : function(settings) {
        for(var i in settings) {
            this._settings[i] = settings[i];
        }
    },

    _getStyles : function() {
        var headnodes = document.getElementsByTagName('head')[0].childNodes;
        for(var i in headnodes) {
            var node = headnodes[i];
            if(node.nodeName != 'LINK') continue;
            if(node.rel != 'stylesheet' && node.rel != 'alternate stylesheet') continue;
            if(node.title == '') continue;

            this._styles.push(node);
        }
    },

    change : function(style) {
        var target;

        for (var i in this._styles) {
            if (this._styles[i].title == style) {

                if (this._styles[i].disabled) this._setCookie(style);
                for (var j in this._styles) {
                    this._styles[j].disabled = true;
                }
                this._styles[i].disabled = false;
                
                break;
            }
        }
    },

    _setCookie : function(style) {
        this._cookie.write(
            this._settings.cookie_name,
            style,
            this._settings.cookie_expire,
            this._settings.cookie_path
        );
    },
    
    _onunload : function() {
        for (var i in this._styles) {
            if (!this._styles[i].disabled) {
                this._setCookie(this._styles[i].title);
                break;
            }
        }
    }
};

/*

=head1 NAME

CSS.Change - Change Stylesheet to altenative one.

=head1 SYNOPSIS

    // in HTML <head>
    <link rel="stylesheet" type="text/css" href="style1.css" title="default" />
    <link rel="alternate stylesheet" type="text/css" href="style2.css" title="style2" />
    <link rel="alternate stylesheet" type="text/css" href="style3.css" title="style3" />

    // in javascript
    var css = new CSS.Change({
        cookie_name : 'css',
        cookie_expires : 0
    });

    // and in HTML
    <a href="javascript:css.change('style2')">style2</a>
    <a href="javascript:css.change('style3')">style3</a>

=head1 DESCRIPTION

CSS.Change is a class for changing main stylesheet to other altenate it.

=head1 SEE ALSO

HTTP.Cookies

=head1 AUTHOR

Daisuke Murase, E<lt>typesterE<64>cpan.orgE<gt>

=head1 COPYRIGHT

Copyright 2005 Daisuke Murase. All rights reserved.

=head1 LICENSE

This library is free software; you can redistribute it and/or modify
it under the terms of the "Artistic License":
L<http://dev.perl.org/licenses/artistic.html>.

=cut

*/