/*====================================================================================================
//////////////////////////////////////////////////////////////////////////////////////////////////////

 Author : http://www.yomotsu.net
 created: 2008/04/08
 update : 2008/05/20
 Licensed under the GNU Lesser General Public License
 
 目標のフラグメントまでスムーズにスクロールするためのライブラリ

//////////////////////////////////////////////////////////////////////////////////////////////////////
====================================================================================================*/
var yomotsuSmoothScroll = {
	
	targetId : new String(),
	targetX  : new Number(),
	targetY  : new Number(),
	rangeX   : new Number(),
	rangeY   : new Number(),

	addEvent : function(){
		try {
			window.addEventListener('load', this.setTrigger, false);
		} catch (e) {
			window.attachEvent('onload', this.setTrigger);
		}
	},

	setTrigger : function(){
		var i, links, locationStr;
		links = document.links;
		
		locationStr=location+"";
		if(locationStr.match(/\#|\?|\&/)){
			locationStr = locationStr.replace(location.hash,"");
		}
		
		for(i=0;i<document.links.length;i++){
			
			
			if((links[i].getAttribute("href").indexOf("#")==0)||(new RegExp(locationStr+"#\.").exec(links[i].getAttribute("href")))){
				links[i].onclick = function(){
					var i, targetId, targetElement, targetY, tergetX;
					targetId = this.getAttribute("href").slice(this.getAttribute("href").indexOf("#")+1);
					targetElement = document.getElementById(targetId);
					targetX  = yomotsuSmoothScroll.getElementPosition(targetElement).left;
					targetY  = yomotsuSmoothScroll.getElementPosition(targetElement).top;
					
					if(document.all&&!window.opera){ //IE
					/*
						if(targetElement.parentNode.firstChild==targetElement){
							for (i = 0; i < 10; ++i) {
								if(targetElement.parentNode.firstChild==targetElement){
									targetElement = targetElement.parentNode;
								}
								else{
									break;
								}
							}
						}
						else */if(targetElement.firstChild &&!targetElement.firstChild.nodeName.match(/#text|img/i)){
							targetElement = targetElement.firstChild;
						}
						
						targetX = yomotsuSmoothScroll.getElementPosition(targetElement).left;
						targetY = yomotsuSmoothScroll.getElementPosition(targetElement).top;
					}
					
					//if (targetY < 0) targetY = 0;
					var scrollMaxX = yomotsuSmoothScroll.getPageSize().width  - yomotsuSmoothScroll.getClientSize().width;
					var scrollMaxY = yomotsuSmoothScroll.getPageSize().height - yomotsuSmoothScroll.getClientSize().height;
					if (targetX > scrollMaxX) targetX = scrollMaxX;
					if (targetY > scrollMaxY) targetY = scrollMaxY;
					
					yomotsuSmoothScroll.targetId = targetId;
					yomotsuSmoothScroll.targetX  = targetX;
					yomotsuSmoothScroll.targetY  = targetY;
					yomotsuSmoothScroll.pageScroll();
					return false;
				}
			}
		}
	},
		
	pageScroll : function(){
		var beforeOffsetY, beforeOffsetX, x = this.targetX, y = this.targetY;
		
		this.rangeX = Math.abs(yomotsuSmoothScroll.getPageOffset().x - this.targetX);
		this.rangeY = Math.abs(yomotsuSmoothScroll.getPageOffset().y - this.targetY);
		
		beforeOffsetY = yomotsuSmoothScroll.getPageOffset().y;
		beforeOffsetX = yomotsuSmoothScroll.getPageOffset().x;
		
		// get [x]
		if (this.rangeX > 10){
			if (this.targetX > yomotsuSmoothScroll.getPageOffset().x){ // scroll left
				x = Math.floor( this.targetX - this.rangeX / 1.2 );
			}
			else if (this.targetX < yomotsuSmoothScroll.getPageOffset().x){ // scroll right
				x = Math.floor( this.targetX + this.rangeX / 1.2 );
			}
		}
		else {
			if (this.targetX > yomotsuSmoothScroll.getPageOffset().x){ // scroll left
				x = this.targetX - 1;
			}
			else if (this.targetY < yomotsuSmoothScroll.getPageOffset().x){ // scroll right
				x = this.targetX + 1;
			}
		}
		
		// get [y]
		if (this.rangeY > 10){
			if (this.targetY > yomotsuSmoothScroll.getPageOffset().y){ // scroll down
				y = Math.floor( this.targetY - this.rangeY / 1.2 );
			}
			else if (this.targetY < yomotsuSmoothScroll.getPageOffset().y){ // scroll up
				y = Math.floor( this.targetY + this.rangeY / 1.2 );
			}
		}
		else {
			if (this.targetY > yomotsuSmoothScroll.getPageOffset().y){ // scroll down
				y = this.targetY - 1;
			}
			else if (this.targetY < yomotsuSmoothScroll.getPageOffset().y){ // scroll up
				y = this.targetY + 1;
			}
		}
		
		window.scrollTo( x, y );
		
		//if ( this.rangeX < 1 || this.rangeY < 1 || ( x == beforeOffsetX && y == beforeOffsetY) ) {
		if ( Math.abs(y - beforeOffsetY) > 1) {
			window.setTimeout("yomotsuSmoothScroll.pageScroll()", 25);
		}
		/*
		else {
			location.hash = "#"+yomotsuSmoothScroll.targetId;
		}*/
	},
	
	
	//--------------------------------------------------
	// functions
	//--------------------------------------------------
	getPageSize : function(){
		var stndardWidth, stndardHeight, QuirksWidth, QuirksHeight, width, height;
		
		stndardWidth  = document.documentElement.scrollWidth || 0;
		stndardHeight = document.documentElement.scrollHeight|| 0;
		
		QuirksWidth  = document.body.scrollWidth  || 0;
		QuirksHeight = document.body.scrollHeight || 0;
		
		width  = Math.max(stndardWidth,  QuirksWidth);
		height = Math.max(stndardHeight, QuirksHeight);
		
		return {width: width, height: height};
	},
	
	getPageOffset : function(){
		var x, y;
		x = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft)
		y = Math.max(document.documentElement.scrollTop,  document.body.scrollTop)
		return {x: x, y: y};
	},
	
	getClientSize : function (){
		var width = height = 0;
		if(window.innerWidth){// Mozilla, Opera, Safari
			width  = window.innerWidth;
			height = window.innerHeight;
		}
		else { // IE Standard || IE Quirks || 0
			width  = document.documentElement.clientWidth  || document.body.clientWidth  || 0;
			height = document.documentElement.clientHeight || document.body.clientHeight || 0;
		}
		return {width:width,height:height}
	},
	
	getElementPosition : function(element) {
		var posTop = posLeft = 0;
		do {
			posTop  += element.offsetTop  || 0;
			posLeft += element.offsetLeft || 0;
			element =  element.offsetParent;
		}
		while (element);
		return {top: posTop, left: posLeft};
	}
		
}

yomotsuSmoothScroll.addEvent()
