/*
        Background Stretcher jQuery Plugin
        © 2011 ajaxBlender.com
        For any questions please visit www.ajaxblender.com
        or email us at support@ajaxblender.com

        Version: 2.0.1
*/

;(function($){
        /*  Variables  */
        var container = null;
        var allLIs = '', containerStr = '';

        var element = this;
        var _bgStretcherPause = false;
        var _bgStretcherAction = false;
        var _bgStretcherTm = null;
        var random_line = new Array();
        var random_temp = new Array();
        var r_image = 0;
        var swf_mode = false;
        var img_options = new Array();

        $.fn.bgStretcher = function(settings){

                if ($('.bgstretcher-page').length || $('.bgstretcher-area').length) {
                        if(typeof(console) !== 'undefined' && console != null) console.log('More than one bgStretcher');
                        return false;
                }
                settings = $.extend({}, $.fn.bgStretcher.defaults, settings);
                $.fn.bgStretcher.settings = settings;

                function _build(body_content){
                        if(!settings.images.length){ return; }

                        _genHtml(body_content);

                        containerStr = '#' + settings.imageContainer;
                        container = $(containerStr);
                        allLIs = '#' + settings.imageContainer + ' LI';
                        $(allLIs).hide().css({'z-index': 1, overflow: 'hidden'});

                        if(!container.length){ return; }
                        $(window).resize(function(){
                                _resize(body_content)
                        });

                        _resize(body_content);

                        var stratElement = 0;
                        /*  Rebuild images for simpleSlide  */
                        if (settings.transitionEffect == 'simpleSlide') {
                                if (settings.sequenceMode == 'random') {
                                        if(typeof(console) !== 'undefined' && console != null) {
                                                console.log('Effect \'simpleSlide\' don\'t be to use with mode random.');
                                                console.log('Mode was automaticly set in normal.');
                                        }
                                }
                                $(allLIs).css({'float': 'left', position: 'static'});
                                $(allLIs).show();
                                if ($.fn.bgStretcher.settings.slideDirection == 'NW' || $.fn.bgStretcher.settings.slideDirection == 'NE') {
                                        $.fn.bgStretcher.settings.slideDirection = 'N';
                                }
                                if ($.fn.bgStretcher.settings.slideDirection == 'SW' || $.fn.bgStretcher.settings.slideDirection == 'SE') {
                                        $.fn.bgStretcher.settings.slideDirection = 'S';
                                }
                                if ($.fn.bgStretcher.settings.slideDirection == 'S' || $.fn.bgStretcher.settings.slideDirection == 'E') {
                                        settings.sequenceMode = 'back';
                                        $(allLIs).removeClass('bgs-current');
                                        $(allLIs).eq($(allLIs).length - $.fn.bgStretcher.settings.startElementIndex - 1).addClass('bgs-current');
                                        if ($.fn.bgStretcher.settings.slideDirection == 'E') {
                                                l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).width()*(-1);
                                                t = 0;
                                        } else { // S
                                                t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height()*(-1);
                                                l = 0;
                                        }
                                        $(containerStr+' UL').css({left: l+'px', top: t+'px'});
                                } else {
                                        settings.sequenceMode = 'normal';
                                        if ($.fn.bgStretcher.settings.startElementIndex != 0) {
                                                if ($.fn.bgStretcher.settings.slideDirection == 'N') {
                                                        t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height()*(-1);
                                                        l = 0;
                                                } else { // W
                                                        l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).width()*(-1);
                                                        t = 0;
                                                        console.log(l);
                                                }
                                                $(containerStr+' UL').css({left: l+'px', top: t+'px'});
                                        }
                                }
                        }

                        if ($(settings.buttonNext).length || $(settings.buttonPrev).length || $(settings.pagination).length){
                                if (settings.sequenceMode == 'random') {
                                        if(typeof(console) !== 'undefined' && console != null) {
                                                console.log('Don\'t use random mode width prev-button, next-button and pagination.');
                                        }
                                } else {
                                        /*  Prev and Next Buttons init  */
                                        if ($(settings.buttonPrev).length){
                                                $(settings.buttonPrev).addClass('bgStretcherNav bgStretcherNavPrev');
                                                $(settings.buttonPrev).click(function(){
                                                        $.fn.bgStretcher.buttonSlide('prev');
                                                });
                                        }
                                        if ($(settings.buttonNext).length){
                                                $(settings.buttonNext).addClass('bgStretcherNav bgStretcherNavNext');
                                                $(settings.buttonNext).click(function(){
                                                        $.fn.bgStretcher.buttonSlide('next');
                                                });
                                        }
                                        /*  Pagination  */
                                        if ($(settings.pagination).length) {
                                                $.fn.bgStretcher.pagination();
                                        }
                                }
                        }

                        /*  Random mode init  */
                        if (settings.sequenceMode == 'random') {
                                var i = Math.floor(Math.random()*$(allLIs).length);
                                $.fn.bgStretcher.buildRandom(i);
                                if (settings.transitionEffect != 'simpleSlide') {
                                        $.fn.bgStretcher.settings.startElementIndex = i;
                                }
                                stratElement = i;
                        } else {
                                if ($.fn.bgStretcher.settings.startElementIndex > ($(allLIs).length - 1)) $.fn.bgStretcher.settings.startElementIndex = 0;
                                stratElement = $.fn.bgStretcher.settings.startElementIndex;
                                if (settings.transitionEffect == 'simpleSlide') {
                                        if ($.fn.bgStretcher.settings.slideDirection == 'S' || $.fn.bgStretcher.settings.slideDirection == 'E') {
                                                stratElement = $(allLIs).length - 1 - $.fn.bgStretcher.settings.startElementIndex;
                                        }
                                }
                        }

                        $(allLIs).eq(stratElement).show().addClass('bgs-current');
                        $.fn.bgStretcher.loadImg($(allLIs).eq(stratElement));

                        /*  Go slideshow  */
                        if(settings.slideShow && $(allLIs).length > 1){
                                _bgStretcherTm = setTimeout('$.fn.bgStretcher.slideShow(\''+$.fn.bgStretcher.settings.sequenceMode+'\', -1)', settings.nextSlideDelay);
                        }

                };

                function _resize(body_content){
                        var winW = 0;
                        var winH = 0;
                        var contH = 0;
                        var contW = 0;

                        if ($('BODY').hasClass('bgStretcher-container')) {
                                winW = $(window).width();
                                winH = $(window).height();
                                if (($.browser.msie) && (parseInt(jQuery.browser.version) == 6)) {
                                        $(window).scroll(function(){
                                                $('#'+settings.imageContainer).css('top', $(window).scrollTop());
                                        });
                                }
                        } else {
                                $('.bgstretcher').css('position', 'absolute').css('top', '0px');
                                winW = body_content.width();
                                winH = body_content.height();
                        }

                        var imgW = 0, imgH = 0;
                        var leftSpace = 0;

                        //        Max image size
                        if(settings.maxWidth != 'auto'){
                                if (winW > settings.maxWidth){
                                        leftSpace = (winW - settings.maxWidth)/2;
                                        contW = settings.maxWidth;
                                } else contW = winW;
                        } else contW = winW;
                        if(settings.maxHeight != 'auto'){
                                if (winH > settings.maxHeight){
                                        contH = settings.maxHeight;
                                } else contH = winH;
                        } else contH = winH;

                        //        Update container's size
                        container.width(contW);
                        container.height(contH);

                        //        Non-proportional resize
                        if(!settings.resizeProportionally){
                                imgW = contH;
                                imgH = contH;
                        } else {
                                var initW = settings.imageWidth, initH = settings.imageHeight;
                                var ratio = initH / initW;

                                imgW = contW;
                                imgH = Math.round(contW * ratio);

                                if(imgH < contH){
                                        imgH = contH;
                                        imgW = Math.round(imgH / ratio);
                                }
                        }

                        // Anchoring
                        var mar_left = 0;
                        var mar_top = 0;
                        var anchor_arr;
                        if ($.fn.bgStretcher.settings.anchoring != 'left top') {
                                anchor_arr = ($.fn.bgStretcher.settings.anchoring).split(' ');
                                if (anchor_arr[0] == 'right') {
                                        mar_left = (winW - contW);
                                } else {
                                        if (anchor_arr[0] == 'center') mar_left = Math.round((winW - contW)/2);
                                }
                                if (anchor_arr[1] == 'bottom') {
                                        mar_top = (winH - contH);
                                } else {
                                        if (anchor_arr[1] == 'center') {
                                                mar_top = Math.round((winH - contH)/2);
                                        }
                                }
                                container.css('marginLeft', mar_left+'px').css('marginTop', mar_top+'px');
                        }
                        mar_left = 0;
                        mar_top = 0;
                        if ($.fn.bgStretcher.settings.anchoringImg != 'left top') {
                                anchor_arr = ($.fn.bgStretcher.settings.anchoringImg).split(' ');
                                if (anchor_arr[0] == 'right') {
                                        mar_left = (contW - imgW);
                                } else {
                                        if (anchor_arr[0] == 'center') mar_left = Math.round((contW - imgW)/2);
                                }
                                if (anchor_arr[1] == 'bottom') {
                                        mar_top = (contH - imgH);
                                } else {
                                        if (anchor_arr[1] == 'center') {
                                                mar_top = Math.round((contH - imgH)/2);
                                        }
                                }
                        }
                        img_options['mar_left'] = mar_left;
                        img_options['mar_top'] = mar_top;

                        //        Apply new size for images
                        if (container.find('LI:first').hasClass('swf-mode')) {

                                var path_swf = container.find('LI:first').html();
                                container.find('LI:first').html('<div id="bgstretcher-flash">&nbsp;</div>');

                                var header = new SWFObject('flash/stars.swf', 'flash-obj', contW, contH, '9');
                                header.addParam('wmode', 'transparent');
                                header.write('bgstretcher-flash');

                        };
                        img_options['imgW'] = imgW;
                        img_options['imgH'] = imgH;

                        if(!settings.resizeAnimate){
                                container.children('UL').children('LI.img-loaded').find('IMG').css({'marginLeft': img_options["mar_left"]+'px', 'marginTop': img_options["mar_top"]+'px'});
                                container.children('UL').children('LI.img-loaded').find('IMG').css({'width': img_options["imgW"]+'px', 'height': img_options["imgH"]+'px'});
                        } else {
                                container.children('UL').children('LI.img-loaded').find('IMG').animate({'marginLeft': img_options["mar_left"]+'px', 'marginTop': img_options["mar_top"]+'px'}, 'normal');
                                container.children('UL').children('LI.img-loaded').find('IMG').animate({'width': img_options["imgW"]+'px', 'height': img_options["imgH"]+'px'}, 'normal');
                        }

                        $(allLIs).width(container.width()).height(container.height());

                        if ($.fn.bgStretcher.settings.transitionEffect == 'simpleSlide') {
                                if ($.fn.bgStretcher.settings.slideDirection == 'W' || $.fn.bgStretcher.settings.slideDirection == 'E') {
                                        container.children('UL').width(container.width() * $(allLIs).length).height(container.height());
                                        if ( $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) != -1 ){
                                                l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * container.width()*(-1);
                                                container.children('UL').css({left: l+'px'});
                                        }
                                } else {
                                        container.children('UL').height(container.height() * $(allLIs).length).width(container.width());
                                        if ( $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) != -1 ){
                                                t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height()*(-1);
                                                container.children('UL').css({top: t+'px'});
                                        }
                                }
                        }

                };

                function _genHtml(body_content){
                        var code = '';
                        var cur_bgstretcher;

                        body_content.each(function(){
                                $(this).wrapInner('<div class="bgstretcher-page" />').wrapInner('<div class="bgstretcher-area" />');
                                code = '<div id="' + settings.imageContainer + '" class="bgstretcher"><ul>';
                                // if swf
                                if (settings.images.length) {
                                        var ext = settings.images[0].split('.');
                                        ext = ext[ext.length-1];

                                        if (ext != 'swf') {
                                                var ind = 0;
                                                for(i = 0; i < settings.images.length; i++){
                                                        if (settings.transitionEffect == 'simpleSlide' && settings.sequenceMode == 'back')
                                                                ind = settings.images.length-1-i;
                                                                        else ind = i;
                                                        if ($.fn.bgStretcher.settings.preloadImg) {
                                                                        code += '<li><span class="image-path">' + settings.images[ind] + '</span></li>';
                                                                } else {
                                                                        code += '<li class="img-loaded"><img src="' + settings.images[ind] + '" alt="" /></li>';
                                                                }
                                                }
                                        } else {
                                                code += '<li class="swf-mode">' + settings.images[0] + '</li>';
                                        }
                                }

                                code += '</ul></div>';
                                cur_bgstretcher = $(this).children('.bgstretcher-area');
                                $(code).prependTo(cur_bgstretcher);
                                cur_bgstretcher.css({position: 'relative'});
                                cur_bgstretcher.children('.bgstretcher-page').css({'position': 'relative', 'z-index': 3});
                        });

                };

                /*  Start bgStretcher  */
                this.addClass('bgStretcher-container');
                _build(this);
        };

        $.fn.bgStretcher.loadImg = function(obj){
                if (obj.hasClass('img-loaded')) return true;
                obj.find('SPAN.image-path').each(function(){
                        var imgsrc = $(this).html();
                        var imgalt = '';
                        var parent = $(this).parent();
                        var img = new Image();

                        $(img).load(function () {
                                $(this).hide();
                                parent.prepend(this);
                                $(this).fadeIn('100');
                        }).error(function () {
                        }).attr('src', imgsrc).attr('alt', imgalt);

                        $(img).css({'marginLeft': img_options["mar_left"]+'px', 'marginTop': img_options["mar_top"]+'px'});
                        $(img).css({'width': img_options["imgW"]+'px', 'height': img_options["imgH"]+'px'});
                });
                obj.addClass('img-loaded');
                return true;
        }

        $.fn.bgStretcher.play = function(){
       _bgStretcherPause = false;
       $.fn.bgStretcher._clearTimeout();
       $.fn.bgStretcher.slideShow($.fn.bgStretcher.settings.sequenceMode, -1);

        };

        $.fn.bgStretcher._clearTimeout = function(){
       if(_bgStretcherTm != null){
           clearTimeout(_bgStretcherTm);
           _bgStretcherTm = null;
       }
        }

        $.fn.bgStretcher.pause = function(){
           _bgStretcherPause = true;
           $.fn.bgStretcher._clearTimeout();
        };

        $.fn.bgStretcher.sliderDestroy = function(){
                var cont = $('.bgstretcher-page').html();
                $('.bgStretcher-container').html('').html(cont).removeClass('bgStretcher-container');
                $.fn.bgStretcher._clearTimeout();
                _bgStretcherPause = false;
        }

        /*  Slideshow  */
        $.fn.bgStretcher.slideShow = function(sequence_mode, index_next){
                _bgStretcherAction = true;
                if ($(allLIs).length < 2) return true;
                var current = $(containerStr + ' LI.bgs-current');
                var next;

                if (index_next == -1) {
                        switch (sequence_mode){
                                case 'back':
                                        next = current.prev();
                                        if(!next.length){ next = $(containerStr + ' LI:last');         }
                                        break;
                                case 'random':
                                        if (r_image == $(containerStr + ' LI').length) {
                                                $.fn.bgStretcher.buildRandom(random_line[$(containerStr + ' LI').length-1]);
                                                r_image = 0;
                                        }
                                        next = $(containerStr + ' LI').eq(random_line[r_image]);
                                        r_image++;
                                        break;
                                default:
                                        next = current.next();
                                        if(!next.length){ next = $(containerStr + ' LI:first'); }
                        }
                } else {
                        next = $(containerStr + ' LI').eq(index_next);
                }

                $(containerStr + ' LI').removeClass('bgs-current');
                $.fn.bgStretcher.loadImg(next);
                next.addClass('bgs-current');

                switch ($.fn.bgStretcher.settings.transitionEffect){
                        case 'fade':
                                $.fn.bgStretcher.effectFade(current, next);
                                break;
                        case 'simpleSlide':
                                $.fn.bgStretcher.simpleSlide();
                                break;
                        case 'superSlide':
                                $.fn.bgStretcher.superSlide(current, next, sequence_mode);
                                break;
                        default :
                                $.fn.bgStretcher.effectNone(current, next);

                        }
                if ($($.fn.bgStretcher.settings.pagination).find('LI').length) {
                        $($.fn.bgStretcher.settings.pagination).find('LI.showPage').removeClass('showPage');
                        $($.fn.bgStretcher.settings.pagination).find('LI').eq($(containerStr + ' LI').index($(containerStr + ' LI.bgs-current'))).addClass('showPage');
                }

                // callback
                if ($.fn.bgStretcher.settings.callbackfunction) {
                        if(typeof $.fn.bgStretcher.settings.callbackfunction == 'function')
                                        $.fn.bgStretcher.settings.callbackfunction.call();
                }

                if(!_bgStretcherPause){
                  _bgStretcherTm = setTimeout('$.fn.bgStretcher.slideShow(\''+$.fn.bgStretcher.settings.sequenceMode+'\', -1)', $.fn.bgStretcher.settings.nextSlideDelay);
                }
        };

        /*  Others effects  */
        $.fn.bgStretcher.effectNone = function(current, next){
                next.show();
                current.hide();
                _bgStretcherAction = false;
        };
        $.fn.bgStretcher.effectFade = function(current, next){
                next.fadeIn( $.fn.bgStretcher.settings.slideShowSpeed );
                current.fadeOut( $.fn.bgStretcher.settings.slideShowSpeed, function(){
                        _bgStretcherAction = false;
                } );
        };

        $.fn.bgStretcher.simpleSlide = function(){
                var t, l;
                switch ($.fn.bgStretcher.settings.slideDirection) {
                        case 'N':
                        case 'S':
                                t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height()*(-1);
                                l = 0;
                                break;
                        default:
                                l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).width()*(-1);
                                t = 0;
                }
                $(containerStr+' UL').animate({left: l+'px', top: t+'px'}, $.fn.bgStretcher.settings.slideShowSpeed, function(){
                        _bgStretcherAction = false;
                });

        };

        $.fn.bgStretcher.superSlide = function(current, next, sequence_mode){
                var t, l;
                switch ($.fn.bgStretcher.settings.slideDirection) {
                        case 'S':
                                t = $(containerStr).height();
                                l = 0;
                                break;
                        case 'E':
                                t = 0;
                                l = $(containerStr).width();
                                break;
                        case 'W':
                                t = 0;
                                l = $(containerStr).width()*(-1);
                                break;
                        case 'NW':
                                t = $(containerStr).height()*(-1);
                                l = $(containerStr).width()*(-1);
                                break;
                        case 'NE':
                                t = $(containerStr).height()*(-1);
                                l = $(containerStr).width();
                                break;
                        case 'SW':
                                t = $(containerStr).height();
                                l = $(containerStr).width()*(-1);
                                break;
                        case 'SE':
                                t = $(containerStr).height();
                                l = $(containerStr).width();
                                break;
                        default:
                                t = $(containerStr).height()*(-1);
                                l = 0;

                }

                if (sequence_mode == 'back') {
                                next.css({'z-index': 2, top: t+'px', left: l+'px'});
                                next.show();
                                next.animate({left: '0px', top: '0px'}, $.fn.bgStretcher.settings.slideShowSpeed, function(){
                                                current.hide();
                                                $(this).css({'z-index': 1});
                                                _bgStretcherAction = false;
                                        });
                        } else {
                                        current.css('z-index', 2);
                                        next.show();
                                        current.animate({left: l+'px', top: t+'px'}, $.fn.bgStretcher.settings.slideShowSpeed, function(){
                                                $(this).hide().css({'z-index': 1, top: '0px', left: '0px'});
                                                _bgStretcherAction = false;
                                        });
                                }
        };

        /*  Build line random images  */
        $.fn.bgStretcher.buildRandom = function(el_not){
                var l = $(allLIs).length;
                var i, j, rt;
                for (i = 0; i < l; i++ ) {
                        random_line[i] = i;
                        random_temp[i] = Math.random()*l;
                }
                for (i = 0; i < l; i++ ) {
                        for (j = 0; j < (l-i-1); j++) {
                                if (random_temp[j] > random_temp[j+1]) {
                                        rt = random_temp[j];
                                        random_temp[j] = random_temp[j+1];
                                        random_temp[j+1] = rt;
                                        rt = random_line[j];
                                        random_line[j] = random_line[j+1];
                                        random_line[j+1] = rt;
                                }
                        }
                }

                if (random_line[0] == el_not) {
                        rt = random_line[0];
                        random_line[0] = random_line[l-1];
                        random_line[l-1] = rt;
                }
        };

        /*  Prev and Next buttons */
        $.fn.bgStretcher.buttonSlide = function(button_point){
                if (_bgStretcherAction || ($(allLIs).length < 2)) return false;
                var mode = '';
                if (button_point == 'prev') {
                        mode = 'back';
                        if ($.fn.bgStretcher.settings.sequenceMode == 'back')  mode = 'normal';
                } else {
                        mode = $.fn.bgStretcher.settings.sequenceMode;
                }
                $(allLIs).stop(true, true);
                $.fn.bgStretcher._clearTimeout();
                $.fn.bgStretcher.slideShow(mode, -1);
                return false;
        };

        /*  Pagination  */
        $.fn.bgStretcher.pagination = function(){
                var l = $(allLIs).length;
                var output = ''; var i = 0;
                if (l > 0) {
                        output += '<ul>';
                                for (i = 0; i < l; i++){
                                        output += '<li><a href="javascript:;">'+(i+1)+'</a></li>';
                                }
                        output += '</ul>';
                        $($.fn.bgStretcher.settings.pagination).html(output);
                        $($.fn.bgStretcher.settings.pagination).find('LI:first').addClass('showPage');

                        $($.fn.bgStretcher.settings.pagination).find('A').click(function(){
                                if ($(this).parent().hasClass('showPage')) return false;
                                $(allLIs).stop(true, true);
                                $.fn.bgStretcher._clearTimeout();
                                $.fn.bgStretcher.slideShow($.fn.bgStretcher.settings.sequenceMode, $($.fn.bgStretcher.settings.pagination).find('A').index($(this)));
                                return false;
                        });

                }
                return false;
        }

        /*  Default Settings  */
        $.fn.bgStretcher.defaults = {
                imageContainer:             'bgstretcher',
                resizeProportionally:       true,
                resizeAnimate:              false,
                images:                     [],
                imageWidth:                 1024,
                imageHeight:                768,
                maxWidth:                   'auto',
                maxHeight:                  'auto',
                nextSlideDelay:             8000,
                slideShowSpeed:             'slow', // fast, normal, slow
                slideShow:                  true,
                transitionEffect:           'fade', // none, fade, simpleSlide, superSlide
                slideDirection:             'N', // N, S, W, E, (if superSlide - NW, NE, SW, SE)
                sequenceMode:               'normal', // back, random
                buttonPrev:                 '',
                buttonNext:                 '',
                pagination:                 '',
                anchoring:                  'center center', // left top right bottom center
                anchoringImg:               'center center', // left top right bottom center
                preloadImg:                 false,
                startElementIndex:          0,
                callbackfunction:           null
        };
        $.fn.bgStretcher.settings = {};
})(jQuery);
