/*
 * gfncSmoothScroll v0.2
 * http://hit-point.jp/
 *
 * Copyright 2011, Hit Point
*/

(function() {
	jQuery.fn.gfncSmoothScroll = function(config) {
		config = jQuery.extend({
				intSpeedMS: 40
			}, config);

			var intNextX = 0;
			var intNextY = 0;
			var intTargetX = $($(this).attr("href")).offset().left;
			var intTargetX = 0;
			var intTargetY = $($(this).attr("href")).offset().top;
			var mobjTimer;
			var mstrHref = $(this).attr("href");

			function fncScroll() {
				var intScrollX = fncScrollPos().x;
				var intScrollY = fncScrollPos().y;
				if (intTargetX < 0) intTargetX = 0;
				if (intTargetY < 0) intTargetY = 0;
				clearTimeout(mobjTimer);

				if (((intNextX != 0 && Math.floor(intNextX) != Math.floor(intScrollX)) || (intNextY != 0 && Math.floor(intNextY) != Math.floor(intScrollY)))) {
					clearTimeout(mobjTimer);

				} else if (Math.abs(Math.floor(intTargetX) - Math.floor(intScrollX)) > 1
					|| Math.abs(Math.floor(intTargetY) - Math.floor(intScrollY)) > 1) {

					if (Math.abs(Math.floor(intTargetX) - Math.floor(intScrollX)) > 1) {
					if (intScrollX > intTargetX) {
						intNextX = Math.floor((intScrollX - intTargetX) / 2) + intTargetX;

					} else {
						intNextX = Math.floor((intTargetX - intScrollX) / 2) + intScrollX;
					}
					} else {
						intNextX = intTargetX;
					}

					if (Math.abs(Math.floor(intTargetY) - Math.floor(intScrollY)) > 1) {
					if (intScrollY > intTargetY) {
						intNextY = Math.floor((intScrollY - intTargetY) / 2) + intTargetY - 1;

					} else {
						intNextY = Math.floor((intTargetY - intScrollY) / 2) + intScrollY;
					}
					} else {
						intNextY = intTargetY;
					}

					window.scrollTo(intNextX, intNextY);
					mobjTimer = setTimeout(fncScroll, config.intSpeedMS);

				} else {
					fncStopScroll();
				}
			}
			fncScroll();

			function fncScrollPos() {
				var objThis = new Object();

				objThis.x = document.documentElement.scrollLeft || document.body.scrollLeft;
				objThis.y = document.documentElement.scrollTop || document.body.scrollTop;

				return objThis;
			}

			function fncStopScroll() {
				clearTimeout(mobjTimer);
				location.href = mstrHref;

				return false;
			}
	};
})(jQuery);

$(document).ready(function() {
	$("a[href*=#]").click(function() {
		$(this).gfncSmoothScroll();

		return false;
	});
});

