//var dragColor
//var hitColor
var bDragMode = false;
var objDragItem;
var arrHitTest = new Array();
var iArrayHit = false;
var RowCount = null;
var mustRefresh = false;
var dataGrid
var dragClassName = '';
var dragClassNameActive = '';
var hasFooter = false
var hasHeader = false
var sortOnChange = false
var objFormName = '';

var FF = (navigator.userAgent.indexOf("Firefox")!=-1)?true:false

function initDragDrop(el) 
{
	var i;
   
    objDragItem = document.getElementById("dwzDragDiv")
    
    if(!objDragItem){
        alert("dwzDragDiv not present - The behavior will not be applyed")
		return
    }
  	objDragItem.style.position = "absolute"
	//objDragItem.style.display = "none"
	
	dataGrid = document.getElementById(el)
            
	if (!dataGrid) return;
	
	RowCount = dataGrid.rows.length;
	if(hasFooter){
	    RowCount -= 1
	}
	
	if(RowCount==1){return}
	
	for(i=0; i < RowCount ; i++)
	{
		arrHitTest[i] = new Array();
	}
	  
	var cx=0;
	var cy=0;
	var c;	
	
	if(hasHeader){
		start = 1
	}else{
		start = 0	
	}
	
	for (i=start; i<RowCount ; i++) {
	    	    
		var clickCell
		clickCell = dataGrid.rows[i].getElementsByTagName("TD")[0];
		clickCell.selectIndex = i;
		clickCell.setAttribute("selectIndex",i)
	
		c = clickCell.offsetParent;
		
		if (cx == 0 && cy == 0)
		{
			while (c.offsetParent != null) {
		              cy += c.offsetTop;
		              cx += c.offsetLeft;
		              c = c.offsetParent;
			}
		}

		arrHitTest[i][0] = cx + clickCell.offsetLeft;
		arrHitTest[i][1] = cy + clickCell.offsetTop;
		arrHitTest[i][2] = clickCell;
		arrHitTest[i][3] = cy + clickCell.offsetTop + clickCell.clientHeight;

		if(FF){
			clickCell.addEventListener("mousedown",onMouseDown,false)
		}else{
			clickCell.attachEvent("onmousedown",onMouseDown);			
		}
		
		var cells = dataGrid.rows[i].getElementsByTagName("TD")
		for(x=0;x<cells.length;x++){
			cells[x].setAttribute("unselectable","on")
		}
		
	} 
	
	if(FF){
		document.addEventListener("mousemove",onMouseMove,false);
		document.addEventListener("mouseup",onMouseUp,false);
	}else{
		dataGrid.document.attachEvent("onmousemove",onMouseMove);
		dataGrid.document.attachEvent("onmouseup",onMouseUp);
	}
	
  	if (arrHitTest[0][0] == arrHitTest[0][3])
		mustRefresh = true;
}




function InitHeader()
{
	var cx=0;
	var cy=0;
	var c;
	if(hasHeader){
		start = 1
	}else{
		start = 0	
	}
	for (i=start; i<RowCount ; i++) {
		var clickCell
		clickCell = dataGrid.rows[i].getElementsByTagName("TD")[0];
		clickCell.setAttribute("selectIndex",i)
		clickCell.selectIndex = i;
		
		c = clickCell.offsetParent;

		if (cx == 0 && cy == 0)
		{
			while (c.offsetParent != null) {
		              cy += c.offsetTop;
		              cx += c.offsetLeft;
		              c = c.offsetParent;
			}
		}

		arrHitTest[i][0] = cx + clickCell.offsetLeft;
		arrHitTest[i][1] = cy + clickCell.offsetTop;
		arrHitTest[i][2] = clickCell;
		arrHitTest[i][3] = cy + clickCell.offsetTop + clickCell.clientHeight;

		if(FF){
			clickCell.addEventListener("mousedown",onMouseDown,true)
		}else{
			clickCell.attachEvent("onmousedown",onMouseDown);			
		}
		
		var cells = dataGrid.rows[i].getElementsByTagName("TD")
		for(x=0;x<cells.length;x++){
			cells[x].setAttribute("unselectable","on")
		}
		
	} 
}



function ChangeHeader(iChange)
{
	for(var y = 1; y < arrHitTest.length; y++){
	   if (arrHitTest[y][2].className == dragClassNameActive)
			arrHitTest[y][2].className = dragClassName;
	}

	if(iChange == "-1") return; 
    
	arrHitTest[iChange][2].className = dragClassNameActive;
}

function onMouseUp(e)
{
		
	if(!bDragMode)	return;
	bDragMode = false;
    
	var iSelected = objDragItem.selectIndex;
	
	if(FF){
		objDragItem.style.display = "none"
	}else{
	    objDragItem.style.display = "none"
	}
	
	ChangeHeader(-1);

    if(FF){
        e.stopPropagation()
        e.preventDefault()
    }else{
	    e.cancelBubble = false;
	    e.returnValue = false;
	}
	
	if( (iArrayHit - 1) < 0 || iSelected < 0) return;	// default faliure

	// iSelected is the 0-based index of the column being moved
	// (iArrayHit-1) is the 0-based index of the column being replaced
	CopyRow(iSelected, (iArrayHit - 1) );

	// Reset our variables
	iSelected = 0;
	iArrayHit = -1;
	
}

function createRowContent(objRow){
	var cells = objRow.getElementsByTagName("TD")
	var src = objRow
	while (src.tagName != "TABLE") {
	    if(FF){
	        src = src.parentNode;
	    }else{
		    src = src.parentElement;
		}
	}
	retStr = "<table "
	if(src && src.className){
	    retStr += " class='" + src.className + "'"
	}
	if(src && src.cellSpacing){
	    retStr += " cellspacing='" + src.cellSpacing + "'"
	}
	if(src && src.cellPadding){
	    retStr += " cellpadding='" + src.cellPadding + "'"
	}
	if(src && src.align){
	    retStr += " align='" + src.align + "'"
	}
	if(src && src.border){
	    retStr += " border='" + src.border + "'"
	}
	retStr += "><tr>"
	for(x=1;x<cells.length;x++){
	    retStr += "<td "
	    if(cells[x].align && cells[x].align!=''){
	        retStr += " align='" + cells[x].align + "' "
	    }
	    if(cells[x].style.backgroundcolor && cells[x].style.backgroundcolor!=''){
	        retStr += " bgcolor='" + cells[x].style.backgroundcolor + "' "
	    }
	    if(cells[x].width && cells[x].width!=''){
	        retStr += " width='" + cells[x].width + "' "
	    }else if(cells[x].clientWidth){
	        retStr += " width='" + cells[x].clientWidth + "' "
	    } 
		
		if(cells[x].className && cells[x].className!=''){
	        retStr += " class='" + cells[x].className + "' "
	    }
		
	    retStr += ">"
	    retStr += cells[x].innerHTML
		retStr += "</td>"
	}
	retStr += "</tr></table>"
	return retStr
}

function onMouseDown(e)
{

	// If the grid is contained in an invisible panel (other DHTML stuff)
	// the initialization step must be repeated to take real values
	if( mustRefresh)	{
		InitHeader();
		mustRefresh = false;
	}
    
	bDragMode 	= true;
	if(FF){
		src = e.target.parentNode
	}else{
		src = e.srcElement;
	}	
	
	while (src.tagName != "TR") {
	    if(FF){
	        src = src.parentNode;
	    }else{
		    src = src.parentElement;
		}
	}
	
	var pos = getPosition(e)
	
	objDragItem.style.top = pos.top.toString() + 'px';
	objDragItem.style.left = pos.left.toString() + 'px';
	
	var rowContent = createRowContent(src)
	var rowHeight = src.clientHeight
	var rowWidth = src.clientWidth - src.getElementsByTagName("TD")[0].clientWidth
	objDragItem.innerHTML = rowContent;
	objDragItem.style.height = rowHeight
	if(!FF){
		objDragItem.style.width = rowWidth
	}
	
	if(FF){
		objDragItem.selectIndex = src.getElementsByTagName("TD")[0].selectIndex
	}else{
		objDragItem.selectIndex	= src.getElementsByTagName("TD")[0].selectIndex //c.selectIndex;
	}
	
	objDragItem.style.display = "block";	 		
		
	if(FF){
        e.stopPropagation()
        e.preventDefault()
    }else{
	    e.cancelBubble = false;
	    e.returnValue = false;
	}
}

function getPosition(e){
	
	intTop = e.clientY
    intLeft = e.clientX

	var x=0
	var y=0
	var c = objDragItem
	if(FF){
		x = window.pageXOffset
		y = window.pageYOffset 
	}else{
		while(c){
			if(c.scrollTop){				
				y += c.scrollTop				
			}
			if(c.scrollLeft){				
				x += c.scrollLeft
			}
			c = c.offsetParent
		}
	}
	intTop += y
	intLeft += x
	
	intTop -= 5
	intLeft -= 0
	
	var pos = new Object()
	pos.left = intLeft
	pos.top = intTop
	return pos
	
}

function onMouseMove(e)
{
	
	if(!bDragMode || !objDragItem) return;	
	
	var pos = getPosition(e)
	
	objDragItem.style.top = pos.top.toString() + 'px';
	objDragItem.style.left = pos.left.toString() + 'px';
	
	if(objDragItem.style.display == "none" || objDragItem.style.display == "") 
		objDragItem.style.display = "block";

	iArrayHit = CheckHit(intTop , intLeft , e);
    
	
    if(FF){
        e.stopPropagation()
        e.preventDefault()
    }else{
	    e.cancelBubble = false;
	    e.returnValue = false;
	}
	
}

function CheckHit(x,y,e)
{

	for(var i=0; i < RowCount; i++)
	{
		if( (x) > (arrHitTest[i][1]) && (x) < (arrHitTest[i][3] )) 
		{
			ChangeHeader(i);
			return i + 1;
		}
	}
	return -1;
}


function CopyRow(from, to)
{	
	if(from == to) return;

	var origfrom = from;
	var origto = to;
	var iDiff = 0;
    var arTmp = new Array()
    
	if( from > to )
	{
	    cells = dataGrid.rows[from].getElementsByTagName("TD")
    
        for(x=0;x<cells.length;x++){
            arTmp[x] = cells[x].innerHTML
        }
        for(x=from-1;x>=to;x--){
            cellsFrom = dataGrid.rows[x].getElementsByTagName("TD")
            cellsTo = dataGrid.rows[x+1].getElementsByTagName("TD")
            for(i=0;i<cellsFrom.length;i++){
                cellsTo[i].innerHTML = cellsFrom[i].innerHTML
            }
        }
        cells = dataGrid.rows[to].getElementsByTagName("TD")
        for(x=0;x<cells.length;x++){
            cells[x].innerHTML = arTmp[x]
        }      
	}
	else
	{
        
        cells = dataGrid.rows[from].getElementsByTagName("TD")
        for(x=0;x<cells.length;x++){
            arTmp[x] = cells[x].innerHTML
        }
        
		 for(x=from+1;x<=to;x++){
            cellsFrom = dataGrid.rows[x].getElementsByTagName("TD")
            cellsTo = dataGrid.rows[x-1].getElementsByTagName("TD")
            for(i=0;i<cellsFrom.length;i++){
                cellsTo[i].innerHTML = cellsFrom[i].innerHTML
            }
        }
		
		cells = dataGrid.rows[to].getElementsByTagName("TD")
        for(x=0;x<cells.length;x++){
            cells[x].innerHTML = arTmp[x]
        }  
		
	}

	InitHeader();
	
	el = document.getElementById("dwzDragSortOrderChanged")
	if(el){
	    el.value = "1"
	}
	
	if(sortOnChange){
		if(objFormName!=''){			
			objForm = document.getElementById(objFormName)
			if(objForm){
				objForm.submit()
			}
		}
	}
}


