//*****************************************************************************
// Do not remove this notice.
//
// Copyright 2001 by Mike Hall.
// See http://www.brainjar.com for terms of use.
//Hard Modifyed for this project ;] (GameBit)
//*****************************************************************************

// 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 oid;
var browser = new Browser();
var dragObj = new Object();
var objA    = objB = null;
var objAType= objAType = null;

function dragStart(event, id) {
    var el, x, y;
    event = getEvent(event);
    
    objA    = getEventTarget(event);
    objAType= objA.getAttribute('cellType');

    if ( objA.tagName != 'TD' && objA.tagName != 'TH' && objA.tagName != 'LI' ) return false;
    if ( objA.tagName == 'LI' && !id ) id = 'DragableItem';

    if ( id == 'DragableItem' ){
        document.getElementById('DragableItem').className       = 'DragableItem';
        document.getElementById('DragableItem').style.left      = findPosX(objA) +'px';
        document.getElementById('DragableItem').style.top       = findPosY(objA) +'px';

        document.getElementById('DragableItem').style.height    = (objA.offsetHeight  -2)+'px';
        document.getElementById('DragableItem').style.width     = (objA.offsetWidth   -2)+'px';

        document.getElementById('DragableItem').style.display   = 'inline';

        document.getElementById('DragableItem').innerHTML       = objA.innerHTML.replace(/<[^>]*>/ig, '');
    } else {
    	document.getElementById(id).style.zIndex = '1';
    }

    oid = id;
    // If an element id was given, find it. Otherwise use the element being
    // clicked on.

    if (id) {
        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);

    if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
    if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;

    // Capture mousemove and mouseup events on the page.
    if (browser.isIE) {
        document.attachEvent("onmousemove", dragGo);
        document.attachEvent("onmouseup", dragStop);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS) {
        document.addEventListener("mousemove", dragGo,   true);
        document.addEventListener("mouseup", dragStop, true);
        event.preventDefault();
    }
}


var errDrop = false;
function dragGo(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.
    dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
    dragObj.elNode.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px";


    if (browser.isIE) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS)
        event.preventDefault();

    updateNodes( dragObj.elNode.id );


    if( dragObj.elNode.id == 'DragableItem' ){
        if ( objAType ){
            objB = ObjAt(x, y, 'TD');
            if ( !objB || !objAType ) return;
            
            if ( objB.getAttribute('cellType') != objAType || GetTable(objA).id == GetTable(objB).id ){
                errDrop = true;
                document.getElementById('DragableItem').className       = 'DragableItemE';
            }else{
                errDrop = false;
                document.getElementById('DragableItem').className       = 'DragableItem';
            }
        }else{
            aboveEditor = (ObjAt(x, y, 'DIV').id == 'VisualEditor');
            if( errDrop == false && aboveEditor ){
                var db = document.getElementById('DBDatabases');

                if ( Tables[db.options[db.selectedIndex].value +'.' +objA.id.replace(/TableInDb_/, '')] ){
                    errDrop = true;
                    document.getElementById('DragableItem').className       = 'DragableItemE';
                }
            }else if( errDrop == true  && !aboveEditor ){
                errDrop = false;
                document.getElementById('DragableItem').className       = 'DragableItem';
            }
        }
    }

}

function dragStop(event) {
    // Stop capturing mousemove and mouseup events.

    if (browser.isIE) {
        document.detachEvent("onmousemove", dragGo);
        document.detachEvent("onmouseup",   dragStop);
    }else if (browser.isNS) {
        document.removeEventListener("mousemove", dragGo,   true);
        document.removeEventListener("mouseup",   dragStop, true);
    }

    if ( oid == 'DragableItem' ){
        if ( document.all ) {
            var _x = event.clientX + document.body.scrollLeft;
            var _y = event.clientY + document.body.scrollTop;
        }else{
            var _x = event.pageX;
            var _y = event.pageY;
        }

        objB = ObjAt( _x, _y, 'TD' );

        if ( !objB || objA.tagName == 'LI' ){
            if ( objA.tagName == 'LI' ){
                objB = ObjAt(_x, _y, 'DIV');

                if ( objB.id == 'VisualEditor' && errDrop == false ){
                    aSQL.AddTable( objA.id.replace(/TableInDb_/, ''), 'VisualEditor', findPosX(document.getElementById(oid)) -findPosX(objB) +objB.scrollLeft, findPosY(document.getElementById(oid)) -findPosY(objB) +objB.scrollTop );
                }
            }

            document.getElementById(oid).style.display = 'none';
            objA = objB = null;
            return false;
        }

        document.getElementById(oid).style.display = 'none';
        if ( GetTable(objA).id == GetTable(objB).id || errDrop == true ) return false;


        var tableA = GetTable(objA).id;
        if ( !Joints[tableA] ) Joints[tableA] = Array();
        var tableLen = Joints[tableA].length+1;
        Joints[tableA][tableLen] = Array();
        Joints[tableA][tableLen]['a'] = objA.id;
        Joints[tableA][tableLen]['b'] = objB.id.replace(/_Type/, '');

        var tableB = GetTable(objB).id;
        if ( !Joints[tableB] ) Joints[tableB] = Array();
        var tableLen = Joints[tableB].length+1;
        Joints[tableB][tableLen] = Array();
        Joints[tableB][tableLen]['a'] = objA.id;
        Joints[tableB][tableLen]['b'] = objB.id.replace(/_Type/, '');
    }else{
    	document.getElementById(oid).style.zIndex = '0';
    	var tableA = oid;
    }
    
    if(tableA) updateNodes(tableA);
    if(tableB) updateNodes(tableB);

    objA = objB = null;
}


function getEvent(e){
    return (e) ? e : ((event) ? event : null);
}

function getEventTarget(e){
    return ((e.target) ? e.target : window.event.srcElement);
}