/**
 * jQuery scrollpane - v1.0.0
 * Copyright © 2010 MITAKA TAIYOKEI-WALK COMITTE. ALL RIGHTS RESERVED.
 * This plugin is made for みたか太陽系ウォーク (taiyokei-walk.jp).
 * 
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 *	jquery.ui.draggable.js
 *	jquery.effects.core.js
 *	jquery.mousewheel.min.js
 */
(function(jQuery) {
	jQuery.scrollpane = function(config){
		var defaults = {
			slider:null,
			contents:null,
			imgPath:'../images/',
			more:'#more',
			pos:0,
			speed:1
		};
		var options = jQuery.extend(defaults, config);
		
		jQuery(options.contents).parent().css({position:"relative", overflow:"hidden"});
		jQuery(options.contents).css("position", "absolute");
		
		var down = '<a href="javascript:scrollpain.downStep();"><img src="' +  options.imgPath + 'btn_more_off.gif" alt="もっと見る" /></a>';
		var up = '<a href="javascript:scrollpain.upStep();"><img src="' +  options.imgPath + 'btn_up_off.gif" alt="上へ戻る" /></a>';
		var dual = '<a href="javascript:scrollpain.upStep();" class="upbtn"><img src="' +  options.imgPath + 'btn_up_s_off.gif" alt="上へ戻る" /></a><a href="javascript:scrollpain.downStep();" class="morebtn"><img src="' +  options.imgPath + 'btn_more_s_off.gif" alt="もっと見る" /></a>';
		jQuery(options.more).html(down);
		
		if(!jQuery.support.checkOn && !jQuery.support.checkClone) { // iPad, iPhone (mobile webKit)
		
			// slider
			jQuery(options.slider).css('position', 'absolute');
			jQuery(options.slider).bind('touchstart', function(event) {
				event.preventDefault();
				var startY = event.originalEvent.touches[0].pageY;
				var startSliderPos = Number(jQuery(options.slider).position().top);
				startSliderPos = startSliderPos ? startSliderPos : 0;
				
				jQuery(options.slider).bind('touchmove', function(event) {
					event.preventDefault();
					var pos = startSliderPos + (event.originalEvent.touches[0].pageY - startY);
					jQuery(options.slider).css('top', Math.max(0, Math.min(pos, jQuery(options.slider).parent().height() - jQuery(options.slider).height())));
					
					options.pos = Math.min(1, jQuery(options.slider).position().top / (jQuery(options.slider).parent().height() - jQuery(options.slider).height()));
					var cpos = (jQuery(options.contents).height() - jQuery(options.contents).parent().height()) * -options.pos;
					jQuery(options.contents).animate({top:cpos}, {"duration":options.speed * 1000, "easing":"easeOutCubic", "queue":false});
					
				})
			});
			
			jQuery(options.slider).bind('touchend', function(event) {
				jQuery(options.slider).unbind('touchmove');
			});
			
			// contents
			jQuery(options.contents).bind('touchstart', function(event) {
				//event.preventDefault();
				var startY = event.originalEvent.touches[0].pageY;
				
				jQuery(options.contents).bind('touchmove', function(event) {
					event.preventDefault();
					var delta = event.originalEvent.touches[0].pageY - startY;
					
					var pos = jQuery(options.slider).position().top - delta;
					jQuery(options.slider).css("top", Math.max(0, Math.min(pos, jQuery(options.slider).parent().height() - jQuery(options.slider).height())));
					
					options.pos = Math.min(1, jQuery(options.slider).position().top / (jQuery(options.slider).parent().height() - jQuery(options.slider).height()));
					var cpos = (jQuery(options.contents).height() - jQuery(options.contents).parent().height()) * -options.pos;
					jQuery(options.contents).animate({top:cpos}, {"duration":options.speed * 1000, "easing":"easeOutCubic", "queue":false, complete:onMoved});
					
					startY = event.originalEvent.touches[0].pageY;
				})
			});
			jQuery(options.contents).bind('touchend', function(event) {
				jQuery(options.contents).unbind('touchmove');
			});
			
		} else { // expect mobile webKit 
			jQuery(options.slider).mouseover(function(){ jQuery(this).css("cursor", "pointer") });
			jQuery(options.slider).draggable({axis:"y", containment:"parent", cursor:"pointer", drag:onDrag, stop:onMoved});
			
			// mouse wheel
			jQuery(options.contents).bind('mousewheel', function(event, delta) {
				if(jQuery(options.contents).parent().height() < jQuery(options.contents).height()) {
					if(!jQuery.support.checkOn) { // webkit
						delta *= .25;
					} else { // others
						delta *= 1.5;
					}
					if(navigator.platform.indexOf('Win') != -1) delta *= 5;
					var pos = jQuery(options.slider).position().top - delta;
					jQuery(options.slider).css("top", Math.max(0, Math.min(pos, jQuery(options.slider).parent().height() - jQuery(options.slider).height())));
					
					options.pos = Math.min(1, jQuery(options.slider).position().top / (jQuery(options.slider).parent().height() - jQuery(options.slider).height()));
					var cpos = (jQuery(options.contents).height() - jQuery(options.contents).parent().height()) * -options.pos;
					jQuery(options.contents).animate({top:cpos}, {"duration":options.speed * 1000, "easing":"easeOutCubic", "queue":false, complete:onMoved});
				}
			});
		}
		
		function onDrag(e, o) {
			options.pos = Math.min(1, o.position.top / (jQuery(options.slider).parent().height() - jQuery(options.slider).height()));
			var cpos = (jQuery(options.contents).height() - jQuery(options.contents).parent().height()) * -options.pos;
			jQuery(options.contents).animate({top:cpos}, {"duration":options.speed * 1000, "easing":"easeOutCubic", "queue":false});
		};
		function onMoved() {
			if(jQuery(options.slider).position().top == 0) {
				jQuery(options.more).html(down);
			} else if(jQuery(options.slider).position().top == (jQuery(options.slider).parent().height() - jQuery(options.slider).height()))  {
				jQuery(options.more).html(up);
			} else {
				jQuery(options.more).html(dual);
			}
			setRollover();
		}
		
		// public property and methods.
		return {
			params:options,
			clear:function() {
				jQuery(options.slider).css("top", 0);
				jQuery(options.contents).stop(true, true).css("top", 0);
				options.pos = 0;
			},
			setPosition:function() {
				var slidemax = jQuery(options.slider).parent().height() - jQuery(options.slider).height();
				jQuery(options.slider).css("top", Math.min(slidemax, slidemax * options.pos));
				var cpos = Math.min(0, (jQuery(options.contents).height() - jQuery(options.contents).parent().height()) * -options.pos);
				jQuery(options.contents).animate({top:cpos}, {"duration":options.speed * 1000, "easing":"easeOutCubic", "queue":false, complete:onMoved});
			},
			downStep:function() {
				var parentH = jQuery(options.contents).parent().height();
				var scrollMax = parentH - jQuery(options.contents).height();
				var currentPos = Math.round(jQuery(options.contents).position().top);
				currentPos = currentPos ? currentPos : 0;
				var scrollPos = Math.max(scrollMax, currentPos - parentH);
				options.pos = scrollPos / scrollMax;
				var slidPos = (jQuery(options.slider).parent().height() - jQuery(options.slider).height()) * options.pos;
				
				jQuery(options.slider).animate({top:slidPos}, {"duration":options.speed * 500, "easing":"easeOutCubic", "queue":false, complete:onMoved});
				jQuery(options.contents).animate({top:scrollPos}, {"duration":options.speed * 500, "easing":"easeOutCubic", "queue":false});
			},
			upStep:function() {
				var parentH = jQuery(options.contents).parent().height();
				var scrollMax = parentH - jQuery(options.contents).height();
				var currentPos = Math.round(jQuery(options.contents).position().top);
				currentPos = currentPos ? currentPos : 0;
				var scrollPos = Math.min(0, currentPos + parentH);
				options.pos = scrollPos / scrollMax;
				var slidPos = (jQuery(options.slider).parent().height() - jQuery(options.slider).height()) * options.pos;
				
				jQuery(options.slider).animate({top:slidPos}, {"duration":options.speed * 500, "easing":"easeOutCubic", "queue":false, complete:onMoved});
				jQuery(options.contents).animate({top:scrollPos}, {"duration":options.speed * 500, "easing":"easeOutCubic", "queue":false});
			},
			forcus:function(pos) {
				if(jQuery(options.contents).parent().height() < jQuery(options.contents).height()) {
					var scrollMax = jQuery(options.contents).parent().height() - jQuery(options.contents).height();
					var scrollPos = Math.max(scrollMax, -pos);
					options.pos = scrollPos / scrollMax;
					var slidPos = (jQuery(options.slider).parent().height() - jQuery(options.slider).height()) * options.pos;
					
					jQuery(options.slider).animate({top:slidPos}, {"duration":options.speed * 500, "easing":"easeOutCubic", "queue":false, complete:onMoved});
					jQuery(options.contents).animate({top:scrollPos}, {"duration":options.speed * 500, "easing":"easeOutCubic", "queue":false});
				}
			}
		};
		
	};
})(jQuery);
