function MoveManager(){	
	var _self 				= this;	 
	var _move				= true;
	var _itemMenuDiv	  		= document.getElementById('itemMenu');
	var _objectsToMove		= new Object();
	var _objectStartPoints  = new Object();
	
	document.onkeydown = function(e){
		if (!e) var e = window.event;
    	return moveElementWithKeyPad(e);
	}                

	this.setCurrentElement = function(element){
		var id = element.properties['id'];
		var ddMenu = element.properties['type']=="easyMenu" && element.properties['ddMenu'];
		clearAllObjects(); 
		if(id == 'website' || id == 'mainPage' || ddMenu ||id=="mainPage_footer")
			_move = false;
		else{
			_objectsToMove[id] = element;
			_move = true;
		}
	}
	function clearAllObjects(){
		for(eachObject in _objectsToMove){
			_objectsToMove[eachObject] = null;
			delete _objectsToMove[eachObject];
			_objectStartPoints[eachObject] = null;
			delete _objectStartPoints[eachObject];
		}			
	}
	// removes children so that only parent is being moved and not all of the elements
	function removeChildren(){
		for(eachElement in _objectsToMove)
		{
			if(_objectsToMove[eachElement].properties['type'] == "menu")
				removeMenu(_objectsToMove[eachElement])
			
			removeElement(_objectsToMove[eachElement])
						
		}
	}
	function removeElement(element){
		if(element != undefined && element != null){
			var children = element.properties['children'];
			if(children != undefined){
				for(eachChild in children){
					var id = children[eachChild].properties['id'];
					if(_objectsToMove[id] != undefined) delete _objectsToMove[id];
					if(children[eachChild].properties['type'] == "menu") removeMenu(children[eachChild]);
					removeElement(children[eachChild]);
				}
			}
		}
	}
	
	function removeMenu(menu){
		var menuHeadings = menu.properties["headings"];
		for (eachHeading in menuHeadings){
			removeElement(menuHeadings[eachHeading])
			removeElement(menuHeadings[eachHeading]['hover'])
			removeElement(menuHeadings[eachHeading]['normal'])
		}
	}
	
	function getAllSelectedElements(){
		if(_elementsManager.anyElementsSelected()){
				clearAllObjects();
				var selectedElements = _elementsManager.getSelectedElements();
				for(eachElement in selectedElements){
					_objectsToMove[selectedElements[eachElement].properties['id']] = selectedElements[eachElement];
				}
				removeChildren();
			}
	}
	this.dragObject = function(e){
		if(_move){
			document.body.onmousedown = null;
			_pm.setStyle(_itemMenuDiv,"opacity:30;");
			if (!e) var e = window.event;
			getAllSelectedElements();
			_resizeManager.hideResizeDiv();
			_itemMenu.hideSubMenus();
			_itemMenu.hideBottomMenu();
			//itemmenu
			var imLeft = parseInt(e.clientX) - parseInt(_itemMenuDiv.style.left);
			var imTop = parseInt(e.clientY) - parseInt(_itemMenuDiv.style.top);
			var bodyScrollTop = parseInt(document.body.scrollTop);
			
			// set start points
			for(eachObject in _objectsToMove){
				var positions = new Object();
				positions['left'] =  parseInt(e.clientX) - parseInt(_objectsToMove[eachObject].properties["holderDiv"].style.left);
				positions['top'] =  parseInt(e.clientY) - parseInt(_objectsToMove[eachObject].properties["holderDiv"].style.top);
				_objectStartPoints[eachObject] = positions;
			}
			
			_siteSettings.setRulerOffset(e);//get the ruler markers to point to top/left of current element
			
			document.onmousedown = null;
			document.onmousemove = function(e){
				if (!e) var e = window.event;
				e.cancelBubble = true;
				var scrollTop = 0;
				if(bodyScrollTop != parseInt(document.body.scrollTop))scrollTop = parseInt(document.body.scrollTop) - bodyScrollTop;
				_itemMenuDiv.style.left = parseInt(e.clientX) - imLeft;
				_itemMenuDiv.style.top  = parseInt(e.clientY) - imTop + scrollTop;
				
				for(eachObject in _objectsToMove){
					_objectsToMove[eachObject].properties["holderDiv"].style.left = parseInt(e.clientX) - _objectStartPoints[eachObject]['left'] ;
					_objectsToMove[eachObject].properties["holderDiv"].style.top  = parseInt(e.clientY) - _objectStartPoints[eachObject]['top'] + scrollTop;
				}
				return false;
			}

			document.onmouseup = function(){
				document.onmousemove = null;
				document.onmouseup	 = null;
				_pm.setStyle(_itemMenuDiv,"opacity:100;");
				_itemMenuDiv.removeAttribute("alpha");
				_itemMenuDiv.getAttribute("style")["filter"] = ""; //this is a fix for IE. otherwise it crops the overflow.
				_elementsManager.displayToolkit(); //to set the current elementPosition
				_elementsManager.displayResizeDiv(); 
				_elementsManager.displaySubMenus();
				_siteSettings.removeRulerOffset();
				_siteSettings.checkPageOverflow(_objectsToMove);
				for(eachObject in _objectsToMove){
					if(_objectsToMove[eachObject].endMove!=undefined)_objectsToMove[eachObject].endMove(); 
				}
			}
		}
			
	}
	
		
	this.moveMenu = function(e, menu){
		if (!e) var e = window.event;
		e.cancelBubble = true;
		var menuLeft = parseInt(e.clientX) - parseInt(menu.style.left);
		var menuTop = parseInt(e.clientY) - parseInt(menu.style.top);
			
		document.onmousemove = function(e){
			if (!e) var e = window.event;					
			menu.style.left = parseInt(e.clientX) - menuLeft;
			menu.style.top  = parseInt(e.clientY) - menuTop;
			return false;
		}
		document.onmouseup = function(){
			document.onmousemove = null;
			document.onmouseup	 = null;
		}
			
	}
	this.moveElementHorizontally = function(distance){	
		getAllSelectedElements();
	 	for(eachObject in _objectsToMove)
			_objectsToMove[eachObject].properties['holderDiv'].style.left = parseInt(_objectsToMove[eachObject].properties['holderDiv'].style.left) + distance;
		
		_elementsManager.displayResizeDiv();//move resize bars
		_itemMenuDiv.style.left = parseInt(_itemMenuDiv.style.left) + distance;
		_elementsManager.displayToolkit(); //to set the current elementPosition				
	}	
	
	this.moveElementVertically = function(distance){
		getAllSelectedElements();
	 	for(eachObject in _objectsToMove)
			_objectsToMove[eachObject].properties['holderDiv'].style.top = parseInt(_objectsToMove[eachObject].properties['holderDiv'].style.top) + distance;
		
		_elementsManager.displayResizeDiv();//move resize bars
	 	_itemMenuDiv.style.top  = parseInt(_itemMenuDiv.style.top) + distance;
	 	_elementsManager.displayToolkit(); //to set the current elementPosition
	}

	this.turnOnKeyPad = function(){
		document.onkeydown = function(e){
			if (!e) var e = window.event;
	    	return moveElementWithKeyPad(e);
		}               
	}
	this.turnOffKeyPad = function(){
		document.onkeydown = null;
	}
		
	function moveElementWithKeyPad(evt){
		var ctrl = evt.ctrlKey; 
		var distance = 1;
		if(evt.shiftKey) distance = 20;	
		if(evt.keyCode == "37"){ _self.moveElementHorizontally(-1 * distance);return false; }
  		else if(evt.keyCode == "38"){ _self.moveElementVertically(-1 * distance);return false;}
  		else if(evt.keyCode == "39"){ _self.moveElementHorizontally(distance);return false;}
  		else if(evt.keyCode == "40") {_self.moveElementVertically(distance);return false;}
  		else if(evt.keyCode == "46") {_itemMenu.displayDeleteWarning()}
  		else if(evt.keyCode == "88"){if(ctrl)_elementsManager.copyElement()}
		return true;            
	}
	this.moveElementsMenu =function(){
		if (document.all){
		var elementsMenu = document.getElementById("elementsMenu");
		var header = document.getElementById("header");
		var toolkit_holder = document.getElementById("toolkit_holder_div");
		var toolkit= document.getElementById("toolkit_div");
		var bodyScrollTop = parseInt(document.body.scrollTop);
		var bodyScrollLeft = parseInt(document.body.scrollLeft);
		header.style.position = "absolute";
		elementsMenu.style.position = "absolute";
		toolkit_holder.style.position = "absolute";
		toolkit.style.position = "absolute";
		header.style.top = bodyScrollTop;
		elementsMenu.style.top = bodyScrollTop +84;
		toolkit_holder.style.top = bodyScrollTop +80;		
		header.style.left = bodyScrollLeft;
		elementsMenu.style.left = bodyScrollLeft+1;
		window.status = parseInt(toolkit_holder.offsetWidth);
		toolkit.style.left = bodyScrollLeft + parseInt(toolkit_holder.offsetWidth) - 200;
		} 
	}
}

function DragSelect(){
	var _self = this;
	var _dragSelectDiv = document.getElementById("dragSelect_div");
	var _mainPage = document.getElementById("mainPage");
	var _allElements = null;
	var _selectedElements = new Object();
	var _dragSelectOn = true;
	
	this.startDragSelect = function(e){
		if(_dragSelectOn) // used to turn the drag select on and off cause it cause so many problems with mouse clicks
			startDragSelect(e)
	}
	
	function startDragSelect(e){
	if (!e) var e = window.event;
		var startTop =  parseInt(e.clientY) + parseInt(document.body.scrollTop);
		var startLeft =  parseInt(e.clientX) + parseInt(document.body.scrollLeft);
		_dragSelectDiv.style.top = startTop;
		_dragSelectDiv.style.left = startLeft;
		_dragSelectDiv.style.height = 0;
		_dragSelectDiv.style.width = 0;
		_dragSelectDiv.style.border = "0px dashed blue";
		_dragSelectDiv.style.display = "block";
		_allElements = _elementsManager.getElementsTable(); 
		delete _selectedElements;
		_selectedElements = new Object();
			
		document.onmousemove = function(e)
		{
			var scrollOffsetTop = parseInt(document.body.scrollTop);
			var scrollOffsetLeft = parseInt(document.body.scrollLeft);
			_dragSelectDiv.style.border = "1px solid blue";
			if (!e) var e = window.event;
			if(parseInt(e.clientX  + scrollOffsetLeft) - startLeft > 0 )
				_dragSelectDiv.style.width = parseInt(e.clientX  + scrollOffsetLeft) - startLeft;
			else{
				_dragSelectDiv.style.left = parseInt(e.clientX  + scrollOffsetLeft);
				_dragSelectDiv.style.width = Math.abs(parseInt(e.clientX  + scrollOffsetLeft) - startLeft);
			}
			if(parseInt(e.clientY + scrollOffsetTop) - startTop >0 )
				_dragSelectDiv.style.height  = parseInt(e.clientY + scrollOffsetTop) - startTop;
			else{
				_dragSelectDiv.style.top = parseInt(e.clientY + scrollOffsetTop);
				_dragSelectDiv.style.height = Math.abs(parseInt(e.clientY + scrollOffsetTop) - startTop);
			}
			determineIntersection()	
			return false;				
		}
		
		document.onmouseup = function()
			{
				_dragSelectDiv.style.display = "none";
				document.onmousemove = null;
				document.onmouseup	 = null;
				//delete _selectedElements;
				//_selectedElements = new Object();
			}
		
		return false;
	}
	
	function determineIntersection()
	{	
		for(eachElement in _allElements)
		{
			var element = _allElements[eachElement];
			var counter = 0;
			
			if(elementIntersects(element) && _selectedElements[element.properties["id"]] == undefined && element.properties["dragSelect"] != "none"){
				_elementsManager.selectElementObj(element,true)
				_selectedElements[element.properties["id"]] = element;			
			}
			
			if(!elementIntersects(element) && _selectedElements[element.properties["id"]] != undefined){
				_elementsManager.selectElementObj(element,true)
				_selectedElements[element.properties["id"]] = null;
				delete _selectedElements[element.properties["id"]];
			}
			
		}	
	}
	function elementIntersects(element)
	{
		var pageTop = parseInt(_mainPage.style.top);
		var pageLeft = parseInt(_mainPage.style.left);
		var id = element.properties["id"];
		var type = element.properties["type"];  
		if(id != "mainPage" && id != "website"){ 
			var eHeight = parseInt(element.properties['holderDiv'].offsetHeight);
			var eWidth = parseInt(element.properties['holderDiv'].offsetWidth);
			
			var absPosition = _objectManager.getAbsolutePosition(element);
			var eTop = absPosition['top'] + pageTop
			var eLeft = absPosition['left'] + pageLeft;
			
			var dHeight = parseInt(_dragSelectDiv.style.height);
			var dWidth = parseInt(_dragSelectDiv.style.width);
			var dTop = parseInt(_dragSelectDiv.style.top);
			var dLeft = parseInt(_dragSelectDiv.style.left);
			//testBox.innerHTML = "id: " + id + "<br>; eTop: " + eTop + " <=  dtop: " + dTop + "<br> dtop <= eBottom: " + (eTop + eHeight);
			
			if(eTop >= dTop && eLeft >= dLeft && eLeft+eWidth <= dLeft + dWidth && eTop+eHeight <= dTop+dHeight) return true;
			if((eTop <= dTop && dTop <= (eTop + eHeight)) && (dLeft <= eLeft && eLeft <= (dLeft+dWidth)))return true; //eleft vs dtop;
			if((eTop <= dTop && dTop <= (eTop + eHeight)) && (dLeft <= (eLeft + eWidth) && (eLeft + eWidth) <= (dLeft+dWidth)))return true; //eright vs dtop;
			if((eTop <= (dTop + dHeight) && (dTop + dHeight) <= (eTop + eHeight)) && (dLeft <= eLeft && eLeft <= (dLeft+dWidth)))return true; //eleft vs dbottom;
			if((eTop <= (dTop + dHeight) && (dTop + dHeight) <= (eTop + eHeight)) && (dLeft <= (eLeft + eWidth) && (eLeft + eWidth) <= (dLeft+dWidth)))return true; //eright vs dtop;			
			if((dTop <= eTop && eTop <= dTop + dHeight) && (eLeft <= dLeft && dLeft <= eLeft + eWidth))return true;
			if((dTop <= (eTop + eHeight) && (eTop +eHeight) <= dTop + dHeight) && (eLeft <= dLeft && dLeft <= eLeft + eWidth))return true;
			if((dTop <= eTop && eTop <= dTop + dHeight) && (eLeft <= (dLeft + dWidth) && (dLeft + dWidth) <= eLeft + eWidth))return true;
			if((dTop <= (eTop+eHeight) && (eTop + eHeight) <= dTop + dHeight) && (eLeft <= (dLeft + dWidth) && (dLeft + dWidth) <= eLeft + eWidth))return true;
		}
		return false;
	}
	
	this.dragSelectOn = function(value){_dragSelectOn = value;}
	
	this.isElementSelected = function(element){
		if(_selectedElements[element.properties["id"]] == undefined) return false;
		else return true;
	}
}

