/**
* Copyright (c) 2009 Anders Ekdahl (http://coffeescripter.com/)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* Version: 1.2.2
*
* Demo and documentation: http://coffeescripter.com/code/ad-gallery/
*/

(function($) {
    $.fn.adGallery = function(options) {
        var defaults = { loader_image: 'loader.gif',
            start_at_index: 0,
            thumb_opacity: 0.7,
            animate_first_image: false,
            animation_speed: 300,
            width: false,
            height: false,
            display_next_and_prev: true,
            display_back_and_forward: true,
            scroll_jump: 0, // If 0, it jumps the width of the container
            slideshow: {
                enable: true,
                autostart: false,
                speed: 5000,
                start_label: 'Start',
                stop_label: 'Stop',
                stop_on_scroll: true,
                countdown_prefix: '(',
                countdown_sufix: ')',
                onStart: false,
                onStop: false
            },
            effect: 'slide-hori', // or 'slide-vert', 'fade', or 'resize', 'none'
            enable_keyboard_move: true,
            cycle: true,
            callbacks: {
                init: false,
                afterImageVisible: false,
                beforeImageVisible: false
            }
        };
        var settings = $.extend(false, defaults, options);
        if (options && options.slideshow) {
            settings.slideshow = $.extend(false, defaults.slideshow, options.slideshow);
        };
        if (!settings.slideshow.enable) {
            settings.slideshow.autostart = false;
        };
        var galleries = [];
		
        $(this).each(function() {
            var gallery = new AdGallery(this, settings);
            galleries[galleries.length] = gallery;
        });
        // Sorry, breaking the jQuery chain because the gallery instances
        // are returned so you can fiddle with them
		
        return galleries;
    };

    function VerticalSlideAnimation(img_container, direction, desc) {
        var current_top = parseInt(img_container.css('top'), 10);
        if (direction == 'left') {
            var old_image_top = '-' + this.image_wrapper_height + 'px';
            img_container.css('top', this.image_wrapper_height + 'px');
        } else {
            var old_image_top = this.image_wrapper_height + 'px';
            img_container.css('top', '-' + this.image_wrapper_height + 'px');
        };
        if (desc) {
            desc.css('bottom', '-' + desc[0].offsetHeight + 'px');
            desc.animate({ bottom: 0 }, this.settings.animation_speed * 2);
        };
        return { old_image: { top: old_image_top },
            new_image: { top: current_top }
        };
    };

    function HorizontalSlideAnimation(img_container, direction, desc) {
        var current_left = parseInt(img_container.css('left'), 10);
        if (direction == 'left') {
            var old_image_left = '-' + this.image_wrapper_width + 'px';
            img_container.css('left', this.image_wrapper_width + 'px');
        } else {
            var old_image_left = this.image_wrapper_width + 'px';
            img_container.css('left', '-' + this.image_wrapper_width + 'px');
        };
        if (desc) {
            desc.css('bottom', '-' + desc[0].offsetHeight + 'px');
            desc.animate({ bottom: 0 }, this.settings.animation_speed * 2);
        };
        return { old_image: { left: old_image_left },
            new_image: { left: current_left }
        };
    };

    function ResizeAnimation(img_container, direction, desc) {
        var image_width = img_container.width();
        var image_height = img_container.height();
        var current_left = parseInt(img_container.css('left'), 10);
        var current_top = parseInt(img_container.css('top'), 10);
        img_container.css({ width: 0, height: 0, top: this.image_wrapper_height / 2, left: this.image_wrapper_width / 2 });
        return { old_image: { width: 0,
            height: 0,
            top: this.image_wrapper_height / 2,
            left: this.image_wrapper_width / 2
        },
            new_image: { width: image_width,
                height: image_height,
                top: current_top,
                left: current_left
            }
        };
    };

    function FadeAnimation(img_container, direction, desc) {
        img_container.css('opacity', 0);
        return { old_image:{ opacity: 0 }, new_image:{ opacity: 1 } };
    };

    // Sort of a hack, will clean this up... eventually
    function NoneAnimation(img_container, direction, desc) {
        img_container.css('opacity', 0);
        return { old_image: { opacity: 0 },
            new_image: { opacity: 1 },
            speed: 0
        };
    };

    function AdGallery(wrapper, settings) {
        this.init(wrapper, settings);
    };
	
    AdGallery.prototype = {
        // Elements
        wrapper: false,
        image_wrapper: false,
        gallery_info: false,
        nav: false,
        loader: false,
        preloads: false,
        thumbs_wrapper: false,
        scroll_back: false,
        scroll_forward: false,
        next_link: false,
        prev_link: false,

        slideshow: false,
        image_wrapper_width: 0,
        image_wrapper_height: 0,
        current_index: 0,
        current_image: false,
        nav_display_width: 0,
        settings: false,
        images: false,
		thumb_wrapper_width: 0,
        in_transition: false,
        animations: false,
        init: function(wrapper, settings) {
			var context = this;
            this.wrapper = $(wrapper);
            this.settings = settings;
            this.setupElements();
            this.setupAnimations();
            if (this.settings.width) {
                this.image_wrapper_width = this.settings.width;
                this.image_wrapper.width(this.settings.width);
                this.wrapper.width(this.settings.width);
            } else {
                this.image_wrapper_width = this.image_wrapper.width();
            };
            if (this.settings.height) {
                this.image_wrapper_height = this.settings.height;
                this.image_wrapper.height(this.settings.height);
            } else {
                this.image_wrapper_height = this.image_wrapper.height();
            };
            this.nav_display_width = this.nav.width();
            this.current_index = 0;
            this.current_image = false;
            this.in_transition = false;
            this.findImages();
            if (this.settings.display_next_and_prev) {
                this.initNextAndPrev();
            };
            // The slideshow needs a callback to trigger the next image to be shown
            // but we don't want to give it access to the whole gallery instance
            var nextimage_callback = function(callback) {
                return context.nextImage(callback);
            };
            this.slideshow = new AdGallerySlideshow(nextimage_callback, this.settings.slideshow);
            this.controls.append(this.slideshow.create());
            if (this.settings.slideshow.enable) {
                this.slideshow.enable();
            } else {
                this.slideshow.disable();
            };
            if (this.settings.display_back_and_forward) {
                this.initBackAndForward();
            };
            if (this.settings.enable_keyboard_move) {
                this.initKeyEvents();
            };
            var start_at = this.settings.start_at_index;
            if (window.location.hash && window.location.hash.indexOf('#ad-image') === 0) {
                start_at = window.location.hash.replace(/[^0-9]+/g, '');
                // Check if it's a number
                if ((start_at * 1) != start_at) {
                    start_at = this.settings.start_at_index;
                };
            };
			
		/* Toggle description */
		/*
			var descTimer;
			var tempWrapper = this.wrapper;
			var descHideFlag = false;
			
			this.wrapper.find("div.ad-image-wrapper").mouseenter(function(e){
				descHideFlag = true;
				$(this).find("div.ad-image-description").slideDown(100);
				clearInterval( descTimer );
				descTimer = setTimeout( function(){ descHide() }, 2000 );
			}).mouseleave(function(e){ descHide() });
			
			function descHide(){
				descHideFlag = false;
				tempWrapper.find("div.ad-image-description").slideUp(80);
			}
			
			this.wrapper.find("div.ad-image-wrapper").bind("mousemove",function(e){
				if(!descHideFlag){
					var adjust = e.pageY - 30;
					if( adjust < 90 )
						$(this).find("div.ad-image-description").slideDown(100);
					else
						descHide();
				}
			});
		*/
		/* ------------------ */
			
            this.loading(true);
            this.showImage(start_at, function(){
				// We don't want to start the slideshow before the image has been displayed
				if (context.settings.slideshow.autostart) {
					context.preloadImage(start_at + 1);
					context.slideshow.start();
				};
			});
            this.fireCallback(this.settings.callbacks.init);
        },
        setupAnimations: function() {
            this.animations = {
                'slide-vert': VerticalSlideAnimation,
                'slide-hori': HorizontalSlideAnimation,
                'resize': ResizeAnimation,
                'fade': FadeAnimation,
                'none': NoneAnimation
            };
        },
        setupElements: function() {
            this.controls = this.wrapper.find('.ad-controls');
            this.gallery_info = $('<p class="ad-info"></p>');
            this.controls.append(this.gallery_info);
            this.image_wrapper = this.wrapper.find('.ad-image-wrapper');
            //this.image_wrapper.empty();
            this.nav = this.wrapper.find('.ad-nav');
            this.thumbs_wrapper = this.nav.find('.ad-thumbs');
            //this.preloads = $('<div class="ad-preloads"></div>');
            this.loader = $('<img class="ad-loader" src="' + this.settings.loader_image + '">');
            //this.image_wrapper.append(this.loader);
            this.loader.hide();
            //$(document.body).append(this.preloads);
        },
        loading: function(bool) {
            if (bool) {
                this.loader.show();
            } else {
                this.loader.hide();
            };
        },
        addAnimation: function(name, fn) {
            if ($.isFunction(fn)) {
                this.animations[name] = fn;
            };
        },
        findImages: function() {
            var context = this;
            this.images = [];
            var thumb_wrapper_width = 0;
            var thumbs_loaded = 0;
			//TODO: return this line when making carousel linkable again
            //var thumbs = this.thumbs_wrapper.find('a');
			var thumbs = this.thumbs_wrapper.find('span');
			//alert(prompt('',this.thumbs_wrapper.html() ));
			
            if (this.settings.thumb_opacity < 1) {
                thumbs.find('img').css('opacity', this.settings.thumb_opacity);
            };
			
            thumbs.each(function(i) {
				//alert( i );
				var link = $(this);
				var image_src = link.attr('href');
				var thumb = link.find('img');
				// Check if the thumb has already loaded
				
				/*
				if ( !context.isImageLoaded(thumb[0]) ) {
					thumb.load(function(){
						//thumb_wrapper_width += this.parentNode.parentNode.offsetWidth;
						thumb_wrapper_width += $(this).parents("li").outerWidth();
						thumbs_loaded++;
					});
				} else {
					//thumb_wrapper_width += thumb[0].parentNode.parentNode.offsetWidth;
					thumb_wrapper_width += thumb.parents("li").outerWidth();
					thumbs_loaded++;
				};
				*/
				
				// images were already preloaded in gallery-builder.js
				thumb_wrapper_width += $(this).parents("li").outerWidth();
				thumbs_loaded++;
				
				link.addClass('ad-thumb' + i);
				link.click(function() {
					if( !$(this).hasClass('ad-active') ){
						context.thumbs_wrapper.find('a.ad-active img').fadeTo(200, context.settings.thumb_opacity);
						//context.showImage(i);
						//context.slideshow.stop();
					}
					//return false;
				})

				.hover(function(){
						if (!$(this).is('.ad-active') && context.settings.thumb_opacity < 1) {
							$(this).find('img').stop().fadeTo(200, 1);
						};
						context.preloadImage(i);
					},function() {
						if (!$(this).is('.ad-active') && context.settings.thumb_opacity < 1) {
							$(this).find('img').stop().fadeTo(200, context.settings.thumb_opacity);
						};
					}
				);
				var desc = false;
				if( thumb.data('ad-desc') ) {
					desc = thumb.data('ad-desc');
				} else if (thumb.attr('longdesc') && thumb.attr('longdesc').length) {
					desc = thumb.attr('longdesc');
				};
				
				var title = false;
				if (thumb.data('ad-title')) {
					title = thumb.data('ad-title');
				} else if (thumb.attr('title') && thumb.attr('title').length) {
					title = thumb.attr('title');
				};
				
				var display = null;
				var preloaded = false;
				if (image_src == null || image_src == '')
					preloaded = true;
				
				context.images[i] = { 
					thumb: thumb.attr('src'), 
					image: image_src, 
					error: false,
					preloaded: preloaded, 
					desc: desc, 
					title: title, 
					size: false,
					source: thumb.data("source"),
					displayContent: display,
					favicon: thumb.data('Favicon'),
					favSource: thumb.data('FavSource')
				};
				
				if (thumbs.length == thumbs_loaded)
					setTotalWidth();
			});
			// Wait until all thumbs are loaded, and then set the width of the ul
			function setTotalWidth(){
				// + 2 fixs wierd probelm where somehow the total width of all the children is short of '2'.
				context.thumb_wrapper_width = thumb_wrapper_width;
				if( thumb_wrapper_width > 0 )
					context.nav.find('.ad-thumb-list').css('width', thumb_wrapper_width + 2 + 'px');
			}
        },
        initKeyEvents: function() {
            var context = this;
			$(document).keydown(function(e) {
				if (e.keyCode == 39) {
					// right arrow
					context.nextImage();
					context.slideshow.stop();
				} else if (e.keyCode == 37) {
					// left arrow
					context.prevImage();
					context.slideshow.stop();
				};
			});
        },
        initNextAndPrev: function() {
            this.next_link = $('<div class="ad-next"><div class="ad-next-image"></div></div>');
            this.prev_link = $('<div class="ad-prev"><div class="ad-prev-image"></div></div>');
            this.image_wrapper.append(this.next_link).append(this.prev_link);
            var context = this;
            this.prev_link.add(this.next_link).mouseover(function(e) {
				// IE 6 hides the wrapper div, so we have to set it's width
				$(this).css('height', context.image_wrapper_height);
				$(this).find('div').show();
			})
			.mouseout(function(e){
				$(this).find('div').hide(); 	
			})
			.click(function(){
				if ($(this).is('.ad-next')) {
					context.nextImage();
					context.slideshow.stop();
				} else {
					context.prevImage();
					context.slideshow.stop();
				};
			})
			.find('div').css('opacity', 0.7);
        },
        initBackAndForward: function() {
            var context = this;
			/*
			if( this.thumbs_wrapper.find("li").size() < 8 ){
				this.nav.addClass("noArrows");
				return;
			}
			*/
			if( context.thumb_wrapper_width < this.wrapper.width() ){
				this.wrapper.addClass("noArrows");
				return;
			}
			
			
			
            this.scroll_forward = $('<div class="arrows ad-forward"><div></div></div>');
            this.scroll_back 	= $('<div class="arrows ad-back"><div></div></div>');
            this.nav.append(this.scroll_forward).prepend(this.scroll_back);
            var has_scrolled = 0;
            var thumbs_scroll_interval = false;
            $(this.scroll_back).add(this.scroll_forward).bind('mousedown', function(){
					// We don't want to jump the whole width, since an image
					// might be cut at the edge
					var width = context.nav_display_width - 50;
					var ulWidth = context.thumbs_wrapper.children('ul').width();
					
					if (context.settings.scroll_jump > 0) {
						var width = context.settings.scroll_jump;
					};
					if( $(this).is('.ad-forward') ){
						// check if reached the end
						if( context.thumbs_wrapper.scrollLeft() == (ulWidth - context.nav_display_width) )
							return false;
						var left = context.thumbs_wrapper.scrollLeft() + width;
					} else {
						// check if carousel is at the begining
						if( context.thumbs_wrapper.scrollLeft() == 0 )
							return false;
						var left = context.thumbs_wrapper.scrollLeft() - width;
					};
					if( context.settings.slideshow.stop_on_scroll ){
						context.slideshow.stop();
					};
					
					context.thumbs_wrapper.stop().animate({ scrollLeft: left + 'px' });
					return false;
				}
      ).css('opacity', 0.6).hover(function(){
            var direction = 'left';
            if ($(this).is('.ad-forward')) {
                direction = 'right';
            };
            thumbs_scroll_interval = setInterval(
            function() {
                has_scrolled++;
                // Don't want to stop the slideshow just because we scrolled a pixel or two
                if (has_scrolled > 30 && context.settings.slideshow.stop_on_scroll) {
                    context.slideshow.stop();
                };
                var left = context.thumbs_wrapper.scrollLeft() + 1;
                if (direction == 'left') {
                    left = context.thumbs_wrapper.scrollLeft() - 1;
                };
                context.thumbs_wrapper.scrollLeft(left);
            },
            10
          );
            $(this).css('opacity', 1);
        },
        function() {
            has_scrolled = 0;
            clearInterval(thumbs_scroll_interval);
            $(this).css('opacity', 0.6);
        }
      );
        },
        _afterShow: function() {
            this.gallery_info.html((this.current_index + 1) + ' / ' + this.images.length);
            if (!this.settings.cycle) {
                // Needed for IE
                this.prev_link.show().css('height', this.image_wrapper_height);
                this.next_link.show().css('height', this.image_wrapper_height);
                if (this.current_index == (this.images.length - 1)) {
                    this.next_link.hide();
                };
                if (this.current_index == 0) {
                    this.prev_link.hide();
                };
            };
            this.fireCallback(this.settings.callbacks.afterImageVisible);
        },
        /**
        * Checks if the image is small enough to fit inside the container
        * If it's not, shrink it proportionally
        */
        _getContainedImageSize: function(image_width, image_height) {
            if (image_height > this.image_wrapper_height) {
                var ratio = image_width / image_height;
                image_height = this.image_wrapper_height;
                image_width = this.image_wrapper_height * ratio;
            };
            if (image_width > this.image_wrapper_width) {
                var ratio = image_height / image_width;
                image_width = this.image_wrapper_width;
                image_height = this.image_wrapper_width * ratio;
            };
            return { width: image_width, height: image_height };
        },
        /**
        * If the image dimensions are smaller than the wrapper, we position
        * it in the middle anyway
        */
        _centerImage: function(img, h, w) {
			//var img_container = this.image_wrapper.find("div.ad-image:first");
			//var obj = img_container.find("img:first");
			
			var size = this._getContainedImageSize( w, h );
			img.css({ top:0, left:0 });
			
            if (size.height < this.image_wrapper_height) {
                var dif = this.image_wrapper_height - size.height;
                img.css({ top:(dif / 2) + 'px', height:'auto' });
            };
			/*
            if (size.width < this.image_wrapper_width) {
                var dif = this.image_wrapper_width - size.width;
                obj.css('left', (dif / 2) + 'px');
            };
			*/
        },
        _getDescription: function(image) {
            var desc = false;
            if (image.desc.length || image.title.length) {
                var title = '', source;
                if (image.title.length) {
                    title = '<strong class="ad-description-title">' + image.title + '</strong>';
                    source = '<div class="ad-description-source"><img src="' + image.favicon + '" alt="" />' + image.favSource + '</div>';
                };
                var desc = '';
                if (image.desc.length) {
                    desc = '<span>' + image.desc + '</span>';
                };
				
				var addThis = '<a class="addthis_button" addthis:url="'+ image.source +'" addthis:title="'+ image.title +'"><img src="http://s7.addthis.com/static/btn/sm-share-en.gif" width="83" height="16" alt="Bookmark and Share" /></a>';
				//var addThis = '<a class="addthis_button"><img src="http://s7.addthis.com/static/btn/sm-share-en.gif" width="83" height="16" alt="Bookmark and Share" /></a>';
				//initShare(image.title, image.source);
				desc = $('<div class="ad-image-description"><div class="wrap">' + addThis + title + source + '</div></div>');
            };			
            return desc;
        },
        /**
        * @param function callback Gets fired when the image has loaded, is displaying
        *                          and it's animation has finished
        */
        showImage: function(index, callback){
			return false;
            if (this.images[index].image == null || this.images[index].image == ''){
                this.images[index].in_transition = false;
                this.images[index].preloaded = false;
            }

            var count = this.images.length;
            
            if (this.images[index] && !this.in_transition){
                var context = this;
                var image = this.images[index];
                this.in_transition = true;
                if (!image.preloaded) {
                    this.loading(true);
                    this.preloadImage(index, function(){
                    if (image.error){
                            // i've inserted this code to deal with bad images. If we get an  error
                            // on a image i just use the thumbnail image instead.
                           
							//var thumbImageFound = $(context.thumbs_wrapper.children()[0].children[2]).find('img');
                            //image.image = thumbImageFound.attr('src');
							
							//this._centerImage();
                            image.image = image.thumb;
                            image.preloaded = false;
                        }

                        context.loading(false);
                        context._showWhenLoaded(index, callback);
                    });
                } else {
                    this._showWhenLoaded(index, callback);
                };
            };
        },
        /**
        * @param function callback Gets fired when the image has loaded, is displaying
        *        and it's animation has finished
        */
        _showWhenLoaded: function(index, callback) {
            try {
                if (this.images[index]) {
                    var context = this;
                    var image = this.images[index];
                    var img_container = $(document.createElement('div')).addClass('ad-image');
					img_container.hide();
                    var img = null;
					
					function newAnimation(speed){
						if( context.current_image || context.settings.animate_first_image ){
							if( speed == 0 ){
								var old_image = context.current_image;
								old_image.remove();
								img_container.show();
								initAniation();
							}
							else{
								var animation_speed = context.settings.animation_speed;
								if (context.current_image){
									var old_image = context.current_image;
									old_image.fadeOut(animation_speed, function() {
										old_image.remove();
										
										img_container.fadeIn(animation_speed, function() {
											initAniation()
										});
										
									});
								};
							};
						}else{
							initAniation()
						};
						
						function initAniation(){
							img_container.removeAttr("style");
							context.current_index = index;
							context.current_image = img_container;
							context.in_transition = false;
							context._afterShow();
							context.fireCallback(callback);
						}
					}
					
					// if its not an image type (maybe a video or something else)
                    if (image.image == null || image.image == '') {
						//var htmlCode = $('.ad-thumb' + index).find('.displaycontainer').attr('displayHtml');
						var htmlCode = $('div.videoList .ad-thumb' + index).data('htmlcode');
                        img = $('<div/>');
						img.addClass("video").html( htmlCode );
						
						//img.find("object, embed").attr("height","100%").attr("width","100%");
						
						//if its a Flash, then build needed DOM
						if( img.find("object").length || img.find("embed").length ){
							if( img.find("object").length ){
								var movieSrc = img.find("object param[name='movie']").attr("value");
								var movieFlashVars = img.find("object param[flashvars]").val() || "";
							}
							else{
								var movieSrc = img.find("embed").attr("src");
								var movieFlashVars = img.find("embed").attr("flashvars") || "";
							}
							
							/* with <object>
							img.html('<object type="application/x-shockwave-flash" data="' + movieSrc +'" width="100%" height="100%">' +
									 '<param name="movie" value="' + movieSrc +'" />' +
									 '<param name="wmode" value="opaque" />' +
									 '<param name="flashvars" value="' + movieFlashVars + '" />' +
									 '<param name="allowFullScreen" value="true" />' +
									 '</object>');
							*/	
							
							// with <embed>
							//movieSrc.replace(/autoplay=1/i,'autoplay=0');
							
							img.html('<embed type="application/x-shockwave-flash"' +
									'src="' + movieSrc + '" width="100%" height="100%" wmode="opaque" allowFullScreen="true" flashvars="' + movieFlashVars + '"' +
									'pluginspage="http://www.adobe.com/go/getflashplayer" />');
							
							this.image_wrapper.addClass("video");
							img_container.append(img).hide();
						};
						
						//img = $('.ad-thumb' + index).find('.displaycontainer').attr('displayHtml');
                        //image.size = new Object();
                        //image.size.width = 468;
                        //image.size.height = 295;
                    }
                    else {
						img = new Image();
						
						img.onload = function(){
							this.onload = null;
							
							// check if width/height ratio is too big, then centers the image. 
							// this is good only as long as popup ratio is about 1.5
							if( (img.width / img.height) > 1.5 ){
								img.style.width = '100%';
								img.style.height = 'auto';
							}
							
							var imgHeight = img.height;
							var imgWidth  = img.width;
							var containerHeight = img_container.height();
							var containerWidth  = img_container.width();
							
							if( imgWidth < containerWidth && imgHeight < containerHeight ){
								img.style.width = 'auto';
								img.style.height = 'auto';
							}
							//else
							//	img_container.removeAttr("style");
							
							context._centerImage( $(img),imgHeight,imgWidth );
							
							$(img).removeAttr("width").removeAttr("height");
							
							img = $("<a class='image' href='"+ image.source +"'></a>").append(img);
							img_container.append(img);
							
							newAnimation();
						};
						
						img.onerror = function(){
							//alert("error");
						};
						
						// image.source
						img.src = image.image;
						
					};
					
					var desc = this._getDescription(image, img_container);
                    if (desc) {
                        img_container.append(desc);
					
					//this.image_wrapper.append(img);
                    //var size = this._getContainedImageSize(image.size.width, image.size.height);
					
                    this.image_wrapper.prepend(img_container);
					if( this.image_wrapper.hasClass('video') )
						newAnimation(0);
					
                    //img.attr('width', size.width);
                    //img.attr('height', size.height);
					/*
                    if (size.width == null) {
                        size.height = 295;
                        size.width = 468;
                    }
					*/
					/*
                    try {
                        img_container.css({ width: size.width + 'px', height: size.height + 'px' });
                    }
                    catch (err) {
                        size.height = 295;
                        size.width = 466;
                    }
					*/
                    
					//	addthis.button('.addthis_button');
					//	addthis_noClick();
                        //var width = size.width - parseInt(desc.css('padding-left'), 10) - parseInt(desc.css('padding-right'), 10);
                        //desc.css('width', width + 'px');
						
                    };
                    this.highLightThumb(this.nav.find('.ad-thumb' + index));
					
					/* absolete
					function initAnimation(){
						var direction = 'right';
						if (context.current_index < index) {
							direction = 'left';
						};
						context.fireCallback(context.settings.callbacks.beforeImageVisible);
						if (context.current_image || context.settings.animate_first_image){
							var animation_speed = context.settings.animation_speed;
							var easing = 'swing';
							var animation = context.animations[context.settings.effect].call(context, img_container, direction, desc);
							if (typeof animation.speed != 'undefined') {
								animation_speed = animation.speed;
							};
							if (typeof animation.easing != 'undefined') {
								easing = animation.easing;
							};
							if (context.current_image) {
								var old_image = context.current_image;
								old_image.animate(animation.old_image, animation_speed, easing,
								function() {
									old_image.remove();
								});
							};
							img_container.animate(animation.new_image, animation_speed, easing,
								function() {
									context.current_index = index;
									context.current_image = img_container;
									context.in_transition = false;
									context._afterShow();
									context.fireCallback(callback);
								});
						}else{
							context.current_index = index;
							context.current_image = img_container;
							context.in_transition = false;
							context._afterShow();
							context.fireCallback(callback);
						};
					};
					*/
                }
            }
            catch (err) {
                alert(err.message);
            }
        },
        nextIndex: function() {
            if (this.current_index == (this.images.length - 1)) {
                if (!this.settings.cycle) {
                    return false;
                };
                var next = 0;
            } else {
                var next = this.current_index + 1;
            };
            return next;
        },
        nextImage: function(callback) {
			return false;
            var next = this.nextIndex();
            if (next === false) return false;
            //this.preloadImage(next + 1);
            this.showImage(next, callback);
            return true;
        },
        prevIndex: function() {
			return false;
            if (this.current_index == 0) {
                if (!this.settings.cycle) {
                    return false;
                };
                var prev = this.images.length - 1;
            } else {
                var prev = this.current_index - 1;
            };
            return prev;
        },
        prevImage: function(callback) {
			return false;
            var prev = this.prevIndex();
            if (prev === false) return false;
           // this.preloadImage(prev - 1);
            this.showImage(prev, callback);
            return true;
        },
        preloadAll: function() {
			return false;
            var context = this;
            var i = 0;
            function preloadNext() {
                if (i < context.images.length) {
                    i++;
                    context.preloadImage(i, preloadNext);
                };
            };
            context.preloadImage(i, preloadNext);
        },
        preloadImage: function(index, callback) {
            if (this.images[index]) {
                var image = this.images[index];
                if (!this.images[index].preloaded) {
                    if (image.image == null || image.image == '') {
                        this.fireCallback(callback);
                        return;
                    }
                    var img = $(new Image());
                    img.attr('src', image.image);
                    if (!this.isImageLoaded(img[0])) {
                        this.preloads.append(img);
                        var context = this;
                        img.load(
              function() {
                  image.preloaded = true;
                  image.size = { width: this.width, height: this.height };
                  context.fireCallback(callback);
              }
            ).error(
              function() {
                  image.error = true;
                  image.preloaded = false;
                  image.size = false;
                  context.fireCallback(callback);
              }
            );
                    } else {
                        image.preloaded = true;
                        image.size = { width: img[0].width, height: img[0].height };
                        this.fireCallback(callback);
                    };
                } else {
                    this.fireCallback(callback);
                };
            };
        },
        isImageLoaded: function(img) {
            if (typeof img.complete != 'undefined' && !img.complete) {
                return false;
            };
            if (typeof img.naturalWidth != 'undefined' && img.naturalWidth == 0) {
                return false;
            };
            return true;
        },
        highLightThumb: function(thumb) {
            this.thumbs_wrapper.find('.ad-active').removeClass('ad-active');
            thumb.addClass('ad-active');
            if (this.settings.thumb_opacity < 1) {
                this.thumbs_wrapper.find('div.ad-thumbs ul img').fadeTo(300, this.settings.thumb_opacity);
                thumb.find('img').fadeTo(300, 1);
            };
            var left = thumb[0].parentNode.offsetLeft;
            left -= (this.nav_display_width / 2) - (thumb[0].offsetWidth / 2);
            this.thumbs_wrapper.animate({ scrollLeft: left + 'px' });
        },
        fireCallback: function(fn) {
            if ($.isFunction(fn)) {
                fn.call(this);
            };
        }
    };

    function AdGallerySlideshow(nextimage_callback, settings) {
        this.init(nextimage_callback, settings);
    };
    AdGallerySlideshow.prototype = {
        start_link: false,
        stop_link: false,
        countdown: false,
        controls: false,

        settings: false,
        nextimage_callback: false,
        enabled: false,
        running: false,
        countdown_interval: false,
        init: function(nextimage_callback, settings) {
            var context = this;
            this.nextimage_callback = nextimage_callback;
            this.settings = settings;
        },
        create: function() {
            this.start_link = $('<span class="ad-slideshow-start">' + this.settings.start_label + '</span>');
            this.stop_link = $('<span class="ad-slideshow-stop">' + this.settings.stop_label + '</span>');
            this.countdown = $('<span class="ad-slideshow-countdown"></span>');
            this.controls = $('<div class="ad-slideshow-controls"></div>');
            this.controls.append(this.start_link).append(this.stop_link).append(this.countdown);
            this.countdown.hide();

            var context = this;
            this.start_link.click(
        function() {
            context.start();
        }
      );
            this.stop_link.click(
        function() {
            context.stop();
        }
      );
            $(document).keydown(
        function(e) {
            if (e.keyCode == 83) {
                // 's'
                if (context.running) {
                    context.stop();
                } else {
                    context.start();
                };
            };
        }
      );
            return this.controls;
        },
        disable: function() {
            this.enabled = false;
            this.stop();
            this.controls.hide();
        },
        enable: function() {
            this.enabled = true;
            this.controls.show();
        },
        toggle: function() {
            if (this.enabled) {
                this.disable();
            } else {
                this.enable();
            };
        },
        start: function() {
            if (this.running || !this.enabled) return false;
            var context = this;
            this.running = true;
            this.controls.addClass('ad-slideshow-running');
            this._next();
            this.fireCallback(this.settings.onStart);
            return true;
        },
        stop: function() {
            if (!this.running) return false;
            this.running = false;
            this.countdown.hide();
            this.controls.removeClass('ad-slideshow-running');
            clearInterval(this.countdown_interval);
            this.fireCallback(this.settings.onStop);
            return true;
        },
        _next: function() {
            var context = this;
            var pre = this.settings.countdown_prefix;
            var su = this.settings.countdown_sufix;
            clearInterval(context.countdown_interval);
            this.countdown.show().html(pre + (this.settings.speed / 1000) + su);
            var slide_timer = 0;
            this.countdown_interval = setInterval(
        function() {
            slide_timer += 1000;
            if (slide_timer >= context.settings.speed) {
                var whenNextIsShown = function() {
                    // A check so the user hasn't stoped the slideshow during the
                    // animation
                    if (context.running) {
                        context._next();
                    };
                    slide_timer = 0;
                };
                if (!context.nextimage_callback(whenNextIsShown)) {
                    context.stop();
                };
                slide_timer = 0;
            };
            var sec = parseInt(context.countdown.text().replace(/[^0-9]/g, ''), 10);
            sec--;
            if (sec > 0) {
                context.countdown.html(pre + sec + su);
            };
        },
        1000
      );
        },
        fireCallback: function(fn) {
            if ($.isFunction(fn)) {
                fn.call(this);
            };
        }
    };
})(hjquery);
