//////////////////////////////////////////////////////////////////
// DRAGapi.js
//
// General utilities for DRAGGING objects 
//
// To initialize, call initDRAGapi();
//
// Author: Mike Bergsma
//
// Modifications:
//
//    $Log: DRAGapi.js,v $
//    Revision 1.13  2008-06-29 18:29:11  bergsma
//    *** empty log message ***
//
//    Revision 1.12  2008-06-27 04:09:18  bergsma
//    no message
//
//    Revision 1.11  2008-04-25 17:51:29  bergsma
//    no message
//
//    Revision 1.10  2008-02-28 02:25:12  bergsma
//    Fix delay in keybuf
//
//    Revision 1.9  2008-01-17 04:23:39  bergsma
//    First working chat prototype
//
//
//
//////////////////////////////////////////////////////////////////

// Global holds reference to selected element
var selectedObj;
var selectedObjName ;
var currentX ;
var currentY ;

// Globals hold location of click relative to element
var offsetX, offsetY;

var dashboardOffsetTop  = 10 ;
var dashboardOffsetLeft = 10 ;

// Lowest zindex

var zOffset = 5 ;

function initDRAGapi()
{
  return ;
}

// Set global reference to element being engaged and dragged
function setSelectedElem( target ) 
{
  selectedObj = null;
  selectedObjName = "" ;

  // We are looking for an element with a either a src or an href 
  // and a name tag
  if ( (target.src || target.href) && target.name ) {

    var name = target.name ;

    // Example:  drag_theobject
    if ( name.substring ( 0, 5 ) == "drag_" ) {

      selectedObjName = name.substring ( 5 ) ;

      var tok = selectedObjName.split('_');
      var divID = "frame_" + tok[1] ;

      selectedObj = getRawObject ( divID ) ;

      if ( selectedObj ) {

        setZIndex(selectedObj, 100 );
      } 
    }
  }

  return;

}

// Drag an element
// This does not work on an iphone, btw. For that we move it with
// succesive mouse clicks. 
function drag_handler_dragIt(evt) {

    evt = (evt) ? evt : event;

    if (selectedObj) {

	var x ;
	var y ;
	var doShift = 0 ;

        if (evt.pageX) {

	  // Mozilla
  	  x = evt.pageX - offsetX ;
	  y = evt.pageY - offsetY ;

	  if ( x > dashboardOffsetLeft && y > dashboardOffsetTop ) {
            shiftTo(selectedObj, x, y ) ;
  	    currentX = x ;
	    currentY = y ;
	  }

        } 
        else if (evt.clientX || evt.clientY) {

	  // IE
	  x = evt.clientX - offsetX ;
	  y = evt.clientY - offsetY ;

	  if ( x > dashboardOffsetLeft && y > dashboardOffsetTop ) {
            shiftTo(selectedObj, x, y ) ;
  	    currentX = x ;
	    currentY = y ;
	  }
	  
        }

        evt.cancelBubble = true;
	if (evt.stopPropagation) evt.stopPropagation();

        return false;
    }
}

// Turn selected element on
function drag_handler_clickIt(evt) {

    evt = (evt) ? evt : event;

    var target = (evt.target) ? evt.target : evt.srcElement;
    
    var tag = (target.tagName) ? target.tagName : "" ;
    //debug('clicked'+tag,1);

    if ( tag == "TD" ) {
      var tok = target.title ;
      if ( tok != "" && tok != " " ) {
         if ( focusOBJ && focusOBJ.hasKeys() ) {
           focusOBJ.setInputValue ( tok ) ;
         }
      }
      return false ;
    }

    setSelectedElem ( target );

    if ( selectedObj ) {

	// Found an element with attribute name="drag_something" 

	// The variables offsetX and offsetY
	// are the offset from the mouse to the top left corner
	// of the selectedObj
	debug('Click on '+ selectedObjName, 0 ) ;

        if (evt.pageX) {

	    // Mozilla
            offsetX = evt.pageX - ((selectedObj.offsetLeft) ? 
                      selectedObj.offsetLeft : selectedObj.left);
            offsetY = evt.pageY - ((selectedObj.offsetTop) ? 
                      selectedObj.offsetTop : selectedObj.top);
        } 

        else if (evt.clientX) {

	    // IE
            offsetX = evt.clientX - ((selectedObj.offsetLeft) ? 
                      selectedObj.offsetLeft : dashboardOffsetLeft);
            offsetY = evt.clientY - ((selectedObj.offsetTop) ? 
                      selectedObj.offsetTop : dashboardOffsetTop);

        }
        else if (evt.offsetX || evt.offsetY) {

            offsetX = evt.offsetX - ((evt.offsetX < -2) ? 
                      dashboardOffsetLeft : document.body.scrollLeft);
            offsetY = evt.offsetY - ((evt.offsetY < -2) ? 
                      dashboardOffsetTop : document.body.scrollTop);
        }

	// Set the current X and Y
	var x ;
	var y ;
        if (evt.pageX) {

	  // Mozilla
  	  x = evt.pageX - offsetX ;
	  y = evt.pageY - offsetY ;

        } 
        else if (evt.clientX || evt.clientY) {

	  // IE
	  x = evt.clientX - offsetX ;
	  y = evt.clientY - offsetY ;
	  
        }

	currentX = x ;
	currentY = y ;

        return false;
    }
}

// Turn selected element off
function drag_handler_releaseIt(evt) {

    if (selectedObj) {
        setZIndex(selectedObj, zOffset);
        zOffset++ ;
        selectedObj = null;
	debug('Dropped '+selectedObjName+' off at '+ currentX +','+currentY, 0 ) ;

	issuePut(selectedObjName,(currentX+":"+currentY),"MOV");

        selectedObjName = null;
    }
}

// Focus on an element
function drag_handler_focusIt(evt) {

    evt = (evt) ? evt : event;
    var target = (evt.target) ? evt.target : evt.srcElement;
    //if ( target != theEventElement ) return ; 
    target.focus() ;
    return false ;
}

// Blur an element
function drag_handler_blurIt(evt) {

    evt = (evt) ? evt : event;
    var target = (evt.target) ? evt.target : evt.srcElement;
    //if ( target != theEventElement ) return ; 
    target.blur() ;
    return false ;
}

function drag_handler_moveIt ()
{

  var winW = getInsideWindowWidth() ;
  var winH = getInsideWindowHeight();
  
  var x ;
  var y ;
  var w ;
  var h ;


  var n = panelArray.length ;

  var panel ;
  var doShift ;
  for ( i=0; i<n; i++ ) {

    panel = panelArray[i] ;
    x = getObjectLeft(panel) ;
    y = getObjectTop(panel) ;
    w = getObjectWidth(panel) ;
    h = getObjectHeight(panel) ;
    
    doShift = 0 ;
    if ( (x < 0) || (x > winW)  ) {

        //alert ( "x="+x+" y="+y+" w="+w+" h="+h+" ww="+winW+" wh="+winH);
	x = (winW-w) > dashboardOffsetLeft ? (winW-w) : dashboardOffsetLeft ;	
	doShift = 1 ;

    }
    if ( (y < 0) || (y > winH) ) {

        //alert ( "x="+x+" y="+y+" w="+w+" h="+h+" ww="+winW+" wh="+winH);
        y = (winH-h) > dashboardOffsetTop ? (winH-h) : dashboardOffsetTop ;	
	doShift = 1 ;
    }
    if ( doShift )
     shiftTo(getRawObject(panel),x,y);
  }

} 
