(function($) {
	$.fn.handScroller = function(options) {
		var defaults = {};
		var options = $.extend(defaults, options);
		return this.each(function() {
			var $this = $(this);
			$this.bind("ondragstart", function() {
				return false;
			});
			if($this.css("width") != undefined) {
				var galWidth = 0;
				var galMaxWidth = parseFloat($this.css("width").replace("px", ''));
				options.container.find("div").each(function() {
					var $this = $(this);
					var w = $this.width();
					galWidth += w;
				});
				galWidth -= galMaxWidth;
				var oPos = options.fixTarget.position();
				options.fixTarget.css({
					'position' : "absolute",
					'marginLeft' : 0,
					'marginTop' : 0,
					'top' : oPos.top,
					'left' : oPos.left
				})
				options.container.css({
					'position' : "absolute",
					'marginLeft' : 0,
					'marginTop' : 0
				});
				var mdown = false;
				var moving = false;
				var ampos = {
					x : 0,
					y : 0
				};
				var ompos = {
					x : 0,
					y : 0
				};
				var mpos = {
					x : 0,
					y : 0
				};
				var speed = {
					x : 04,
					y : 0
				};
				var hdir = 0;
				var containerX = 0;
				var maxSpeed = 13;
				var maxFalloff = .04;
				options.container.find('div').mouseup(function(e) {
					if(mdown && !moving) {
						window.location = $(this).attr('href');
					}
				});
				options.fixTarget.mousedown(function(e) {
					mdown = true;
					speed.x = 0;
					ampos.x = parseInt(e.pageX);
					ampos.y = parseInt(e.pageY);
					mpos.x = parseInt(e.pageX);
					mpos.y = parseInt(e.pageY);
					return false;
				});
				var browserWindow = $(window);
				if(jQuery.browser.msie) {
					browserWindow = $(document);
				}
				options.container.mousemove(function(e) {
					if(!mdown) {
						options.container.css("cursor", "pointer");
					} else {
						speed.x = 0;
					}
				});
				browserWindow.mousemove(function(e) {
					oPos = options.fixTarget.position();
					if(mdown) {
						options.container.css("cursor", "w-resize");
						moving = true;
						ompos.x = parseInt(mpos.x);
						ompos.y = parseInt(mpos.y);
						mpos.x = parseInt(e.pageX);
						mpos.y = parseInt(e.pageY);
						speed.x = mpos.x - ompos.x;
						speed.y = mpos.y - ompos.y;
						containerX += parseInt(speed.x);
						if(containerX > 0) {
							containerX = containerX - 105;
							options.container.find('.gal_item:last').prependTo(options.container);
						} else if(containerX < -105) {
							containerX = containerX + 105;
							options.container.find('.gal_item:first').appendTo(options.container);
						}
						options.container.css({
							left : containerX
						})
					}
				}).mouseup(function(e) {
					moving = false;
					mdown = false;
					options.container.css("cursor", "pointer");
				});
				$this.update = function() {
					var dir = 0;
					if(!mdown) {
						if(speed.x > maxSpeed)
							speed.x = maxSpeed;
						if(speed.x < -maxSpeed)
							speed.x = -maxSpeed;
						if(parseInt(Math.abs(speed.x)) > 0) {
							dir = parseInt(speed.x) / parseInt(Math.abs(speed.x));
						}
						var moving = false;
						if(dir > 0) {
							containerX += parseInt(speed.x);
							speed.x -= maxFalloff;
							if(speed.x < 0)
								speed.x = maxFalloff;
							moving = true;
						} else if(dir < 0) {
							containerX += parseInt(speed.x);
							speed.x += maxFalloff;
							if(speed.x > 0)
								speed.x = maxFalloff;
							moving = true;
						}
						if(moving) {
							if(containerX > 0) {
								containerX = containerX - 105;
								options.container.find('.gal_item:last').prependTo(options.container);
							} else if(containerX < -105) {
								containerX = containerX + 105;
								options.container.find('.gal_item:first').appendTo(options.container);
							}
							options.container.css({
								left : containerX
							});
						} else {
							speed.x = 1;
						}
					}
					//$this.delay(10, $this.update);
				}
				setInterval($this.update, 10);
				//$this.delay(10, $this.update);
			};
		});
	};
	$(window).load(function() {
		var galContainer = $("#gal_container");
		var gal = $("#site_gallery");
		$('#site_gallery').handScroller({
			container : $("#gal_container"),
			fixTarget : $("#gal_content")
		});
	});
})(jQuery);

