(function($) { // hide the namespace
	$.fn.scroller = function(options){
		var settings = $.extend({}, $.fn.scroller.defaults, options);
		var propSize = function (imgSize, maxSize){
		    var pc = Math.min(1, maxSize[0]/imgSize[0], maxSize[1]/imgSize[1]);
		    return [Math.round(imgSize[0]*pc), Math.round(imgSize[1]*pc)];
		};

		return this.each(function(n){
			var options = settings;
			var t = $(this);
			var imgs = [];
			var lnk;
			var pl, pm, pp, photoTimer;
			var nShift, tIdx = 0, tNum = 3;
			var pl = options['photoList'] ? options['photoList'] : t.find('.ssList');
			var pm = options['photoMask'] ? options['photoMask'] : t.find('.ssMask');
			var pp = options['photoPreview'] ? options['photoPreview'] : t.find('.ssPreview');
			var next = options['photoNext'] ? options['photoNext'] : t.find('.ssNext');
			var prev = options['photoPrev'] ? options['photoPrev'] : t.find('.ssPrev');
			var desc = options['photoDesc'] ? options['photoDesc'] : t.find('.photoDesc');
			var changePhoto = function (idx){
				idx = (isNaN(idx) ? (tIdx + 1) : idx) % tLen;
				//alert(id);
				if(idx < 0)idx = 1;
				tIdx = idx;
				var l = lnks.eq(idx);
				var left = l.offset().left - pm.offset().left - 1;
				clearTimeout(photoTimer);
				if(typeof (imgs[idx]) != 'undefined'){
					var cur = pp.find('img:first-child');
					var pos = cur.position();
					img = imgs[idx];
					var alt = l.children("img:first-child").attr('alt');
					cur.css({position : 'absolute',left : pos.left,background : '',top : pos.top}).animate({opacity:0,width:img[1]+'px',height:img[2]+'px',left:pp.offset().left+(pp.width()-img[1])/2+'px'},{queue:false,complete:function(){$(this).remove();}})
					.before('<img/>').prev().attr({'src':img[0].src, title:alt}).css({width:cur[0].width,height:cur[0].height}).animate({width:img[1]+'px',height:img[2]+'px'},{queue:false});
					desc.html('<a href="'+l.attr('href')+'">'+alt +'</a>');
					lnks.removeClass('hover');
					l.addClass('hover');
					var pos = (pm.width() - left);
					if(pos <= 0){
						next.click();
					}else if(idx == 0){
						pl.animate({ left:"0px"}, 700);
					}
					if(options.slideshow)photoTimer = setTimeout(nextPhoto, options.interval, null);
				}else{
					var img = new Image();
					l.append('<span class="load"/>').children('span:last-child');
					$(img).bind('load', function() {
						if(this.width){
							imgs[idx] = (new Array(img)).concat(propSize([this.width, this.height], options.maxSize));
						}else{
							imgs[idx] = [img, options.maxSize[0], options.maxSize[1]];
						}
						l.find('span.load').remove();
						$(this).unbind();
						options.change(idx);
					});
					img.src = l.children("img:first-child").attr('src').replace('90x60', options.dir);
				}
			};
			if (options.slideshow && !options.change){
				options.change = changePhoto;
			}
			var nextPhoto = function(){
				if (options.change) options.change();
			};
			var lnks = pl.find('a');
			var tLen = lnks.length;
			// Find the default image to load
			var l = lnks.filter('.def');
			l = (l.length == 0) ? lnks.eq(0) : l;
			// Calculate size of different elements
			width = l.outerWidth(true);
			var plWidth = width * lnks.length;
			var pmWidth = pm.width();
			//pm.css({overflow:'visible'});
			pl.css({"width": plWidth + tLen});
			tNum = parseInt(pmWidth / width);
			l.click();
			if(plWidth > pmWidth){
				nShift = width * tNum;
				
				var left = Math.max(pmWidth - plWidth, 0 - Math.max(0, lnks.index(l) - 2) * width);
				//var left = Math.max(pmWidth - plWidth, pm.offset().left + 1 + 2 * width - l.offset().left);
				
				pl.css('left', left);
				next.click(function(){
					var newPos = Math.max(pmWidth - plWidth, parseInt(pl.css('left')) - nShift);
					pl.animate({ left:newPos+"px"}, 500);
					return false;
				});
				prev.click(function() {
					var newPos = Math.min(0, parseInt(pl.css('left')) + nShift);
					pl.animate({ left:newPos+"px"}, 500);
					return false;
				});
			}else{
				pl.css('left', (pmWidth-plWidth)/2);
				prev.add(next).click(function(){return false;});
			}
			if(options.slideshow){
				lnks.click(function(){
					var idx = lnks.index(this);
					options.change(idx);
					return false;
				});
				if(options.autostart)photoTimer = setTimeout(nextPhoto, options.interval, null);
			}
			
		});
	};
	$.fn.scroller.defaults = {
		change:null,
		maxSize : [294,225],
		dir : '300x225',
		slideshow : true,
		autostart : true,
		interval : 5000
	};
})(jQuery);
