    var MstkHelpers = {
        qsVar: function(key){
            var val = false;
            if(key.length > 0){
                $ES('script').each(function(s){
                    if(s.src.match('moostick.js?')){
                        var uriParts = s.src.split('?');
                        if(uriParts[1]){
                            uriParts[1].split('&').each(function(keyPair){
                                var tmp = keyPair.split('=');
                                if(tmp[1] && tmp[0] == key)
                                    val = tmp[1];
                            });
                        }
                    }
                });
            }
            return val;
        },
        checkArray: function(val){
            if(!val[0])
                return [val];
            else
                return val;
        }    
    }
    if(MstkHelpers.qsVar('init') !== 'false'){
        window.addEvent('domready', function() {
            MstkInit.go(false, true);
        });
    }
    var MstkInit = {    
        lists        : false,
        autoStart    : false,
        interval     : 2500,
        fxOptions    : {},
        trust4Speed  : false,
        trustOpacity : false,
        go: function(lists, autoStart, interval, fxOptions, trust4Speed, trustOpacity) {
            this.lists        = (!lists)
                              ? this.lists
                              : lists;
            this.autoStart    = (autoStart === true)
                              ? autoStart
                              : this.autoStart;          
            this.interval     = (!interval) || (interval.toInt() < 500)
                              ? this.interval
                              : interval.toInt();  
            this.fxOptions    = ((!fxOptions) || (typeof(fxOptions) != 'object'))
                              ? this.fxOptions
                              : fxOptions;
            this.trust4Speed  = (trust4Speed === true)
                              ? trust4Speed
                              : this.trust4Speed;            
            this.trustOpacity = (trustOpacity === true)
                              ? trustOpacity
                              : this.trustOpacity;    
            if(this.autoStart === true){
                if(this.trust4Speed === true){
                    this._fastMode();
                }
                else{
                    this._safeMode();
                }
            }
        },
        _fastMode: function(){
            this.lists = MstkHelpers.checkArray(this.lists);
            this.lists.each(function(list){
                new Moostick(
                    list,
                    this.autoStart,
                    this.interval,
                    this.fxOptions,
                    this.trust4Speed,
                    this.trustOpacity
                )
            }, this);
        },
        _safeMode: function(){           
            if(this.lists === false){
                var defaultLists = false;
                if($('moostick'))
                    defaultLists = [$('moostick')];
                else if($$('.moostick'))
                    defaultLists = $$('.moostick');                
                this.lists = (!defaultLists) ? false : defaultLists;
            }    
            if(this.lists){
                this.lists = MstkHelpers.checkArray(this.lists);
                this.lists.each(function(list){
                    new Moostick(
                        list,
                        this.autoStart,
                        this.interval,
                        this.fxOptions,
                        this.trust4Speed,
                        this.trustOpacity
                    )
                }, this);
            }
        }    
    } 
    var Moostick = Class({
        version      : '1.0',
        list         : {},
        autoStart    : false,
        interval     : 3500,
        fxOptions    : {},
        trust4Speed  : false,
        trustOpacity : false,
        _firstRun    : true,
        _elSched     : null,
        _fx: false,
        initialize: function(list, autoStart, interval, fxOptions, trust4Speed, trustOpacity) {
            this.list         = ((!list) || (typeof(list) != 'object'))
                              ? this.list
                              : list;    
            this.autoStart    = (autoStart === true)
                              ? autoStart
                              : this.autoStart;            
            this.interval     = (!interval) || (interval.toInt() < 500)
                              ? this.interval
                              : interval.toInt();            
            this.fxOptions    = ((!fxOptions) || (typeof(fxOptions) != 'object'))
                              ? this.fxOptions
                              : fxOptions;            
            this.trust4Speed  = (trust4Speed === true)
                              ? trust4Speed
                              : this.trust4Speed;           
            this.trustOpacity = (trustOpacity === true)
                              ? trustOpacity
                              : this.trustOpacity;           
            this.list.moostick = this;           
            if(this.autoStart === true){
                if(this.trust4Speed === true){
                    this._fastMode();
                }
                else{
                    this._safeMode();
                }
            }
        },       
        startTick: function(list, interval, fxOptions, trust4Speed, trustOpacity){
            this.initialize(list, true, interval, fxOptions, trust4Speed, trustOpacity);
        },
        stopTick: function(){
            this.list.$events.mouseenter = false;
            this.list.$events.mouseleave = false;
            this.pauseTick();
        },
        pauseTick: function(){
            this._elSched = $clear(this._elSched);
        },    
        resumeTick: function(){
            this._schedule();
        },
        _fastMode: function(){
            this._liHandler();
            this._schedule();
        },
        _safeMode: function(){    
            if(this.list){ 
                if($ES('li', this.list)){
                    var items = $ES('li', this.list);
                    if(!this.list.hasClass('moostick')) this.list.addClass('moostick');
                    var noStyle = false;
                    if( this.list.getStyle('overflow') != 'hidden'
                        || items[0].getStyle('display') != 'block'
                        || items[0].getStyle('list-style-type') != 'none'){
                        noStyle = true;
                    }                        
                    if(noStyle){                
                        this.list.setStyles({
                            'display' : 'block',
                            'height'  : '1.1em',
                            'margin'  : 0,
                            'padding' : '2px 0 2px 0',
                            'overflow': 'hidden'
                        });                       
                        this._liHandler({
                            'display'        : 'block',
                            'list-style-type': 'none',
                            'margin'         : '0 auto 0 auto',
                            'padding'        : 0
                        });
                    }
                    else{
                        this._liHandler();
                    }
                    this._schedule();
                }
            }
        },
        _setMouseEvents: function(){  
            this.list.addEvents({
                'mouseenter': function(){
                    this.moostick.pauseTick();
                },
                'mouseleave': function(){
                    this.moostick.resumeTick();
                }
            });
        },       
        _liHandler: function(styles){
            if((!styles) || (typeof(styles) != 'object')) styles = false;
            if((this.trustOpacity !== true) || (styles !== false)){                
                $ES('li', this.list).each(function(li){
                    if(styles !== false) li.setStyles(styles);
                    if(this.trustOpacity !== true)
                        li.setOpacity(0);
                });
            }
        },        
        _schedule: function(){
            if(!this._elSched){
                var firstItem = $E('li', this.list);
                if(firstItem.getStyle('opacity') != 1)
                    this._fadeIn(firstItem);
                else if(this._firstRun === true)
                    this._fadeIn(firstItem);
                this._elSched = this._run.periodical(
                    this.interval,
                    this,
                    this.list
                );
                listEvents = this.list.$events;
                if(!listEvents)
                    this._setMouseEvents();
                else if((!listEvents.mouseenter) && (!listEvents.mouseleave))
                    this._setMouseEvents();
            }
        },        
        _run: function(){
            var items = $ES('li', this.list);
            if(items[1]){
                items[0].injectAfter(items.getLast());
                this._fadeIn(items[1]);
                $ES('li', this.list).getLast().setOpacity(0);
            }
        },
        _fadeIn: function(item){
            this._fx = item.effect('opacity', this.fxOptions).start(0,1);
            this._firstRun = false;
        }
    });
