/*
$Id: 
Copyright(C) 1996-2005 INCREMENT P CORP.
*/

function CScaleController( oDoc, oParam )
{
	var oOwner	= this;

	var oScale	= CreateImage(oParam.DocRoot + oParam.BaseSrc,  oParam.ZIndex);
	var oThumb	= CreateImage(oParam.DocRoot + oParam.ThumbSrc, oParam.ZIndex + 1);
	var oWide	= CreateButton(oDoc, oParam.DocRoot + oParam.WideNormalSrc, oParam.DocRoot + oParam.WideDownSrc);
	var oDetail	= CreateButton(oDoc, oParam.DocRoot + oParam.DetailNormalSrc, oParam.DocRoot + oParam.DetailDownSrc);

	oScale.style.top = oParam.BaseTop;
	if( oParam.Right != undefined )
	{
		oScale.style.right	= oParam.Right;
		oThumb.style.right	= oParam.Right;
		oWide.style.right	= oParam.Right;
		oDetail.style.right	= oParam.Right;
	}
	else
	{
		oScale.style.left	= oParam.Left;
		oThumb.style.left	= oParam.Left;
		oWide.style.left	= oParam.Left;
		oDetail.style.left	= oParam.Left;
	}
	if( oParam.Reverse )
	{
		oWide.style.top		= oParam.LowerButtonTop;
		oDetail.style.top	= oParam.UpperButtonTop;
	}
	else
	{
		oWide.style.top		= oParam.UpperButtonTop;
		oDetail.style.top	= oParam.LowerButtonTop;
	}
	oDoc.body.appendChild( oWide );
	oDoc.body.appendChild( oDetail );

	var nThumbClickOffset	= 0;
	var bDown		= false;

	this.SetScale = function( nScale )
	{
		if( !bDown )
		{
			SetThumbPosFromScale( nScale );
		}
	}

	function CreateImage( src, zIndex )
	{	
		var o	= oDoc.createElement("img");
		o.style.zIndex		= zIndex;
		o.style.position	= "absolute";
		o.style.cursor		= "default";
		o.src			    = src;
		o.onmousedown		= function(e)
		{
			var	oEvent = CMN_GetEvent( this.ownerDocument, e );
			oEvent.cancelBubble	= true;
		}
		oDoc.body.appendChild( o );
		return	o;
	}

	oWide.OnClickButton = function(e)
	{
		if( oOwner.OnClickWide != null )
		{
			oOwner.OnClickWide();
		}
	}

	oDetail.OnClickButton = function(e)
	{
		if( oOwner.OnClickDetail != null )
		{
			oOwner.OnClickDetail();
		}
	}
	
	oScale.onclick = function(e)
	{
		var oEvent = CMN_GetEvent(this.ownerDocument, e);
		if( oOwner.OnChangedScale != null )
		{
			oOwner.OnChangedScale( GetScaleFromYPos( oEvent.clientY ) );
		}
	}
	
	oThumb.onmousedown = function(e)
	{
		var oEvent = CMN_GetEvent( oDoc, e );
		oEvent.cancelBubble = true;
		CMN_PreventDefault( oEvent );
		//
		nThumbClickOffset = oEvent.clientY - parseInt(oThumb.style.top);
		bDown = true;
		//
		CMN_AddEventListener( oDoc, CMN_GetEventName( "mousemove" ), ThumbMoveMove, true );
		CMN_AddEventListener( oDoc, CMN_GetEventName( "mouseup" ), ThumbMouseUp, true );
	}
	
	function ThumbMouseUp(e)
	{
		if( !bDown )
		{
			return;
		}
		var oEvent = CMN_GetEvent( oDoc, e );
		bDown = false;
		var nScale = GetScaleFromYPos( oEvent.clientY - nThumbClickOffset + (oParam.ThumbMoveStep/2) );
		SetThumbPosFromScale( nScale );
		if( oOwner.OnChangedScale != null )
		{
			oOwner.OnChangedScale( nScale );
		}
		//
		CMN_RemoveEventListener( oDoc, CMN_GetEventName( "mousemove" ), ThumbMoveMove, true );
		CMN_RemoveEventListener( oDoc, CMN_GetEventName( "mouseup" ), ThumbMouseUp, true );
	}
	
	function ThumbMoveMove(e)
	{
		if( !bDown )
		{
			return;
		}
		var oEvent = CMN_GetEvent( oDoc, e );
		oEvent.cancelBubble	= true;
		//
		var nScale	= GetScaleFromYPos( oEvent.clientY - nThumbClickOffset + (oParam.ThumbMoveStep/2) );
		
		if( oParam.Grid )
		{
			SetThumbPosFromScale( nScale );
		}
		else
		{
			var nBaseYPos	= parseInt(oScale.style.top);
			var nYPos = oEvent.clientY- nThumbClickOffset - nBaseYPos - oParam.ThumbOffset;
			if( nYPos < oParam.BaseTopMargin )
			{
				nYPos = oParam.BaseTopMargin;
			}
			else if ( nYPos > oParam.BaseTopMargin + 12*oParam.ThumbMoveStep )
			{
				nYPos = oParam.BaseTopMargin + 12*oParam.ThumbMoveStep;
			}
			oThumb.style.top = nYPos + nBaseYPos + oParam.ThumbOffset;
		}
		
		if( oOwner.OnChangingScale != null )
		{
			oOwner.OnChangingScale( nScale );
		}

		// ƱEɥ̥֥Ȥonmouseup٥Ȥä
		// ٥ȤΥХ֥EåפԤEʤ(cancelBubble=true) Eˤ⡢
		// ThumbMouseUp˥٥ȤΤEE褦ˤE٥ȤΥץE
		// IEΰ٤˹ԤFireFoxͭOpera̵EEE
		// Gekko/Opera/SafariCMN_AddEventListner()裴ѥ᡼¦Ʊ̣ġ
		return	false;
	}

	function GetScaleFromYPos( nYPos )
	{
		var nBaseYPos	= parseInt(oScale.style.top);
		var nVal = parseInt( (nYPos - nBaseYPos - oParam.BaseTopMargin ) / oParam.ThumbMoveStep );
		if( nVal < 0 )
		{
			nVal = 0;	
		}
		else if( nVal > 12 )
		{
			nVal = 12;
		}
		if( !oParam.Reverse )
		{
			nVal = 12 - nVal;
		}
		var nScale = nVal + 1;
		return	nScale;
	}

	function GetYPosFromScale( nScale )
	{
		var nVal = nScale - 1;	
		if( !oParam.Reverse )
		{
			nVal = 12 - nVal;
		}
		if( nVal < 0 )
		{
			nVal = 0;	
		}
		else if( nVal > 12 )
		{
			nVal = 12;
		}
		var nBaseYPos	= parseInt(oScale.style.top);
		var nYPos = nVal * oParam.ThumbMoveStep + nBaseYPos + oParam.BaseTopMargin;	
		return	nYPos;
	}
	
	function SetThumbPosFromScale( s )
	{
		oThumb.style.top = GetYPosFromScale( s ) + oParam.ThumbOffset;
	}

	return	this;
}

