(function($){
    /**
     * Thumbs class constructor
     * 
     * @param DOMElement element
     */
    var Thumbs = function(element){
        var _index = 0;
        var _this = this;
        var _element = $(element);
        var _length = _element.find('li').length;
        var _next = _element.parent('div').siblings('a[href=next]');
        var _prev = _element.parent('div').siblings('a[href=prev]');
        /**
         * Focus on the clicked thumb
         * 
         * @param DOMEvent event
         */
       _this.focus = function(event){
            event.preventDefault();
            var imageUrl = $(this).attr('href');
            var imageAlt = $(this).find('img').attr("alt");
            var imageTarget = $($(this).attr('target'));
            var previousImage = imageTarget.find('img');
            var nextImage = $('<img>').attr('src', imageUrl).attr('alt', imageAlt);
            imageTarget.prepend(nextImage);
            nextImage.load(function(event){
                previousImage.fadeOut('slow', function(){
                    previousImage.remove();
                });
            });
        };
        /**
         * Handle toggling of prev and next buttons
         * 
         */
        _this.checkButtons = function(){
            // can it go next ?
            var nextIndex = _index + 6;
            (nextIndex >= _length) ? _next.hide() : _next.show();
            var prevIndex = _index -1;
            (prevIndex < 0) ? _prev.hide() : _prev.show();
        };
        /**
         * Go forward
         *
         * @param DOMEvent event
         */
        _this.next = function(event){
            event.preventDefault();
            _element.animate({left: "-=136"}, 'fast', function(){
                 _index++;
                _this.checkButtons();
            });
        };
        /**
         * Go backwards
         * 
         * @param DOMEvent event
         */
        _this.prev = function(event){
            event.preventDefault();
            _element.animate({left: "+=136"}, 'fast', function(){
                _index--;
                _this.checkButtons();
            });
        };
        /**
         * Instance init
         * 
         */
        _this.init = function(){
            _this.checkButtons();
            _next.click(_this.next);
            _prev.click(_this.prev);
            _element.find('li a').click(_this.focus);
        };
        // Init
        _this.init();
    };
    /**
     * Namespace in jQuery
     * 
     */
    $.fn.thumbs = function(){
        return this.each(function(){
			new Thumbs(this);
		});
    };
    /**
     * Heritage class constructor
     *
     * @param DOMElement element
     */
    var Heritage = function(element){
        var _this = this;
        var _element = $(element);
        var _story = $(element).parent('div').find('.story');
        /**
         * Go to the specified story part
         * @param event
         */
        _this.goto = function(event){
            event.preventDefault();
            var timelineItem = $(this).parent('li');
            _element.find('.current').removeClass('current');
            timelineItem.addClass('current');
            var currentStory = _story.find('.current');
            var targetStory = $($(this).attr('href'));
            var offset = $(currentStory).position().left - $(targetStory).position().left;
            currentStory.removeClass('current');
            targetStory.addClass('current');
            _story.animate({
                'left': '+=' + offset
            });
        };
        /**
         * Instance init
         *
         */
        _this.init = function(){
            var currentStep = _element.find('li:first-child');
            var currentStory = $(currentStep.find('a').attr('href'));
            currentStep.addClass('current');
            currentStory.addClass('current');
            _element.find('a').click(_this.goto);
        };
        // Init
        _this.init();
    };
    /**
     * Namespace in jQuery
     *
     */
    $.fn.heritage = function(){
        return this.each(function(){
           new Heritage(this);
        });
    };
    /**
     * Newsletter form class constructor
     *
     * @param DOMElement element
     */
    var NewsletterForm = function(element){
        var _this = this;
        var _element = $(element);
        /**
         * Instance init
         * 
         */
        _this.init = function(){
            _element.find('input').each(function(offset, element){
               $(element).data('default', $(element).val());
            });
            _element.find('input').focus(function(event){
                if($(this).val() === $(this).data('default')){
                    $(this).val('');
                }
            });
            _element.find('input').blur(function(event){
                if($(this).val() === ''){
                    $(this).val($(this).data('default'));
                }
            });
        };
        // Init
        _this.init();
    };
    /**
     * Namespace in jQuery
     *
     */
    $.fn.newsletterForm = function(){
        return this.each(function(){
           new NewsletterForm(this);
        });
    };
    /**
     * Tip list class constructor
     *
     * @param DOMElement element
     */
    var TipList = function(element){
        var _this = this;
        var _element = $(element);

        _this.open = function(toOpen){
            _element.find('dd').hide();
            _element.find('dt.active').removeClass('active');
            toOpen.addClass('active');
            toOpen.next('dd').show();
        };
        _this.click = function(event){
            _this.open($(this));
        };
        /**
         * Instance init
         *
         */
        _this.init = function(){
            _this.open(_element.find('dt.active'));
            _element.find('dt').click(_this.click);
        };
        // Init
        _this.init();
    };
    /**
     * Namespace in jQuery
     */
    $.fn.tipList = function(){
        return this.each(function(){
            new TipList(this);
        });
    };
    /**
     * Menu class constructor
     *
     * @param DOMElement element
     */
    var Menu = function(element){
        var _this = this;
        var _element = $(element);
        var _status = 'closed';
        var _openTimeOut;
        var _closeTimeOut;
        /**
         * Open the submenu
         * 
         * @param DOMEvent event
         */
        _this.open = function(event){
            $(this).children('a').addClass('active');
            if(_status !== 'opening'){
                var listElement = $(this);
                var submenu = $(this).find('.submenu');
                if(submenu.length > 0){
                    window.clearTimeout(_closeTimeOut);
                    _status = 'opening';
                    _openTimeOut = window.setTimeout(function(){
                        listElement.addClass('open');
                        submenu.slideDown('fast');
                        _status = 'open';
                    }, 300);
                }
            }
        };
        /**
         * Close the submenu
         * 
         * @param DOMEvent event
         */
        _this.close = function(event){
            $(this).children('a').removeClass('active');
            if(_status !== 'closing'){
                var listElement = $(this);
                var submenu = $(this).find('.submenu');
                if(submenu.length > 0){
                    window.clearTimeout(_openTimeOut);
                    _status = 'closing';
                    _closeTimeOut = window.setTimeout(function(){
                        submenu.slideUp('fast', function(){
                            listElement.removeClass('open');
                        });
                        _status = 'closed';
                    }, 300);
                }
            }
        };
        /**
         * Instance init
         *
         */
        _this.init = function(){
            _element.children('li').hover(_this.open, _this.close);
        };
        // Init
        _this.init();
    };
    /**
     * Namespace in jQuery
     */
    $.fn.menu = function(){
        return this.each(function(){
            new Menu(this);
        });
    };
    /**
     * Namespace in jQuery
     */
    $.fn.bigLinks = function(){
        return this.each(function(){
            if($(this).find('a').length !== 0){
                $(this).css('cursor', 'pointer');
                $(this).click(function(event){
                window.location.href = $(this).find('a').attr('href');
                });
            }
        });
    };
    // Domready
    $(document).ready(function(event){
        $('.product-thumbs').thumbs();
        $('.timeline').heritage();
        $('.newsletter-form').newsletterForm();
        $('.tip-list dl.tips').tipList();
        $('.box, .tips-categories li div, .product-categories li').bigLinks();
        $('ul.navigation').menu();
    });
})(jQuery);
