// 
function deleteSelection(e) {


    if (window.getSelection) {
        // Mozilla

        var selection = window.getSelection();
        if (selection.rangeCount > 0) {
//            window.getSelection().deleteFromDocument();
            window.getSelection().removeAllRanges();
        }
    } else if (document.selection) {
        // Internet Explorer
        var ranges = document.selection.createRangeCollection();
/*        for (var i = 0; i < ranges.length; i++) {
            ranges[i].text = "";
        }*/
    }
	if  (navigator.appName != 'Microsoft Internet Explorer')
	{
		if (e.preventDefault) {e.preventDefault()};
		e.returnValue=false;
		e.cancelBubble=true;
	}
	 
};

function DDGroup (objName,dragDiv,ddManager,borderStyle,highlightBorderStyle,borderSelection,paddingOnMouseover,dragMouseOffset)
{
	this.drag_list = Array();
	this.drop_list = Array();
	this.drag_border_list = Array();
	this.drop_border_list = Array();
	this.objName = objName;
	this.dragging = false;
	this.currentDragName="";
	this.prospectDropName="";
	this.prospectDropBorder="";
	this.dragDiv = dragDiv;
	obj = this;
	this.mouseMoveHandler = function (e) { ddManager.onmousemove(e,dragDiv); return false;}; //deleteSelection(e);
	this.mouseUpHandler = function (e) { ddManager.onmouseup(e,dragDiv);return false;}; //deleteSelection(e);
	this.borderStyle = borderStyle;
	this.highlightBorderStyle = highlightBorderStyle;
	this.ddManager = ddManager;
	this.borderSelection = borderSelection;
	if (typeof paddingOnMouseover == 'undefined' ) this.paddingOnMouseover = 2;
	else this.paddingOnMouseover = paddingOnMouseover;
	if (typeof dragMouseOffset == 'undefined' ) this.dragMouseOffset = 20;
	else this.dragMouseOffset = dragMouseOffset;

};

DDGroup.prototype.drag_list;
DDGroup.prototype.drop_list;
DDGroup.prototype.drag_border_list;
DDGroup.prototype.drop_border_list;
DDGroup.prototype.objName;
DDGroup.prototype.dragging;
DDGroup.prototype.currentDragName;
DDGroup.prototype.prospectDropName;
DDGroup.prototype.prospectDropBorder;
DDGroup.prototype.dragDiv;
DDGroup.prototype.mouseMoveHandler;
DDGroup.prototype.mouseUpHandler;
DDGroup.prototype.documentMouseMoveSwapHandler;
DDGroup.prototype.documentMouseUpSwapHandler;
DDGroup.prototype.ddManager;
DDGroup.prototype.borderStyle;
DDGroup.prototype.highlightBorderStyle;
DDGroup.prototype.borderSelection;
DDGroup.prototype.paddingOnMouseover;
DDGroup.prototype.dragMouseOffset;

DDGroup.prototype.searchList = function (arr,obj)
{
	for(var i=0; i<arr.length; i++) {
		if (arr[i] == obj) return true;
	}
	return false;
};

DDGroup.prototype.indexOf = function (arr,obj)
{
	for(var i=0; i<arr.length; i++) {
		if (arr[i] == obj) return i;
	}
	return -1;
};


DDGroup.prototype.findPosX = function (obj)
{
	var curleft = 0;
	if(obj.offsetParent)
	while(1)
	{
		curleft += obj.offsetLeft;
		if(!obj.offsetParent)
		break;
		obj = obj.offsetParent;
	}
	else if(obj.x)
	curleft += obj.x;
	return curleft;
};

DDGroup.prototype.findPosY = function (obj)
{
	var curtop = 0;
	if(obj.offsetParent)
	while(1)
	{
		curtop += obj.offsetTop;
		if(!obj.offsetParent)
		break;
		obj = obj.offsetParent;
	}
	else if(obj.y)
	curtop += obj.y;
	return curtop;
};


DDGroup.prototype.onBorder = function (e,div)
{

	if( !e )
	{
		if( window.event ) e = window.event; else return;
	}
	if( typeof( e.pageX ) == 'number' ) 
	{
		var xcoord = e.pageX;
		var ycoord = e.pageY;
	} 
	else if( typeof( e.clientX ) == 'number' ) 
	{
		var xcoord = event.clientX + document.body.scrollLeft;
		var ycoord = event.clientY + document.body.scrollTop
	}

	var x = xcoord - this.findPosX(div);
	var y = ycoord - this.findPosY(div);
	var bl = div.style.borderLeftWidth.replace("px","")*1;
	var br = div.style.borderRightWidth.replace("px","")*1;
	var bt = div.style.borderTopWidth.replace("px","")*1;
	var bb = div.style.borderBottomWidth.replace("px","")*1;
	var w = div.style.width.replace("px","")*1;
	var h = div.style.height.replace("px","")*1;

	var bl = this.paddingOnMouseover;
	var br = this.paddingOnMouseover;
	var bt = this.paddingOnMouseover;
	var bb = this.paddingOnMouseover;

	if ( (x >= 0 && x <= bl) || (x >= w-br && x <= w) || (y >= 0 && y <= bt) || (y >= h-bb && y <= h))
		return true;
	return false;
};

DDGroup.prototype.onObject = function (e,div)
{
	//deleteSelection(e);
	if( !e )
	{
		if( window.event ) e = window.event; else return;
	}
	if( typeof( e.pageX ) == 'number' ) 
	{
		var xcoord = e.pageX;
		var ycoord = e.pageY;
	} 
	else if( typeof( e.clientX ) == 'number' ) 
	{
		var xcoord = event.clientX + document.body.scrollLeft;
		var ycoord = event.clientY + document.body.scrollTop
	}

	var x = this.findPosX(div);
	var y = this.findPosY(div);
	var w = div.offsetWidth;
	var h = div.offsetHeight;
	if ( xcoord > x && xcoord < x+w && ycoord > y && ycoord < y+h )	return true;
	return false;
};


DDGroup.prototype.onmouseover = function (e,divName)
{
	div = document.getElementById(divName);
	var objectSelected = false;
	if (!this.dragging)
	{
		if ( this.borderSelection ) objectSelected = this.onBorder(e,div);
		else objectSelected = this.onObject(e,div);
	}
	else 
	{
		objectSelected=true;
	}
	if ( objectSelected)
	{
		document.getElementById(divName).style.border = this.borderStyle;
		document.getElementById(divName).style.cursor = "pointer";
		document.getElementById(divName).style.padding = this.paddingOnMouseover;

	}
	return false;
};

DDGroup.prototype.onmouseout = function (e,divName)
{
	i = this.indexOf(this.drag_list,divName);
	if ( i  >= 0 )
		document.getElementById(divName).style.border = this.drag_border_list[i];
	else
	{
		i = this.indexOf(this.drop_list,divName);
		if ( i  >= 0 )
			document.getElementById(divName).style.border =this.drop_border_list[i];
	}
	document.getElementById(divName).style.cursor = "";
	document.getElementById(divName).style.padding = 0;
	return false;
};

DDGroup.prototype.onmousedown = function (e,divName)
{
	//deleteSelection(e);
	if (!this.dragging)
	{
		div = document.getElementById(divName);
		var objectSelected = false;
		if ( this.borderSelection ) objectSelected = this.onBorder(e,div);
		else objectSelected = this.onObject(e,div);
		if (objectSelected)
		{
			this.dragging = true;
			this.documentMouseMoveSwapHandler = document.mousemove;
			this.documentMouseUpSwapHandler = document.mouseup;
			document.onmousemove = this.mouseMoveHandler;
			document.onmouseup = this.mouseUpHandler;
			document.getElementById(this.dragDiv).innerHTML = div.innerHTML;
//			document.getElementById(this.dragDiv).style.width = div.offsetWidth+'px';
//			document.getElementById(this.dragDiv).style.height = div.offsetHeight+'px';
			document.getElementById(this.dragDiv).style.top = this.findPosY(div)+'px';
			document.getElementById(this.dragDiv).style.left = this.findPosX(div)+'px';

			document.getElementById(this.dragDiv).style.border = this.highlightBorderStyle;
//			document.getElementById(this.dragDiv).style.border = div.style.border;
//			document.getElementById(this.dragDiv).style.borderColor = "#0000ff";
			document.getElementById(this.dragDiv).style.visibility = "visible";
			this.currentDragName=divName;
		}
	}
	return false;
};

DDGroup.prototype.clearAllExcept = function (divName)
{
	for(var i=0; i<this.drag_list.length; i++){
		if (this.drag_list[i] != divName) 
			document.getElementById(this.drag_list[i]).style.border = this.drag_border_list[i] ;
	}
	for(var i=0; i<this.drop_list.length; i++){
		if (this.drop_list[i] != divName) 
			document.getElementById(this.drop_list[i]).style.border = this.drop_border_list[i] ;
	}

};

DDGroup.prototype.onmousemove = function (e)
{
	if (this.dragging)
	{
		deleteSelection(e);
		if( !e )
		{
			if( window.event ) e = window.event; else return;
		}
		if( typeof( e.pageX ) == 'number' ) 
		{
			var xcoord = e.pageX;
			var ycoord = e.pageY;
		} 
		else if( typeof( e.clientX ) == 'number' ) 
		{
			var xcoord = event.clientX + document.body.scrollLeft;
			var ycoord = event.clientY + document.body.scrollTop
		}

		document.getElementById(this.dragDiv).style.top = (ycoord-this.dragMouseOffset)+'px';
		document.getElementById(this.dragDiv).style.left = (xcoord-this.dragMouseOffset)+'px';
		divName = this.getDropDiv(e);
		if (divName != this.prospectDropName)
		{
			if ( divName != "" ) 
			{
				this.prospectDropName = divName;
				this.prospectDropBorder = document.getElementById(divName).style.border;
				document.getElementById(divName).style.border = this.borderStyle;
				document.getElementById(divName).style.padding = this.paddingOnMouseover;
				this.clearAllExcept (divName);
			}
			else if ( this.prospectDropName != "" )
			{
				document.getElementById(this.prospectDropName).style.border = this.prospectDropBorder ;
				document.getElementById(this.prospectDropName).style.padding = 0;
				this.clearAllExcept ("");
				this.prospectDropName = "";
				this.prospectDropBorder = "";
			}
		}
		if ( ycoord-document.body.clientHeight >document.body.scrollTop && ycoord < document.body.offsetHeight)
			document.body.scrollTop = document.body.scrollTop +20;
		else if ( ycoord <= document.body.scrollTop  && ycoord > 0 )
			document.body.scrollTop = document.body.scrollTop -20;


		if ( xcoord-document.body.clientWidth >document.body.scrollLeft && xcoord < document.body.offsetWidth)
			document.body.scrollLeft = document.body.scrollLeft +20;
		else if ( xcoord <= document.body.scrollLeft  && xcoord > 0 )
			document.body.scrollLeft = document.body.scrollLeft -20;


//		else document.body.scrollTop = document.body.scrollTop -10;
	}
	return false;
};

DDGroup.prototype.getDropDiv = function (e)
{
	if( !e )
	{
		if( window.event ) e = window.event; else return;
	}
	if( typeof( e.pageX ) == 'number' ) 
	{
		var xcoord = e.pageX;
		var ycoord = e.pageY;
	} 
	else if( typeof( e.clientX ) == 'number' ) 
	{
		var xcoord = event.clientX + document.body.scrollLeft;
		var ycoord = event.clientY + document.body.scrollTop
	}

	for(var i=0; i<this.drop_list.length; i++) 
	{
		divName = this.drop_list[i];
		div = document.getElementById(divName);
		var x = this.findPosX(div);
		var y = this.findPosY(div);
		if ( x < xcoord && div.offsetWidth+x > xcoord &&  y < ycoord && div.offsetHeight+y > ycoord )
			return divName;
	}
	return "";
};
DDGroup.prototype.onmouseup = function (e)
{	if (this.dragging)
	{
		this.dragging = false;
		divName = this.getDropDiv(e);
		if ( divName != "" )
		{
			swap = document.getElementById(divName).innerHTML;
			document.getElementById(divName).innerHTML = document.getElementById(this.dragDiv).innerHTML ;

			document.getElementById(divName).style.width = '';
			document.getElementById(divName).style.height = '';


//			document.getElementById(divName).style.width = document.getElementById(this.dragDiv).style.width;
//			document.getElementById(divName).style.height =document.getElementById(this.dragDiv).style.height;
			document.getElementById(this.prospectDropName).style.border = this.prospectDropBorder ;
			document.getElementById(this.currentDragName).innerHTML = swap;
		}
		document.getElementById(this.dragDiv).innerHTML = "";
//		document.getElementById(this.dragDiv).style.width = '0px';
//		document.getElementById(this.dragDiv).style.height = '0px';
		document.getElementById(this.dragDiv).style.top = '0px';
		document.getElementById(this.dragDiv).style.left = '0px';
		document.getElementById(this.dragDiv).style.visibility = "hidden";
		document.mousemove = this.documentMouseMoveSwapHandler;
		document.mouseup = this.documentMouseUpSwapHandler;
	}
	return false;
};

DDGroup.prototype.addToDragList = function (divName)
{
	if ( this.searchList(this.drag_list,divName) ) alert("Div name already exists in the drag list"+divName);
	else
	{
		obj = this;
		var ddm = this.ddManager;
		var dragDiv = this.dragDiv;
		this.drag_list.push(divName);
		this.drag_border_list.push(document.getElementById(divName).style.border);
		document.getElementById(divName).onmousedown = function (e) {ddm.onmousedown(e,divName,dragDiv);};
		document.getElementById(divName).onmouseover = function (e) { ddm.onmouseover(e,divName,dragDiv); };
		document.getElementById(divName).onmouseout = function (e) { ddm.onmouseout(e,divName,dragDiv); };
//		document.getElementById(divName).onmousemove = function (e) {ddm.onmousemove(e); };
/*		document.getElementById(divName).onmouseup = function (e) { ddm.onmouseup(e,dragDiv); };
		document.getElementById(divName).onmousemove = document.mousemove;
		document.getElementById(divName).onmouseup = document.mouseup;*/
	}
};

DDGroup.prototype.addToDropList = function (divName)
{
	if ( this.searchList(this.drop_list,divName) ) alert("Div name already exists in the drop list");
	else
	{
		this.drop_list.push(divName);
		this.drop_border_list.push(document.getElementById(divName).style.border);
	}
};


function DDManager (borderSelection)
{
	this.ddGroupArray = new Array ();
	this.borderSelection = borderSelection;
};

DDManager.prototype.ddGroupArray;
DDManager.prototype.borderSelection;

DDManager.prototype.searchDDGroups = function (divName)
{
	for(var i=0; i<this.ddGroupArray.length; i++) {
		if (this.ddGroupArray[i].dragDiv == divName) return i;
	}
	return -1;
};


DDManager.prototype.addDDGroup= function (_ddGroupDivName,_borderStyle,_highlightBorderStyle,_borderSelection,_paddingOnMouseover,_dragMouseOffset)
{
	this.ddGroupArray.push(new DDGroup('xyz',_ddGroupDivName,this,_borderStyle,_highlightBorderStyle,_borderSelection,_paddingOnMouseover,_dragMouseOffset));
};


DDManager.prototype.reAddDDGroup= function (_ddGroupDivName,_borderStyle,_highlightBorderStyle,_borderSelection,_paddingOnMouseover,_dragMouseOffset)
{
	i = this.searchDDGroups(ddGroupDivName);
	if ( i == -1) this.addDDGroup (_ddGroupDivName,_borderStyle,_highlightBorderStyle,_borderSelection,_paddingOnMouseover,_dragMouseOffset);
	this.ddGroupArray[i] = new DDGroup('xyz',_ddGroupDivName,this,_borderStyle,_highlightBorderStyle,_borderSelection,_paddingOnMouseover,_dragMouseOffset);
};

DDManager.prototype.addToDragList= function (ddGroupDivName,divName)
{

	i = this.searchDDGroups(ddGroupDivName);
	if ( i >=0 )
		this.ddGroupArray[i].addToDragList(divName);
};


DDManager.prototype.addToDropList= function (ddGroupDivName,divName)
{
	i = this.searchDDGroups(ddGroupDivName);
	if ( i >=0 )
		this.ddGroupArray[i].addToDropList(divName);
};

DDManager.prototype.onmousedown=function (e,divName,dragDiv)
{
	i = this.searchDDGroups(dragDiv);
	this.ddGroupArray[i].onmousedown(e,divName);
};

DDManager.prototype.onmouseover=function (e,divName,dragDiv)
{
	i = this.searchDDGroups(dragDiv);
	this.ddGroupArray[i].onmouseover(e,divName);

};
DDManager.prototype.onmouseout=function (e,divName,dragDiv)
{
	i = this.searchDDGroups(dragDiv);
	this.ddGroupArray[i].onmouseout(e,divName);

};

DDManager.prototype.onmouseout=function (e,divName,dragDiv)
{
	i = this.searchDDGroups(dragDiv);
	this.ddGroupArray[i].onmouseout(e,divName);
};

DDManager.prototype.onmousemove=function (e,dragDiv)
{
	i = this.searchDDGroups(dragDiv);
	this.ddGroupArray[i].onmousemove(e);
};

DDManager.prototype.onmouseup=function (e,dragDiv)
{
	i = this.searchDDGroups(dragDiv);
	this.ddGroupArray[i].onmouseup(e);
};


DDManager.prototype.alertMsg=function ()
{
	alert ("This is kemosparc");
};

