document.onmousemove = mouseMove;
document.onmouseup = mouseUp;

var dragObject = null;
var mouseOffset = null;
var userPlatesId = 'user_plates';
var exchangeHolder = 'exchange_landing_zone';
var dragContainerId = 'scrabble_cont'; // specify container with position relative for drag area - need for draggable items adjustment position
var draggableItemsDimentions = 57; // draggable items dimention side assuming that items are square
var clearTimePeriod = 0.5; // period in seconds - after this period cloned item will be cleared
var makeTimePeriod = 0.2; // period in seconds - after this period cloned item will be created
var startDraggingDelay = 0.3; // period in seconds - after how many secconds will start dragging when holding mouse button

var droppedObjects = new Array();

var spotSize = 40;
var droppedExchangeObjects = new Array();

// new device form settings
var formPosOffset = 50;
var formDivId = 'item_form_cont';


var dragging = false; // dragging status
var powerSwitch = false; // single click status (before dragging) when needed for power on/off
var dblClick = false; // dblclick status
var dblClickMenuCont = 'dblclick_menu_cont'; // dblclick menu cont
var dblClickOffcet = 35; // dblclick menu offset

function initializeDragObject() {
    // make draggble all plates that can be drag and drop
    var draggableList = new Array('DIV');
	if($('user_plates') != null)
		var plates = $('user_plates').childNodes;
    var dragKey = 0;
    
    for(i in plates) {
        if(in_array(plates[i].tagName, draggableList)) {
                dragItem = plates[i];
                dragItem.drop = 'drag_'+dragKey;
                dragItem.id = 'drag_'+dragKey;
                dragKey = dragKey + 1;
                makeDraggable(dragItem);
        }
    }
    
    // make draggble landing side - board
    var boardMaxSize = 15;
    var currentLand = 1;
    device_list = $('scrabble').childNodes;
    draggableList = new Array('DIV');
    for(i in device_list) {
        if(in_array(device_list[i].tagName, draggableList)) {
            devices = device_list[i].childNodes;
            
            container = device_list[i];
			maxPos = currentLand % boardMaxSize;
			if(!maxPos)
				maxPos = boardMaxSize;
            container.id = maxPos+'x'+Math.ceil(currentLand / boardMaxSize);
            containerChilds = container.childNodes;
            if(containerChilds.length > 1)
                container.inField = 'full';
            
            currentLand = currentLand + 1;
        }
    }
}

function getMouseOffset(target, ev) {
    ev = ev || window.event;
    
    var docPos = getPosition(target);
    var mousePos = mouseCoords(ev);
    
    return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function mouseCoords(ev) {
    if(ev.pageX || ev.pageY) {
        return {x:ev.pageX, y:ev.pageY};
    }
    return {
        x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
        y:ev.clientY + document.body.scrollTop - document.body.clientTop
    };
}

function getPosition(e) {
    var left = 0;
    var top = 0;
    
    while(e.offsetParent) {
        left += e.offsetLeft;
        top += e.offsetTop;
        e = e.offsetParent;
    }
    
    left += e.offsetLeft;
    top += e.offsetTop;
    
    return {x:left, y:top};
}

function mouseMove(ev) {
    if(dragObject) {
        ev = ev || window.event;
        var mousePos = mouseCoords(ev);
        var contPos = getPosition($(dragContainerId));
        
        dragObject.style.position = 'absolute';
        dragObject.style.top = (mousePos.y - mouseOffset.y - contPos.y)+'px';
        dragObject.style.left = (mousePos.x - mouseOffset.x - contPos.x)+'px';
        
        return false;
    }
}

function mouseUp(ev) {
    if(dragging) {
        if(!checkDropedInDiv(userPlatesId, ev)) {
			dropExchange = false;
			
			if(checkDropedInDiv(exchangeHolder, ev)) {
				var leftOffset = 2;
				var exist = false;
				
				exchangePos = getPosition($(exchangeHolder));
				contPos = getPosition($(dragContainerId));
				
				dragObject.style.left = ((droppedExchangeObjects.length * spotSize) + exchangePos.x - contPos.x + leftOffset)+'px';
				dragObject.style.top = (exchangePos.y - contPos.y)+'px';
				
				for(var i in droppedExchangeObjects)
					if(droppedExchangeObjects[i].id == dragObject)
						exist = true;
				
				if(!exist)
					droppedExchangeObjects[droppedExchangeObjects.length] = dragObject;
			} else {
				var landFieldSize = 39;
				
				contPos = getPosition($(dragContainerId));
				dragObjectPos = getPosition(dragObject);
				
				dropObjectX = Math.ceil((dragObjectPos.x - contPos.x) / landFieldSize);
				dropObjectY = Math.ceil((dragObjectPos.y - contPos.y) / landFieldSize);
				
				// премахва обекта от масива за смяна, ако е в него
				dropExchangePlate();
				
				if($(dropObjectX+'x'+dropObjectY) != null) {
					if($(dropObjectX+'x'+dropObjectY).inField == null) {
						// set land field for current plate
						dragObject.land = dropObjectX+'x'+dropObjectY;
						
						if(!in_array(dropObjectX+'x'+dropObjectY, droppedObjects))
							droppedObjects[droppedObjects.length] = dropObjectX+'x'+dropObjectY;
						dropPlateOnLand($(dropObjectX+'x'+dropObjectY));
					} else
						dropPlateDefault();
				} else
					dropPlateDefault();
			}
        } else
			dropPlateDefault();
    }
    
    if(dragObject != null)
        dragObject.style.zIndex = 102;
    
    dragging = false;
    dragObject = null;
}

function makeDraggable(item) {
    if(!item) return;
    
    item.onmousedown = function(ev) {
        activateDragging(ev, this);
        return false;
    }
}

// activate dragging - actuali drag item
function activateDragging(ev, obj) {
    // remove inField value if user move plate from board
    if(obj.land != null) {
        $(obj.land).inField = null;
        for (i in droppedObjects)
            if(droppedObjects[i] == obj.land)
                droppedObjects.splice(i, 1);
    }
    
    // make selected object as draggable one and start dragging
    obj.style.zIndex = 103;
    dragObject = obj;
    
    mouseOffset = getMouseOffset(obj, ev);
    dragging = true;
}

// delay dragging activation
function delayActivationDragging(ev, obj) {
    if(powerSwitch) {
        obj.style.cursor = 'default';
        activateDragging(ev, obj);
    } else {
        var functRef = function() {devicePowerOnOff(obj);};
        setTimeout(functRef, 200);
    }
}

function makeClickable(object) {
    object.onmousedown = function(ev) {
        mouseOffset = getMouseOffset(object, ev);
        makeDraggable(newNode);
    }
}

// Get element width and height
function getElementDimentionsById(divId) {
    if(typeof(divId) == 'string') {
        if(document.getElementById)
			var elem = $(divId);
		else if (document.all)
			var elem = document.all[divId];
    } else
        var elem = divId;
    
	/*if(ns4) {
		var elem = getObjNN4(document, divId);
		return {x:elem.clip.width, y:elem.clip.height};
	} else {*/
		
		/*if(op5) {
			yPos = elem.style.pixelHeight;
			xPos = elem.style.pixelWidth;
		} else {*/
			yPos = elem.offsetHeight;
			xPos = elem.offsetWidth;
		/*}*/
		return {width:xPos, height:yPos};
	/*} */
}
