/*
  CodeBaby JavaScript Library
  Copyright (c) 2004-2006 CodeBaby Corp.
  All rights reserved.
  This source code can only be distributed in accordance with the terms of the license agreement entered into
  with CodeBaby.

  Version: LEX
  $Rev: 1184 $
  $Date: 2006-07-04 10:32:07 -0600 (Tue, 04 Jul 2006) $
  $URL: http://svn/svn/Development/JSLib/Branches/LEXSimplifyJavaScript/Core/cb/core/cb_library_common.js $
*/	 

/*******************************************************************************
  NOTE: this is a core CodeBaby file, and should not be modified in any way, 
  unless absolutely necessary.
*******************************************************************************/

/**
  Static class used for dragging the codebaby console.
  
  @author Steve Middleton
*/
function CodeBabyDrag() {};

/**
  Called by a mousedown event.  This starts the dragging of a div or element.
  E.g. <div id="myDiv" onmousedown="CodeBabyDrag.startDrag(event, "myDiv");"> 

  @param event The event object, passed by the mouseover event.
  @param id The ID of the element to be dragged
  @author Steve Middleton
*/
CodeBabyDrag.startDrag = function(event, id) {

    // get the browser type
    var browser = codebaby.getBrowserType();
    
    // get the element
    CodeBabyDrag.element = document.getElementById(id);
    
    // get cursor position with respect to the page.
    var x, y;
    if (browser == "Explorer") {
        x = window.event.clientX + document.documentElement.scrollLeft
          + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
          + document.body.scrollTop;
    } else {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }
    
    // Save starting positions of cursor and element.
    CodeBabyDrag.cursorStartX = x;
    CodeBabyDrag.cursorStartY = y;
    CodeBabyDrag.elementStartLeft = parseInt(CodeBabyDrag.element.style.left, 10);
    CodeBabyDrag.elementStartTop = parseInt(CodeBabyDrag.element.style.top, 10);
    
    if (isNaN(CodeBabyDrag.elementStartLeft)) CodeBabyDrag.elementStartLeft = 0;
    if (isNaN(CodeBabyDrag.elementStartTop)) CodeBabyDrag.elementStartTop = 0;
    
    // Capture mousemove and mouseup events on the page.
    if (browser == "Explorer") {
        document.attachEvent("onmousemove", CodeBabyDrag.doDrag);
        document.attachEvent("onmouseup", CodeBabyDrag.stopDrag);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    } else {
        document.addEventListener("mousemove", CodeBabyDrag.doDrag, true);
        document.addEventListener("mouseup", CodeBabyDrag.stopDrag, true);
        
        // don't want to prevent bubbling in Safari, because the mousedown event
        // never gets sent to flash 
        if (browser != "Safari") {
            event.preventDefault();
        }

    }
}

/**
  Performs the drag.  This should be called on every mousemove event
  during dragging.
  
  @param event The event object, passed by the mousemove event.
  @author Steve Middleton
*/
CodeBabyDrag.doDrag = function(event) {

    // get the browser type
    var browser = codebaby.getBrowserType();
    
    // Get cursor position with respect to the page.
    var x, y;
    if (browser == "Explorer") {
        x = window.event.clientX + document.documentElement.scrollLeft +
            document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop +
            document.body.scrollTop;
    } else {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }

    // Move drag element by the same amount the cursor has moved.
    if (codebaby.isConsoleDragging) {
        CodeBabyDrag.element.style.left = 
            (CodeBabyDrag.elementStartLeft + x - CodeBabyDrag.cursorStartX) + "px";
        CodeBabyDrag.element.style.top = 
            (CodeBabyDrag.elementStartTop + y - CodeBabyDrag.cursorStartY) + "px";
        codebaby.updateSpeechBubblePosition();      
    }
  
    if (browser == "Explorer") {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    } else {
        event.preventDefault();
    }
}

CodeBabyDrag.stopDrag = function(event) {

    // get the browser type
    var browser = codebaby.getBrowserType();
    
    // fire the drag stop event
    codebaby.fireEvent("DragStop");
    
    // Stop capturing mousemove and mouseup events.
    if (browser == "Explorer") {
        document.detachEvent("onmousemove", CodeBabyDrag.doDrag);
        document.detachEvent("onmouseup",   CodeBabyDrag.stopDrag);
    } else {
        document.removeEventListener("mousemove", CodeBabyDrag.doDrag, true);
        document.removeEventListener("mouseup", CodeBabyDrag.stopDrag, true);
    }
    
}
