// JavaScript Document
(function ($) {
    var totalWidth = 0;
    $.fn.propGallery = function (options) {
        // Extend our default options with those provided.
        // Note that the first arg to extend is an empty object -
        // this is to keep from overriding our "defaults" object.
		var settings = $.extend({}, $.fn.propGallery.defaults, options);
        var base = this.children('div').children('img');
        var imgDescription = this.children('#image-description');
		if(settings.caption==false ) {
			imgDescription.remove();
		}
		
        var movement = false;
        var childCount = 2;
        var gallerySize = $(settings.slideDiv).children('li').length;
		$(settings.slideDiv).children('li').each(function () {
			thumbWidth = $(this).width() + parseInt($(this).css('margin-right').replace('px', ''));
			totalWidth = parseInt(thumbWidth) + parseInt(totalWidth);
		});
		$(settings.slideDiv).width(totalWidth);
		

        base.init = function () {
            base.checkImageSize();
            base.positionImage();
            base.fadeIn(settings.fadeInTime);
            if (settings.autoPlay == true) {
                setTimeout(base.autoPlayMain, 8000);
            }
            setTimeout(base.hideDescription, 2000)
        };

        $(settings.slideDiv).children('li').children('a').click(function () {
            imageLink = $(this).attr('href');
            imageDescription = $('img', this).attr('alt');
            imgDescription.html(imageDescription);
            base.changeImage();
            return false;
        });

        $(settings.mainDiv).mouseenter(function () {
            base.showDescription();
        }).mouseleave(function () {
            base.hideDescription();
        });
		
        if (settings.slideStyle == "autoSlide") {
            $(settings.slideDiv).parent().mousemove(function (e) {
                x = e.pageX - this.offsetLeft;

                if (x < ($(settings.slideDiv).parent().width() * 0.4)) {
                    xExp = ($(settings.slideDiv).parent().width() * 0.4 - x) / 100;
                    distance = Math.exp(xExp);
                    distance = Math.round(distance);
                } else if (x > ($(settings.slideDiv).parent().width() * 0.6)) {
                    xExp = (x - $(settings.slideDiv).parent().width() * 0.6) / 100;
                    distance = Math.exp(xExp);
                    distance = Math.round(distance);
                }
            }).mouseenter(function () {
                timerval = setInterval(base.scrollImages, 40);
            }).mouseleave(function () {
                clearInterval(timerval);
            });
        } else {
            $('.move-right,.move-left').css('cursor', 'pointer');
            $('.move-right').click(function () {
                base.moveImages('-');
            });

            $('.move-left').click(function () {
                base.moveImages('+');
            });
        };

        base.scrollImages = function () {
            leftPos = parseInt($(settings.slideDiv).css('left').replace('px', ''));
            if (x < ($(settings.slideDiv).parent().width() * 0.4) && leftPos < 0) {
                $(settings.slideDiv).css({
                    'left': leftPos + (distance * settings.slideSpeed) + 'px'
                })
            } else if (x > ($(settings.slideDiv).parent().width() * 0.6) && leftPos > -($(settings.slideDiv).width() - $(settings.slideDiv).parent().width())) {
                $(settings.slideDiv).css({
                    'left': leftPos - (distance * settings.slideSpeed) + 'px'
                })
            }
        };

        base.checkImageSize = function () {
			base.removeAttr("width").removeAttr("height").css({ width: "", height: "" }); // Remove css dimensions as well
            mainContHeight = $(settings.mainDiv).height();
            mainContWidth = $(settings.mainDiv).width();
            imageRatio = base.width() / base.height();

            if (base.width() > mainContWidth && base.height() < mainContHeight) {
                base.width(parseInt(mainContWidth));
                base.height(parseInt(mainContWidth / imageRatio));
            } else if (base.height() > mainContHeight && base.width() < mainContWidth) {
                base.height(parseInt(mainContHeight));
                base.width(parseInt(mainContHeight * imageRatio));
            } else if (base.height() > mainContHeight && base.width() > mainContWidth) {
				if(base.width() - mainContWidth > base.height() - mainContHeight) {
					base.width(parseInt(mainContWidth));
					base.height(parseInt(mainContWidth / imageRatio));
				} else {
					base.height(parseInt(mainContHeight));
					base.width(parseInt(mainContHeight * imageRatio));
				}
			}
        };

        base.moveImages = function (direction) {
            leftPos = parseInt($(settings.slideDiv).css('left').replace('px', ''));
            if (leftPos > -($(settings.slideDiv).width() - $(settings.slideDiv).parent().width()) && direction == "-" && movement == false) {
                movement = true;
                $(settings.slideDiv).animate({
                    'left': direction + '=' + $(settings.slideDiv).parent().width()
                }, function () {
                    movement = false;
                });
            } else if (leftPos < 0 && direction == "+" && movement == false) {
                movement = true;
                $(settings.slideDiv).animate({
                    'left': direction + '=' + $(settings.slideDiv).parent().width()
                }, function () {
                    movement = false;
                });
            }
        };

        base.autoPlayMain = function () {
            $('.shown').removeClass('shown');
            $(settings.slideDiv).children('li:nth-child(' + childCount + ')').children().trigger('click');
            if (childCount == gallerySize) {
                childCount = 1;
            } else {
                childCount++;
            }
        };

        base.changeImage = function () {
			base.addClass('loading');
            base.fadeOut(settings.fadeOutTime, function () {
                base.attr('src', imageLink).load(function () {
                    base.positionImage();
                    base.fadeIn(settings.fadeInTime, function(){
						$('.loading').removeClass('loading');
					});
                    base.showDescription();
                });
            });
        };

        base.positionImage = function () {
            imageHeight = base.height();
            divHeight = $(settings.mainDiv).height();
            difference = divHeight - imageHeight;
            base.css('padding-top', (difference / 2) + 'px');
        };

        // Trigger the initialization
        base.load(function () {
            base.init();
        });

        base.hideDescription = function () {
            if (settings.caption == "autoHide") {
                imgDescription.stop().animate({
                    'bottom': '-50px'
                }, settings.hideDescriptionSpeed);
            } 
        };

        base.showDescription = function () {
            if (settings.caption == "autoHide") {
                imgDescription.stop().animate({
                    'bottom': '0px'
                }, settings.showDescriptionSpeed);
            }
        };
    };

    // plugin defaults - added as a property on our plugin function
    $.fn.propGallery.defaults = {
		slideDiv: '.gallery',
		mainDiv: '#gallery-main-image',
		fadeOutTime: 500,
		fadeInTime: 500,
		slideSpeed:1,
		hideDescriptionSpeed:500,
		showDescriptionSpeed:500,
		slideStyle:'click',
		caption:false,
		autoPlay:false
    };
})(jQuery);
