function ObjectManager(){
	var _self = this;
	this.createLink = function(link,target, element){		
		var heading = _self.getParent(element, 'heading')
		
		if(heading != null){
			heading.properties['link'] = link;
			heading.properties['linkTarget'] = target;
		}else if(element.properties.type=="easyMenu"){
			element.setLink(link,target);
		}else{
			element.properties['link'] = link;
			element.properties['linkTarget'] = target;
		}	
	}
	
	this.getParent = function(element, parentName){
		if(element == undefined || element == null) return null
		else {
			var parentElement = _elementsManager.getElementFromElementsTable(element.properties['parentId'])
			
			var foundParent = false;
			var elementsParent = null;
			if(parentElement != undefined){			
				while (!foundParent && parentElement != undefined ){
					if(parentElement.properties.type == parentName){
						foundParent = true;
						elementsParent = parentElement;
					}
					parentElement = _elementsManager.getElementFromElementsTable(parentElement.properties['parentId']);
				}
			}
			return elementsParent;
		}
	}
	
	this.getLink = function(element,option){
		var returnValue = "";
		if(element.properties.type=="easyMenu"){	returnValue = element.getLink(option);	}
		else if(element.properties['link'] != "" ){
			if(option == "link") returnValue = element.properties['link'];
			else returnValue = element.properties['linkTarget'];		
		}
		else
		{	var heading = _self.getParent(element, 'heading')
			if(heading != null){
				if(option == "link") returnValue = heading.properties['link'];
				else returnValue = heading.properties['linkTarget'];
			}	
		}
		return returnValue;
	}
	
	this.setCursorForChildren = function(element,cursor){		
		element.setCursor(cursor)
		var children = element.properties['children'];
		if(children != undefined)
		{
			for(eachChild in children)
			{
				_self.setCursor(children[eachChild], cursor);
			}	
		}		 	
	}
	
	this.setCursor = function(element, cursor){
		var heading = _self.getParent(element, 'heading')		
		if(heading != null){
			heading.properties['cursor'] = cursor;			
		}			
		else
			element.setCursor(cursor);	
	}
	
	this.getCursor = function(element){
		var heading = _self.getParent(element, 'heading')		
		if(heading != null)
			return heading.properties['cursor'];
		else
			return element.properties['cursor'];
	}
	
	this.startResize = function(mouseEvent,direction){
		mouseEvent.cancelBubble = true;
		var element = _elementsManager.getCurrentElement();
		if(_elementsManager.isElementSelected(element.properties['id']))
			if(mouseEvent.ctrlKey) _elementsManager.selectElementById(element.properties['id'],true);
			else startResize(mouseEvent,direction)
		else{
			_elementsManager.selectElementById(element.properties['id'], mouseEvent.ctrlKey)
			startResize(mouseEvent,direction)
		}
	}
	function startResize(mouseEvent,direction){
		var element = _elementsManager.getCurrentElement();
		if(element != undefined){
			element.startResize();
			var menu = _objectManager.getParent(element,"menu");
			if(menu != null && menu.properties['preview'] == "on"){} 
			else
				_resizeManager.startResize(mouseEvent,direction, element);
		} 	
	}
	
	
	this.endResize = function(element){	
		// empty for now...used to be the resize stuff			   	   
	}
	
	this.loadElement = function(newElement){
		parentId = newElement.properties['parentId'];
		if(parentId != "" && parentId !="undefined" && parentId != undefined){
			var id = newElement.properties['id']
			if(idExists(id))
			{
				_elementsManager.mapNewID(id,newElement);
				newElement.properties['id'] = _self.createId(newElement.properties['type']);
				newElement.properties['holderDiv'].id = newElement.properties['id'];		
			}
			var parentElement = _elementsManager.getElementFromElementsTable(parentId);
			newElement.properties['parentId'] = parentElement.properties['id'];
			var children = parentElement.properties['children'];
			if (children == undefined){
				children = new Object(); 
				parentElement.properties['children'] = children;
			}
			newElement.appendTo(parentElement.properties['holderDiv']);
			children[newElement.properties['id']] = newElement;		
			_elementsManager.addToAllElementsTable(newElement);
		}		
	}
	
	function idExists(id){
		if(_elementsManager.getElementFromElementsTable(id) == undefined)
			return false;
		else
			return true;
	}
	
	this.createId = function(type){
		var id = type+"." + Math.random() * 5000;
		if(idExists(id))
			id = _self.createId(type);
		else 
			return id;
	}
	
	this.deleteElement = function(element){
		var children = element.properties['children'];
		
		/* need to delete itself from parent's children too */
		var parentElement = _elementsManager.getElementFromElementsTable(element.properties['parentId']);
		if(parentElement != undefined){
			parentElement.properties['children'][element.properties['id']] = null;
			delete parentElement.properties['children'][element.properties['id']];
		}
		/* delete all of its children */	
		for(eachChild in children){
			//alert("im a child of: " +element.properties.id + " my id is: " + children[eachChild].properties["id"]);
			_elementsManager.purgeElement(children[eachChild])
			children[eachChild] = null;
			delete children[eachChild];
		}
		//alert("deletein: " +element.properties.id + " whos parent is: " + element.properties["parentId"]);
		if(element.properties["holderDiv"] != undefined){
			element.properties["holderDiv"].parentNode.removeChild(element.properties["holderDiv"])
			element.properties["holderDiv"] = null;
		}	
	}
	this.makeElementFit =function (parentElement,childElement){
		var parentHeight 	= parseInt(parentElement.properties['holderDiv'].style.height);
		var parentWidth 	= parseInt(parentElement.properties['holderDiv'].style.width);
		var newElementHeight= parseInt(childElement.properties['holderDiv'].style.height)
		var newElementWidth = parseInt(childElement.properties['holderDiv'].style.width)
		var newDimensions 	= false;
		if(parentHeight - 7 < newElementHeight){
			newElementHeight = Math.floor(parentHeight * 0.7);
			newDimensions = true;
		}
		if(parentWidth - 7 < newElementWidth){
			var newElementWidth = Math.floor(parentWidth * 0.7);
			newDimensions = true;
		}
		if(newDimensions)childElement.setSize(newElementHeight,newElementWidth);
	}
	
	this.addElement = function(parentElement, childElement, newElement){		
		//alert(parentElement.properties["type"]);
		//remove child from previous parent if not new element
		if(!newElement){
			var parentEl = _elementsManager.getElementFromElementsTable(childElement.properties['parentId']);
			delete parentEl.properties['children'][childElement.properties.id]
		}
		else{	_elementsManager.addToAllElementsTable(childElement); }
		
		childElement.properties['parent'] = parentElement;
		childElement.properties['parentId'] = parentElement.properties['id'];
		var children = parentElement.properties['children'];
		if (children == undefined){
			children = new Object(); 
			parentElement.properties['children'] = children;
		}
		if(parentElement.properties['holderDiv'] != undefined)
			childElement.appendTo(parentElement.properties['holderDiv']);
		children[childElement.properties['id']] = childElement;
	}
	
	this.setScrollBars = function(element,bars){
		element.style.overflow = "hidden";
		if(bars == "vertical")
			element.style.overflowY = "scroll";
		else if(bars == "horizontal")
			element.style.overflowX = "scroll";
		else if(bars == "both")
			element.style.overflow = "auto";
	}
	
	this.findElementByProperty = function(parentElement,property,searchString){
		var element = null;
		if(parentElement.properties[property]==searchString){
			element = parentElement;
		}
		else
		{
			var children = parentElement.properties['children'];
			for(eachChild in children){
				element = _self.findElementByProperty(children[eachChild],property,searchString);
				if (element!= null) break;
			}		
		}
		return element;
	}
	
	this.changeId = function(element, id){
		element.properties["id"]= id;
		var holderDiv = element.properties["holderDiv"];
		holderDiv.id = id;
	}
	
	this.changeBorder = function(element, borderObj){	
		var border = borderObj['all']
		try{ 
			if(border != undefined){element.style.border = border["weight"] + " " + border["style"]+" " + border["color"];}
			else{
				border = borderObj['top'];
				if(border != undefined) element.style.borderTop = border["weight"] + " " + border["style"]+" " + border["color"];
				border = borderObj['left'];
				if(border != undefined) element.style.borderLeft = border["weight"] + " " + border["style"]+" " + border["color"];
				border = borderObj['right'];
				if(border != undefined) element.style.borderRight = border["weight"] + " " + border["style"]+" " + border["color"];
				border = borderObj['bottom'];
				if(border != undefined) element.style.borderBottom = border["weight"] + " " + border["style"]+" " + border["color"];
			}	
		}catch(err){}
	}
	
	this.createBorderObj = function(border){
		var borderObj = new Object()
		borderObj['all'] = getBorderProperties(border);
		return borderObj;
	}
	
	this.borderToString = function(borderObj){
		var borderString = "border:0px solid black;";
		if(borderObj != undefined)
		{
			var border = borderObj['all']
			if(border != undefined)
				borderString = "border:" + border["weight"] + " " + border["style"]+" " + border["color"]+";";
			else{
				borderString = "";
				border = borderObj['top'];
				if(border != undefined) borderString += "border-top:" + border["weight"] + " " + border["style"]+" " + border["color"] +";";
				border = borderObj['left'];
				if(border != undefined) borderString += "border-left:" + border["weight"] + " " + border["style"]+" " + border["color"] +";";
				border = borderObj['right'];
				if(border != undefined) borderString += "border-right:" + border["weight"] + " " + border["style"]+" " + border["color"] +";";
				border = borderObj['bottom'];
				if(border != undefined) borderString += "border-bottom:" + border["weight"] + " " + border["style"]+" " + border["color"] +";";
			}	
		}
		return borderString;
	}
	
	this.loadBorderObj = function(borderString){
		var borderObj = new Object();
		//alert("'"+borderString+"'");
		var border = borderString.split(";"); 
		for(i=0; i< border.length; i++ )
		{
			if(border[i]!="")
			{ 
				var borderType = border[i].split(":")
				//alert("type: "+ borderType[0])
				switch(borderType[0])
				{
					case 'border': 			borderObj['all'] = getBorderProperties(borderType[1]); break;
					case 'border-top': 		borderObj['top'] = getBorderProperties(borderType[1]); break;
					case 'border-left': 	borderObj['left'] = getBorderProperties(borderType[1]); break;
					case 'border-right':	borderObj['right'] = getBorderProperties(borderType[1]); break;
					case 'border-bottom': 	borderObj['bottom'] = getBorderProperties(borderType[1]); break;
					default:				borderObj['all'] = getBorderProperties(borderType[0]); break;					
				}
			}		
		}
		return borderObj;	
	}
	function getBorderProperties(border){
		if(border == "")border = "0px solid black";
		var borderProperties = new Object();
		var borderProps = border.split(" ");
		borderProperties["weight"]= borderProps[0];
		borderProperties["style"] = borderProps[1];
		borderProperties["color"] = borderProps[2];
		return borderProperties;
	}
	
	this.cloneObject = function(obj){
		if(typeof(obj) != 'object') return obj;
		if(obj == null) return obj;

		var newObj = new Object();
		for(var i in obj)
			newObj[i] = _self.cloneObject(obj[i]);

		return newObj;
	}
	
	this.getAbsolutePosition = function(element){	
		var positions = new Object();
		positions['top'] = getPosition("top", element);
		positions['left'] = getPosition("left", element);
		return positions;
	}
	function getPosition(direction, element){
		if(element == undefined) return 0;
		else
		{
			var parentId = element.properties["parentId"]
			var position = 0;
			var holderDiv = element.properties['holderDiv'];
			if(holderDiv != undefined){
				if(direction == "top") position = parseInt(holderDiv.style.top);
				else position = parseInt(holderDiv.style.left);
			}
				
			if(parentId == undefined) return 0;
			else if(parentId == "mainPage") return position;
			else return position + getPosition(direction, _elementsManager.getElementFromElementsTable(parentId));
		} 
	}
	
	this.needToHighlightElement = function(element)	{
		if(_elementsManager.isElementSelected(element.properties["id"])) return false;
		if(element.properties["bgColor"] != "transparent") return false;
		if(element.properties["bgImg"] != "") return false;
		if(!_self.noBorderPresent(element)) return false;
		return true;
	}
	
	this.noBorderPresent = function(element){
		var borderObj = element.properties["borderObj"]; 
		return _self.noBorderPresent_object(borderObj);
	}
	this.noBorderPresent_object = function(borderObj){
		for(eachBorder in borderObj){
			if(parseInt(borderObj[eachBorder]["weight"]) != 0) return false;
		}
		return true;
	}
	this.setPropertyIncludeChildren = function(element, property, value){
		_self.setProperty(element,property,value);
		if(element != undefined && element != null){
			var children = element.properties['children'];
			for(eachChild in children)
				_self.setPropertyIncludeChildren(children[eachChild],property,value);
		}
	}
	
	this.setProperty = function(element, property, value){
		if(element != undefined && element != null)
			element.properties[property] = value;
	} 
	
	this.highlightElement = function(element,border){
		var holderDiv = element.properties["holderDiv"];
		if(element.properties['highlighted'] != true){
			//holderDiv.style.width = parseInt(holderDiv.style.width) + 2;
			//holderDiv.style.height = parseInt(holderDiv.style.height) + 2;
			holderDiv.style.top = parseInt(holderDiv.style.top) - 1;
			holderDiv.style.left = parseInt(holderDiv.style.left) - 1;
			element.properties['highlighted'] = true;
		}
		holderDiv.style.border = border;
	}
	
	this.unHighlightElement = function(element){
		if(element.properties['highlighted'] == true){			
			var holderDiv = element.properties["holderDiv"];
			if(holderDiv!= null && holderDiv!=undefined){
				holderDiv.style.top = parseInt(holderDiv.style.top) + 1
				holderDiv.style.left = parseInt(holderDiv.style.left) + 1
				holderDiv.style.border = "0px dashed white";
			}			
		}
		element.properties['highlighted'] = false; 
	}
	
	this.getProperDimensions = function(element){
		var holderDiv = element.properties['holderDiv'];
		var dimesions = new Object();
		
		dimesions['width'] = holderDiv.style.width;
		dimesions['height'] = holderDiv.style.height;
		dimesions['left'] = parseInt(holderDiv.style.left);
		dimesions['top'] = parseInt(holderDiv.style.top);
				
		var border = holderDiv.style.border;
		if(border!=""){
			var borderWidth = parseInt(holderDiv.style.border.split(" "));
			if(borderWidth!= NaN && borderWidth > 0){
				dimesions['left'] = parseInt(holderDiv.style.left) + borderWidth;
				dimesions['top'] = parseInt(holderDiv.style.top) + borderWidth;				
			}
		} 
		return dimesions;
	}
	this.isChild = function(cE, pE){
		var itis = false;
		var children = pE.properties.children;
		for(eachChild in children){
			var child = _elementsManager.getElementFromElementsTable(children[eachChild].properties.id)
			if(cE == child) itis = true;
			else itis = isChild(cE,child)
		}
		return itis;
	}
}	

