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   : '/' };
  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) {
    var self = this; // event set 4 gecko css selecter
    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
*/
