/************************************************************************************************************
(C) www.dhtmlgoodies.com, January 2006

This is a script from www.dhtmlgoodies.com. You will find this and a lot of other scripts at our website.	

Version:	1.0	: January 16th - 2006
			1.1 : January 31th - 2006 - Added cookie support - remember rss sources
			1.2 : July 13th - 2006 - Fixed a problem in the createRSSBoxesFromCookie function
			
Terms of use:
You are free to use this script as long as the copyright message is kept intact. However, you may not
redistribute, sell or repost it without our permission.

Thank you!

www.dhtmlgoodies.com
Alf Magne Kalleland

************************************************************************************************************/		

/* USER VARIABLES */

var numberOfColumns = 1;	// Number of columns for dragable boxes
var src_rightImage = 'skin/dragbox/arrow_right.gif';
var src_downImage = 'skin/dragbox/arrow_down.gif';
var src_smallRightArrow = 'skin/dragbox/small_arrow.gif';

var transparencyWhenDragging = false;
var txt_editLink = 'Edit';
var txt_editLink_stop = 'End edit';
var autoScrollSpeed = 10;	// Autoscroll speed	- Higher = faster	
var dragObjectBorderWidth = 1;	// Border size of your RSS boxes - used to determine width of dotted rectangle

// Constraints
var verticalOnly = true;
var horizontalOnly = false;

var nameOfCookie = 'dragable_boxes';	// Name of cookie

/* END USER VARIABLES */

var columnParentBox;
var dragableBoxesObj;

var ajaxObjects = new Array();

var boxIndex = 0;	
var autoScrollActive = false;
var dragableBoxesArray = new Array();

var dragDropCounter = -1;
var dragObject = false;
var dragObjectNextSibling = false;
var dragObjectParent = false;
var destinationObj = false;

var mouse_x;
var mouse_y;

var el_x;
var el_y;	

var rectangleDiv;
var okToMove = true;

var documentHeight = false;
var documentScrollHeight = false;
var dragableAreaWidth = false;
	
var opera = navigator.userAgent.toLowerCase().indexOf('opera')>=0?true:false;

var staticObjectArray = new Array();

function Get_Cookie(name) { 
   var start = document.cookie.indexOf(name+"="); 
   var len = start+name.length+1; 
   if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 
   if (start == -1) return null; 
   var end = document.cookie.indexOf(";",len); 
   if (end == -1) end = document.cookie.length; 
   return unescape(document.cookie.substring(len,end)); 
} 
// This function has been slightly modified
function Set_Cookie(name,value,expires,path,domain,secure) { 
	expires = expires * 60*60*24*1000;
	var today = new Date();
	var expires_date = new Date( today.getTime() + (expires) );
    var cookieString = name + "=" +escape(value) + 
       ( (expires) ? ";expires=" + expires_date.toGMTString() : "") + 
       ( (path) ? ";path=" + path : "") + 
       ( (domain) ? ";domain=" + domain : "") + 
       ( (secure) ? ";secure" : ""); 
    document.cookie = cookieString; 
} 

function autoScroll(direction,yPos)
{
	if(document.documentElement.scrollHeight>documentScrollHeight && direction>0)return;
	if(opera)return;
	window.scrollBy(0,direction);
	if(!dragObject)return;
	
	/*if(direction<0){
		if(document.documentElement.scrollTop>0){
			dragObject.style.top = (el_y - mouse_y + yPos + document.documentElement.scrollTop) + 'px';		
		}else{
			autoScrollActive = false;
		}
	}else{
		if(yPos>(documentHeight-50)){	
			dragObject.style.top = (el_y - mouse_y + yPos + document.documentElement.scrollTop) + 'px';			
		}else{
			autoScrollActive = false;
		}
	}*/
	if(autoScrollActive)setTimeout('autoScroll('+direction+',' + yPos + ')',5);
}

function initDragDropBox(e)
{
	dragDropCounter = 1;
	if(document.all)e = event;
	
	if (e.target) source = e.target;
		else if (e.srcElement) source = e.srcElement;
		if (source.nodeType == 3) // defeat Safari bug
			source = source.parentNode;
	
	if(source.tagName.toLowerCase()=='img' || source.tagName.toLowerCase()=='a' || source.tagName.toLowerCase()=='input' || source.tagName.toLowerCase()=='td' || source.tagName.toLowerCase()=='tr' || source.tagName.toLowerCase()=='table')return;

	mouse_x = e.clientX;
	mouse_y = e.clientY;	
	var numericId = this.id.replace(/[^0-9]/g,'');
	el_x = getLeftPos(this.parentNode.parentNode)/1;
	el_y = getTopPos(this.parentNode.parentNode)/1 - document.documentElement.scrollTop;
		
	dragObject = this.parentNode.parentNode;
	
	try{
	documentScrollHeight = document.documentElement.scrollHeight + 100 + dragObject.offsetHeight;
	
	if(dragObject.nextSibling){
		dragObjectNextSibling = dragObject.nextSibling;
		if(dragObjectNextSibling.tagName!='DIV')dragObjectNextSibling = dragObjectNextSibling.nextSibling;
	}
	dragObjectParent = dragableBoxesArray[numericId]['parentObj'];
		
	dragDropCounter = 0;
	initDragDropBoxTimer();	
	}
	catch(e)
	{
		/*alert(e.message);*/
	}
	return false;
}

function initDragDropBoxTimer()
{
	if(dragDropCounter>=0 && dragDropCounter<10){
		dragDropCounter++;
		setTimeout('initDragDropBoxTimer()',10);
		return;
	}
	if(dragDropCounter==10){
		mouseoutBoxHeader(false,dragObject);
	}
}

function moveDragableElement(e){
	if(document.all)e = event;
	if(dragDropCounter<10)return;
	
	if(document.all && e.button!=1 && !opera){
		stop_dragDropElement();
		return;
	}
		
	if(document.body!=dragObject.parentNode){
		dragObject.style.width = (dragObject.offsetWidth - (dragObjectBorderWidth*2)) + 'px';
		dragObject.style.position = 'absolute';	
		dragObject.style.textAlign = 'left';
		if(transparencyWhenDragging){	
			dragObject.style.filter = 'alpha(opacity=70)';
			dragObject.style.opacity = '0.7';
		}	
		dragObject.parentNode.insertBefore(rectangleDiv,dragObject);
		rectangleDiv.style.display='block';
		document.body.appendChild(dragObject);

		rectangleDiv.style.width = dragObject.style.width;
		rectangleDiv.style.height = (dragObject.offsetHeight - (dragObjectBorderWidth*2)) + 'px'; 
		
	}
	
	if(e.clientY<50 || e.clientY>(documentHeight-50)){
		if(e.clientY<50 && !autoScrollActive){
			autoScrollActive = true;
			autoScroll((autoScrollSpeed*-1),e.clientY);
		}
		
		if(e.clientY>(documentHeight-50) && document.documentElement.scrollHeight<=documentScrollHeight && !autoScrollActive){
			autoScrollActive = true;
			autoScroll(autoScrollSpeed,e.clientY);
		}
	}else{
		autoScrollActive = false;
	}		

	
	var leftPos = e.clientX;
	var topPos = e.clientY + document.documentElement.scrollTop;
	
	if(!verticalOnly){dragObject.style.left = (e.clientX - mouse_x + el_x) + 'px';}else{dragObject.style.left = el_x + 'px';}
	if(!horizontalOnly){dragObject.style.top = (el_y - mouse_y + e.clientY + document.documentElement.scrollTop) + 'px';}else{dragObject.style.top = el_y + 'px';}
	
	
	if(!okToMove)return;
	okToMove = false;

	destinationObj = false;	
	rectangleDiv.style.display = 'none'; 
	
	var objFound = false;
	var tmpParentArray = new Array();
	
	if(!objFound){
		try{
		for(var no=1;no<dragableBoxesArray.length;no++){
			if(dragableBoxesArray[no]['obj']==dragObject)continue;
			tmpParentArray[dragableBoxesArray[no]['obj'].parentNode.id] = true;
			if(!objFound){
				var tmpX = getLeftPos(dragableBoxesArray[no]['obj']);
				var tmpY = getTopPos(dragableBoxesArray[no]['obj']) - document.body.scrollTop;

				if(leftPos>tmpX && leftPos<(tmpX + dragableBoxesArray[no]['obj'].offsetWidth) && topPos>(tmpY-20) && topPos<(tmpY + (dragableBoxesArray[no]['obj'].offsetHeight/2))){
					destinationObj = dragableBoxesArray[no]['obj'];
					destinationObj.parentNode.insertBefore(rectangleDiv,dragableBoxesArray[no]['obj']);
					rectangleDiv.style.display = 'block';
					objFound = true;
					break;
					
				}
				
				if(leftPos>tmpX && leftPos<(tmpX + dragableBoxesArray[no]['obj'].offsetWidth) && topPos>=(tmpY + (dragableBoxesArray[no]['obj'].offsetHeight/2)) && topPos<(tmpY + dragableBoxesArray[no]['obj'].offsetHeight)){
					objFound = true;
					if(dragableBoxesArray[no]['obj'].nextSibling){
						
						destinationObj = dragableBoxesArray[no]['obj'].nextSibling;
						if(!destinationObj.tagName)destinationObj = destinationObj.nextSibling;
						if(destinationObj!=rectangleDiv)destinationObj.parentNode.insertBefore(rectangleDiv,destinationObj);
					}else{
						destinationObj = dragableBoxesArray[no]['obj'].parentNode;
						dragableBoxesArray[no]['obj'].parentNode.appendChild(rectangleDiv);
					}
					rectangleDiv.style.display = 'block';
					break;					
				}
				
				
				if(!dragableBoxesArray[no]['obj'].nextSibling && leftPos>tmpX && leftPos<(tmpX + dragableBoxesArray[no]['obj'].offsetWidth)
				&& topPos>topPos>(tmpY + (dragableBoxesArray[no]['obj'].offsetHeight))){
					destinationObj = dragableBoxesArray[no]['obj'].parentNode;
					dragableBoxesArray[no]['obj'].parentNode.appendChild(rectangleDiv);	
					rectangleDiv.style.display = 'block';	
					objFound = true;				
					
				}
			}
			
		}
		}
		catch(e) {/*alert("error1:"+e.message);*/}
	
	}

	if(!objFound){
		try{
		for(var no=1;no<=numberOfColumns;no++){
			if(!objFound){
				var obj = document.getElementById('dragableBoxesColumn' + no);
				
					var left = getLeftPos(obj)/1;
				
					var width = obj.offsetWidth;
					if(leftPos>left && leftPos<(left+width)){
						destinationObj = obj;
						obj.appendChild(rectangleDiv);
						rectangleDiv.style.display='block';
						objFound=true;		
					}
				
			}
		}
		}
		catch(e) {/*alert("error2:"+e.message);*/}
	}

	setTimeout('okToMove=true',5);

}

function stop_dragDropElement()
{
	if(dragDropCounter<10){
		dragDropCounter = -1
		return;
	}
	dragDropCounter = -1;
	if(transparencyWhenDragging){
		dragObject.style.filter = null;
		dragObject.style.opacity = null;
	}		
	dragObject.style.position = 'static';
	dragObject.style.width = null;
	var numericId = dragObject.id.replace(/[^0-9]/g,'');

	if(destinationObj && destinationObj.id!=dragObject.id){
		
		if(destinationObj.id.indexOf('dragableBoxesColumn')>=0){
			destinationObj.appendChild(dragObject);
			dragableBoxesArray[numericId]['parentObj'] = destinationObj;
		}else{
			destinationObj.parentNode.insertBefore(dragObject,destinationObj);
			dragableBoxesArray[numericId]['parentObj'] = destinationObj.parentNode;
		}


						
	}else{
		if(dragObjectNextSibling){
			dragObjectParent.insertBefore(dragObject,dragObjectNextSibling);	
		}else{
			dragObjectParent.appendChild(dragObject);
		}				
		
		
	}
	
	autoScrollActive = false;
	rectangleDiv.style.display = 'none'; 
	dragObject = false;
	dragObjectNextSibling = false;
	destinationObj = false;

	//documentHeight = document.documentElement.clientHeight;	
	documentHeight = document.body.clientHeight;
	saveCookies();
}

function getTopPos(inputObj)
{		
  var returnValue = inputObj.offsetTop;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetTop;
  }
  return returnValue;
}
	
function getLeftPos(inputObj)
{
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='HTML')returnValue += inputObj.offsetLeft;
  }
  return returnValue;
}

/* Cookie */
function saveCookies()
{
	cookieCounter = 0;
	var tmpUrlArray = new Array();

	var items = getElementsByClassName(document,"dragableBox");
	if(items.length==0)return false;
	
	var tmpItemArray = new Array();
	for(var i=0; i<items.length; i++){
		var boxIndex = items[i].id.replace(/[^0-9]/g,'');
		if(item.id!='rectangleDiv'){
			tmpItemArray[i] = boxIndex;
			/*alert(i + " : " + boxIndex);*/
		}	
	}
	
	var columnIndex = 1;
	
	for(var no2=0;no2<tmpItemArray.length;no2++){
		var boxIndex = tmpItemArray[no2];
		var heightOfBox = dragableBoxesArray[boxIndex]['heightOfBox'];
		var uniqueIdentifier = dragableBoxesArray[boxIndex]['uniqueIdentifier'];
		var state = dragableBoxesArray[boxIndex]['boxState'];
		/*var name = dragableBoxesArray[boxIndex]['name'];*/
		var inner = getElementsByClassName(items[no2],"dragableBoxInner");
		var name = inner[0].id;	// Name

		try{Set_Cookie(nameOfCookie + cookieCounter,columnIndex + '#;#' + heightOfBox + '#;#' + uniqueIdentifier + '#;#' + state + '#;#' + name ,60000);}catch(e){}
		cookieCounter++;
		
	}

}

function loadFromCookie() 
{ 
	var tmpArray = new Array(); 
	var cookieValue = Get_Cookie(nameOfCookie + '0'); 
	cookieCounter=0; 
	while(cookieValue && cookieValue!='') 
    { 
        var items = cookieValue.split('#;#'); 
     	var index = items[0]; 
     	if(!items[0])index = items[2]; 
     	if(items.length>1 && !tmpArray[index]) 
        { 
        	var state = items[3];
        	var name = items[4];
        	
        	var inner = document.getElementById(name);
            var numericId = inner.parentNode.id.replace(/[^0-9]/g,'');
            
			var obj = document.getElementById('dragableBoxContent' + numericId);
			
			/*obj.style.display = state ==0?'none':'block';*/
			var image = document.getElementById('dragableBoxExpand' + numericId);
			image.src = state==0?src_downImage:src_rightImage;
			
			dragableBoxesArray[numericId]['boxState'] = state;
     	}
     	cookieCounter++;
     	var cookieValue = Get_Cookie(nameOfCookie + cookieCounter); 
     	if(cookieCounter>10){return false;}
  	}	
}


function mouseoverBoxHeader()
{
	if(dragDropCounter==10)return;
	var id = this.id.replace(/[^0-9]/g,'');
	document.getElementById('dragableBoxExpand' + id).style.visibility = 'visible';		
	/*document.getElementById('dragableBoxCloseLink' + id).style.visibility = 'visible';*/
	
}

function mouseoutBoxHeader(e,obj)
{
	if(!obj)obj=this;
	
	var id = obj.id.replace(/[^0-9]/g,'');
	document.getElementById('dragableBoxExpand' + id).style.visibility = 'hidden';		
	document.getElementById('dragableBoxCloseLink' + id).style.visibility = 'hidden';		
	
}

function showHideBoxContent(e,inputObj)
{
	if(document.all)e = event;
	if(!inputObj)inputObj=this;
	
	var numericId = inputObj.id.replace(/[^0-9]/g,'');
	var obj = document.getElementById('dragableBoxContent' + numericId);
	
	obj.style.display = inputObj.src.indexOf(src_rightImage)>=0?'none':'block';
	inputObj.src = inputObj.src.indexOf(src_rightImage)>=0?src_downImage:src_rightImage
	
	dragableBoxesArray[numericId]['boxState'] = obj.style.display=='block'?1:0;
	saveCookies();
	setTimeout('dragDropCounter=-5',5);
}

function mouseover_CloseButton()
{
	this.className = 'closeButton_over';	
	setTimeout('dragDropCounter=-5',5);
}

function highlightCloseButton()
{
	this.className = 'closeButton_over';	
}

function mouseout_CloseButton()
{
	this.className = 'closeButton';	
}

function closeDragableBox(e,inputObj)
{
	if(!inputObj)inputObj = this;
	var numericId = inputObj.id.replace(/[^0-9]/g,'');
	document.getElementById('dragableBox' + numericId).style.display='none';	
}

function cancelSelectionEvent(e)
{
	if(document.all)e = event;
	
	if (e.target) source = e.target;
		else if (e.srcElement) source = e.srcElement;
		if (source.nodeType == 3) // defeat Safari bug
			source = source.parentNode;
	if(source.tagName.toLowerCase()=='input')return true;
					
	if(dragDropCounter>=0)return false; else return true;	
	
}

function cancelEvent()
{
	return false;
}

function initEvents()
{
	document.body.onmousemove = moveDragableElement;
	document.body.onmouseup = stop_dragDropElement;
	document.body.onselectstart = cancelSelectionEvent;

	document.body.ondragstart = cancelEvent;	
	
	documentHeight = document.body.clientHeight;
	
}

function createHelpObjects()
{
	/* Creating rectangle div */
	rectangleDiv = document.createElement('DIV');
	rectangleDiv.id='rectangleDiv';
	rectangleDiv.style.display='none';
	document.body.appendChild(rectangleDiv);
	
	 
}

/* --------------------------------------------------------------------------- */
//Get all the elements of the given classname of the given tag.
function getElementsByClassName(parent,classname,tag) {
	if(!tag) tag = "*";
	if(parent=="") parent = document;
	var anchs =  parent.getElementsByTagName(tag);
	var total_anchs = anchs.length;
	var regexp = new RegExp('\\b' + classname + '\\b');
	var class_items = new Array()

	for(var i=0;i<total_anchs;i++) { //Go thru all the links seaching for the class name
		var this_item = anchs[i];
		if(regexp.test(this_item.className)) {
			class_items.push(this_item);
		}
	}
	return class_items;
}

function initDragableBoxesScript()
{
	try
	{
		createHelpObjects();
		initEvents();
		var boxlist = getElementsByClassName(document, "dragableBoxHeader");
		for(var i=0; i< boxlist.length; i++)
		{
			if(boxlist[i] != "undefined"){
				boxIndex ++;
				var numericId = boxlist[i].id.replace(/[^0-9]/g,'');
				
				boxlist[i].onmouseover = mouseoverBoxHeader;
				boxlist[i].onmouseout = mouseoutBoxHeader;
				boxlist[i].onmousedown = initDragDropBox;
				boxlist[i].style.cursor = 'move';
				
				/*var closeLink = document.createElement('A');
				closeLink.style.cssText = 'float:right';
				closeLink.style.styleFloat = 'right';
				closeLink.id = 'dragableBoxCloseLink' + numericId;
				closeLink.innerHTML = 'x';
				closeLink.className = 'closeButton';
				closeLink.onmouseover = mouseover_CloseButton;
				closeLink.onmouseout = mouseout_CloseButton;
				closeLink.style.cursor = 'pointer';
				closeLink.style.visibility = 'hidden';
				closeLink.onmousedown = closeDragableBox;
				boxlist[i].appendChild(closeLink);*/
				var closeLink = document.getElementById('dragableBoxCloseLink' + numericId);
				closeLink.onmouseover = mouseover_CloseButton;
				closeLink.onmouseout = mouseout_CloseButton;
				closeLink.style.cursor = 'pointer';
				closeLink.onmousedown = closeDragableBox;

				/*var image = document.createElement('IMG');
				image.id = 'dragableBoxExpand' + numericId;
				image.style.cssText = 'float:right';
				image.style.styleFloat = 'right';
				image.src = src_rightImage;
				image.style.visibility = 'hidden';	
				image.style.cursor = 'pointer';
				image.onmousedown = showHideBoxContent;	
				boxlist[i].appendChild(image);*/
				var image = document.getElementById('dragableBoxExpand' + numericId);

				image.style.cursor = 'pointer';
				image.onmousedown = showHideBoxContent;
				
				var content = document.getElementById('dragableBoxContent' + numericId);
				var state = content.style.display == "none" ? 0 : 1;
				image.src = state==0?src_downImage:src_rightImage;
			
				var dragbox = boxlist[i].parentNode.parentNode;
				
				dragableBoxesArray[boxIndex] = new Array();
				dragableBoxesArray[boxIndex]['obj'] = dragbox;
				dragableBoxesArray[boxIndex]['parentObj'] = dragbox.parentNode;
				dragableBoxesArray[boxIndex]['uniqueIdentifier'] = numericId;
				dragableBoxesArray[boxIndex]['heightOfBox'] = "0";
				dragableBoxesArray[boxIndex]['boxState'] = state;	// Expanded
				
				var inner = getElementsByClassName(dragbox,"dragableBoxInner");
				dragableBoxesArray[boxIndex]['name'] = inner[0].id;	// Expanded
				
				staticObjectArray[numericId] = boxIndex;
			}
		}
		/*loadFromCookie();*/
	}
	catch(e)
	{
		/*alert(e.message);*/
	}
}

window.onload = initDragableBoxesScript;
