/*
 * Page Scroll
 *
 * Copyright: (c) 2009 九州旅客鉄道株式会社
 *
 * Depends Script:
 *	js/jQuery/jquery.js (1.3.2)
 */

var pagescroll = {
	jQuery: $,

	settings: {
		autostart: true,
		top_anchor: 'pagetop',
		top_margin: 0
	},

/* objects~ */
	_ready: false,
	_msie6: false,
/* ~objects */

/* action~ */
	init: function() {
		if (this.jQuery.browser.msie && parseInt(this.jQuery.browser.version) <= 6) this._msie6 = true;
		if (this.settings.autostart) this.set();
		this._ready = true;
	},

	set: function(container) {
		var pagescroll = this,
			$ = this.jQuery,
			settings = this.settings;

		var now_page = (location.protocol + '//' + location.hostname + '/' + (location.pathname).replace(/^\//, '') + location.search).toLowerCase();
		$('a[href*=#]:not([href$=#])', !container ? 'body' : container).each(function() {
			var next_page = (this.protocol + '//' + this.hostname + '/' + (this.pathname).replace(/^\//, '') + this.search).toLowerCase();
			if (now_page == next_page) {
				var anchor = this.hash == '#' + settings.top_anchor ? 'body' : this.hash;
				$(this).click(function() {
					pagescroll.go(anchor);
					return false;
				});
			}
		});
	},

	go: function(anchor, callback) {
		var pagescroll = this,
			$ = this.jQuery,
			settings = this.settings;

		if (pagescroll._ready) {
			if (!anchor || anchor == '#' + settings.top_anchor) anchor = 'body';
			$target = $(anchor);
			if ($target.size()) {
				var $window = $(window),
					top = $target.offset().top - settings.top_margin;
				if (top < 0) top = 0;
				if (anchor == 'body') {
					var action = 'top',
						left = 0;
				} else {
					if (top - $window.scrollTop() > 0) var action = 'down';
						else var action = 'up';
					var $document = $(document),
						doc_height = $document.height();
					if (pagescroll._msie6 && doc_height > document.body.clientHeight) doc_height = document.documentElement.clientHeight;
					var max_top = doc_height - $window.height();
					if (top > max_top) top = max_top;
//					var left = $target.offset().left;
//					var left = $window.scrollLeft();
					var left = 0;
				}
				pagescroll.move(top, left, action, callback, false);
			}
		}
	},

	move: function(landingTop, landingLeft, action, callback, prev_timer) {
		var pagescroll = this,
			$ = this.jQuery,
			settings = this.settings;

		var $window = $(window),
			scrollTop = $window.scrollTop(),
			scrollLeft = $window.scrollLeft(),
			displayTop = scrollTop - ((scrollTop - landingTop) / 10),
			displayLeft = scrollLeft - ((scrollLeft - landingLeft) / 10);
		if (action == 'up' || action == 'top') displayTop = Math.floor(displayTop);
			else displayTop = Math.ceil(displayTop);
		displayLeft = Math.floor(displayLeft);
		if (Math.abs(displayTop - landingTop) > 1) {
			window.scrollTo(displayLeft, displayTop);
			var timer_id = setTimeout(function() {
				pagescroll.move(landingTop, landingLeft, action, callback, timer_id);
			}, 10);
			if (prev_timer) clearTimeout(prev_timer);
		} else {
			window.scrollTo(action == 'top' ? 0 :scrollLeft, landingTop);
			if ($.isFunction(callback)) callback();
			clearTimeout(prev_timer);
		}
	}
/* ~action */
}

$(function() {
	pagescroll.init();
});

$(window).unload(function() {
	clearTimeout();
});
