// Copyright ©2009 Aaron Vanderzwan, by Aaron Vanderzwan
// Thanks to Skye Giordano for the suggestion of the resizeMsg option.
// 
// LICENSE
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
// 
// VERSION: 1.1.7




(function($) {
    // The maxImages plugin resizes an image dynamically, according to the width of the browser.
    jQuery.fn.maxImage = function(options) {
  
        var resizeMsgDefaults = {
            show: false, 
            location: 'before', 
            message: 'Original: ([w]w x [h]h)'
        };
  
        // var opts = $.extend({}, $.fn.maxImage.defaults, options);
        var opts = jQuery.extend({
            wait:                 true,
            imageArray:           [],
            maxFollows:           'both',  // Options: width, height, both
            verticalOffset:       0,
            horizontalOffset:     0,
            leftSpace:            0,
            topSpace:             0,
            rightSpace:           0,
            bottomSpace:          0,
            overflow: 						'hidden',
            position:             'absolute',
            isBackground:         false,
            zIndex:               -1,
            verticalAlign:        'center',
            horizontalAlign:      'center',
            maxAtOrigImageSize:   false,
            slideShow:            false,
            slideDelay:           5,
            slideShowTitle:       true,
            loaderClass:          'loader',
            resizeMsg:            resizeMsgDefaults,
            onImageShow:          function(){}	
        }, options);
  
        // var resizeDefaults = {show: false, location: 'before', message: '(resized)'};
        opts.resizeMsg = jQuery.extend(resizeMsgDefaults, options.resizeMsg)
  
        // Cache jQuery object
        var jQueryMatchedObj = this;
        var currentSlide = 0;
        var slideInterval;
  
        function _initialize() {
            _start(this,jQueryMatchedObj);
            return false;
        }
  
        function _start(image,jQueryMatchedObj) {
            if( opts.slideShow ){
                _setup_slideshow(jQueryMatchedObj);
            } else if ( opts.isBackground ){
                Background._setup_background(image);
            } else {
                Others._setup_others(image,opts);
            }
        }
        
        Others = {
            _setup_others: function(image,opts){
                $this = $(image);
                $this.hide();
	  	
                Others._configure_css(image,opts);
                $(window).load(function(){
                    _get_orig_data($this);
                    _size_image($this);
                    _center_image($this);
                    $this.show();
                    $('.'+opts.loaderClass).hide();
                    opts.onImageShow.call(this);
                    $(window).resize(function(){
                        _size_image($this);
                        _center_image($this);
                    });
                });
            },
            _configure_css: function(image,opts){
                if(opts.position == 'absolute') {
				
                    $(image).css({
                        'overflow':   'hidden',
                        'left':       opts.leftSpace,
                        'top':        opts.topSpace,
                        'position':   'absolute'
                    });
        
                    if(opts.verticalAlign == 'bottom'){
                        $(image).css({
                            'bottom':opts.bottomSpace,
                            'top':'auto'
                        });
                    }
                    if(opts.horizontalAlign == 'right'){
                        $(image).css({
                            'right':opts.rightSpace,
                            'left':'auto'
                        });
                    }
                } else {
                    $(image).css({
                        'margin-top':     opts.topSpace,
                        'margin-right':   opts.rightSpace,
                        'margin-bottom':  opts.bottomSpace,
                        'margin-left':    opts.leftSpace,
                        'position':       opts.position
                    });
                }
            }
        }
  
        Background = {
            _setup_background: function(image){
                $this = $(image);
                $this.hide();
      
                Background._configure_css(image);
                $(window).load(function(){
                    _get_orig_data($this);
                    _size_image($this);
                    _center_image($this);
                    $this.show();
                    $('.'+opts.loaderClass).hide();
                    opts.onImageShow.call(this);
                    $(window).resize(function(){
                        _size_image($this);
                        _center_image($this)
                    });
                });
      
            },
            _configure_css: function(image){
                // If position is set to absolute (or if isBackground)
                $(image).css({
                    'z-index':  opts.zIndex
                });
                if(opts.position == 'absolute') {
                    $(image).css({
                        'overflow':   'hidden',
                        'left':       opts.leftSpace,
                        'top':        opts.topSpace,
                        'position':   'absolute'
                    });
        
                    $('html').css({
                        'overflow-y':opts.overflow
                    });
        
                    if(opts.verticalAlign == 'bottom'){
                        $(image).css({
                            'bottom':opts.bottomSpace,
                            'top':'auto'
                        });
                    }
                    if(opts.horizontalAlign == 'right'){
                        $(image).css({
                            'right':opts.rightSpace
                        });
                    }
                } else {
                    $(image).css({
                        'margin-top':     opts.topSpace,
                        'margin-right':   opts.rightSpace,
                        'margin-bottom':  opts.bottomSpace,
                        'margin-left':    opts.leftSpace,
                        'position':       opts.position
                    });
                }
            }
        }
        
        
        SlideControl = {            
            _next_slide : function(){
                clearInterval(slideInterval);
                if(currentSlide < opts.imageArray.length-1){
                    currentSlide++;
                    lastSlide = currentSlide-1;
                } else {
                    currentSlide=0;
                    lastSlide = opts.imageArray.length-1;
                }
			
                $('.slide-'+lastSlide).css({
                    'z-index':opts.zIndex-1
                }).fadeOut('slow');
                $('.slide-'+currentSlide).css({
                    'z-index':opts.zIndex
                }).fadeIn('slow');
                if(opts.slideShowTitle){
                    next_title(currentSlide,lastSlide);
                }
                slideInterval = setInterval(slideTimeInterval,(to_i(opts.slideDelay)*1000));
            },
        
            _prev_slide : function(){
                clearInterval(slideInterval);
                if(currentSlide > 0){
                    currentSlide--;
                    lastSlide = currentSlide+1;
                } else {
                    currentSlide = opts.imageArray.length-1;
                    lastSlide = 0;
                }
                //alert(currentSlide + " " + lastSlide );	
                $('.slide-'+lastSlide).css({
                    'z-index':opts.zIndex-1
                }).fadeOut('slow');
                $('.slide-'+currentSlide).css({
                    'z-index':opts.zIndex
                }).fadeIn('slow');
                if(opts.slideShowTitle){
                    next_title(currentSlide,lastSlide);
                }
                slideInterval = setInterval(slideTimeInterval,(to_i(opts.slideDelay)*1000));
            }        
        }
  
  
        // SLIDESHOW FUNCTIONS
        function _setup_slideshow (jQueryMatchedObj){
            _build_slideshow_structure(jQueryMatchedObj);
    
            opts.imageArray.length = 0;

            if( jQueryMatchedObj.length == 1){
                opts.imageArray.push(new Array(objClicked.getAttribute('src'),objClicked.getAttribute('title')));
            } else {  
                for ( var i = 0; i < jQueryMatchedObj.length; i++ ) {
                    opts.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('src'),jQueryMatchedObj[i].getAttribute('title')));
                    $(jQueryMatchedObj[i]).attr('original',$(jQueryMatchedObj[i]).attr('src')).attr('src','');
                }
            }
            _configure_css();
            _loads_image(0);
        }
    
        function _build_slideshow_structure() {
            position = 40;
            for ( var i = 0; i < jQueryMatchedObj.length; i++ ) {
                $(jQueryMatchedObj[i]).addClass('slides slide-'+i).after('<div id="slideTitle'+i+'" class="slideTitle"><img src="images/Circle.png" alt="Our Portfolio"></div>');
                $('#slideTitle'+i).css({                    
                    'background':'transparent',
                    'position':'absolute',
                    'bottom':'80px',
                    'width':'30px',
                    'height':'30px',
                    'left': position+'px',
                    'opacity':'0.8'
                });
                position = to_i(position) + 40;
                
            }
            
        }
  
  
        function _loads_image(nums){
            var currentImage = nums;
    
            var objImagePreloader = new Image();
            objImagePreloader.onload = function() {
                $('.slide-'+currentImage).attr('src',opts.imageArray[currentImage][0]);
                _get_orig_data($('.slide-'+currentImage));
                _size_image($('.slide-'+currentImage));
                _center_image($('.slide-'+currentImage));
                if(currentImage==0) opts.onImageShow.call(this);
                $(window).resize(function(){
                    _size_image($('.slide-'+(currentImage)));
                    _center_image($('.slide-'+currentImage));
                });
      
                if(currentImage==0){
                    _start_timer();
                }
      
                if(currentImage < opts.imageArray.length-1){
                    _loads_image(currentImage+1);
                }
      
            }
            objImagePreloader.src = opts.imageArray[currentImage][0];
        }
  
        function _start_timer() {
            //var currentSlide = 0;
    
            // Hide the loading graphic
            $('.'+opts.loaderClass).hide();
    
            // Fade in first image
            $('.slide-'+currentSlide).css({
                'z-index':opts.zIndex
            }).fadeIn();
    
            // If user wants to show titles, use this option
            if(opts.slideShowTitle){
                $('.slide-'+currentSlide).next('.slideTitle').css({
                    'z-index':opts.zIndex+1,
                    'background':'transparent'
                }).fadeIn();
                $('.slide-'+currentSlide).next('.slideTitle').find('img').attr('src','images/Circle_Hover.gif');
            }
    
            // Start timer for slideshow
            slideInterval = setInterval(slideTimeInterval,(to_i(opts.slideDelay)*1000));
        }
        
        function slideTimeInterval(){
            if(currentSlide < opts.imageArray.length-1){
                currentSlide++;
                lastSlide = currentSlide-1;
            } else {
                currentSlide=0;
                lastSlide = opts.imageArray.length-1;
            }
			
            $('.slide-'+lastSlide).css({
                'z-index':opts.zIndex-1
            }).fadeOut('slow');
            $('.slide-'+currentSlide).css({
                'z-index':opts.zIndex
            }).fadeIn('slow');
            if(opts.slideShowTitle){
                next_title(currentSlide,lastSlide);
            }
        }

        function _configure_css(){
            for(i=0;i<opts.imageArray.length;i++){
                // Style the slide
                if(opts.position == 'absolute') {
                    $('.slide-'+i).css({
                        'position':   'absolute',
                        'overflow':   'hidden'
                    });
        
                    $('html').css({
                        'overflow-y':opts.overflow
                    });
        
                    if(opts.verticalAlign == 'bottom'){
                        $('.slide-'+i).css({
                            'bottom':opts.bottomSpace
                        });
                    }else{
                        $('.slide-'+i).css({
                            'top':opts.topSpace
                        });
                    }
				
                    if(opts.horizontalAlign == 'right'){
                        $('.slide-'+i).css({
                            'right':opts.rightSpace
                        });
                    }else{
                        $('.slide-'+i).css({
                            'left':opts.leftSpace
                        });
                    }
                } else {
                    $('.slide-'+i).css({
                        'margin-top':     opts.topSpace,
                        'margin-right':   opts.rightSpace,
                        'margin-bottom':  opts.bottomSpace,
                        'margin-left':    opts.leftSpace,
                        'position':       opts.position
                    });
                }
      
      
                // Style the title
                $('.slide-'+i).next('.slideTitle').css({
                    'position':'absolute',
                    'bottom':'80px'
                //'right':'5%'
                });
            }
        }
  
  
        function next_title(currentSlide,lastSlide){
            //            $('.slide-'+lastSlide).next('.slideTitle').fadeOut();
            //            $('.slide-'+currentSlide).next('.slideTitle').fadeIn();
            $('.slide-'+lastSlide).next('.slideTitle').find('img').attr('src','images/Circle.png');
            $('.slide-'+currentSlide).next('.slideTitle').find('img').attr('src','images/Circle_Hover.gif');

        }
  
  
        // BROAD FUNCTIONS - FOR EACH SECTION
        function _center_image(image){
            $this = image;
		
            if(opts.horizontalAlign == 'center'){
                var pageWidth = $(window).width() - opts.horizontalOffset;
                var newWidth = -1*($this.width() - pageWidth)/2;
                $(image).css({
                    'left':newWidth
                });
            }
		
            if(opts.verticalAlign == 'center'){
                var pageHeight = $(window).height() - opts.verticalOffset;
                var newHeight = -1*($this.height() - pageHeight)/2;
                $(image).css({
                    'top':newHeight
                });
            }
        }

        function _get_orig_data(image){
            $this = image;
   	
            $this.attr('origWidth', $this.width());
            $this.attr('origHeight', $this.height());
            $this.attr('ratio', find_ratio($this.width(),$this.height()));
        }
  
        function _size_image(image){
            $this = image;
    
            var originalWidth = to_i($this.attr('origWidth'));
            var originalHeight = to_i($this.attr('origHeight'));
            var ratio = $this.attr('ratio');
	
            if(originalWidth == 0 || originalHeight == 0){
                setTimeout(function(){
                    _get_orig_data(image);
                    _size_image(image);
                }, 100);
                return;
            }
    
            var width_and_height = [];
            width_and_height = find_width_and_height(originalWidth,originalHeight,ratio);
    
            $this.width( width_and_height[0] );
            $this.height( width_and_height[1] );
    
            _show_resize_message(originalWidth,originalHeight,image);
        }
  
        function _show_resize_message(originalWidth,originalHeight,image){
            if( (to_i($this.width()) != originalWidth || to_i($this.height()) != originalHeight) && opts.resizeMsg.show){
                $(".maximage_resized").remove();
      
                // Replace [w] and [h] with their respective width or height
                opts.resizeMsg.message = opts.resizeMsg.message.replace('[w]',originalWidth).replace('[h]',originalHeight);
      
                var insertStr = '<div class="maximage_resized">' + opts.resizeMsg.message + '</div>';
                if(opts.resizeMsg.location.toLowerCase() == "before"){
                    $this.before(insertStr);
                } else {
                    $this.after(insertStr);
                }
            }
        }
  
        function find_width_and_height(originalWidth,originalHeight,ratio) {
            var pageWidth = $(window).width() - opts.horizontalOffset;
            var pageHeight = $(window).height() - opts.verticalOffset;
    
            if(!opts.isBackground){
                if(opts.maxFollows=='both'){
                    max_follows_width(pageWidth,ratio);
        
                    if( height > pageHeight ){
                        max_follows_height(pageHeight,ratio);
                    }
                } else if (opts.maxFollows == 'width'){
                    max_follows_width(pageWidth,ratio);
                } else if (opts.maxFollows == 'height'){  
                    max_follows_height(pageHeight,ratio);
                }
            }else{
                width = pageWidth + 40;
                height = width/ratio;
      
                if( height < pageHeight ){
                    height = pageHeight - (opts.topSpace + opts.bottomSpace);
                    width = height*ratio;
                }
            }
    
            // If maxAtRatio == true and your new width is larger than originalWidth, size to originalWidth
            if ( opts.maxAtOrigImageSize && width > originalWidth){
                arrayImageSize = new Array(originalWidth,originalHeight);
            }else{
                arrayImageSize = new Array(width,height);
            }
            return arrayImageSize;
        }
  
        function max_follows_height(pageHeight,ratio){
            height = pageHeight - (opts.topSpace + opts.bottomSpace);  // Page Height minus topSpace and bottomSpace
            width = height*ratio;
        }
  
        function max_follows_width(pageWidth,ratio){
            width = pageWidth - (opts.leftSpace + opts.rightSpace); // Page Width minus leftSpace and rightSpace
            height = width/ratio;
        }
  
        function find_ratio(width,height) {
            width = to_i(width);
            height = to_i(height);
            var ratio = width/height;
            ratio = ratio.toFixed(2);
            return ratio;
        }
  
        function to_i(i){
            last = parseInt(i);
            return last;
        }
  
        // private function for debugging
        function debug($obj) {
            if (window.console && window.console.log) {
                window.console.log($obj);
            }
        }
  
        return this.each(_initialize);
    };


})(jQuery);
