;(function($) {
	// private variables
	var oSettings = {};
	var bImgLoaded = false;
	var oCssDivInit = {
		 overflow:	"hidden"
		,width:		"600px"
		,position:	"relative"
		,left:		"0px"
		,top:		"0px"
	};
	var oCssUlInit = {
		listStyle:	"none"
		,margin:	"0px"
		,position:	"absolute"
	};
	var oCssLiInit = {
		  float:	"left"
	};
	//
	var iImgRowWidth = 0;
	var iMinRowX = -100;
	var iMaxRowX = 0;
	//
	var mImgRowDiv;
	var mImgRowUl;
	var aImgRowImgs;
	//
	var iW;
	var iH;
	//
	var iMx = 0;
	var iMy = 0;
	//
	var bOverDiv = false;
	//
	var iSpd = -1;
	//
	// default settings
	$.silviewer = {
		 id: "Silviewer"
		,version: "1.0.0"
		,defaults: {
			 debug:	false
			,type: "mouse"
			,width: null
			,height: null
		}
		// public functions
		,foo: function(bar) {
		}
	};
	// call
	$.fn.extend({
		silviewer: function(_settings) {
			oSettings = $.extend({}, $.silviewer.defaults, _settings);
			trace($.silviewer.id+" "+$.silviewer.version,true);
			//
			//
			if (oSettings.width!==null)		oCssDivInit.width = oSettings.width+"px";
			if (oSettings.height!==null)	oCssDivInit.height = oSettings.height+"px";
			//
			if (this.length>0) {
				$(window).load(function(e){
					if (!bImgLoaded) imgsLoaded();
				});
			}
			//
			return this.each(function(i,o) {
				init($(o));
				var mUl = $(o);
				var aLi = mUl.find(">li");
				var iNumLi = aLi.length;
			});
		}
		,setScrPos: function() {
			return $(this);
		}
	});

	// init
	function init(ul) {
		mImgRowUl = ul;
		aImgRowImgs = mImgRowUl.find("img");
		//
		mImgRowDiv = mImgRowUl.wrap('<div class="silviewer"></div>').parent();
		mImgRowDiv.append('<br style="clear:both;" />');
		mImgRowDiv.mouseover(function(e){bOverDiv=true;}).mouseout(function(e){bOverDiv=false;});
		// initial css
//		alert("a"+mImgRowDiv+" "+oCssDivInit);
//		mImgRowDiv.css(oCssDivInit);
		mImgRowDiv.css({
			 overflow:	"hidden"
//			,width:		"600px"
			,position:	"relative"
//			,left:		"0px"
//			,top:		"0px"
		});
		mImgRowDiv.height($(aImgRowImgs[0]).height());
		mImgRowUl.css(oCssUlInit);
		mImgRowUl.find("li").css(oCssLiInit);
		iW = mImgRowDiv.width();
		// set height to first img height
		mImgRowUl.find("img:first").load(function(e){
			iH = mImgRowDiv.height($(e.currentTarget).height());
		});
		// loading all images
		var iImgLoad = 0;
		trace("waiting for "+aImgRowImgs.length+" imgs...")
		aImgRowImgs.each(function(i,el){
			iImgLoad++;
			$(this).load(function(e){
				iImgLoad--;
				if (iImgLoad===0) {
					imgsLoaded();
				}
			});
		});
		if (iImgLoad===0) bImgLoaded = true;
		//
//		$("#menu").prepend("<li>END_REACHED</lki>");
	}

	// imgsLoaded
	function imgsLoaded() {
		trace("imgsLoaded");
		iImgRowWidth = 0;
		aImgRowImgs.each(function(i,el){
			iImgRowWidth += $(el).parent().width();
		});
		mImgRowUl.width(iImgRowWidth);
		//$(window).resize(calcMinRowX);
		calcMinRowX();
		trace("iW: "+iW);
		trace("iImgRowWidth: "+iImgRowWidth);
		trace("iMinRowX: "+iMinRowX);
		trackMouse();
		moveImageRow();
	}

	// calcMinRowX
	function calcMinRowX() {
		iMinRowX = iW-iImgRowWidth;
	}
	// trackMouse
	function trackMouse() {
		$(document).mousemove(function(e){
			iMx = e.pageX;
			iMy = e.pageY;
		}); 
	}

	// moveImageRow
	function moveImageRow() {
		var iHoffset = iSpd;
		if (bOverDiv) {
			iHoffset = -.1*(iMx-(mImgRowDiv.position().left+.5*iW));
			iSpd = Math.abs(iSpd)*(iHoffset/Math.abs(iHoffset));
		}
		var iXnow = mImgRowUl.position().left;
		var iXnew = Math.min(Math.max(Math.round(iXnow + iHoffset),iMinRowX),iMaxRowX);
		//
		if (!bOverDiv&&iXnow===iXnew) iSpd = -iSpd;
		//
		mImgRowUl.css({
			left: iXnew+"px"
		});
		setTimeout(moveImageRow,40);
	}

	// trace
	function trace(o,v) {
		if ((v||oSettings.debug)&&window.console&&window.console.log) {
			if (typeof(o)==="string")	window.console.log($.silviewer.id+" "+o);
			else						for (var prop in o) window.console.log(prop+":\t"+String(o[prop]).split("\n")[0]);
		}
	}
})(jQuery);
