
var onTheFlyColumnResizing = true;

// Determine browser and version.

function Browser() {

  var ua, s, i;

  this.isIE    = false;
  this.isNS    = false;
  this.version = null;

  ua = navigator.userAgent;

  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  // Treat any other "Gecko" browser as NS 6.1.

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
}

var browser = new Browser();

// Global object to hold drag information.

var dragObj = new Object();
dragObj.zIndex = styles.zDragObj;
dragObj.dragging = false;

dragObj.dragStart = function(event, id, byObj) {

  var el;
  var x, y;

  // If an element id was given, find it. Otherwise use the element being
  // clicked on.

  if (id) {
    if (byObj) {
      dragObj.elNode = id;
    }
    else {
      dragObj.elNode = document.getElementById(id);
    }
  }
  else {
    if (browser.isIE)
      dragObj.elNode = window.event.srcElement;
    if (browser.isNS)
      dragObj.elNode = event.target;

    // If this is a text node, use its parent element.

    if (dragObj.elNode.nodeType == 3)
      dragObj.elNode = dragObj.elNode.parentNode;
  }

  // Get cursor position with respect to the page.

  if (browser.isIE) {
    x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
  }
  if (browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  // Save starting positions of cursor and element.

  dragObj.cursorStartX = x;
  dragObj.cursorStartY = y;
  dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
  dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);
  dragObj.elStartWidth = parseInt(dragObj.elNode.style.width,  10);

  if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
  if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;
  if (isNaN(dragObj.elStartWidth))dragObj.elStartWidth  = 0;

  // Update element's z-index.

  // dragObj.elNode.style.zIndex = ++dragObj.zIndex;

  // Capture mousemove and mouseup events on the page.

  if (browser.isIE) {
    document.attachEvent("onmousemove", dragObj.dragGo);
    document.attachEvent("onmouseup",   dragObj.dragStop);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (browser.isNS) {
    document.addEventListener("mousemove", dragObj.dragGo,   true);
    document.addEventListener("mouseup",   dragObj.dragStop, true);
    event.preventDefault();
  }
  
  dragObj.dragging = true;
  
}

dragObj.dragGo = function(event) {

  var x, y;

  // Get cursor position with respect to the page.

  if (browser.isIE) {
    x = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
  }
  if (browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  // Move drag element by the same amount the cursor has moved.
  if (dragObj.type=='dialog') {
    dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
    dragObj.elNode.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px";
  }
  
  if (dragObj.type=='resize') {
    var width = dragObj.elStartWidth + x - dragObj.cursorStartX;
    if (width < 30) width = 30;
    dragObj.cell.setWidth(width);
    dragObj.cell.row.resize(dragObj.cell.colNum+1);
    if (onTheFlyColumnResizing) {
      dragObj.doResizeColumn(dragObj.cell);
    }
  }
  
  if (dragObj.type=='move') {
    var left = dragObj.elStartLeft + x - dragObj.cursorStartX;
    dragObj.elNode.style.left = (left - dragObj.cell.grid.gridDiv.scrollLeft) + "px";
    dragObj.cell.grid.movingColumnDiv.style.left = (parseInt(dragObj.elNode.style.left) + dragObj.cell.grid.containerLeft) + "px";
    var top = dragObj.elStartTop  + y - dragObj.cursorStartY;  
    if (top > dragObj.cell.y) top = dragObj.cell.y;
    dragObj.elNode.style.top  =  top + "px"
    dragObj.cell.grid.movingColumnDiv.style.top = (parseInt(dragObj.elNode.style.top) + dragObj.cell.grid.containerTop) + "px";
    if (dragObj.cell.y - rowHeight*2 > top) {
      styles.setRemovingHeader(dragObj.cell);
    }
    else {
      styles.setDragHeader(dragObj.cell);
    }
  }

  if (dragObj.type=='moveControl') {
    var left = dragObj.elStartLeft + x - dragObj.cursorStartX;
    left = Math.floor(left / 10) * 10;
    dragObj.elNode.style.left = left + "px";
    var top = dragObj.elStartTop  + y - dragObj.cursorStartY;  
    top = Math.floor(top / 15) * 15;
    dragObj.elNode.style.top  =  top + "px"
    dragObj.cell.y = dragObj.elNode.offsetTop;
    dragObj.cell.x = dragObj.elNode.offsetLeft;    
  }

  if (dragObj.type=='moveTable') {
    var left = dragObj.elStartLeft + x - dragObj.cursorStartX;
    if (left < 0) left = 0;
    dragObj.elNode.style.left = left + "px";
    var top = dragObj.elStartTop  + y - dragObj.cursorStartY;  
    if (top < 0) top = 0;
    dragObj.elNode.style.top  =  top + "px"
    dragObj.cell.y = dragObj.elNode.offsetTop;
    dragObj.cell.x = dragObj.elNode.offsetLeft;
    dragObj.cell.area.drawJoinLines(dragObj.cell);    
  }
  
  if (dragObj.type=='resizeTable') {
    var changeX = x - dragObj.cursorStartX;
    var changeY = y - dragObj.cursorStartY;  
    var table = dragObj.cell;
    var dir = table.resizeDirection;
    var newX = table.resizeX;
    var newY = table.resizeY;
    var newWidth = table.resizeWidth;
    var newHeight = table.resizeHeight;
    var north = false;
    var south = false;
    var west = false;
    var east = false;
    if (dir == "nw" || dir == "n" || dir == "ne") north = true; 
    if (dir == "sw" || dir == "s" || dir == "se") south = true;
    if (dir == "sw" || dir == "w" || dir == "nw") west = true;
    if (dir == "se" || dir == "e" || dir == "ne") east = true;
    if (north) {
      newHeight = newHeight - changeY;
      newY += changeY;
    }
    if (south) {
      newHeight += changeY;
    }
    if (west) {
      newWidth = newWidth - changeX;
      newX += changeX;
    }
    if (east) {
      newWidth += changeX;
    }
    if (newWidth < 100) {
      if (west) newX += (newWidth - 100);
      newWidth = 100;
    }
    if (newHeight < 100) {
      if (north) newY += (newHeight - 100);
      newHeight = 100;
    }
    if (newX < 0) {
      newWidth += newX;
      newX = 0;
    }
    if (newY < 0) {
      newHeight += newY;
      newY = 0;
    }
    if (newX != table.x || newY != table.y || newWidth != table.width || newHeight != table.height) {
      if (newX != table.x || newY != table.y) {
        table.moveTo(newX, newY);
      }
      table.resize(newWidth, newHeight);
      dragObj.cell.area.drawJoinLines(dragObj.cell);
    } 
  }

  if (dragObj.type=='joinFields') {
    var left = x;
    var top = y; 
    var obj = dragObj.cell.table.area.div.parentNode;
    while (obj != null && obj != document.body && obj.offsetLeft != null && obj.offsetTop != null) {
      left = left - obj.offsetLeft;
      top = top - obj.offsetTop;
      obj = obj.parentNode;
    };
    dragObj.cell.drawLineTo(left, top);    
  }

  if (browser.isIE) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (browser.isNS)
    event.preventDefault();
}

dragObj.dragStop = function(event) {

  // Stop capturing mousemove and mouseup events.

  dragObj.dragging = false;

  if (browser.isIE) {
    document.detachEvent("onmousemove", dragObj.dragGo);
    document.detachEvent("onmouseup",   dragObj.dragStop);
  }
  if (browser.isNS) {
    document.removeEventListener("mousemove", dragObj.dragGo,   true);
    document.removeEventListener("mouseup",   dragObj.dragStop, true);
  }

  if (dragObj.type=='resize') {
   dragObj.doResizeColumn(dragObj.cell);
  }
  
  if (dragObj.type=='move') {  
    var top = dragObj.cell.div.style.top;
    top = top.substr(0, top.length - 2);
    dragObj.cell.grid.movingColumnDiv.style.visibility = "hidden";
    dragObj.cell.grid.movingColumnDiv.style.left = "0px";
    dragObj.cell.grid.movingColumnHeaderDiv.style.visibility = "hidden";
    dragObj.cell.grid.removeImg.style.visibility = "hidden";
    dragObj.cell.grid.removeText.style.visibility = "hidden";
    dragObj.cell.grid.fixedHeaderDiv.style.visibility = "hidden";
    dragObj.cell.grid.fixedHeaderDiv.style.left = "0px";
    var remove = false;
    if (dragObj.cell.y - rowHeight*2 > Number(top)) {  
      if (dragObj.cell.grid.cols.length <= 2) {      
        alert('You cannot remove the last column.');
        styles.setHeader(dragObj.cell);
      }
      else {
        remove = true;
      }
    }
    if (remove) {  // Remove Column
      dragObj.cell.grid.deleteCol(dragObj.cell.colNum);
      for (var rowNum = 0; rowNum < dragObj.cell.col.cells.length; rowNum++) {
        row = dragObj.cell.grid.rows[rowNum];        
        row.resize();
      }
      dragObj.cell.grid.scroller.positionToGrid(dragObj.cell.grid);
      dragObj.cell.grid.cache.clear();
      dragObj.cell.grid.cache.save();
      dragObj.cell.grid.updateFieldView();
    }
    else {  // Move Column
      var x = null;
      styles.setHeader(dragObj.cell);
      dragObj.cell.col.highlight(styles.dataBgColor);
      if (dragObj.cell.grid.downArrowImg.style.visibility == "visible") {
        dragObj.cell.x = parseInt(dragObj.cell.grid.downArrowImg.style.left) - dragObj.cell.grid.containerLeft + dragObj.cell.grid.gridDiv.scrollLeft;
        dragObj.cell.grid.downArrowImg.style.visibility = "hidden";
        // column moved - clear cache
        dragObj.cell.grid.cache.clear();
      }
      dragObj.cell.div.style.zIndex = styles.zCell;
      dragObj.cell.moveTo(x, dragObj.cell.y);
      dragObj.cell.grid.cols.sort(dragObj.sortColsByX);
      var row;    
      // take care of data
      for (var rowNum = 1; rowNum < dragObj.cell.col.cells.length; rowNum++) {
        row = dragObj.cell.grid.rows[rowNum];
        if (rowNum!=0) {
          for (var colNum = 0; colNum < dragObj.cell.row.cells.length; colNum++) {
            row.cells[colNum].x = dragObj.cell.grid.rows[0].cells[colNum].x;
          }
        }      
        row.cells.sort(dragObj.sortCellsByX);
        for (var i=0; i<row.cells.length; i++) {
          row.cells[i].colNum = i;
          row.cells[i].col = dragObj.cell.grid.cols[i];
        }
        row.resize();
      }
      // now, take care of headers
      row = dragObj.cell.row;    
      row.cells.sort(dragObj.sortCellsByX);
      for (var i=0; i<row.cells.length; i++) {
        row.cells[i].colNum = i;
        row.cells[i].col = dragObj.cell.grid.cols[i];
      }
      row.resize();    
      dragObj.cell.grid.cache.save();
    }
  }  

  if (dragObj.type=='joinFields') {
    var fromField = dragObj.cell;
    var area = fromField.table.area;
    var toField = area.lastHover;
    fromField.div.style.backgroundColor = "";
    fromField.div.style.border = "1px solid white";
    fromField.div.style.color = "";
    if (fromField.canvas != null) fromField.canvas.clear();
    if (toField != null && fromField.table != toField.table) {
      toField.div.style.backgroundColor = "";
      area.addJoinLine(fromField, toField);
      toField.div.style.border = "1px solid white";
      toField.div.style.color = "";
    }
    dragObj.cell = null;
  }  
}


dragObj.sortCellsByX = function(cell1, cell2) {
  if (cell1.colNum == 0) return -1;
  if (cell2.colNum == 0) return 1;
  return cell1.x - cell2.x;
}

dragObj.sortColsByX = function(col1, col2) {
  return dragObj.sortCellsByX(col1.cells[0], col2.cells[0]);
}


dragObj.doResizeColumn = function(baseCell) {
  baseCell.col.setWidth(baseCell.width);
  for (var colNum = baseCell.colNum+1; colNum < baseCell.row.cells.length; colNum++) {
    var cell = baseCell.row.cells[colNum];
    var prevCell = baseCell.row.cells[colNum-1];
    cell.col.moveTo(prevCell.x + prevCell.width + cellPadding + 1);
  }
  baseCell.grid.scroller.positionToGrid(baseCell.grid);
}


