/********************************************************************************
  Copyright, 2005, Intergraph Corporation. All Rights Reserved.
  The product licensee is granted permission to copy and distribute 
  this script only to support the product SVG output and licensee's 
  associated web sites, and to prepare derivative works solely for 
  internal use. All other rights reserved.
**********************************************************************************/


/*********************************************************/
//---  BASIC MOUSE EVENTS  --- 
// Requires:
//   -global CORE FUNCTIONS object
//   -global BASIC FUNCTIONS object
/*********************************************************/


//---BASIC MOUSE EVENTS OBJECT/INTERFACE-------------------
function _gwmBasicMouseEventsObject()
{
  //--Methods-----

  // Handlers should be implemented and set to override 
  // these as needed, in your capture initialization routine.

  this.onCompletionHandler  = _gwmMEDone;
  this.onInterruptHandler   = _gwmMEInterrupt; 
  this.onMoveHandler        = _gwmMEMove; 
  this.keyPress             = _gwmKeyPress;

  //--Properties-----
  /*
  possible ListenerStates:
    IDLE          = 0;   Process click events for Hotspots and Handlers
    ZOOMBOX       = 1;
    PANREADY      = 2;
    PAN           = 3;
    
    CONTEXTMENU   = 4;
    LOADING       = 5;
    INTERACTIVE   = 6;   Geometry capture modes
    
    SHIFTVIEW     = 10;
    CENTERVIEW    = 11;
    ZOOMINVIEW    = 12;
    ZOOMOUTVIEW   = 13;
    FITELEMENT    = 14;
    GETELEMENT    = 15;

    POINTMODE      = 101;
    LINEMODE       = 102;
    POLYLINEMODE   = 103;
    POLYGONMODE    = 104;
    RECTANGLEMODE  = 105;
    CIRCLEMODE     = 106;
    TEXTMODE       = 107;
    CALLOUTMODE    = 108;
  */

  //--Implemented Listener States
  this.IDLE           =   0;
  this.PANREADY       =   2;
  this.PAN            =   3;
  this.GETELEMENT     =  15;
  
  this.POINTMODE        = 101;
  this.LINEMODE         = 102;
  this.POLYLINEMODE     = 103;
  this.POLYGONMODE      = 104;
  this.RECTANGLEMODE    = 105;
  this.CIRCLEMODE       = 106;
  this.TEXTMODE         = 107;
  this.CALLOUTMODE      = 108;
  this.TEXTKEYINSTART   = 109;
  this.TEXTKEYINMODE    = 110;

  this.iListenerState = 0;

}

var _gwmBasME = new _gwmBasicMouseEventsObject();


//=========================================================
function _gwmMEDone()
{
/***
  NOTE: this function is only a Stub/placeholder in case
  it is not implemented and set by other script.
***/
  return;
}

//=========================================================
function _gwmMEInterrupt()
{
/***
  NOTE: this function is only a Stub/placeholder in case
  it is not implemented and set by other script.
***/
  return;
}

//=========================================================
function _gwmMEMove()
{
/***
  NOTE: this function is only a Stub/placeholder in case
  it is not implemented and set by other script.
***/
  return;
}


//=========================================================
function _gwmMouseOver(evt)
{
  if( _gwmBasME.iListenerState != _gwmBasME.IDLE && 
      //_gwmBasME.iListenerState != _gwmBasME.FITELEMENT && 
      _gwmBasME.iListenerState != _gwmBasME.GETELEMENT ) return;

  var ele = evt.target;

  if( _gwmBas.isEleTooltipEnabled(ele) )
    _gwmCore.tooltipHandler( evt, "", true );

  if( _gwmBas.isEleHotspotEnabled(ele) ) 
    _gwmCore.highlightHandler(evt, 1);
}

//=========================================================
function _gwmMouseOut(evt)
{
  if( _gwmBasME.iListenerState != _gwmBasME.IDLE && 
      //_gwmBasME.iListenerState != _gwmBasME.FITELEMENT && 
      _gwmBasME.iListenerState != _gwmBasME.GETELEMENT ) return;

  var ele = evt.target;

  if( _gwmBas.isEleTooltipEnabled(ele) )
      _gwmCore.tooltipHandler( evt, "", false );

  if( _gwmBas.isEleHotspotEnabled(ele) ) 
    _gwmCore.highlightHandler(evt, 0);
}

//=========================================================
function _gwmMouseMove(evt)
{
var state = _gwmBasME.iListenerState;

  if( state == _gwmBasME.IDLE ) return;

  switch( state )
  {
    case _gwmBasME.PAN:
    case _gwmBasME.PANREADY:
      /***
      if (!evt) evt = window.event;
        evt.cancelBubble = true;
      if (evt.stopPropagation)
        evt.stopPropagation();
        ***/
        
      var pc = _gwmCore.getTransSVGPoint( evt );
      _gwmBas.attachActiveCursor( pc ); 

      if( state == _gwmBasME.PAN ) 
      {  
        var p1   = _gwmCore.svgRoot.createSVGPoint();
        p1.x = evt.getClientX();
        p1.y = evt.getClientY();
        var p0 = _gwmBas.ptArray[0];
  
        if( p0.x == p1.x && p0.y == p1.y )
        {
          return;
        }

      //TRY: adding step value to X:
      //  =>better pure horizontal movement; terrible in the diagonal.
      //var step=Math.round(((p1.x - p0.x)*.9)); //.9=aspect ratio of test map
      //p1.x = p1.x + step;  
      
      _gwmBas.ptArray[1]=p1;
      _gwmCore.svgRoot.currentTranslate.x += p1.x - p0.x;
      _gwmCore.svgRoot.currentTranslate.y += p1.y - p0.y;
      _gwmBas.ptArray[0] = p1;    
      }
      
    break;

    
    //--GEOM CAPTURE MODES
    case _gwmBasME.POINTMODE:
    case _gwmBasME.LINEMODE:
    case _gwmBasME.POLYLINEMODE:
    case _gwmBasME.POLYGONMODE:
    case _gwmBasME.RECTANGLEMODE:
    case _gwmBasME.CIRCLEMODE:
    case _gwmBasME.TEXTMODE:
    case _gwmBasME.CALLOUTMODE:
    case _gwmBasME.TEXTKEYINSTART:

      var p = _gwmCore.getTransSVGPoint( evt );
      _gwmBas.attachActiveCursor( p );
      if( _gwmBas.ptArray.length <= 0 && 
          (state != _gwmBasME.TEXTMODE && 
           state != _gwmBasME.CALLOUTMODE) 
        ) break;

      if( state == _gwmBasME.LINEMODE )
        _gwmBas.drawPath( _gwmBas.sEleDrawLine, null, _gwmBas.ptArray, p, false );
      else if( state == _gwmBasME.POLYLINEMODE )
        _gwmBas.drawPath( _gwmBas.sEleDrawPolyline, null, _gwmBas.ptArray, p, false );
      else if( state == _gwmBasME.TEXTMODE )  
      {
        _gwmBas.clearMultiple( _gwmBas.sEleDrawText, null );
        _gwmBas.drawText( _gwmBas.sEleDrawText, null, p , _gwmBas.sDrawText );
      }
      else if( state == _gwmBasME.CALLOUTMODE )
      {
        _gwmBas.drawPath( _gwmBas.sEleDrawCalloutLine, null, _gwmBas.ptArray, p, false );
        _gwmBas.clearMultiple( _gwmBas.sEleDrawText, null );
        _gwmBas.drawText( _gwmBas.sEleDrawText, null, p , _gwmBas.sDrawText );
      }
      else if( state == _gwmBasME.POLYGONMODE )
        _gwmBas.drawPath( _gwmBas.sEleDrawPolygon, null, _gwmBas.ptArray, p, true );
      else if( state == _gwmBasME.RECTANGLEMODE )
        _gwmBas.drawRectangle( _gwmBas.sEleDrawRect, null, _gwmBas.ptArray[0], p );
      else if( state == _gwmBasME.CIRCLEMODE )
        _gwmBas.drawCircle( _gwmBas.sEleDrawCircle, null, _gwmBas.ptArray[0], p );

    break;

  } //-End:switch(ListenerState)

}

//=========================================================
function _gwmMouseDown(evt)
{
  //disable viewer's default behavior (contextMenu)
  if( _gwmBasME.iListenerState != _gwmBasME.IDLE ) 
    evt.preventDefault();

  if( _gwmIsRightClick(evt) )
  {
   if( _gwmBasME.onInterruptHandler ) 
       _gwmBasME.onInterruptHandler(); 
     return;
  }

  if( _gwmBasME.iListenerState == _gwmBasME.PANREADY )
  {
    _gwmBas.sCoordList = ""; 
    _gwmBas.ptArray = null;
    _gwmBas.ptArray = new Array(); 
    _gwmBas.mtxHolder = _gwmCore.getSVGTransMatrix();

    var pc = _gwmCore.getTransSVGPoint( evt );
    _gwmBas.attachActiveCursor( pc );

    var p   = _gwmCore.svgRoot.createSVGPoint();
    p.x = evt.getClientX();
    p.y = evt.getClientY();
    _gwmBas.ptArray[0]=p; 
  
    _gwmBasME.iListenerState = _gwmBasME.PAN;
  }
}

//=========================================================
function _gwmMouseUp(evt)
{
  if( _gwmBasME.iListenerState == _gwmBasME.PAN )
  {
//    _gwmBasME.iListenerState = _gwmBasME.IDLE;
    //--transform last point according to first point's view matrix,  
    //  otherwise you get last point same as first.
    var p = _gwmCore.getTransSVGPointMtx( evt, _gwmBas.mtxHolder );
    _gwmBas.ptArray[1] = p;
    if( _gwmBasME.onCompletionHandler )
      _gwmBasME.onCompletionHandler();     
  }
}

//=========================================================
// PMW 11/16/05 - created for handling SVGScroll event
function _gwmOnSVGScroll(evt)
{
  if (_gwmBas.evtHandlerSVGScroll)
    _gwmBas.evtHandlerSVGScroll(evt);
}

//=========================================================
// PMW 11/18/05 - created for handling SVGZoom event
function _gwmOnSVGZoom(evt)
{
  if (_gwmBas.evtHandlerSVGZoom)
    _gwmBas.evtHandlerSVGZoom(evt);
}

//=========================================================
function _gwmMouseClick(evt)
{
var ele;
var state = _gwmBasME.iListenerState;
var bIsRC = _gwmIsRightClick(evt);


  switch( state )
  {
    case _gwmBasME.IDLE: 

      if( bIsRC ) 
      {
        //--Dev Note: If API function setEventHandler ever implements
        //  right-click notification, put that code here.
        return;
      }
      
      ele = evt.target;

      if( null != _gwmBas.evtHandlerClick && 
          typeof(_gwmBas.evtHandlerClick) != 'undefined' )
      {
        var p = _gwmCore.getTransSVGPoint( evt );
        _gwmBas.evtHandlerClick(ele,p.x,p.y);
      }

      if( _gwmBas.isEleHotspotEnabled(ele) )
      {
        _gwmCore.actionHandler(evt);
      }

    break;

    case _gwmBasME.POINTMODE:
    case _gwmBasME.LINEMODE:
    case _gwmBasME.POLYLINEMODE:
    case _gwmBasME.POLYGONMODE:
    case _gwmBasME.RECTANGLEMODE:
    case _gwmBasME.CIRCLEMODE:
    case _gwmBasME.TEXTMODE:
    case _gwmBasME.CALLOUTMODE:
    case _gwmBasME.TEXTKEYINSTART:
    case _gwmBasME.TEXTKEYINMODE:
    case _gwmBasME.PAN:

      if( bIsRC )
      {
//window.alert("BasicME:_gwmMouseClick; _gwmBasME.onInterruptHandler=" + _gwmBasME.onInterruptHandler);
        if( _gwmBasME.onInterruptHandler ) 
          _gwmBasME.onInterruptHandler(); 
        break;
      }

      if( state == _gwmBasME.PAN ) return;
      
      var p = _gwmCore.getTransSVGPoint( evt );
      var bIsDblClick = _gwmIsDblClick( p );

      if( !bIsDblClick ) _gwmBas.ptArray[ _gwmBas.ptArray.length ] = p; 

      var bDone = false;

      if( _gwmBas.ptArray.length == 1 )
      {
        if( state == _gwmBasME.POINTMODE  ) 
        {
          bDone = true;
          _gwmBas.drawPoint( _gwmBas.sEleDrawPoint, null, _gwmBas.ptArray[0] );
        }
        else if( state == _gwmBasME.TEXTMODE ) 
        {
          bDone = true;
          _gwmBas.clearMultiple( _gwmBas.sEleDrawText, null );
          _gwmBas.drawText( _gwmBas.sEleDrawText, null, 
                            _gwmBas.ptArray[0], _gwmBas.sDrawText );
        }
        else if( state == _gwmBasME.TEXTKEYINSTART ) 
        {
          bDone = true;
          // Move to completionHandler
          //_gwmBas.drawTextKeyinStart( _gwmBas.sEleDrawTextKeyin, null, 
          //                            _gwmBas.ptArray[0], _gwmBas.sDrawText );
        }
      }
      else if( _gwmBas.ptArray.length == 2 )
      {       
        if( state == _gwmBasME.LINEMODE || 
            state == _gwmBasME.RECTANGLEMODE || 
            state == _gwmBasME.CIRCLEMODE || 
            ((state == _gwmBasME.POLYLINEMODE || state == _gwmBasME.CALLOUTMODE) 
              && bIsDblClick) 
           ) bDone = true;              
      }
      else 
      {
        if( bIsDblClick ) bDone = true;
      }
    
      if( bDone )
      {   
        if( _gwmBasME.onCompletionHandler )
          _gwmBasME.onCompletionHandler();            
      }
    
    break;

    //--GET CLICKED ELEMENT MODES-------------------------------------

    //case  _gwmBasME.FITELEMENT:  
    case  _gwmBasME.GETELEMENT:
      
      if( bIsRC ) 
      {
        if( _gwmBasME.onInterruptHandler ) 
          _gwmBasME.onInterruptHandler(); 
        break;
      }
      ele = evt.target;
      if( _gwmBasME.onCompletionHandler )
          _gwmBasME.onCompletionHandler( ele );   
    break;

  } //switch

}

//=========================================================
function _gwmIsRightClick( evt )
{
  return( (evt.getButton()==2) );
}


//=========================================================
function _gwmIsDblClick( p )
{
var bIsDblClick = false;
var pts = _gwmBas.ptArray;

  if( pts.length > 0 )
  {
    bIsDblClick = ( p.x == pts[pts.length-1].x &&
                    p.y == pts[pts.length-1].y )
  }

  return bIsDblClick;
}


//==========================================================
function _gwmKeyPress(evt)
{
var state = _gwmBasME.iListenerState;

  if( state == _gwmBasME.IDLE ) return;
  var key = evt.charCode;

  switch( state )
  {
    case _gwmBasME.TEXTKEYINMODE:
    
      //Escape Key = 27
      if( key == 27 && _gwmBasME.onInterruptHandler ) 
      {
        _gwmBasME.onInterruptHandler(); 
        break;
      }
   
      _gwmBas.drawTextKeyin( _gwmBas.sEleDrawTextKeyinT, key );

    break;
      
      
   } //end:switch
}

//=========================================================
/***
function keypress(evt)
{
  _gwmKeyPress(evt);
}
***/

//=========================================================
_gwmBasME.handleEvent = function(e) {
    var type = e.type;
  //if ( _gwmBasME.[type] != null ) _gwmBasME.[type](e);
  if( type == "keypress" ) _gwmKeyPress(e);
};


