/*
$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 );
	
	var oGuide = CreateImage(oParam.DocRoot + oParam.GuideSrc,  oParam.ZIndex + 2);
	oGuide.style.display = 'none';
	oGuide.style.top   = oParam.GuideTop;

	
	// 座標初期化
	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;
		oGuide.style.right  = oParam.Right;
	}
	else
	{
		oScale.style.left	= oParam.Left;
		oThumb.style.left	= oParam.ThumbLeft;
		oWide.style.left	= oParam.LowerButtonLeft;
		oDetail.style.left	= oParam.UpperButtonLeft;
		oGuide.style.left   = oParam.GuideLeft;

	}
	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 );
		}
		
		if(nScale > oParam.DfScaleMax) {
			this.Scale = oParam.DfScaleMax;
		}
	}

	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 );
	}
	
	oScale.onmouseover = function(e)
	{
		if (oGuide.style.display == 'none') oGuide.style.display = 'block';
	}

	oScale.onmouseout = function(e)
	{
		oGuide.style.display = 'none';
	}

	oWide.onmouseover = function(e)
	{
		if (oGuide.style.display == 'none') oGuide.style.display = 'block';
	}

	oWide.onmouseout = function(e)
	{
		oGuide.style.display = 'none';
	}

	oDetail.onmouseover = function(e)
	{
		if (oGuide.style.display == 'none') oGuide.style.display = 'block';
	}

	oDetail.onmouseout = function(e)
	{
		oGuide.style.display = 'none';
	}
	
	oThumb.onmouseover = function(e)
	{
		if (oGuide.style.display == 'none') oGuide.style.display = 'block';
	}

	oThumb.onmouseout = function(e)
	{
		oGuide.style.display = 'none';
	}
	
	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 );
		}

		// 同一ドキュメント内の別オブジェクトがonmouseupイベントを受け取って
		// イベントのバブルアップを行わない(cancelBubble=true) 場合にも、
		// ThumbMouseUpにイベントが通知されるようにする。※イベントのキャプチャ
		// 主にIEの為に行う。FireFoxも有効。Operaは無視される。
		// Gekko/Opera/SafariはCMN_AddEventListner()の第４パラメータ側が同じ意味を持つ。
		return	false;
	}

	function GetScaleFromYPos( nYPos )
	{
		var nBaseYPos	= parseInt(oScale.style.top);
		var nVal = parseInt( (nYPos - nBaseYPos - oParam.BaseTopMargin ) / oParam.ThumbMoveStep ) - 1;

		if( nVal < 0 )
		{
			nVal = 0;	
		}
		else if( nVal > (oParam.DfScaleMax+1) )
		{
			nVal = (oParam.DfScaleMax+1);
		}
		if( !oParam.Reverse )
		{
			nVal = (oParam.DfScaleMax+1) - nVal;
		}
		var nScale = nVal + 1;
		return	nScale;
	}

	function GetYPosFromScale( nScale )
	{
		var nVal = nScale - 1;	
		if( !oParam.Reverse )
		{
			nVal = (oParam.DfScaleMax-1) - nVal;
		}
		if( nVal < 0 )
		{
			nVal = 0;	
		}
		else if( nVal > (oParam.DfScaleMax-1) )
		{
			nVal = (oParam.DfScaleMax-1);
		}
		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;
}

