var portlets = {};
var userPortlets = {};
var placeholders = {};
var personalizationManager=false;
var pages = {};
var userSettings = false;

function putPortlet(pageLabel, placeholderId, portletId, nextSiblingId) {
    if (!portlets[pageLabel]) {
        portlets[pageLabel]={};
    }
    if (!placeholders[pageLabel]) {
        placeholders[pageLabel] = {};
        placeholders[pageLabel][placeholderId] = new JSArrayList();
    
    } else if (!placeholders[pageLabel][placeholderId]) {
    	placeholders[pageLabel][placeholderId] = new JSArrayList();
    }
    var currentPlaceholder = portlets[pageLabel][portletId];
    if (Global.isDefined(currentPlaceholder)) {
	    var index = placeholders[pageLabel][currentPlaceholder].indexOf(portletId);
	    if (index > -1) {
	        placeholders[pageLabel][currentPlaceholder].removeAt(index);
	    }
	  }
	  if (typeof placeholders[pageLabel][placeholderId] != "function") {
	    if (Global.isDefined(nextSiblingId)) {
	    	placeholders[pageLabel][placeholderId].insertBefore(portletId, nextSiblingId);
	    } else {
	    	placeholders[pageLabel][placeholderId].add(portletId);
	    }
		}
    portlets[pageLabel][portletId] = placeholderId;
}
function showPortlets(pageLabel) {
    var p = portlets;
    var plhs = placeholders[pageLabel];
    for(var plh in plhs) {
        var portletArray = placeholders[pageLabel][plh];
        if (typeof portletArray != "function") {
	        //show
	        //dropzoneAfterPortlet
	        var offset = dropzoneAfterPortlet ? portletArray.length-1 : 0;
	        for (var i=0; i<portletArray.length; i++) {
	        	//var portletId = portletArray[i];
	        	var placeholder = document.getElementById(plh);
	        	var portlet = document.getElementById(portletArray[i]);
	        	var portletDropzone = portlet.previousSibling;
	        	var dropzone = getPlaceholderDropzoneFromPlaceholder(placeholder);
	          // insert portlet before placeholder dropzone
	          if (Global.isDefined(portlet)) {
	          	placeholder.insertBefore(portlet, dropzone);
	          	placeholder.insertBefore(portletDropzone, portlet);
	          	portlet.style.display = "block";
	          }
	        }
				}
    }
    // hide other portlets (put in library)
}
function registerPortlet(pageLabel, portletLabel, placeholder, user) {
    var dragbar = document.getElementById(portletLabel+"_titlebar_drag");
    if (Global.isDefined(dragbar)) {
    		var placeholder = findPlaceholder(dragbar);
        var portlet = getPortletFromDragbar(dragbar);
        if (user) {
            portlet.style.display = "none";
        } else {
            if (!portlets[pageLabel]) {
                portlets[pageLabel]={};
            }
//            placeholders[pageLabel][placeholder.id] = portletLabel;	//portlet.cloneNode(true);
            putPortlet(pageLabel, placeholder.id, portlet.id);
        }
    }
}
function registerWindow(pageLabel, dragDiv, portletLabel, userRegistered) {
    if (Global.isDefined(pageLabel)) {
        var drag = document.getElementById(dragDiv);
        var placeholder = findPlaceholder(drag);
        dndMgr.registerDraggable( new PSPortletDraggable(drag,dragDiv, dndMgr, true, pageLabel, portletLabel, placeholder.id ) );
    }
}

function removeWindow(pLabel,wLabel)
{
    var elem = document.getElementById("portlet_"+pLabel+"_"+wLabel);
    if (elem)
    {
        elem.parentNode.removeChild(elem);
        document.getElementById(pLabel+"_library_container").appendChild(elem);
        dndMgr.registerDraggable( new PSPortletDraggable("drag_"+elem.id,"drag_"+elem.id, dndMgr, true ) );
        //do not register a dropzone for a portlet in library!
        //dndMgr.registerDropZone( new PSPlaceholderDropzone(elem.id) ); 
        var delBtn = document.getElementById("delete_"+pLabel+"_"+wLabel);
        if (delBtn)
            delBtn.style.display="none";
    }
}

function findPlaceholder(elem) {
    if (elem) {
        if (elem.id) {
            if (isPlaceholder(elem)) {
                return elem;
             }
         }
        return findPlaceholder(elem.parentNode);
    }
    return undefined;
}
function isPlaceholder(elem) {
	if (Global.isDefined(elem)) {
		if (Global.isDefined(elem.id)) {
			return (elem.id.indexOf("placeholder_")==0)
		} else {
			return false;	//alert("WARNING:");
		}
	}
	return false;
}
/*
 * @deprecated use registerDropzone(pageLabel, dropzoneId, placeholder)
 */
function registerPlaceholder(pageLabel, dropzoneLabel, number) {
    registerDropzone(pageLabel, dropzoneLabel, number);
}
function registerDropzone(pageLabel, dropzoneId, placeholder) {
    var dropzone = document.getElementById(dropzoneId);
    if (Global.isDefined(dropzone)) {
    		var portlet = getPortletFromChild(dropzone);
        var plh = findPlaceholder(dropzone);
        if(plh) plh.insertBefore(dropzone, portlet);
        
        //dropzone.style.width = plh.offsetWidth + "px";

//        var pldz = document.getElementById("dropzone_"+dropzoneId+"_"+number);
/*        if (!placeholders[pageLabel]) {
            placeholders[pageLabel]={};
        }
        placeholders[pageLabel][placeholder]=dropzone;
*/
        if (typeof dndMgr != "undefined") {
            dndMgr.registerDropZone( new PSPlaceholderDropzone(dropzone, pageLabel, plh.id) ); 
        }
    }
}

function saveLayout(pageLabel) {
    var msg = document.getElementById(pageLabel+"_msgBox");
    if (msg)    
        msg.innerHTML = "Saving configuration...";
    var layoutStr = getLayoutStr(pageLabel);

    ajaxEngine.sendRequest("saveLayout","process=true","pageLabel="+pageLabel,"portlets="+escape(layoutStr));
}

function getLayoutStr(pageLabel) {
//	pageLabel, placeholder, portletLabel
    var layoutStr="";
    
    var plhs = placeholders[pageLabel];
    for(var plh in plhs) {
        var portletArray = placeholders[pageLabel][plh];
        
        if (typeof portletArray != "function") {
        	var l = (portletArray.length);
	        for (var i=0; i<portletArray.length; i++) {
	            layoutStr += "-\"" + pageLabel + "\",\"" + plh + "\",\"" + portletArray[i] + "\"";
	        }
	      }
    }

    return layoutStr;
}

var dropzoneAfterPortlet = false;
function placePortletInDropzone(pageLabel, placeholder, dragPortlet, dropzone, portletLabel) {

	var nextSibling;
	var currentPlaceholder = findPlaceholder(dragPortlet);
	if (Global.isDefined(dropzone)) {
		var placeholderDropzone = getPlaceholderDropzoneFromPlaceholder(findPlaceholder(dropzone));
		var insertBeforePortlet = dropzone;
		if (placeholderDropzone != dropzone) {
		//if (insertBeforePortlet != placeholder) {
//			insertBeforePortlet = getPortletFromChild(insertBeforePortlet);	//.parentNode;
//			if (dropzoneAfterPortlet) {
//				insertBeforePortlet = insertBeforePortlet.nextSibling;
//			}
			nextSibling = dropzone.nextSibling.id; //insertBeforePortlet.id;
		} else {
//			insertBeforePortlet = dropzoneAfterPortlet ? dropzone.nextSibling : dropzone;
		}

		if (Global.isDefined(insertBeforePortlet)) {
			placeholder.insertBefore(dragPortlet, insertBeforePortlet);
		} else {
			placeholder.appendChild(dragPortlet);
		}
	} else {
		placeholder.appendChild(dragPortlet);
	}
	var portletDropzone = document.getElementById(portletLabel + "_dropzone");
	placeholder.insertBefore(portletDropzone, dragPortlet);
	
	putPortlet(pageLabel, placeholder.id, dragPortlet.id, nextSibling);
	saveLayout(pageLabel);
}

/*
 * Get portlet object from a child element within it
 */
function getPortletFromChild(child) {
	var divs = new Array();
	var el = child;
	divs[0] = el;
	var i = 1;
	while (!isPlaceholder(el)) {
		el = el.parentNode;
		if (!Global.isDefined(el)) {	// stop if there is no parent
			break;
		}
		divs[i] = el;
		i++;
	}
	var diffPortletPlaceholder = 1;
	return divs[divs.length-diffPortletPlaceholder-1];
}

/*
 * @deprecated use getPortletFromChild(el)
 */
function getPortletFromDragbar(dragbar) {
	var divs = new Array();
	var el = dragbar;
	divs[0] = el;
	var i = 1;
	while (!isPlaceholder(el)) {
		el = el.parentNode;
		if (!Global.isDefined(el)) {	// stop if there is no parent
			break;
		}
		divs[i] = el;
		i++;
	}
	var diffPortletPlaceholder = 1;
	return divs[divs.length-diffPortletPlaceholder-1];
}
function getPortletDropzoneFromDragbar(dragbar) {
	var portlet = getPortletFromDragbar(dragbar);	//dragbar.parentNode.parentNode;
	return portlet.previousSibling;
	for (var i=0; i<portlet.childNodes.length; i++) {
		if (!portlet.childNodes[i].id) {
			continue;
		}
		if (portlet.childNodes[i].id.indexOf("_dropzone") > 0) {
			return portlet.childNodes[i];
		}
	}
}
function getPlaceholderDropzoneFromPlaceholder(placeholder) {
	if (dropzoneAfterPortlet) {
		for (var i=0; i<placeholder.childNodes.length; i++) {
			var childId = placeholder.childNodes[i].id;
			if (Global.isDefined(childId)) {
				if (childId.indexOf("_dropzone") > 0) {
					return placeholder.childNodes[i];
				}
			}
		}
	} else {
		for (var i=placeholder.childNodes.length-1; i>=0; i--) {
			var childId = placeholder.childNodes[i].id;
			if (Global.isDefined(childId)) {
				if (childId.indexOf("_dropzone") > 0) {
					return placeholder.childNodes[i];
				}
			}
		}
	}
}



var ctrlKeyPressed = false;
var altKeyPressed = false;
var shiftKeyPressed = false;
var mouseButtonDown = false;
var mouseButtonUp = false;

document.onkeydown = // assumes not handled at lower level
	function (e) {
		if (!Global.isDefined(e)) e = event;
		if (e.keyCode == 16) { //keyCode 16 == shift
			shiftKeyPressed = true;
		} else if (e.keyCode == 17) { //keyCode 17 == ctrl
			ctrlKeyPressed = true;
		} else if (e.keyCode == 18) { //keyCode 18 == alt
			altKeyPressed = true;
		}
	}

document.onkeyup = // assumes not handled at lower level
	function (e) {
		if (!Global.isDefined(e)) e = event;
		if (e.keyCode == 16) { //keyCode 16 == shift
			shiftKeyPressed = false;
		} else if (e.keyCode == 17) { //keyCode 17 == ctrl
			ctrlKeyPressed = false;
		} else if (e.keyCode == 18) { //keyCode 18 == alt
			altKeyPressed = false;
		}
	}
document.onmousedown = // assumes not handled at lower level
	function (e) {
		if (!Global.isDefined(e)) e = event;
		mouseButtonDown = true;
	}

document.onmouseup = // assumes not handled at lower level
	function (e) {
		if (!Global.isDefined(e)) e = event;
		mouseButtonDown = false;
	}
/**
 * get the width of an object/layer/box
 **/
function getObjectWidth(obj) {
	var objWidth = 0;
	if (document.getBoxObjectFor == undefined) {	//ie
		objWidth = obj.getBoundingClientRect().right - obj.getBoundingClientRect().left;
	} else {	//mozilla
		
		//objWidth = document.getBoxObjectFor(obj).width;
		objWidth = obj.offsetWidth;
	}
	return objWidth;
}
/**
 * get the height of an object/layer/box
 **/
function getObjectHeight(obj) {
	var objHeight = 0;
	if (document.getBoxObjectFor == undefined) {	//ie
		objHeight = obj.getBoundingClientRect().bottom - obj.getBoundingClientRect().top;
	} else {	//mozilla
		objHeight = document.getBoxObjectFor(obj).height;
	}
	return objHeight ;
}
/**
 * get the measures of of an object
 */
function getObjMeasures(obj) {
	var measures = new JSHashMap();
	if (document.getBoxObjectFor == undefined) {	//ie
		measures.put("left", obj.getBoundingClientRect().left);
		measures.put("top", obj.getBoundingClientRect().top);
		measures.put("right", obj.getBoundingClientRect().right);
		measures.put("bottom", obj.getBoundingClientRect().bottom);
		measures.put("width", measures.get("right") - measures.get("left"));
		measures.put("height", measures.get("bottom") - measures.get("top"));
		measures.put("scrollTop", document.body.scrollTop);
	} else {	//mozilla
		var objBox = document.getBoxObjectFor(obj);
		measures.put("left", objBox.x);
		measures.put("top", objBox.y);
		measures.put("width", objBox.width);
		measures.put("height", objBox.height);
		measures.put("right", measures.get("left") + measures.get("width"));
		measures.put("bottom", measures.get("top") + measures.get("height"));
		if (!Global.isDefined(window)) {
			var a = "";
		}
		measures.put("scrollTop", window.pageYOffset);
	}
	return measures;
}
/**
 * check if two object intersect each other
 */
function isObjIntersection(obj1, obj2) {
	var selects = document.getElementsByTagName("SELECT");
	var obj1Measures = getObjMeasures(obj1);
	var obj2Measures = getObjMeasures(obj2);
//alert(obj1Measures.get("bottom") + ">"+ obj2Measures.get("top") + " && "+ obj1Measures.get("top") + "<"+ obj2Measures.get("bottom") + " && "+ obj1Measures.get("right") + ">"+ obj2Measures.get("left") + " && "+ obj1Measures.get("left") + "<"+ obj2Measures.get("right"));
	if ((obj1Measures.get("bottom") > obj2Measures.get("top")) && (obj1Measures.get("top") < obj2Measures.get("bottom")) && (obj1Measures.get("right") > obj2Measures.get("left")) && (obj1Measures.get("left") < obj2Measures.get("right"))) {
		return true;
	} else {
		return false;
	}
}
getRealOffsetTop = function(element,rel){
	if(!Global.isDefined(rel)) rel = document.body;

	var result = 0;
	var finger = element;
	while(finger!=null && finger != rel){
		result += finger.offsetTop;
		finger = finger.offsetParent;
	}
	return result;
}

getRealOffsetLeft = function(element, rel){
	if(!Global.isDefined(rel)) rel = document.body;
	var result = 0;
	var finger = element;
	
	while(finger!=null && finger != rel){
		result += finger.offsetLeft;
		finger = finger.offsetParent;
	}
	return result;
}

function createDivForPersonalize(id, className, value) { 
   return createElementForPersonalize("div", id, className, value);
}
function createElementForPersonalize(name, id, className, value) {
     var el = document.createElement(name.toUpperCase());
     if ((id != undefined) && (id != "")) { el.id = id; }
     if ((className != undefined) && (className != "")) { el.className = className; }
     if ((value != undefined) && (value != "")) { el.innerHTML = value; }
     return el;
} 