﻿/*
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
*/

; (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.stratElementIndex - 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.stratElementIndex != 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;
                        }
                        $(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');
                            Cufon.refresh();
                        });
                    }
                    if ($(settings.buttonNext).length) {
                        $(settings.buttonNext).addClass('bgStretcherNav bgStretcherNavNext');
                        $(settings.buttonNext).click(function () {
                            $.fn.bgStretcher.buttonSlide('next');
                            Cufon.refresh();
                        });
                    }
                    /*  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.stratElementIndex = i;
                }
                stratElement = i;
            } else {
                if ($.fn.bgStretcher.settings.stratElementIndex > ($(allLIs).length - 1)) $.fn.bgStretcher.settings.stratElementIndex = 0;
                stratElement = $.fn.bgStretcher.settings.stratElementIndex;
                if (settings.transitionEffect == 'simpleSlide') {
                    if ($.fn.bgStretcher.settings.slideDirection == 'S' || $.fn.bgStretcher.settings.slideDirection == 'E') {
                        stratElement = $(allLIs).length - 1 - $.fn.bgStretcher.settings.stratElementIndex;
                    }
                }
            }

            $(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);
                $('#kt').html('<div class="description_img">' + $(containerStr + ' LI.bgs-current img').attr('alt') + '</div>');
            }

        };

        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());
                } else {
                    container.children('UL').height(container.height() * $(allLIs).length).width(container.width());
                }
            }

        };

        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];
                    var ext = settings.imagesalt[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="' + settings.imagesalt[ind] + '" /></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);
        }
        $('#kt').html('<div class="description_img">' + $(containerStr + ' LI.bgs-current img').attr('alt') + '</div>');
    };

    /*  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: [],
        imagesalt: [],
        imageWidth: 1024,
        imageHeight: 768,
        maxWidth: 'auto',
        maxHeight: 'auto',
        nextSlideDelay: 3000,
        slideShowSpeed: 'normal',
        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: 'left top', // right bottom center
        anchoringImg: 'left top', // right bottom center
        preloadImg: false,
        stratElementIndex: 0,
        callbackfunction: null
    };
    $.fn.bgStretcher.settings = {};
})(jQuery);
