/**
 * Stolen from baseJS
 * http://paularmstrongdesigns.com/projects/basejs/
 */
$.extend(Function.prototype, {
    /**
     * Override scope of a function.
     * @param oScope     {object}      Object to override the scope of the function.
     * @param arguments  {*}           Any additional arguments to pass.
     */
    use: function() {
		var method = this, args = Array.prototype.slice.call(arguments), object = args.shift();
		return function() {
			return method.apply(object, args.concat(Array.prototype.slice.call(arguments)));
		}
    },
    /**
     * Override scope of a callback function on an event.
     * @param oScope     {object}      Object to override the scope of the function.
     * @param arguments  {*}           Any additional arguments to pass.
     */
    useEL: function() {
        var method = this, args = Array.prototype.slice.call(arguments), object = args.shift();
        return function(event) {
            return method.apply(object, [event || window.event].concat(Array.prototype.slice.call(arguments)));
        }
    }
});

var Specials = function() {
    this.els = {
        list: $(Specials.sels.list),
        items: $(Specials.sels.items),
        nav: $(Specials.els.nav)
    };
    
    this.currentKey = 0;

    this.initDisplay();
           
    this.els.prevLink.bind('click', this.prevItem.useEL(this));
    this.els.nextLink.bind('click', this.nextItem.useEL(this));
    
    this.startTimer();
};
$.extend(Specials.prototype, {
    prevItem: function(event) {
        if(event) {
            event.preventDefault();
            event.stopPropagation();
            if(this.timer) { clearTimeout(this.timer); }
        } else {
            this.startTimer();
        }
        
        var prev = (this.currentKey == 0) ? this.els.items.length-1 : this.currentKey-1;
        this.swapToItem(prev);
    },
    nextItem: function(event) {
        if(event) {
            event.preventDefault();
            event.stopPropagation();
            if(this.timer) { clearTimeout(this.timer); }
        } else {
            this.startTimer();
        }
        
        var next = (this.currentKey == this.els.items.length-1) ? 0 : this.currentKey+1;
        this.swapToItem(next);
    },
    startTimer: function() {
        this.timer = setTimeout(function() {
            this.nextItem();
        }.use(this), Specials.swapDelay + Specials.fadeTime);
    },
    swapToItem: function(key) {
        $(this.els.items.get(this.currentKey)).fadeOut(Specials.fadeTime);
        $(this.els.items.get(key)).fadeIn(Specials.fadeTime);
        
        this.currentKey = key;
        this.els.countCur.text(Specials.zeroPad(this.currentKey+1));
    },
    initDisplay: function() {
        this.els.list.addClass('interactive').after(this.els.nav);

        $.extend(this.els, {
            prevLink: this.els.nav.find(Specials.sels.prevLink),
            nextLink: this.els.nav.find(Specials.sels.nextLink),
            countCur: this.els.nav.find(Specials.sels.countCur),
            countTot: this.els.nav.find(Specials.sels.countTot)
        });

        var maxHeight = 0;
        var i = this.els.items.length;
        while(i--) {
            var $item = $(this.els.items[i]).hide();
            
            var itemHeight = $item.height();
            if(itemHeight > maxHeight) {
                maxHeight = itemHeight;
            }
        }
        $(this.els.items[0]).show();
        this.els.list.height(maxHeight);
        
        if($('#columns').length) {
            if($(Specials.sels.module).find('.content').height() < $(Specials.sels.contactModule).find('.content').height()) {
                $(Specials.sels.module).find('.content').height($(Specials.sels.contactModule).find('.content').height())
            } else {
                $(Specials.sels.contactModule).find('.content').height($(Specials.sels.module).find('.content').height())
            }
        }
        
        this.els.countCur.text(Specials.zeroPad(1));
        this.els.countTot.text(Specials.zeroPad(this.els.items.length));
    }
});
$.extend(Specials, {
    init: function() {
        Specials.instance = new Specials();
    },
    sels: {
        list: 'ul.specialList',
        items: 'ul.specialList li',
        prevLink: '.left',
        nextLink: '.right',
        countCur: '.countCur',
        countTot: '.countTot',
        module: '.module.specials',
        contactModule: '.module.keepPosted'
    },
    els: {
        nav: '<ul class="specialNav"><li><a class="replaced left" href="#prev">Previous</a></li><li class="count"><span class="countCur"></span> <span class="replaced of">of</span> <span class="countTot"></span></li><li><a class="replaced right" href="#next">Next</a></li></ul>'
    },
    zeroPad: function(num) {
        if( num < 10 ) {
            num = '0'+num;
        }
        return num;
    },
    startDelay: 0,
    fadeTime: 1500,
    swapDelay: 6000
});

var Slideshow = function() {
    this.els = {
        container: $(Slideshow.sels.container),
        slides: $(Slideshow.sels.slides)
    }
    
    this.currentSlide = 0;
    
    this.initDisplay();
    
    this.els.container.bind('click', this.stopTimer.useEL(this));
    this.els.container.bind('click', this.checkLoadedAndSwap.useEL(this));
    
    this.timer = setTimeout(function() {
        this.startTimer();
    }.use(this), Slideshow.startDelay)
};
$.extend(Slideshow.prototype, {
    initDisplay: function() {
        this.els.container.addClass('interactive');
        
        this.els.slides.hide();
        
        this.preload($(this.els.slides.get(this.currentSlide)), this.currentSlide, this.attachImage.use(this));
        $(this.els.slides.get(this.currentSlide)).show();
        
        this.auto = true;
        
        var i = -1;
        while(i++ < this.els.slides.length) {
            var thisSlide = $(this.els.slides.get(i));
            //var thisLink = thisSlide.find(Slideshow.sels.link).attr('href');
            //thisSlide.prepend('<a class="bigLink" href="'+thisLink+'"></a>');
            this.preload(thisSlide, i, this.attachImage);
        }
    },
    attachImage: function(slide, image) {
        slide.css({ backgroundImage: 'url('+image+')'});
    },
    preload: function(slide, key, callback) {
        var img = new Image();
        var callback = (callback) ? callback : function() {};

        img.onload = function() {
            slide.trigger('loadingComplete');
            slide.data('loaded', true)
            callback(slide, img.src);
        };
        
        img.onerror = function() {
            slide.trigger('loadingError');
        };
        
        img.src = '/img/slides-'+key+'.jpg';
    },
    startTimer: function() {
        this.timer = setTimeout(function() {
            this.checkLoadedAndSwap();
        }.use(this), Slideshow.swapDelay+Slideshow.fadeTime);
    },
    stopTimer: function() {
        this.auto = false;
        if(this.timer) { clearTimeout(this.timer); }
    },
    checkLoadedAndSwap: function(e) {
        this.nextSlide = (this.currentSlide+1 == this.els.slides.length) ? 0 : this.currentSlide+1;
        
        var nextSlide = $(this.els.slides.get(this.nextSlide));
        if(!nextSlide.data('loaded')) {
            nextSlide.bind('loadingComplete', this.swapSlides.useEL(this));
        } else {
            this.swapSlides();
        }
    },
    swapSlides: function() {
        $(this.els.slides.get(this.nextSlide)).fadeIn(Slideshow.fadeTime);
        $(this.els.slides.get(this.currentSlide)).fadeOut(Slideshow.fadeTime);
        
        this.currentSlide = this.nextSlide;
        
        if(this.auto) {
            this.startTimer();
        }
    }
});
$.extend(Slideshow, {
    init: function() {
        Slideshow.instance = new Slideshow();
    },
    sels: {
        container: '#slideshow',
        slides: '.slide',
        link: 'h2 a'
    },
    startDelay: 10000,
    fadeTime: 1500,
    swapDelay: 6000
});

$(document).ready(function() {
	
   if( $('.module.specials').length ) {
       Specials.init();
   }
   
   if( $('#slideshow').length ) {
       Slideshow.init();
   }

   $('input, textarea').focus(function() {
       $(this).siblings('label').fadeOut(200);
   });
   $('input, textarea').blur(function() {
       if(/^\s*$/.test($(this).attr('value'))) {
           $(this).siblings('label').fadeIn(300);
       }
   });
   $('label').click(function() {
       $(this).fadeOut(200);
       $(this).siblings('input, textarea').focus();
   });
   // check inputs on page load for default content
   $('input, textarea').each(function() {
       if($(this).attr('value') != '') {
           $(this).siblings('label').hide();
       }
   });
   
   $('input[type=submit]').attr('value', '');
  
});