/*
	--------------------------------
	Last Updated: 2006.04.11
	--------------------------------
	- Table of Contents -

	1. CONFIGURATION

	2. FUNCTION CALLS
		- SetUp

	2. FUNCTIONS
		- SetUp ( )
		- CreateInstance ( )
		- AddSwapBgImg ( )
		- AddSwapTab ( )
		- SwapBgImg ( )
		- SwapTab ( )
		- ScrollSlide ( )
		- ScrollDrag ( )
		- ScrollMove ( )
		- ScrollDrop ( )
		- ScrollByArrow ( )
		- OperateScrollByArrow ( )
		- ScrollStop ( )
		- GetObjSize ( )
		- GetObjOffsetPosition ( )
	--------------------------------
*/



/* --------------------------------
	1. CONFIGURATION
-------------------------------- */

var Clip_H = 441;
var Scr_Area_H = 417;
var Scr_Bar_Min_H = 20;
var Scr_Bar_Attach_H = 4;
var Slide_Blank = 16;
var Scr_Pitch = 16;
var Scr_Interval = 24;

var I_Instance_ID = 'i-nav-instance';
var I_Original_ID = 'i-nav-original';
var I_Original_Mark = '-orig';
var I_Screen_ID = 'i-screen';
var I_Content_ID = 'i-content';
var Scr_Box_ID = 'scr-box';
var Scr_Area_ID = 'scr-area';
var Scr_Bar_ID = 'scr-bar';
var Scr_Bar_Body_ID = 'scr-bar-body';
var Scr_Arw_Up_ID = 'scr-arw-up';
var Scr_Arw_Down_ID = 'scr-arw-down';
var I_Tab_SwapKey_Blur = '-a';
var I_Tab_SwapKey_Focus = '-b';
var I_Tab_SwapKey_Current = '-c';

var Is_Active_Scr_Bar = false;
var Timer_ID;
var Cache = [ ];



/* --------------------------------
	2. FUNCTION CALLS
-------------------------------- */

window.onload = SetUp;



/* --------------------------------
	3. FUNCTIONS
-------------------------------- */

function SetUp ( ) {
	if ( GetObjSize ( I_Original_ID, 'h' ) ) { return false; }

	CreateInstance ( );

	var Scr_Box = document.getElementById( Scr_Box_ID );
	var Scr_Area = document.getElementById( Scr_Area_ID );
	var Scr_Bar = document.getElementById( Scr_Bar_ID );
	var Scr_Arw_Up = document.getElementById( Scr_Arw_Up_ID );
	var Scr_Arw_Down = document.getElementById( Scr_Arw_Down_ID );

	var Refer_Restrict = function ( ) { return false; }
	var Refer_ScrollUp = function ( ) { ScrollByArrow ( 0 ); }
	var Refer_ScrollDown = function ( ) { ScrollByArrow ( 1 ); }

	Scr_Box.style.display = 'block';

	Scr_Area.oncontextmenu = Refer_Restrict;
	Scr_Area.onmousedown = ScrollSlide;

	Scr_Bar.oncontextmenu = Refer_Restrict;
	Scr_Bar.onmousedown = ScrollDrag;
	Scr_Bar.onmouseup = ScrollDrop;

	Scr_Arw_Up.oncontextmenu = Refer_Restrict;
	Scr_Arw_Up.onmousedown = Refer_ScrollUp;
	Scr_Arw_Up.onmouseup = ScrollStop;

	Scr_Arw_Down.oncontextmenu = Refer_Restrict;
	Scr_Arw_Down.onmousedown = Refer_ScrollDown;
	Scr_Arw_Down.onmouseup = ScrollStop;

	document.getElementById( I_Content_ID ).style.position = 'absolute';

	var Scr_Bar = document.getElementById( Scr_Bar_ID ).style;
	var Scr_Bar_Body = document.getElementById( Scr_Bar_Body_ID ).style;
	var Content_H = GetObjSize ( I_Content_ID, 'h' );
	if ( Content_H <= Clip_H ) {
		Scr_Bar.display = 'none';
	} else {
		var Content_Offset_H = Content_H - Clip_H;
		var Scr_Bar_T = 0;
		var Scr_Bar_H = Math.floor ( Clip_H * Scr_Area_H / Content_H );
		if ( Scr_Bar_H < Scr_Bar_Min_H ) { Scr_Bar_H = Scr_Bar_Min_H; }
		var Scr_Bar_Body_H = Scr_Bar_H - Scr_Bar_Attach_H;
		var Scr_Area_Offset_H = Scr_Area_H - Scr_Bar_H;

		Scr_Bar.top = Scr_Bar_T + 'px';
		Scr_Bar_Body.height = Scr_Bar_Body_H + 'px';
		Scr_Bar.display = 'block';
	}

	Cache[ 'Content_T' ] = 0;
	Cache[ 'Content_H' ] = Content_H;
	Cache[ 'Content_Offset_H' ] = Content_Offset_H;
	Cache[ 'Scr_Bar_T' ] = 0;
	Cache[ 'Scr_Bar_Offset_T' ] = GetObjOffsetPosition ( Scr_Bar_ID, 't' );
	Cache[ 'Scr_Area_Offset_H' ] = Scr_Area_Offset_H;
}

function CreateInstance ( ) {
	var Instance = document.getElementById( I_Original_ID ).innerHTML;

	var Str = I_Screen_ID + I_Original_Mark;
	while ( Instance.match ( Str ) ) { Instance = Instance.replace ( Str, I_Screen_ID ); }
	var Str = I_Content_ID + I_Original_Mark;
	while ( Instance.match ( Str ) ) { Instance = Instance.replace ( Str, I_Content_ID ); }

	document.getElementById( I_Instance_ID ).innerHTML = Instance;
}

function ScrollSlide ( e ) {
	if ( Is_Active_Scr_Bar ) { return false; }

	var Content_T = Cache[ 'Content_T' ];
	var Content_Offset_H = Cache[ 'Content_Offset_H' ];
	var Scr_Bar_Offset_T = Cache[ 'Scr_Bar_Offset_T' ];
	var Scr_Bar_T = Cache[ 'Scr_Bar_T' ];
	var Scr_Area_Offset_H = Cache[ 'Scr_Area_Offset_H' ];
	if ( e ) {
		var Y = e.pageY;
	} else {
		var Y = window.event.clientY;
		Y += ( document.documentElement.scrollTop ) ? document.documentElement.scrollTop :
			( document.body.scrollTop ) ? document.body.scrollTop :
			0;
	}

	if ( !Content_Offset_H ) { return false; }

	var Content = document.getElementById( I_Content_ID ).style;
	var Scr_Bar = document.getElementById( Scr_Bar_ID ).style;

	var Slide_H = ( Clip_H > Slide_Blank ) ? Clip_H - Slide_Blank : Clip_H;
	var Operator = ( Y < Scr_Bar_Offset_T + Scr_Bar_T ) ? -1 : 1;
	Content_T += Slide_H * Operator;
	Content_T = ( Content_T < 0 ) ? 0 : ( Content_T > Content_Offset_H ) ? Content_Offset_H : Content_T;
	var Scr_Ratio = Math.floor ( Content_T / Content_Offset_H * 100 );
	var Scr_Bar_T = Math.floor ( Scr_Area_Offset_H * Scr_Ratio / 100 );

	Content.top = Content_T * -1 + 'px';
	Scr_Bar.top = Scr_Bar_T + 'px'; 

	Cache[ 'Content_T' ] = Content_T;
	Cache[ 'Scr_Bar_T' ] = Scr_Bar_T;
}

function ScrollDrag ( e ) {
	Is_Active_Scr_Bar = true;
	document.onmousemove = ScrollMove;
	document.onmouseup = ScrollDrop;
	Cache[ 'Track' ] = ( window.event ) ? document.body.scrollTop + window.event.clientY : e.pageY;
}

function ScrollMove ( e ) {
	if ( Cache[ 'Track' ] !== false ) {
		var Content_Offset_H = Cache[ 'Content_Offset_H' ];
		var Scr_Bar_T = Cache[ 'Scr_Bar_T' ];
		var Scr_Area_Offset_H = Cache[ 'Scr_Area_Offset_H' ];
		var Track = Cache[ 'Track' ];
		var Y = ( window.event ) ? document.body.scrollTop + window.event.clientY : e.pageY;

		var State = ( Y < Track ) ? ( Scr_Bar_T > 0 ) : ( Scr_Bar_T < Scr_Area_Offset_H );
		if ( State ) {
			var Content = document.getElementById( I_Content_ID ).style;
			var Scr_Bar = document.getElementById( Scr_Bar_ID ).style;

			Scr_Bar_T += Y - Track;
			var State = ( Y < Track ) ? ( Scr_Bar_T < 0 ) : ( Scr_Bar_T > Scr_Area_Offset_H );
			if ( State ) { Scr_Bar_T = ( Y < Track ) ? 0 : Scr_Area_Offset_H; }
			var Scr_Ratio = Math.floor ( Scr_Bar_T / Scr_Area_Offset_H * 100 );
			var Content_T = Math.floor ( Content_Offset_H * Scr_Ratio / 100 );

			Content.top = Content_T * -1 + 'px';
			Scr_Bar.top = Scr_Bar_T + 'px'; 

			Cache[ 'Content_T' ] = Content_T;
			Cache[ 'Scr_Bar_T' ] = Scr_Bar_T;
			Cache[ 'Track' ] = Y;
		}
	}
}

function ScrollDrop ( ) {
	Is_Active_Scr_Bar = false;
	document.onmousemove = null;
	document.onmouseup = null;
	if ( Cache[ 'Track' ] !== false ) { Cache[ 'Track' ] = false; }
}

function ScrollByArrow ( Mode ) {
	if ( !Mode ) { Timer_ID = setInterval ( 'OperateScrollByArrow ( 0 )', Scr_Interval ); }
	else { Timer_ID = setInterval ( 'OperateScrollByArrow ( 1 )', Scr_Interval ); }
}

function OperateScrollByArrow ( Mode ) {
	var Content_T = Cache[ 'Content_T' ];
	var Content_Offset_H = Cache[ 'Content_Offset_H' ];
	var Scr_Area_Offset_H = Cache[ 'Scr_Area_Offset_H' ];

	var State = ( !Mode ) ? ( Content_T > 0 ) : ( Content_T < Content_Offset_H );
	if ( State ) {
		var Content = document.getElementById( I_Content_ID ).style;
		var Scr_Bar = document.getElementById( Scr_Bar_ID ).style;

		var Operator = ( !Mode ) ? -1 : 1;
		Content_T += Scr_Pitch * Operator;
		var State = ( !Mode ) ? ( Content_T < 0 ) : ( Content_T > Content_Offset_H );
		if ( State ) { Content_T = ( !Mode ) ? 0 : Content_Offset_H; }
		var Scr_Ratio = Math.floor ( Content_T / Content_Offset_H * 100 );
		var Scr_Bar_T = Math.floor ( Scr_Area_Offset_H * Scr_Ratio / 100 );

		Content.top = Content_T * -1 + 'px';
		Scr_Bar.top = Scr_Bar_T + 'px';

		Cache[ 'Content_T' ] = Content_T;
		Cache[ 'Scr_Bar_T' ] = Scr_Bar_T;
	} else {
		clearInterval ( Timer_ID );
	}
}

function ScrollStop ( ) { clearInterval ( Timer_ID ); }

function GetObjSize ( ) {
	// arguments : ( string id [, string mode ] )

	var Args = GetObjSize.arguments;
	if ( !Args.length ) { return false; } // in place of undefined for IE

	var Obj = document.getElementById( Args[ 0 ] );
	var Obj_W = ( !Obj ) ? 0 : ( Obj.offsetWidth ) ? Obj.offsetWidth : ( Obj.clientWidth ) ? Obj.clientWidth : 0;
	var Obj_H = ( !Obj ) ? 0 : ( Obj.offsetHeight ) ? Obj.offsetHeight : ( Obj.clientHeight ) ? Obj.clientHeight : 0;

	var Val = [ Obj_W, Obj_H ];
	Val[ 'w' ] = Obj_W;
	Val[ 'h' ] = Obj_H;

	return ( Args[ 1 ] == 'w' ) ? Obj_W : ( Args[ 1 ] == 'h' ) ? Obj_H : Val;
}

function GetObjOffsetPosition ( ) {
	// arguments : ( string id [, string mode ] )

	var Args = GetObjOffsetPosition.arguments;
	if ( !Args.length ) { return false; } // in place of undefined for IE

	var Obj = document.getElementById( Args[ 0 ] );
	var Obj_L = 0;
	var Obj_T = 0;
	if ( Obj ) {
		while ( Obj.offsetParent ) {
			Obj = Obj.offsetParent;
			Obj_L += Obj.offsetLeft;
			Obj_T += Obj.offsetTop;
		}
	}

	var Val = [ Obj_L, Obj_T ];
	Val[ 'l' ] = Obj_L;
	Val[ 't' ] = Obj_T;

	return ( Args[ 1 ] == 'l' ) ? Obj_L : ( Args[ 1 ] == 't' ) ? Obj_T : Val;
}
