/* pagetop */
var __scroll = { sp:6, fps:16, timer:0 };
function setScrollSp( sp )
{
	if( typeof sp == "number" )
    {
		this.__scroll.sp = sp;
	}
}

function setScrollFps( fps )
{
	if( typeof fps == "number" )
    {
		this.__scroll.fps = fps;
	}
}

function scrollToTop()
{
	pageScroll( 0, 0 );
}

function getScrollLeft()
{
	if( navigator.userAgent.indexOf( "MSIE" ) != -1 )
	{
		return ( document.compatMode=="CSS1Compat" ) ? document.documentElement.scrollLeft : document.body.scrollLeft;
	}
    else
    {
		return ( window.pageXOffset ) ? window.pageXOffset : 0;
	}
}

function getScrollTop()
{
	if( navigator.userAgent.indexOf("MSIE") != -1 )
    {
		return ( document.compatMode=="CSS1Compat" ) ? document.documentElement.scrollTop : document.body.scrollTop;
	}
    else
    {
		return ( window.pageYOffset ) ? window.pageYOffset : 0;
	}
}

function pageScroll( toX, toY, cuX, cuY ) 
{
	clearTimeout( this.__scroll.timer );
	toX = ( !toX || toX < 0 ) ? 0 : toX;
	toY = ( !toY || toY < 0 ) ? 0 : toY;
	cuX = ( !cuX ) ? 0 + getScrollLeft() : cuX;
	cuY = ( !cuY ) ? 0 + getScrollTop() : cuY;
	cuX += ( toX - getScrollLeft() ) / this.__scroll.sp;
	cuY += ( toY - getScrollTop() ) / this.__scroll.sp;

	if( cuX < 0 )
    {
    	cuX = 0;
    }

	if( cuY < 0 )
    {
    	cuY = 0;
    }

	window.scrollTo( Math.floor(cuX), Math.floor( cuY ) );

	if( Math.floor( cuX ) != toX || Math.floor( cuY ) != toY )
    {
		this.__scroll.timer = setTimeout( "pageScroll("+ toX + "," + toY + "," + cuX + "," + cuY + ")", this.__scroll.sp );
	}
}



/* SCROLL_PAGE_LINK */
function ScrollClass(){}

ScrollClass.prototype.speed = 12;
ScrollClass.prototype.timer = 0;
ScrollClass.prototype.direction = new Object();
ScrollClass.prototype.offset = new Object();
ScrollClass.prototype.isCompatMode = document.compatMode == "CSS1Compat";
ScrollClass.prototype.major = parseInt(navigator.appVersion);
ScrollClass.prototype.minor = parseFloat(navigator.appVersion);
ScrollClass.prototype.isIE = navigator.userAgent.indexOf("MSIE") != -1;
ScrollClass.prototype.isOpera = window.opera;
ScrollClass.prototype.isMozilla = navigator.userAgent.indexOf("Gecko") != -1;
ScrollClass.prototype.isSafari = navigator.userAgent.indexOf('Safari') != -1;
ScrollClass.prototype.isNN  = navigator.userAgent.indexOf("Netscape") != -1;
ScrollClass.prototype.isMac = navigator.userAgent.indexOf("Mac") != -1;


ScrollClass.prototype.setScrollSpeed = function( num )
{
	if( typeof num == "number" )
    {
		this.speed = num;
	}
}


ScrollClass.prototype.getScrollSpeed = function()
{
	return this.speed;
}


ScrollClass.prototype.getMaxScroll = function()
{
	var pos = new Object();
	var sc  = new Object();

	if( this.isNN || this.isOpera )
    {
		pos.x = this.major <= 5 ? document.documentElement.offsetWidth - window.innerWidth + 16 : document.documentElement.offsetWidth - window.innerWidth + 17;
		pos.y = this.major <= 5 ? document.documentElement.offsetHeight - window.innerHeight + 16 : document.documentElement.offsetHeight - window.innerHeight + 17;
	}
    else
    {
		pos.x = this.isCompatMode ? document.documentElement.scrollWidth - document.documentElement.clientWidth : document.body.scrollWidth - document.body.clientWidth;
		pos.y = this.isCompatMode ? document.documentElement.scrollHeight - document.documentElement.clientHeight : document.body.scrollHeight - document.body.clientHeight;
	}

	if( pos.x < 0 )
    {
    	sc.x = 0;
    }

	if( pos.y < 0 )
    {
    	sc.y = 0;
    }
	return { x : pos.x, y : pos.y };
}


ScrollClass.prototype.getScrollLeft = function()
{
	if( this.isIE )
    {
		return this.isCompatMode ? document.documentElement.scrollLeft : document.body.scrollLeft;
	}
    else
    {
		return window.pageXOffset ? window.pageXOffset : 0;
	}
}


ScrollClass.prototype.getScrollTop = function()
{
	if( this.isIE )
    {
		return this.isCompatMode ? document.documentElement.scrollTop : document.body.scrollTop;
	}
    else
    {
		return window.pageYOffset ? window.pageYOffset : 0;
	}
}


ScrollClass.prototype.findAnchor = function( id )
{
	return ( document.getElementById( id ) || document.anchors[id] );
}


ScrollClass.prototype.getAnchorPos = function( id )
{
	if( document.getElementById( id ) )
    {
		var element = document.getElementById( id );
		var obj = new Object();
		do
        {
			obj.x = ( !obj.x ) ? element.offsetLeft : obj.x + element.offsetLeft;
			obj.y = ( !obj.y ) ? element.offsetTop : obj.y + element.offsetTop;
		} 
		while( ( element = element.offsetParent ) != null );
		return { x:obj.x < 0 ? 0 : obj.x, y:obj.y };
	}
    else if( document.layers )
    {
		var element = document.anchors[id];
		return { x:element.x, y:element.y };
	}
	else
    {
		return { x:0, y:0 };
	}
}


ScrollClass.prototype.parse = function( direction, value )
{
	var maxScroll = this.getMaxScroll();
	var range = { min_x : 0, max_x : maxScroll.x, min_y : 0, max_y : maxScroll.y  };

	switch( direction )
	{
		case "x":
			if( typeof value == "boolean" )
			{
				return value ? 0 : this.getScrollLeft();
			}
			else if( typeof value == "number" )
			{
				if( !this.isOpera )
				{
					if( value < 0 )
					{
						return 0;
					}
                    else if( value > range.max_x )
					{
						return range.max_x;
					}
				}
				return value;
			}
            else if( typeof value == "string" )
            {
				switch( value )
                {
					case "left": return 0;
					case "center": return Math.floor( range.max_x / 2 );
					case "right": return range.max_x;
					default: this.getScrollLeft();
				}
			}
			return this.getScrollLeft();
			break;

		case "y":
			if( typeof value == "boolean" )
			{
				return value ? 0 : this.getScrollTop();
			}
			else if( typeof value == "number" )
			{
				if( value < 0 )
				{
					return 0;
				}
				else if( value > range.max_y )
				{
					return range.max_y;
				}
				return value;
			}
			else if( typeof value == "string" )
			{
				switch( value )
				{
					case "top": return 0;
					case "middle": return Math.floor( range.max_y / 2 );
					case "bottom": return range.max_y;
					default: this.getScrollTop();
				}
			}
			return this.getScrollTop();
			break;
	}
}


ScrollClass.prototype.pageScroll = function( toX, toY )
{
/*
	if( this.isOpera )
	{
		window.scrollTo( toX, toY );
		return;
	}
*/
	clearTimeout( this.timer );
	var dX = this.direction.is_x;
	var dY = this.direction.is_y;
	var scX = this.getScrollLeft();
	var scY = this.getScrollTop();
	var cuX = dX ? Math.ceil( ( toX - scX ) / this.speed ) : Math.floor( ( toX - scX ) / this.speed );
	var cuY = dY ? Math.ceil( ( toY - scY ) / this.speed ) : Math.floor( ( toY - scY ) / this.speed );

	if( ( ( dX && scX + cuX < toX -1 ) || ( !dX && scX + cuX > toX + 1 ) ) || ( ( dY && scY + cuY < toY - 1 ) || ( !dY && scY + cuY > toY +1 ) ) )
    {
		if( this.offset.x != null && this.offset.y != null )
        {
			if( this.offset.x == scX && this.offset.y == scY )
            {
				scroll.allCover( 'off' );
				return;
			}
			else if( ( dX && this.offset.x > scX ) || ( !dX && this.offset.x < scX ) )
			{
				scroll.allCover( 'off' );
				return;
			}
			else if( ( dY && this.offset.y > scY ) || ( !dY && this.offset.y < scY ) )
			{
				scroll.allCover( 'off' );
				return;
			}
		}
		window.scrollTo( scX + cuX, scY + cuY );
		this.timer = setTimeout( "ScrollClass.prototype.pageScroll(" + toX + "," + toY + ")", this.speed );
		this.offset.x = scX;
		this.offset.y = scY;
	}
    else
    {
		scroll.allCover( 'off' );
		clearTimeout( this.timer );
		window.scrollTo( toX, toY );
		return false;
	}
}


ScrollClass.prototype.allCover = function( display )
{

	var objBody = document.getElementsByTagName( "body" ).item( 0 );
	if( window.innerHeight && window.scrollMaxY )
    {	
		maxHeight = window.innerHeight + window.scrollMaxY;
	}
    else if( document.body.scrollHeight > document.body.offsetHeight )
    {
		maxHeight = document.body.scrollHeight;
	}
    else
    {
		maxHeight = document.body.offsetHeight;
	}

	if( display == 'on' )
    {
		this.objCover = document.createElement( "div" );
		this.objCover.setAttribute( 'id', 'cover' );
		objBody.appendChild( this.objCover );

		this.objCover.style.width =  100 + '%';
		this.objCover.style.height = maxHeight + 'px';
		this.objCover.style.position = 'absolute';

		this.objCover.style.zIndex = 999;
		this.objCover.style.top = 0;
		this.objCover.style.left = 0;
	}
	else if( display == 'off' && this.objCover )
    {
		objBody.removeChild( this.objCover );
	}
}


ScrollClass.prototype.autoSetUp = function()
{
	if( !document.getElementsByTagName )
	{
    	return;
    }

	var anch = document.getElementsByTagName( 'a' );
	var path;
	for( var i = 0; i < anch.length; i++ )
    {
		path = anch[i].getAttribute( 'href' );
		if( path.indexOf('#') != -1 && ( !path.split( '#' )[0] || path.split( '#' )[0] == location.href.split( '#' )[0] ) )
		{
			anch[i].onclick = function()
			{
				scroll.allCover( 'on' );
				scroll.scrollTo( 0, this.getAttribute( 'href' ).split( '#' )[1] );
				return false;
			}
		}
	}
}


ScrollClass.prototype.scrollTo = function()
{
	clearTimeout( this.timer );
	this.offset.x = null;
	this.offset.y = null;
	var toX = this.parse( "x", this.findAnchor( arguments[0] ) ? this.getAnchorPos( arguments[0] ).x : arguments[0] );

	var toY = this.parse( "y", this.findAnchor( arguments[1] ) ? this.getAnchorPos( arguments[1] ).y : arguments[1] );
	this.direction.is_x = toX - this.getScrollLeft() >= 0 ? true : false;
	this.direction.is_y = toY - this.getScrollTop() >= 0 ? true : false;
	this.pageScroll( toX, toY );
}



var scroll = new ScrollClass();



/* SCROLL_PAGE_LINK */
var DEFAULT_SCROLL_ANCOR = 'spos';
function inlineAnchJump()
{
	var aname = "";
	var locStr = window.location.href;
	var bidx =locStr.indexOf( "?" );

	aname = bidx < 0 ? DEFAULT_SCROLL_ANCOR : locStr.substring( bidx+1, locStr.length );

	if( scroll.getAnchorPos( aname ).y > 0 )
	{
		setTimeout( "setAnchJump('" + aname + "');", 500 );
	}
}

function setAnchJump( anchor, oldX, oldY )
{
	var scX = scroll.getScrollLeft();
	var scY = scroll.getScrollTop();
	if( ( scX == 0 ) && ( scY == 0 ) )
	{
		var toY = scroll.getAnchorPos( anchor ).y -5;
		scroll.scrollTo( 0, toY );
	}
}