var lat_rectangleBorderWidth = 2;	// Used to set correct size of the lat_rectangle with red dashed border
var lat_uselat_rectangle = true;

var lat_autoScrollSpeed = 4;	// lat_autoScroll speed	- Higher = faster

/* Don't change anything below here */


var dragableElementsLateralBox;
var lat_opera = navigator.appVersion.indexOf('lat_opera')>=0?true:false;
	
var lat_rectangleDiv = false;
var lat_insertionMarkerDiv = false;
var lat_mouse_x;
var lat_mouse_y;

var lat_el_x;
var lat_el_y;
	
var lat_dragDropTimer = -1;	// -1 = no drag, 0-9 = initialization in progress, 10 = dragging
var lat_dragObject = false;
var lat_dragObjectNextObj = false;
var lat_dragableObjectArray = new Array();
var lat_destinationObj = false;	
var lat_currentlat_dest = false;
var lat_allowlat_rectangleMove = true;
var lat_insertionMarkerLine;
var lat_dragDropMoveLayer;
var lat_autoScrollActive = false;
var lat_documentHeight = false;
var lat_documentScrollHeight = false;
var lat_dragableAreaWidth = false;

function lat_getTopPos(inputObj)
{		
  var returnValue = inputObj.offsetTop;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetTop;
  }
  return returnValue;
}

function lat_getLeftPos(inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetLeft;
  }
  return returnValue;
}
	
function lat_cancelSelectionEvent()
{
	if(lat_dragDropTimer>=0)return false;
	return true;
}

function lat_getObjectFromPosition(x,y)
{
	var height = lat_dragObject.offsetHeight;
	var width = lat_dragObject.offsetWidth;
	var indexCurrentlat_dragObject=-5;
	for(var no=0;no<lat_dragableObjectArray.length;no++){			
		lat_ref = lat_dragableObjectArray[no];			
		if(lat_ref['obj']==lat_dragObject)indexCurrentlat_dragObject=no;
		if(no<lat_dragableObjectArray.length-1 && lat_dragableObjectArray[no+1]['obj']==lat_dragObject)indexCurrentlat_dragObject=no+1;
		if(lat_ref['obj']==lat_dragObject && lat_uselat_rectangle)continue;	
		if(x > lat_ref['left'] && y>lat_ref['top'] && x<(lat_ref['left'] + (lat_ref['width']/2)) && y<(lat_ref['top'] + lat_ref['height'])){
			if(!lat_uselat_rectangle && lat_dragableObjectArray[no]['obj']==lat_dragObject)return 'self';
			if(indexCurrentlat_dragObject==(no-1))return 'self';
			return Array(lat_dragableObjectArray[no],no);
		}
		
		if(x > (lat_ref['left'] + (lat_ref['width']/2)) && y>lat_ref['top'] && x<(lat_ref['left'] + lat_ref['width']) && y<(lat_ref['top'] + lat_ref['height'])){
			if(no<lat_dragableObjectArray.length-1){
				if(no==indexCurrentlat_dragObject || (no==indexCurrentlat_dragObject-1)){
					return 'self';
				}
				if(lat_dragableObjectArray[no]['obj']!=lat_dragObject){
					return Array(lat_dragableObjectArray[no+1],no+1);
				}else{
					if(!lat_uselat_rectangle)return 'self';
					if(no<lat_dragableObjectArray.length-2)return Array(lat_dragableObjectArray[no+2],no+2);
				}
			}else{
				if(lat_dragableObjectArray[lat_dragableObjectArray.length-1]['obj']!=lat_dragObject)return 'append';	
				
			}
		}
		if(no<lat_dragableObjectArray.length-1){
			if(x > (lat_ref['left'] + lat_ref['width']) && y>lat_ref['top'] && y<(lat_ref['top'] + lat_ref['height']) && y<lat_dragableObjectArray[no+1]['top']){
				return Array(lat_dragableObjectArray[no+1],no+1);
			}
		}
	}	
	if(x>lat_ref['left'] && y>(lat_ref['top'] + lat_ref['height']))return 'append';				
	return false;	
}
	
function lat_initDrag(e)
{
	if(document.all)e = event;
	lat_mouse_x = e.clientX;
	lat_mouse_y = e.clientY;

	criaEventAndThis(e);
	if(source.parentNode.id!='')
		lat_dragObject = source.parentNode.id.replace("header", "").replace("div", "");//this
	else
		lat_dragObject = source.parentNode.parentNode.id.replace("header", "").replace("div", "")

	lat_dragObject = document.getElementById("div"+lat_dragObject);
	
	if(!lat_documentScrollHeight)lat_documentScrollHeight = document.documentElement.scrollHeight + 100;
	lat_el_x = lat_getLeftPos(lat_dragObject)/1;
	lat_el_y = lat_getTopPos(lat_dragObject)/1;
	
	
	if(lat_uselat_rectangle){
		lat_rectangleDiv.style.width = lat_dragObject.clientWidth - (lat_rectangleBorderWidth*2)-10 +'px';
		lat_rectangleDiv.style.height = lat_dragObject.clientHeight - (lat_rectangleBorderWidth*2)-10 +'px';
		lat_rectangleDiv.className = lat_dragObject.className;
	}else{
		lat_insertionMarkerLine.style.width = '6px';
	}
	lat_dragDropTimer = 0;
	lat_dragObjectNextObj = false;
	if(this.nextSibling){
		lat_dragObjectNextObj = this.nextSibling;
		if(!lat_dragObjectNextObj.tagName)lat_dragObjectNextObj = lat_dragObjectNextObj.nextSibling;
	}
	lat_initDragTimer();
	return false;
}

function lat_initDragTimer(){
	if(lat_dragDropTimer>=0 && lat_dragDropTimer<10){
		lat_dragDropTimer++;
		setTimeout('lat_initDragTimer()',5);
		return;
	}
	if(lat_dragDropTimer==10){
		
		if(lat_uselat_rectangle){
			lat_dragObject.style.opacity = 0.5;
			lat_dragObject.style.filter = 'alpha(opacity=50)';
			lat_dragObject.style.cursor = 'default';
		}else{
			var newObject = lat_dragObject.cloneNode(true);
			lat_dragDropMoveLayer.appendChild(newObject);
		}
	}
}

function lat_autoScroll(direction,yPos){
	//
}

function lat_moveDragableElement(e)
{
	if(document.all)e = event;
		if(lat_dragDropTimer<10)return;
	if(!lat_allowlat_rectangleMove)return false;
	
	
	if(e.clientY<50 || e.clientY>(lat_documentHeight-50)){
		if(e.clientY<50 && !lat_autoScrollActive){
			lat_autoScrollActive = true;
			lat_autoScroll((lat_autoScrollSpeed*-1),e.clientY);
		}
		
		if(e.clientY>(lat_documentHeight-50) && document.documentElement.scrollHeight<=lat_documentScrollHeight && !lat_autoScrollActive){
			lat_autoScrollActive = true;
			lat_autoScroll(lat_autoScrollSpeed,e.clientY);
		}
	}else{
		lat_autoScrollActive = false;
	}
	if(lat_uselat_rectangle){			
		if(lat_dragObject.style.position!='absolute'){
			lat_dragObject.style.position = 'absolute';
			setTimeout('lat_repositionlat_dragObjectArray()',50);
		}
	}		

	if(lat_uselat_rectangle){
		lat_rectangleDiv.style.display='block';
	}else{
		lat_insertionMarkerDiv.style.display='block';	
		lat_dragDropMoveLayer.style.display='block';	
	}
	
	if(lat_uselat_rectangle){
		lat_dragObject.style.left = (lat_el_x - lat_mouse_x + e.clientX + Math.max(document.body.scrollLeft,document.documentElement.scrollLeft)) + 'px';
		lat_dragObject.style.top = (lat_el_y - lat_mouse_y + e.clientY) + 'px';
	}else{
		lat_dragDropMoveLayer.style.left = (lat_el_x - lat_mouse_x + e.clientX + Math.max(document.body.scrollLeft,document.documentElement.scrollLeft)) + 'px';
		lat_dragDropMoveLayer.style.top = (lat_el_y - lat_mouse_y + e.clientY) + 'px';
	}
	lat_dest = lat_getObjectFromPosition(e.clientX+Math.max(document.body.scrollLeft,document.documentElement.scrollLeft),e.clientY+Math.max(document.body.scrollTop,document.documentElement.scrollTop));
		
	if(lat_dest!==false && lat_dest!='append' && lat_dest!='self'){
		lat_destinationObj = lat_dest[0]; 
		
		if(lat_currentlat_dest!==lat_destinationObj){
			lat_currentlat_dest = lat_destinationObj;
			if(lat_uselat_rectangle){
				lat_destinationObj['obj'].parentNode.insertBefore(lat_rectangleDiv,lat_destinationObj['obj']);
				lat_repositionlat_dragObjectArray();
			}else{
				if(lat_dest[1]>0 && (lat_dragableObjectArray[lat_dest[1]-1]['obj'].offsetLeft + lat_dragableObjectArray[lat_dest[1]-1]['width'] + lat_dragObject.offsetWidth) < lat_dragableAreaWidth){
					lat_insertionMarkerDiv.style.left = (lat_getLeftPos(lat_dragableObjectArray[lat_dest[1]-1]['obj']) + lat_dragableObjectArray[lat_dest[1]-1]['width'] + 2) + 'px';
					lat_insertionMarkerDiv.style.top = (lat_getTopPos(lat_dragableObjectArray[lat_dest[1]-1]['obj']) - 2) + 'px';
					lat_insertionMarkerLine.style.height = lat_dragableObjectArray[lat_dest[1]-1]['height'] + 'px';
				}else{					
					lat_insertionMarkerDiv.style.left = (lat_getLeftPos(lat_destinationObj['obj']) - 8) + 'px';
					lat_insertionMarkerDiv.style.top = (lat_getTopPos(lat_destinationObj['obj']) - 2) + 'px';
					lat_insertionMarkerLine.style.height = lat_destinationObj['height'] + 'px';
				}
				
				
			}
		}
	}
		
	if(lat_dest=='self' || !lat_dest){
		lat_insertionMarkerDiv.style.display='none';
		lat_destinationObj = lat_dest;	
	}
	
	if(lat_dest=='append'){
		if(lat_uselat_rectangle){
			dragableElementsLateralBox.appendChild(lat_rectangleDiv);
			dragableElementsLateralBox.appendChild(document.getElementById('clear'));
		}else{
			var tmplat_ref = lat_dragableObjectArray[lat_dragableObjectArray.length-1];
			lat_insertionMarkerDiv.style.left = (lat_getLeftPos(tmplat_ref['obj']) + 2) + tmplat_ref['width'] + 'px';
			lat_insertionMarkerDiv.style.top = (lat_getTopPos(tmplat_ref['obj']) - 2) + 'px';
			lat_insertionMarkerLine.style.height = tmplat_ref['height'] + 'px';	
		}
		lat_destinationObj = lat_dest;
		lat_repositionlat_dragObjectArray();
	}	
	
	if(lat_uselat_rectangle && !lat_dest){
		lat_destinationObj = lat_currentlat_dest;
		}
	
	lat_allowlat_rectangleMove = false;
	setTimeout('lat_allowlat_rectangleMove=true',50);
}

function lat_stop_dragDropElement()
{
	habilitaSalvar();
	lat_dragDropTimer = -1;
	
	if(lat_destinationObj && lat_destinationObj!='append' && lat_destinationObj!='self'){
		lat_destinationObj['obj'].parentNode.insertBefore(lat_dragObject,lat_destinationObj['obj']);
	}
	if(lat_destinationObj=='append'){
		dragableElementsLateralBox.appendChild(lat_dragObject);
		dragableElementsLateralBox.appendChild(document.getElementById('clear'));
	}

	if(lat_dragObject && lat_uselat_rectangle){
		lat_dragObject.style.opacity = 1;
		lat_dragObject.style.filter = 'alpha(opacity=100)';
		lat_dragObject.style.cursor = 'default';//move
		lat_dragObject.style.position='static';
	}
	lat_rectangleDiv.style.display='none';
	lat_insertionMarkerDiv.style.display='none';
	lat_dragObject = false;
	lat_currentlat_dest = false;
	lat_resetObjectArray();
	lat_destinationObj = false;
	if(lat_dragDropMoveLayer){
		lat_dragDropMoveLayer.style.display='none';
		lat_dragDropMoveLayer.innerHTML='';
	}
	lat_autoScrollActive = false;
	lat_documentScrollHeight = document.documentElement.scrollHeight + 100;
}

function lat_cancelEvent()
{
	return false;
}

function lat_repositionlat_dragObjectArray()
{
	for(var no=0;no<lat_dragableObjectArray.length;no++){
		lat_ref = lat_dragableObjectArray[no];
		lat_ref['left'] = lat_getLeftPos(lat_ref['obj']);
		lat_ref['top'] = lat_getTopPos(lat_ref['obj']);			
	}	
	lat_documentScrollHeight = document.documentElement.scrollHeight + 100;
	lat_documentHeight = document.documentElement.clientHeight;
}

function lat_resetObjectArray()
{
	lat_dragableObjectArray.length=0;
	var lat_subDivs = dragableElementsLateralBox.getElementsByTagName('*');
	var lat_countEl = 0;
		for(var no=0;no<lat_subDivs.length;no++){
		var attr = lat_subDivs[no].getAttribute('dragableBox');
		if(lat_opera)attr = lat_subDivs[no].dragableBox;
		if(attr=='true'){
			var index = lat_dragableObjectArray.length;
			lat_dragableObjectArray[index] = new Array();
			lat_ref = lat_dragableObjectArray[index];
			lat_ref['obj'] = lat_subDivs[no];
			lat_ref['width'] = lat_subDivs[no].offsetWidth;
			lat_ref['height'] = lat_subDivs[no].offsetHeight;
			lat_ref['left'] = lat_getLeftPos(lat_subDivs[no]);
			lat_ref['top'] = lat_getTopPos(lat_subDivs[no]);
			lat_ref['index'] = lat_countEl;
			lat_countEl++;
		}
	}	
}

function lat_initDragableElements()
{
	dragableElementsLateralBox = document.getElementById('dragableElementsLateralBox');
	lat_insertionMarkerDiv = document.getElementById('insertionMarkerLateral');
	lat_insertionMarkerLine = document.getElementById('lat_insertionMarkerLine');
	lat_dragableAreaWidth = dragableElementsLateralBox.offsetWidth;
	
	if(!lat_uselat_rectangle){
		lat_dragDropMoveLayer = document.createElement('DIV');
		lat_dragDropMoveLayer.id = 'lat_dragDropMoveLayer';		
		document.body.appendChild(lat_dragDropMoveLayer);	
	}
	
	var lat_subDivs = dragableElementsLateralBox.getElementsByTagName('*');
	var lat_countEl = 0;
	for(var no=0;no<lat_subDivs.length;no++){
		var attr = lat_subDivs[no].getAttribute('dragableBox');
		if(lat_opera)attr = lat_subDivs[no].dragableBox;
		if(attr=='true'){
			lat_subDivs[no].style.cursor='default';	//move
			lat_subDivs[no].onmousedown = lat_initDrag;
			
			var index = lat_dragableObjectArray.length;
			lat_dragableObjectArray[index] = new Array();
			lat_ref = lat_dragableObjectArray[index];
			lat_ref['obj'] = lat_subDivs[no];
			lat_ref['width'] = lat_subDivs[no].offsetWidth;
			lat_ref['height'] = lat_subDivs[no].offsetHeight;
			lat_ref['left'] = lat_getLeftPos(lat_subDivs[no]);
			lat_ref['top'] = lat_getTopPos(lat_subDivs[no]);
			lat_ref['index'] = lat_countEl;
			lat_countEl++;
		}
	}
	
	/* Creating rectangel indicating where item will be dropped */
	lat_rectangleDiv = document.createElement('DIV');
	lat_rectangleDiv.id='lat_rectangle';
	lat_rectangleDiv.style.display='none';
	dragableElementsLateralBox.appendChild(lat_rectangleDiv);
	
	dragableElementsLateralBox.onmousemove = lat_moveDragableElement;
	dragableElementsLateralBox.onmouseup = lat_stop_dragDropElement;
	dragableElementsLateralBox.onselectstart = lat_cancelSelectionEvent;
	dragableElementsLateralBox.ondragstart = lat_cancelEvent;
	dragableElementsLateralBox.onresize = lat_repositionlat_dragObjectArray; 
	
	lat_documentHeight = document.documentElement.clientHeight;
}



