/* ###########################################################################
#
# Copyright (c) Razoon AG, 2007
#
# Diese Software ist urheberrechtlich geschützt. 
# Es ist verboten, den Source Code zu entschlüsseln oder zu verändern,
# sowie die Software mehr als lizensiert zu nutzen. 
# Zuwiderhandlungen werden strafrechtlich verfolgt.
#
########################################################################### */


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

var dragObject  = null;
var objectOver  = null;
var mouseOffset = null;

var indexDrag;
var indexOver;

var aItems  = new Array();
var aItemsX = new Array();
var aItemsY = new Array();

var dragTmpX;
var dragTmpY;

var overTmpX;
var overTmpY;

var aSingleDragable = new Array();
var singleObject;

//-----------------------------------------------------------------------------
// make a single object dragable
//-----------------------------------------------------------------------------
function mkDragable(id){
  var object = null;

  if(object=document.getElementById(id)){
    aSingleDragable[object.id] = true;
    
    var objectPos = getPosition(object);
		
		object.style.position = "absolute";
    object.style.left = objectPos.x;
		object.style.top = objectPos.y;
		object.style.margin = 0;
  }
}

//-----------------------------------------------------------------------------
// initialize the container
//-----------------------------------------------------------------------------
function getItems(container){

	var box = document.getElementById(container);
	var itemPos = null;
	var counter = 0;
	
	scanChilds(box);
  
  function scanChilds(parent){
    if(parent.hasChildNodes()){
      var child = parent.childNodes;
      for(var i=0;i<child.length;i++){
        scanChilds(child[i]);
        if(!child[i].id)
          continue;
        var id = child[i].id.split("-");
        if(id[0]==container){
          itemPos = getPosition(child[i]);
      		aItems[counter]      = child[i];
      		aItemsX[child[i].id] = itemPos.x;
      		aItemsY[child[i].id] = itemPos.y;
      		counter++;
        }
      }
    }
  }
  
	for(var i=counter-1;i>=0;i--){
		aItems[i].style.position = "absolute";
		aItems[i].style.left = aItemsX[aItems[i].id];
		aItems[i].style.top = aItemsY[aItems[i].id];
		aItems[i].style.margin = 0;
	}	
}

//-----------------------------------------------------------------------------
// get mouse coords.
//-----------------------------------------------------------------------------
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 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};
}

//-----------------------------------------------------------------------------
// get absolute object position
//-----------------------------------------------------------------------------
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};
}

//-----------------------------------------------------------------------------
// event if mouse move
//-----------------------------------------------------------------------------
function mouseMove(ev){
	ev = ev || window.event;
	var mousePos = mouseCoords(ev);
	
	if(dragObject){
		
		var middleX = dragObject.offsetWidth/2+mousePos.x-mouseOffset.x;
		var middleY = dragObject.offsetHeight/2+mousePos.y-mouseOffset.y;
		
		var objectX = 0;
		var objectY = 0;
		
		for(var i=0;i<aItems.length;i++){
			
			if(aItems[i]!=dragObject){
				
				objectX = aItemsX[aItems[i].id];
				objectY = aItemsY[aItems[i].id];
				
				if(middleX>=objectX && middleX<=objectX+aItems[i].offsetWidth && 
					 middleY>=objectY && middleY<=objectY+aItems[i].offsetHeight){
					
				 	objectOver = aItems[i];
					reSort(i);
					objectOver = null;
				}
			}
		}
		
		dragObject.style.left = mousePos.x-mouseOffset.x;
		dragObject.style.top  = mousePos.y-mouseOffset.y;
		dragObject.focus();
	}
	//single object
	else if(singleObject){

    singleObject.style.left = mousePos.x-mouseOffset.x;
  	singleObject.style.top  = mousePos.y-mouseOffset.y;
  	singleObject.focus();
		
  }
  return true;
}

//-----------------------------------------------------------------------------
// event if mouse up
//-----------------------------------------------------------------------------
function mouseUp(){
	if(dragObject){
		
		dragObject.style.left = aItemsX[dragObject.id];
		dragObject.style.top  = aItemsY[dragObject.id];
		swapStyle(dragObject,false);
	}
	else if(singleObject)
	 swapStyle(singleObject,false);
	 
	singleObject = null;
	dragObject = null;
	objectOver = null;
	dragTmpX = null;
	dragTmpY = null;
	overTmpX = null;
	overTmpY = null;
	indexDrag = null;
	indexOver = null;
}

//-----------------------------------------------------------------------------
// event if mouse down
//-----------------------------------------------------------------------------
function mouseDown(ev){
	ev = ev || window.event;
	var object =  getObject(ev);

	if(aItemsX[object.id])
    dragObject = object;
  else if(aSingleDragable[object.id])
    singleObject = object;
  else if(object.tagName!="INPUT" && object.tagName!="TEXTAREA" &&
          object.tagName!="SELECT" && object.tagName!="IMG" &&
          object.tagName!="A"){
    var parent;
    while(parent=object.parentNode){
      if(aItemsX[parent.id]){
        dragObject = parent;
        break;
      }
      else if(aSingleDragable[parent.id]){
        singleObject = parent;
        break;
      }
      object = parent;
    }
	}

  if(dragObject){
		
		for(var i=0;i<aItems.length;i++){
			if(aItems[i]==object)
				indexDrag = i;			
		}	
		
		mouseOffset = getMouseOffset(dragObject, ev);
		swapStyle(dragObject,true);
		
		dragTmpX = aItemsX[dragObject.id];
		dragTmpY = aItemsY[dragObject.id];
	}
  else if(singleObject){
		mouseOffset = getMouseOffset(singleObject, ev);
		swapStyle(singleObject,true);
	}
	
	return true;
}

//-----------------------------------------------------------------------------
// get object where the mouse pointer is
//-----------------------------------------------------------------------------
function getObject(ev){
  ev = ev || window.event;
	
	var object;
	if(ev.target) 
		object = ev.target
	else if(ev.srcElement)
		object = ev.srcElement
	if(object.nodeType==3) // defeat Safari bug
		object = object.parentNode
	return object;
}

//-----------------------------------------------------------------------------
// swap the css style
//-----------------------------------------------------------------------------
function swapStyle(object,drag){
	if(drag){
		object.style.zIndex = 100;
		object.className = 'osModGL01Drag';
	}
	else{
		if(dragObject)
      object.style.zIndex = 1;
		object.className = '';
	}
	return true;
}

//-----------------------------------------------------------------------------
// sort the object array for the new order
//-----------------------------------------------------------------------------
function reSort(indexOver){
		
	overTmpX = aItemsX[aItems[indexOver].id];
	overTmpY = aItemsY[aItems[indexOver].id];
	
	var aTmp = new Array();
	for(var i=0;i<aItems.length;i++)
		aTmp[i] = aItems[i];	

	
	if(indexOver<indexDrag){
		for(var i=indexOver;i<indexDrag;i++){
			aItems[i].style.left = aItemsX[aItems[i+1].id];
			aItems[i].style.top  = aItemsY[aItems[i+1].id];
			aItemsX[aItems[i].id] = aItemsX[aItems[i+1].id];
			aItemsY[aItems[i].id] = aItemsY[aItems[i+1].id];
			
			if(i==indexOver)
				aTmp[i] = dragObject;
			else
				aTmp[i] = aItems[i-1];
		}
		aTmp[i] = aItems[i-1];
		aItemsX[dragObject.id] = overTmpX;
		aItemsY[dragObject.id] = overTmpY;
		aItems = aTmp;
	}
	else if(indexOver>indexDrag){
		for(var i=indexOver;i>indexDrag;i--){
			aItems[i].style.left = aItemsX[aItems[i-1].id];
			aItems[i].style.top  = aItemsY[aItems[i-1].id];
			aItemsX[aItems[i].id] = aItemsX[aItems[i-1].id];
			aItemsY[aItems[i].id] = aItemsY[aItems[i-1].id];
			
			if(i==indexOver)
				aTmp[i] = dragObject;
			else
				aTmp[i] = aItems[i+1];
			
		}
		aTmp[i] = aItems[i+1];
		aItemsX[dragObject.id] = overTmpX;
		aItemsY[dragObject.id] = overTmpY;
		aItems = aTmp;
	}

	indexDrag = indexOver;
	
	return true;
}

//-----------------------------------------------------------------------------
// get the new order
//-----------------------------------------------------------------------------
function getOrder(){
	
	var order = '';
	var id = '';
	for(var i=0;i<aItems.length;i++){
		id = aItems[i].id.split("-");
		order += id[1]+";";
	}	
	return order.substr(0,order.length-1);
}

