/**
 * Provides functions used by the page configuration module
 */
 	
window['portal$web$pages$REGION_PREFIX'] = "region_";
window['portal$web$pages$WINDOW_PREFIX'] = "pageWindow";

window['portal$web$pages$REGIONS'] = new Array();
window['portal$web$pages$WINDOWS'] = new Array();

window['portal$web$pages$FADEOUT'] = 0.20;
window['portal$web$pages$FADEIN'] = 0.9;

/**
 * Active drop zone on portlet drag (over region)
 */
window['portal$web$pages$activeDropZone'] = undefined;

/**
 * Active element draggable
 */
window['portal$web$pages$activeElem'] = undefined;

/**
 * Active element draggable
 */
window['portal$web$pages$dragElem'] = undefined;

/**
 * Active/selected region (to add new portlets)
 */
window['portal$web$pages$activeRegion'] = undefined;

window['portal$web$pages$removeWindow'] = function (windowID, uriRemoveWindow) {
	
	var param = {'section':'content'};		
	param['post.window.id'] = windowID;
															  
	updateTarget(uriRemoveWindow, param, 'post', false, 'toTrash', loader,
	 	null, 
		function() 
		{ 
			window['portal$web$pages$removeWindowHTML'](windowID);
		}, 
		null, 
		null, 
		false);	
					
};

window['portal$web$pages$removeWindowHTML'] = function (windowID) {
	
	var elemWindow = document.getElementById("pageWindow" + windowID);
	elemWindow.parentNode.removeChild(elemWindow);
	
}; 	

window['portal$web$pages$initDropRegion'] =  function (regionName, uriMoveWindow){
	var divRegion = $(window['portal$web$pages$REGION_PREFIX'] + regionName);
	if(divRegion != undefined)
	{
		divRegion.className = "regionStyleAdminMode";		
		window['portal$web$pages$REGIONS'].push({region: regionName, uri: uriMoveWindow});	
	}
}

window['portal$web$pages$eventOnDropWindow'] = function (regionName, windowID, uriMoveWindow){
	
	var pos = window['portal$web$pages$getNewWindowPosition'](regionName, window['portal$web$pages$WINDOW_PREFIX'] + windowID, 1, 'DIV');//1 = type DIV
		 		
	var param = {'section':'content'};		
	param['post.window.id'] = windowID;	
	param['post.page.region'] = regionName;	
	param['post.page.window.position'] = pos;	
	
	updateTarget(uriMoveWindow, param, 'post', false, 'toTrash', loader,
		null, 
		null, 
		null,
		null,
		false); 		
	//TODO CATCH IF WAS A ERROR ON MOVE AND PUT THE WINDOW IN THE PREVIOUS POSITION		
};

window['portal$web$pages$initDragWindow'] = function (windowID){

	var windowElem = $(window['portal$web$pages$WINDOW_PREFIX'] + windowID);
	windowElem.windowId = windowID;
	window['portal$web$pages$WINDOWS'].push(windowElem);
};
	 	
window['portal$web$pages$getNewWindowPosition'] = function(regionName, windowID, nodeType, nodeName)
{
	
	var regionDiv = document.getElementById(window['portal$web$pages$REGION_PREFIX'] + regionName);
	var	regionChildNodes = regionDiv.childNodes;
	
	var i, pos = 0, nodeDiv;
	
	//iterate all divs for search divID
	for(i = 0; i < regionChildNodes.length; i++)
	{				
		nodeDiv = regionChildNodes[i];			
				
		if(nodeDiv.nodeType == nodeType && nodeDiv.nodeName == nodeName)
		{				
			if(nodeDiv.id == windowID)											
				return pos;								
			pos++;
		}			
	}
	return -1;//not find
	
};


window['portal$web$pages$dragZoneFix'] = function(draggable)
{
	// fix drag zone width
	var dragZone = draggable.getElementsBySelector('.drag_border')[0];
	if(dragZone.getSize().size.x > draggable.getSize().size.x)
		dragZone.setStyle('width', (draggable.getSize().size.x) + 'px');
	else
		dragZone.setStyle('width', '');
};


window['portal$web$pages$activateRegion'] = function(regionName)
{	
	//alert("ENTROU: " + regionName);
	
	var divRegion = $(window['portal$web$pages$REGION_PREFIX'] + regionName);
	if(divRegion)
	{
		window['portal$web$pages$clearRegion']();
		
		window['portal$web$pages$activeRegion'] = divRegion;		
			
		divRegion.selectFx.start('ffffff', '8ad5f4').chain( 
			function() {
				// executes 1 seconds after completion of above effect								
				divRegion.selectFx.start('8ad5f4', 'd9e9ef');	
			});			
	}	
};

window['portal$web$pages$clearRegion'] = function()
{
	if(window['portal$web$pages$activeRegion'] != undefined)
	{
		window['portal$web$pages$activeRegion'].selectFx.start('d9e9ef', 'ffffff');
		window['portal$web$pages$activeRegion'] = undefined;
	}	
};

window.onload = function() {
	
	var webBoxMarker = new Element('div').addClass('webBoxMarker').setStyles({'display': 'none'}).injectInside(document.getElementsByTagName('body')[0]);
	
	var optDropzone = {
	    over: function(draggable) {
	        //this.addClass("regionStyleAdminMode-selected");	            
	        window['portal$web$pages$activeDropZone'] = this;		       
	    },		   
	    leave: function(draggable) {
	        //this.removeClass("regionStyleAdminMode-selected");       
	        window['portal$web$pages$activeDropZone'] = undefined;		        
	    },
	    drop: function(draggable) {
	    	//this.removeClass("regionStyleAdminMode-selected");       
	    	window['portal$web$pages$activeDropZone'] = undefined;		    	
	    }   	    
	}	
		
	var dropRegions = new Array();
	var regions = window['portal$web$pages$REGIONS'];
	var divRegion;
	for(i = 0; i < regions.length; i++)
	{
		divRegion = $(window['portal$web$pages$REGION_PREFIX'] + regions[i].region);
		divRegion.uriMove = regions[i].uri;
		divRegion.regionName = regions[i].region;
		//divRegion.selectFx = divRegion.effect('background-color', { duration: 1000 }); // wait is needed so that to toggle the effect,
		divRegion.selectFx = new Fx.Style(divRegion.id, 'background-color', {
					wait: true,
					duration: 750, 
					transition: Fx.Transitions.quartInOut
				});
		divRegion.addEvents(optDropzone);
		dropRegions.push(divRegion);	  		
	}
	
	window['portal$web$pages$activeElem'] = undefined;
	
	// get all windows and add drag and drop porperties (draggables)
	var draggables = window['portal$web$pages$WINDOWS']; 
	draggables.each(
		function(el){
			// Make each webBox draggable using the handle
			//
			el.makeDraggable({
				handle: el.getElementsBySelector('.drag_border')[0],
				droppables : dropRegions,
				'onBeforeStart': function(draggable) {						
					//console.debug("START:"+draggable.id + " WIDTH:"+draggable.getStyle('width'));
					
					// Introduce the marking box, change the draging box to absolute
					// The order the next 4 lines seems to be important for it to work right in Firefox					
					window['portal$web$pages$activeDropZone'] = draggable.getParent();
					var maxMarkerHeight = (el.getSize().size.y > 150 ? 150 : el.getSize().size.y) + "px";						
					webBoxMarker.injectAfter(draggable).setStyles({'display': 'block', 'height': maxMarkerHeight});
					draggable.setStyles({'z-index': '3333', 'width': draggable.getStyle('width'), 'position': 'absolute', 'opacity': '0.5'});
					draggable.setStyles({'top': webBoxMarker.getCoordinates().top + "px", 'left': webBoxMarker.getCoordinates().left + "px"});
					draggable.injectInside(document.getElementsByTagName('body')[0]);			
				
				},
				'onComplete': function(draggable) {											
					//console.debug("COMPLETE:"+draggable.id+" WIDTH:"+draggable.getStyle('width'));
					
					// Replace the draging webBox
					draggable.injectBefore(webBoxMarker).setStyles({'z-index': '1', 'margin': '0 0 0 0', 'position': 'relative', 'top': '0', 'left': '0', 'opacity': '1'});
					// Remove the marking box
					webBoxMarker.injectInside(document.getElementsByTagName('body')[0]).setStyles({'display': 'none'});
					
					// fade out efects
					el.elFxDrag.stop();
					el.elFxDrag.start(window['portal$web$pages$FADEIN'], window['portal$web$pages$FADEOUT']);
					el.elFxOp.stop();
					el.elFxOp.start(window['portal$web$pages$FADEIN'], window['portal$web$pages$FADEOUT']);
					window['portal$web$pages$activeElem'] = undefined;
					el.mouseIsOver = false;			
					
					// width auto - to region adapt 
					draggable.setStyles({'width': ''});
					
					// fix drag zone width
					window['portal$web$pages$dragZoneFix'](draggable);
				
					// sincronize portlet move with server
					var region = draggable.getParent();
			    	window['portal$web$pages$eventOnDropWindow'](region.regionName, el.windowId, region.uriMove);	
				},
				'onDrag': function(draggable) {
					//console.debug("DRAG:"+draggable.id+" WITH:" + draggable.getStyle('width'));
				  	var dropZone = window['portal$web$pages$activeDropZone'];		    	
			    	if(dropZone != undefined)
			    	{
			    		// draw indicator region
				    	var mouseY = this.mouse.now.y;
				    	var actualY = dropZone.getPosition().y;						
				    	var nodeBefore = undefined;
				    	
				    	var i, items = dropZone.getChildren();
				    	for(i = 0; i < items.length; i++)
				    	{
							itemNode = items[i];    			
						    var y = itemNode.getSize().size.y;	    			
			    			var nextMiddleY = actualY + (y / 2);    			
			    			if(mouseY < nextMiddleY)
			    			{
			    				nodeBefore = itemNode;    	
			    				break;
			    			}    			
			    			actualY += y;	
				    	}
				    		        				        
				        if(nodeBefore != undefined)
							webBoxMarker.injectBefore(nodeBefore);			
				        else		        
				            webBoxMarker.injectInside(dropZone);
				    }				    
				}				
			});
			
			//end
		}
	);
	
	//get all windows to add header effects (drag zone and options)
	var draggables = $$('.adminPortletContainer');
	draggables.each(
		function(el){
			el.mouseIsOver = false;	
			el.elFxDrag = new Fx.Style(el.id + "Drag", 'opacity', {
					duration: 500, 
					transition: Fx.Transitions.quartInOut
				});
			el.elFxOp = new Fx.Style(el.id + "Options", 'opacity', {
					duration: 500, 
					transition: Fx.Transitions.quartInOut
				});
			
			el.onmouseover = function(e) {				
				if(el.mouseIsOver == true)
					return;
							
				//console.debug("IN");		
				activeElem = window['portal$web$pages$activeElem'];
				if(activeElem != undefined)
				{				
					//efeito de fade out				
					/*activeElem.elFxDrag.stop();
					activeElem.elFxDrag.start(window['portal$web$pages$FADEIN'], window['portal$web$pages$FADEOUT']);
					activeElem.elFxOp.stop();
					activeElem.elFxOp.start(window['portal$web$pages$FADEIN'], window['portal$web$pages$FADEOUT']);
					activeElem = undefined;*/
				}
				
				el.mouseIsOver = true;
				window['portal$web$pages$activeElem'] = el;
				
				if(!window['portal$web$pages$activeDropZone'])
				{
					//efeito de fade in		
					el.elFxDrag.stop();
					el.elFxDrag.start(window['portal$web$pages$FADEOUT'],window['portal$web$pages$FADEIN']);
					el.elFxOp.stop();
					el.elFxOp.start(window['portal$web$pages$FADEOUT'],window['portal$web$pages$FADEIN']);
				}
			};
			el.onmouseout= function(e) {				
				if (!e) /* For IE. */
					e = window.event;
				
				//verify if mouse is out								
				if(	   e.clientY > (el.getPosition().y+2) 
					&& e.clientY < (el.getPosition().y + el.getSize().size.y)
					&& e.clientX > (el.getPosition().x+2)
					&& e.clientX < (el.getPosition().x + el.getSize().size.x) )
				{
					/*console.debug("NOT IN");
					console.debug("CY:" + e.clientY + " EPY:" + (el.getPosition().y+5) + " EPYM:" + (el.getPosition().y + el.getSize().size.y));		
					console.debug("CX:" + e.clientX + " EPX:" + (el.getPosition().x+5) + " EPXM:" + (el.getPosition().x + el.getSize().size.x));		
				*/
					el.mouseIsOver = true;			
					return;				
				}		
				
				/*console.debug("out");
				console.debug("CY:" + e.clientY + " EPY:" + (el.getPosition().y+5) + " EPYM:" + (el.getPosition().y + el.getSize().size.y));		
				console.debug("CX:" + e.clientX + " EPX:" + (el.getPosition().x+5) + " EPXM:" + (el.getPosition().x + el.getSize().size.x));		
				*/
				window['portal$web$pages$activeElem'] = undefined;
				el.mouseIsOver = false;
				
				if(!window['portal$web$pages$activeDropZone'])
				{
					//efeito de fade out									
					el.elFxDrag.stop();
					el.elFxDrag.start(window['portal$web$pages$FADEIN'], window['portal$web$pages$FADEOUT']);
					el.elFxOp.stop();
					el.elFxOp.start(window['portal$web$pages$FADEIN'], window['portal$web$pages$FADEOUT']);
				}
			};			
			
			window['portal$web$pages$dragZoneFix'](el);
		}
	);
	
};


 
	 
 
