

var contextPath = '';

<!-- debug -->
// this is the main switch
var mgnlDebugOn = false;

// set the contextes which you want to debug
var mgnlDebugContextes = {
	tree: true,
	dialog: true,
	acl: true,
	debug: true
}

function mgnlRootWindow(current){
	if(current.top != current)
		return mgnlRootWindow(current.top);
	if(current.opener != null)
		return mgnlRootWindow(current.opener);
	return current;
}

function mgnlDebug(msg, context, o, level){
	if(!mgnlDebugOn)
		return;
	if(!level)
		level = 1;
		
	// is the context in debug mode?
	if(context != null && (mgnlDebugContextes[context] == null || !mgnlDebugContextes[context]))
		return;
		
	var console = mgnlRootWindow(window).mgnlDebugConsole;
	var doc = null;
	// create new window if not allready done
	if(console == null){
		console = window.open('','mgnlDebugConsole');
		mgnlRootWindow(window).mgnlDebugConsole = console;
		doc = console.document;
		doc.write('<input type="button" value="Clear" onclick="document.getElementById(\'consoleDiv\').innerHTML=\'\';" > <p>');
		doc.write('<div id="consoleDiv" style="font-family: sans-serif; font-size: 10pt">');
		doc.write('</div>');
		doc.close();
	}
	else{
		doc = console.document;
	}
	
	if(doc == null)
		return;
	
	// get the div to write in
	var div = doc.getElementById('consoleDiv');
	
	if(o){
		msg += ":" + mgnlDebugObject(o, level, "");
	}
	
	if(context != null)
		msg = context + ": " + msg;
	div.innerHTML += msg + "<br>";
}

function mgnlDebugObject(o, level, spaces){
	var res = "";
	switch(typeof o){
	
		case "object":
			if(level<=0)
				return "object";
			res = "<br>" + spaces + "{<br>";
			for(var key in o){
				if(!res.match(/\{<br>$/))
					res += ",<br>";
				res += spaces + "&nbsp;&nbsp;&nbsp;" + key + ":";
				res += mgnlDebugObject(o[key], level-1, spaces + "&nbsp;&nbsp;&nbsp;"); 
			}
			res += "<br>" + spaces + "}";
			break;
		case "function":
			return "function"
			break;
		
		default:
			return o;
	}
	return res;
}


<!-- i18n -->
/* ###################################
### i18n.js
################################### */

/* ###################################
### Message Class
################################### */

var MGNL_I18N_DEFAULT_BASENAME = "info.magnolia.module.admininterface.messages";

/* ###################################
### Constructor
################################### */

function MgnlI18nMessages(){
	this.messages = new Object();
}

/* ###################################
### Add a message. Basename is optional
################################### */

MgnlI18nMessages.prototype.add = function (key, msg, basename){
	if(basename==null){
		basename = MGNL_I18N_DEFAULT_BASENAME;
	}
	
	if(this.messages[basename] == null){
		this.messages[basename] = new Object();
	}
	
	this.messages[basename][key]=msg;
}


/* ###################################
### Get a Message. Basename is optional
################################### */

MgnlI18nMessages.prototype.get = function (key, basename, args){
	var msg;
	
	// basename is optional
	if(basename == null)
		basename = MGNL_I18N_DEFAULT_BASENAME;
		
	// return ??? key ??? if you can't find the mesage
	if(this.messages[basename] == null || this.messages[basename][key] == null){
		return "???" + key + "???";
	}
	
	msg = this.messages[basename][key];
	
	// replace parameters
	if(args != null){
		for(i=0; i<args.length;i++){
			msg = msg.replace("{" + i +"}", args[i]);
		}
	}
	return msg;
}

var mgnlMessages = new MgnlI18nMessages();



/* ###################################
### Generated Messages
################################### */

mgnlMessages.add('js.dialog.calendar.month10','Ottobre','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.mon','Lun','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.tue','Mar','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.import.button.close','Close','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.inline.move.aboveThisOne','Sposta il paragrafo selezionato sopra questo','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.datecheck.date','La data deve essere nel formato\naaaa-MM-gg\n\nesempio:\n2004-06-14','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.thu','Gio','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.inline.delete.text','Il paragrafo selezionato sarà eliminato immediatamente.\n\nSicuro di voler continuare?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.movenode.confirm.text','The node\n{0}\nwill be de-activated immediately.\n\nAre you sure to continue?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month4','Aprile','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.richedit.nopaste','Il tuo browser non supporta l\'incolla pulito','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.verifyname.illegalCharacter','Caratteri non validi nel nome!','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.exportnode.confirm.text','Sei sicuro di voler continuare?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month5','Maggio','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.savenode.confirmDeactivation.text','Il salvataggio disattiverà il nodo.\nContinuo?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month12','Dicembre','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.sun','Dom','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month11','November','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month3','Marzo','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.wed','Mer','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month2','Febbraio','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month7','Luglio','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month9','Settembre','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month8','Agosto','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month6','Giugno','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month1','Gennaio','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.import.button','Importa','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.saving','Sto salvando...','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.inline.delete.title','Elimino il paragrafo?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.deletenode.confirm.title','Elimino il nodo?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.fri','Ven','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.datecheck.datetime','La data deve essere nel formato\naaaa-MM-gg\'T\'HH:mm:ss\n\nesempio:\n2004-06-14T09:28:00','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.sat','Sab','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.richedit.pastehelp','Il testo copiato in alcune applicazioni (per esempio Word, Excel) contiene informazioni addizionali che potrebbero causare problemi sul web.\n\n Incollando il testo con Ctrl-V inseriresti anche queste informazioni addizionali.','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.acl.choose','Scegli un ruolo','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.savenode.confirmDeactivation.title','Disattivazione','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.deletenode.confirm.text','Il nodo\n{0}\nsarà disattivato e eliminato immediatamente.\n\nSei sicuro di voler continuare?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.password.failed','Verifica della passord fallita!','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.exportnode.confirm.title','Sto esportando {0} in formato xml.','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.movenode.confirm.title','Move node?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.loading','Loading...','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.pastenode.itself','Non è possibile muovere un nodo su se stesso.','info.magnolia.module.admininterface.messages');

 <!-- load the messages from propertyfiles -->

/* ###################################
### generic.js
### generic, magnolia independant methods
################################### */


/**
 * Simple shortcut for document.getElementById()
 */
function $(element)
{
    return document.getElementById(element);
}

/**
 * get position of an object
 */
function mgnlGetPosX(obj)
	{
	if (!obj) return 0;

  	if (navigator.appName.indexOf("Microsoft")==-1)
  		{
  		if (navigator.vendor!=("Netscape6") && navigator.product!=("Gecko")) return obj.x; //ns4
  		else //ns6; don't laugh...
  			{
  			for (var elem in obj)
  				{
  				var tmp=obj[elem];
  				}
  			return obj.offsetLeft;
  			}
  		}
  	var x=document.body.scrollLeft;
  	while (obj.offsetParent)
  		{
  		x+=obj.offsetLeft;
  		obj=obj.offsetParent;
  		}
	return x; //ie
	}


function mgnlGetPosY(obj)
	{
	if (!obj) return 0;

	return obj.offsetTop;
  	if (navigator.appName.indexOf("Microsoft")==-1)
  		{
  		if (navigator.vendor!=("Netscape6") && navigator.product!=("Gecko")) return obj.y; //ns4
  		else //ns6; don't laugh...
  			{
  			for (var elem in obj)
  				{
  				var tmp=obj[elem];
  				}
  			return obj.offsetTop;
  			}
  		}
  	var y=document.body.scrollTop;
  	while (obj.offsetParent)
  		{
  		y+=obj.offsetLeft;
  		obj=obj.offsetParent;
  		}
	return y; //ie
	}


function mgnlGetMousePos(event)
	{
	var pos=new Object();
	if (document.all)
		{
		pos.x=window.event.clientX+document.body.scrollLeft;
		pos.y=window.event.clientY+document.body.scrollTop;
		}
	else
		{
		pos.x=event.pageX;
		pos.y=event.pageY;
		}
	return pos;
	}


/* ###################################
### miscellaneous
################################### */


function mgnlIsKeyEnter(event)
	{
	return mgnlIsKey(event,13);
	}

function mgnlIsKeyEscape(event)
	{
	return mgnlIsKey(event,27);
	}

function mgnlIsKey(event,keyCode)
	{
	if (window.event && window.event.keyCode == keyCode) return true;
	else if (navigator.appName=="Netscape" && event.which==keyCode) return true;
	else return false;
	}

function mgnlWhichKey(event)
	{
	if (window.event && window.event.keyCode) alert(window.event.keyCode);
	else if (navigator.appName=="Netscape" && event.which==keyCode) alert(event.which);
	}



function mgnlGetWindowSize()
	{
	var obj=new Object();
	if( typeof (window.innerWidth) == 'number' )
		{
		//Non-IE
		obj.w=window.innerWidth;
		obj.h=window.innerHeight;
		}
	else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		{
		//IE 6+ in 'standards compliant mode'
		obj.w=document.documentElement.clientWidth;
		obj.h=document.documentElement.clientHeight;
		}
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		{
		//IE 4 compatible
		obj.w=document.body.clientWidth;
		obj.h=document.body.clientHeight;
		}
	//alert(h+'//'+w);
	return obj;
	}


function mgnlGetIFrameDocument(iFrameName)
	{
	if (document.frames && document.frames[iFrameName]) return document.frames[iFrameName].document;
	else if (document.getElementById(iFrameName)) return document.getElementById(iFrameName).contentDocument;
    else return null;
	}

function mgnlGetCacheKiller() {
    var now = new Date();
    return now.getTime();
}



/* ###################################
### add/remove parameter to query string
################################### */

function mgnlAddParameter(href,name,value)
	{
	var delimiter;
	if (href.indexOf("?")==-1) delimiter="?";
	else delimiter="&";
	return href+delimiter+name+"="+value;
	}


function mgnlRemoveParameter(href,name)
	{
	//works only for a single paramter
	/*
	var nameExtended;
	var delimiter
	var tmp;
	if (href.indexOf("?"+name+"=")!=-1) delimiter="?";
	else delimiter="&";

	var tmp=href.split(delimiter+name+"=");
	var href2=tmp[0];
	if (tmp[1])
		{
		if (tmp[1].indexOf("&")!=-1) href2+=delimiter+tmp[1].substring(tmp[1].indexOf("&")+1);
		}
	return href2;
	*/

	var tmp=href.split("?");

	var newHref=tmp[0];
	if (tmp[1])
		{
		var paramObj=tmp[1].split("&");

		for (var i=0;i<paramObj.length;i++)
			{
			if (paramObj[i].indexOf(name+"=")!=0)
				{
				if (i==0) newHref+="?";
				else newHref+="&";
				newHref+=paramObj[i];
				}
			}
		}
	return newHref;
	}


/* ###################################
### general.js
### some general magnolia methods (used all over magnolia)
################################### */

var mgnlSort=false; //true as long as a page is selected


var mgnlControlSets=new Object();
//dialog: will be extended by each tab

var mgnlTreeControls=new Object();
//will be extended by each tree

var mgnlMove=false;
//inline editing: true as long as a paragraph is selected for moving





/* ###################################
### mouse events
################################### */

var xMousePos = 0; //used in site admin (place layers)
var yMousePos = 0;

function initMouseEvents()
	{
	// ns 4, check if needed for ns 6+
	if (navigator.appName=="Netscape")
		{
		document.captureEvents(Event.MOUSEMOVE);
		document.captureEvents(Event.MOUSEDOWN);
		document.captureEvents(Event.MOUSEUP);
		}
	document.onmousemove=getMousePos;
	document.onmousedown=mgnlResetDown;
	document.onmouseup=mgnlResetUp;
	}

initMouseEvents();

var mgnlDragTreeColumn_Tree;
var mgnlDragTreeColumn=false;

var mgnlTreeMoveNode_Tree;
var mgnlTreeMoveNode=false;

function getMousePos(evt)
	{
	var x,y;
	if (document.all)
		{
		x=window.event.clientX+document.body.scrollLeft;
		y=window.event.clientY+document.body.scrollTop;
		}
	else
		{
		x=evt.pageX;
		y=evt.pageY;
		}
	xMousePos = x;
	yMousePos = y;


	// moving content paragraphs
	if (mgnlMove)
		{
		var divShadow=document.getElementById('mgnlMoveDivShadow');

		divShadow.style.left=(x+15) + "px";
		divShadow.style.top=(y-20) + "px";


		var divDenied=document.getElementById('mgnlMoveDivDenied');
		divDenied.style.left=(x+5) + "px";
		divDenied.style.top=(y-15) + "px";

		var divAllowed=document.getElementById('mgnlMoveDivAllowed');
		divAllowed.style.left=(x+20) + "px";
		divAllowed.style.top=(y-19) + "px";
		}

	// sorting pages in site admin
	// outdated; old admin
	if (mgnlSort)
		{
		var divShadow=document.getElementById('mgnlSortDivShadow');
		divShadow.style.left=(x+5) + "px";
		divShadow.style.top=(y-20) + "px";

		var divDenied=document.getElementById('mgnlSortDivDenied');
		divDenied.style.left=(x+5) + "px";
		divDenied.style.top=(y-15) + "px";
		}

	// move/copy pages in tree
	if (mgnlTreeMoveNode)
		{
		mgnlTreeMoveNode_Tree.moveNode(x,y);
		}

	// resize tree columns
	if (mgnlDragTreeColumn)
		{
		mgnlDragTreeColumn_Tree.dragColumn(x,y);
		}
	}

function mgnlResetDown()
    {
    if (mgnlMove)
        {
        var editBarTable=document.getElementById(mgnlMoveNodeCollection+'__'+mgnlMoveNode);
		mgnlMoveNodeSetClassName(editBarTable,"NORMAL");

		var divShadow=document.getElementById('mgnlMoveDivShadow');
        divShadow.style.visibility='hidden';
		divShadow.style.left=-50 + "px";;
		divShadow.style.top=-50 + "px";

		var divDenied=document.getElementById('mgnlMoveDivDenied');
		divDenied.style.visibility='hidden';
		divDenied.style.left=-50 + "px";
		divDenied.style.top=-50 + "px";

		var divAllowed=document.getElementById('mgnlMoveDivAllowed');
		divAllowed.style.visibility='hidden';
		divAllowed.style.left=-50 + "px";
		divAllowed.style.top=-50 + "px";

		mgnlMove=false;

		//trick! otherwise, by clicking a cont. of a different list, this one would be selected directly. now, the already selected will just be disabled
		mgnlMoveDont=true;
		setTimeout("mgnlMoveDont=false;",500);
        }

    if (mgnlSort)
    	{
    	if (!mgnlSortSubmit)
    		{
			var trSelected=document.getElementById('sadminTr'+mgnlSortPageId);
			trSelected.style.backgroundColor='';
			}

		var divShadow=document.getElementById('mgnlSortDivShadow');
        divShadow.style.visibility='hidden';
		divShadow.style.left=-50 + "px";
		divShadow.style.top=-50 + "px";

		var divDenied=document.getElementById('mgnlSortDivDenied');
		divDenied.style.visibility='hidden';
		divDenied.style.left=-50 + "px";
		divDenied.style.top=-50 + "px";

    	mgnlSort=false;
    	}
    }


function mgnlResetUp(evt)
	{
	if (mgnlDragTreeColumn)
		{
		mgnlDragTreeColumn_Tree.dragColumnStop();
		}
	}


/* ###################################
### open window
################################### */


function mgnlOpenWindow(url,width,height)
	{

	//dialog window is resized in  dialog itself (window.resize)
    if (!width) width=800;
    if (!height) height=100;
	url="/" + url;
	if(url.indexOf('?')>=0){
		url+="&";
	}
	else{
		url+="?";
	}
	url+="mgnlCK="+mgnlGetCacheKiller();

	var w=window.open(url,"mgnlDialog"+mgnlGetCacheKiller(),"width="+width+",height="+height+"scrollbars=no,status=yes,resizable=yes");
	if (w) w.focus();
	}


/* ###################################
### open dialog window
################################### */


function mgnlOpenDialog(path,nodeCollection,node,paragraph,repository,dialogPage,width,height)
	{

	//dialog window is resized in  dialog itself (window.resize)
    if (!width) width=800;
    if (!height) height=100;

	//magnolia edit window: add browser information (needed for rich editor)
    var agent=navigator.userAgent.toLowerCase();

	var richE="false";
	var richEPaste="";
	var richESupported=false;
	if (document.designMode)
		{
		//safari has designMode...
	    if (agent.indexOf("safari")==-1) richESupported=true;
		}
	if (richESupported)
		{
		//richedit
		richE="true";
		if (agent.indexOf("mac")!=-1) richEPaste="false";
		else if (agent.indexOf("msie")!=-1)  richEPaste="button";
		else richEPaste="textarea";
		}

	if (!dialogPage){
		dialogPage = ".magnolia/dialogs/" + paragraph + ".html";
	 	//dialogPage=".magnolia/dialogs/standard.html";
	}

    url="/";
    url+=dialogPage;
    url+="?mgnlPath="+path;
    url+="&mgnlNodeCollection="+nodeCollection;
	url+="&mgnlNode="+node;
	url+="&mgnlParagraph="+paragraph;
	url+="&mgnlRichE="+richE;
	url+="&mgnlRichEPaste="+richEPaste;
	url+="&mgnlRepository="+repository;
	url+="&mgnlCK="+mgnlGetCacheKiller();

	var w=window.open(url,"mgnlDialog"+mgnlGetCacheKiller(),"width="+width+",height="+height+"scrollbars=no,status=yes,resizable=yes");
	if (w) w.focus();
	}


/* ###################################
### open tree browser
################################### */

function mgnlOpenTreeBrowser(pathSelected, pathOpen, repository, width, height, callBackCommand){
	mgnlDebug("mgnlOpenTreeBrowser","dialog");
	if (!width) width=450;
	if (!height) height=550;
	var src="/.magnolia/dialogpages/linkBrowser.html?mgnlCK="+mgnlGetCacheKiller();
	if (pathSelected) src+="&pathSelected="+pathSelected;
	if (pathOpen) src+="&pathOpen="+pathOpen;
	if (repository) src+="&repository="+repository;
	var w=window.open(src,"mgnlTreeBrowser","width="+width+",height="+height+",resizable=yes,status=yes,scrollbars=no");

	if (w){
		mgnlDebug("register call back function", "dialog");
		w.mgnlCallBackCommand = callBackCommand;
	}
}

function mgnlOpenTreeBrowserWithControl(control,pathSelected,pathOpen,repository,extension,width,height,addcontext){
	mgnlDebug("mgnlOpenTreeBrowserWithControl","dialog");
	var callBackCommand = new MgnlTreeBrowserWithControlCallBackCommand(control,extension,addcontext);
	mgnlOpenTreeBrowser(pathSelected, pathOpen, repository, width, height, callBackCommand)
}

/* ###################################
### tree browser default callback
################################### */

function MgnlTreeBrowserWithControlCallBackCommand(control, extension, addcontext){
	this.control = control;
	this.extension = extension;
	this.addcontext = addcontext;

	this.callback = function(value){
		if (this.addcontext){
		  value = contextPath + value;
		}

		if (this.extension){
			value += "." + extension;
		}

		mgnlDebug("MgnlTreeBrowserCallBackCommand: write to the control", "dialog");
		this.control.value = value;
	}
}



/* ###################################
### open adminCentral
################################### */

function mgnlOpenAdminCentral(path,repository)
	{
	var src="";
	src+="/.magnolia/adminCentral.html?mgnlCK="+mgnlGetCacheKiller();
	src+="&pathSelected="+path;
	if (repository) src+="&repository="+repository;
    var w=window.open(src,"mgnlAdminCentral","");
	if (w) w.focus();
	}






/* ###################################
### update mgnlCK in the extisting location string
################################### */

function mgnlUpdateCK(href)
	{
	if (!href) href=document.location.href;
	tmp=href.split("?")
	var href2=tmp[0]+"?mgnlCK="+new Date().getTime();
	if (tmp[1])
		{
		var qs=tmp[1].split("&");
		for (var elem=0; elem<qs.length; elem++)
			{
			if (qs[elem].indexOf("mgnlCK=")!=0) href2+="&"+qs[elem];
			}
		}
	return href2;
	}


/* ###################################
### alert
################################### */
function mgnlAlert(text,title)
	{
    var line="--------------------------------------------\n";
    var alertText="";
    alertText+=line;
    if (title) alertText+=title+"\n"+line;
   	alertText+="\n"+text+"\n";
   	alertText+=line;
   	alert(alertText);
	}

/* ###################################
### confirm
################################### */
function mgnlConfirm(text,title)
	{
    var line="--------------------------------------------\n";
    var alertText="";
    alertText+=line;
    if (title) alertText+=title+"\n"+line;
   	alertText+="\n"+text+"\n";
   	alertText+=line;
   	return confirm(alertText);
   	}


function eventHandlerOnResize(e)
	{
	//resize tabs before resize of trees (in case there are any trees on a tab)
	mgnlDialogResizeTabs();
	mgnlDialogLinkBrowserResize();
	mgnlTreeResize();
	mgnlAdminCentralResize();
	}
window.onresize = eventHandlerOnResize;

/* ###################################
### controls.js
################################### */

var mgnlControlButtonBorderDark="#396101";
var mgnlControlButtonBorderLight="#ADC97B";
var mgnlControlButtonPUSHED="_PUSHED";

function mgnlShiftDividedButton(id)
	{
	var button=document.getElementById(id);
	if (button)
		{
		var state;
		if (button.type=="checkbox") state=!button.checked;
		else state=true;
		button.checked=state;
		}
	}

function mgnlShiftPushButtonDown(button)
	{
	if (button.className.indexOf(mgnlControlButtonPUSHED)==-1)
		{
		button.style.borderTopColor=mgnlControlButtonBorderDark;
		button.style.borderLeftColor=mgnlControlButtonBorderDark;
		button.style.borderBottomColor=mgnlControlButtonBorderLight;
		button.style.borderRightColor=mgnlControlButtonBorderLight;
		}
	}

function mgnlShiftPushButtonOut(button)
	{
	button.style.borderTopColor="";
	button.style.borderLeftColor="";
	button.style.borderBottomColor="";
	button.style.borderRightColor="";
	}

function mgnlShiftPushButtonClick(button)
	{
	if (button.id.indexOf("_SETBUTTON_")!=-1)
		{
		//is part of a button set (radio, e.g. tab buttons) -> disable all other buttons
		var baseId=button.id.substring(0,button.id.lastIndexOf("_"));
		var i=0;
		var className=button.className;
		if (className.indexOf(mgnlControlButtonPUSHED)==-1)
			{
			while (document.getElementById(baseId+"_"+i))
				{
				var currentButton=document.getElementById(baseId+"_"+i)
				currentButton.className=className;
				i++;
				}
			button.className=className+mgnlControlButtonPUSHED;
			}
		}
	mgnlShiftPushButtonOut(button); //get rid of hilighted borders
	}



/* ###################################
### tree.js
################################### */

	var globalCounter=0; //for debugging

	//#################
	//### Tree
	//### repository: the repository name
	//### name: the name of the javascript tree
	//### handlerName: the name of the tree handler
	//### browseMode: true if the tree is showed in the link browser.
	//#################

	function mgnlTree(repository, path, name, height, handlerName, browseMode) {
		if(handlerName == null){
			handlerName = repository;
		}

		if(browseMode == null){
			browseMode = false;
		}

		this.repository=repository;
		this.path=path;
		this.name=name;
		this.handlerName = handlerName;
		this.browseMode = browseMode;
		mgnlDebug("new mgnlTree", "tree", this);

		document.write('<div id="'+name+'_'+path+'_DivSub" style="display:none;"></div>');
		this.divMain=document.getElementById(name+"_"+path+"_DivMain");
		// this is setted afterward because a cyclic dependency for the conditions
		this.menu = null;

		this.addressBar=document.getElementById(name+"AddressBar");
		this.divMoveShadow=document.getElementById(name+"_MoveShadow");
		this.divMoveDenied=document.getElementById(name+"_MoveDenied");


		this.nodes=new Object();
		this.selectedNode=this.getNode(path);

		this.clipboardNode=null;
		this.clipboardMethod=null;

		this.lastEditedHtmlObject;
		this.lastEditedOriginalValue="";
		this.lastEditedNode;
		this.lastEditedName="";
		this.lastEditedIsMeta=false;
		this.lastEditedIsLabel=false;
		this.lastEditedIsNodeDataValue=false;
		this.lastEditedIsNodeDataType=false;

		this.columns=new Array();

		this.columnResizerDiv=document.getElementById(name+"_ColumnResizerDiv");
		this.columnResizerLine=document.getElementById(name+"_ColumnResizerLine");
		this.columnHeaderDiv=document.getElementById(name+"_ColumnHeader");

		this.height=height;

		this.paddingLeft=8;
		this.paddingRight=8;
		this.paddingTop=0;
		this.paddingBottom=0;
		this.columnResizerGifWidthHalf=4;
		this.columnResizerGifWidth=9;
		this.columnSpacing=8;
		this.columnMinimumWidth=50;

		this.colors=new Object();
		this.colors.nodeHighlight="#F0F2E6";
		this.colors.nodeSelected="#e0e0e0";

		this.strings=new Object();
		this.strings.saving=mgnlMessages.get('js.tree.saving');
		this.strings.loading=mgnlMessages.get('js.tree.loading');
		this.strings.empty="-";

		this.moveDontReset=false;
		this.moveDenied=false;
		this.moveDeniedTimeout=200;
		this.moveLastMouseoverId=null;
	}


	mgnlTree.prototype.expandNode = function(path)
		{
		mgnlDebug('tree.expandNode','tree');

		var chunks=path.split("/");
		var id="";

		for (var i=1;i<chunks.length;i++) //i==1: first chunk is empty: /en/bla -> [], [en], [bla]
			{
			id+="/"+chunks[i];
			var node=this.nodes[id];

			if (node)
				{
				node.expand();
				}
			else
				{
				node=this.getNode(id);

				var divSub=document.getElementById(node.divSubId);
				if (divSub.innerHTML=="")
					{
					var params=new Object();
					params.pathSelected=path;
					node.expand(params);
					break;
					}
				}
			}
		this.selectNode(path);
		}


	mgnlTree.prototype.shifterDown = function(id)
		{
		this.moveDontReset=true;
		this.shiftNode(id);
		}

	mgnlTree.prototype.shifterOut = function()
		{
		this.moveDontReset=false;
		}


	mgnlTree.prototype.shiftNode = function(id)
		{
		var node=this.getNode(id);
		node.shift();
		}

	mgnlTree.prototype.selectNode = function(id)
		{
		mgnlDebug("selectNode:" + id, "tree");
		var sNode=this.getNode(id);
		var divMain=document.getElementById(sNode.divMainId);
		mgnlDebug("selectNode: divMainId:" + sNode.divMainId, "tree");

		var divMainSelected=document.getElementById(this.selectedNode.divMainId);

		if (divMain && this.selectedNode.divMainId!=sNode.divMainId)
			{
			if (divMainSelected)
				{
				divMainSelected.style.backgroundColor="";
				divMainSelected.style.textDecoration="";
				}
			divMain.style.backgroundColor=this.colors.nodeSelected;
			this.addressBar.value=id;
		    this.selectedNode=sNode;
		    }
		}


	mgnlTree.prototype.getNode = function(id)
		{
		var node=this.nodes[id];
		if (!node)
			{
			node=new mgnlTreeNode(this,id);
			this.nodes[id]=node;
			}
		return node;
		}


	mgnlTree.prototype.dragColumnStart = function(resizerGif,resizerNumber)
		{
		if (!mgnlDragTreeColumn)
			{
			var line=this.columnResizerLine;
			line.style.left=mgnlGetPosX(this.divMain)-this.paddingLeft+parseInt(resizerGif.style.left)+this.columnResizerGifWidthHalf+resizerNumber*this.columnResizerGifWidth-1;
			line.style.visibility="visible";
			line.style.top=mgnlGetPosY(this.divMain);
			line.style.height=parseInt(this.divMain.style.height)+1;

			this.columnResizerGif=resizerGif;
			this.columnResizerLine=line;
			this.columnResizerNumber=resizerNumber;

			mgnlDragTreeColumn_Tree=this;
			mgnlDragTreeColumn=true;
			}
		}



	mgnlTree.prototype.dragColumnStop = function()
		{
		//todo: resize edit control!

		mgnlDragTreeColumn=false;
		this.columnResizerLine.style.visibility="hidden";

		var tmp=this.columnResizerGif.id;
		var columnNumber=tmp.replace(this.name+"ColumnResizer",""); //mgnlTreeControlColumnResizer2 -> 2

		var lastLeft=0;
		var resizeAll=false;
		for (var i=0;i<this.columns.length-1;i++)
			{
			var colReGif=document.getElementById(this.name+"ColumnResizer"+(i+1));
			//var left=parseInt(colReGif.style.left)-this.columnResizerGifWidth+this.columnSpacing;
			var left=parseInt(colReGif.style.left)+((i-2)*this.columnResizerGifWidthHalf)-2;
			if (left<lastLeft+this.columnMinimumWidth)
				{
				left=lastLeft+this.columnMinimumWidth+this.columnSpacing;
				resizeAll=true;
				}
			var w=left-lastLeft;
			this.columns[i].width=w;
			lastLeft=left;

			if (i==this.columns.length-2)
				{
				var w=parseInt(this.divMain.style.width)-left;
           		if (w<this.columnMinimumWidth)
           			{
           			w=this.columnMinimumWidth;
           			resizeAll=true;
           			}
				this.columns[i+1].width=w;
				}
			}

		if (resizeAll) this.resize();
		else this.resize(columnNumber);
		}


	mgnlTree.prototype.dragColumn = function(x,y)
		{
		//todo: stop at next dragger
		this.columnResizerGif.style.left=x+1-mgnlGetPosX(this.divMain)-this.columnResizerGifWidthHalf-(this.columnResizerGifWidth*(this.columnResizerNumber-1));
		//this.columnResizerLine.style.left=x-this.paddingLeft;
		this.columnResizerLine.style.left=x+1;
		}

	mgnlTree.prototype.getColumnsWidth = function()
		{
		var w=0;
		for (var elem in this.columns)
			{
			w+=this.columns[elem].width;
			}
		return w;
		}

	mgnlTree.prototype.resizeOnload = function(){
	    if (navigator.userAgent.toLowerCase().indexOf("safari")==-1) {
	    	mgnlDebug("resizeOnload: not safari","tree");
	    	this.resize();
	    }
	    else{
  	    	mgnlDebug("resizeOnload: safari","tree");
	    	setTimeout("mgnlTreeResizeOnloadSafari('"+this.name+"');",200);
	    }
	}

	function mgnlTreeResizeOnloadSafari(treeName){
		mgnlDebug("mgnlTreeResizeOnloadSafari: safari","tree");
		var tree=eval(treeName);
		tree.resize();
	}

	mgnlTree.prototype.resize = function(columnNumber){
		//no columnNumber passed: resize all columns (@ resizing window)
		//columnNumber passed: resize only this column and re-clip the one before (@ resizing column)

		if (this.divMain){
			var sizeObj=mgnlGetWindowSize();

			//resize tree div
		    var agent=navigator.userAgent.toLowerCase();
		    //todo: to be tested!
		    if (agent.indexOf("msie")!=-1) this.divMain.style.width=sizeObj.w;
			else this.divMain.style.width=sizeObj.w-this.paddingLeft-this.paddingRight-2;

			this.divMain.style.height=sizeObj.h-49;

			//resize columns
			var quotient=sizeObj.w/this.getColumnsWidth();
			var sizeObjX=sizeObj;

			//todo: move to init (tree or column?)!!!

			//rules property differs in browsers
			var rulesKey;
			if (document.all){
				rulesKey="rules";
			}
			else if (document.getElementById){
				rulesKey="cssRules";
			}
			mgnlDebug("mgnlTree.resize: running with rules: " + rulesKey, "tree");

			// for each stylesheet included
			var treeColumnClasses=new Object();
			//for (var elem0 in document.styleSheets) //does not work in firebird 0.8, safari 1.2
			// internal styles seems to be always in last styleSheets, therefor top down
			//to do: define break point!
			for (var elem0 = document.styleSheets.length-1; elem0>=0; elem0--) {
				mgnlDebug("mgnlTree.resize: styleSheets[elem0].href = " + document.styleSheets[elem0].href, "tree");

                var rules=document.styleSheets[elem0][rulesKey];
				mgnlDebug("mgnlTree.resize: rules", "tree", rules);

				//for (var elem1 in rule) //does not work in firebird 0.8, safari 1.2
				for (var elem1=0; elem1<rules.length; elem1++){
					//mgnlDebug("mgnlTree.resize: rules[elem1]", "tree", rules[elem1]);

					var cssClass=rules[elem1].selectorText;
					// in safar 1.3 the selectorText is in lower case
					if (cssClass && cssClass.toLowerCase().indexOf("." + this.name.toLowerCase() + "cssclasscolumn")!=-1){
						treeColumnClasses[cssClass.toLowerCase()]=rules[elem1];
					}
				}
			}

			var left=0;
			for (var elem in this.columns){
				//var cssClassObj=this.columns[elem].cssClass;
				// in safari is it lowercase
				var cssClass="."+this.name.toLowerCase()+"cssclasscolumn"+elem;
				var cssClassObj=treeColumnClasses[cssClass];
				var columnWidth=parseInt(this.columns[elem].width*quotient);
				var columnWidthWithoutSpacing=columnWidth-this.columnSpacing;
				//resize columne (by setting the left and clip attribute of its css class
				if (cssClassObj){
					if (!columnNumber || elem==columnNumber){
						cssClassObj.style.left=left;
					}
					if (!columnNumber || elem==columnNumber || elem==columnNumber-1){
						cssClassObj.style.clip="rect(0 "+columnWidthWithoutSpacing+" 100 0)";
					}
					this.columns[elem].width=columnWidth;
				}
				//place the column resizer
				var columnResizer=document.getElementById(this.name+"ColumnResizer"+elem);
				this.columnResizerDiv.style.top=mgnlGetPosY(this.divMain)-2;
				this.columnResizerDiv.style.left=mgnlGetPosX(this.divMain);

				this.columnHeaderDiv.style.top=mgnlGetPosY(this.divMain)-18;
				this.columnHeaderDiv.style.left=mgnlGetPosX(this.divMain)+this.paddingLeft;
				if (columnResizer){
					if (!columnNumber || elem==columnNumber){
						var offsetResizerWidthSum=(elem-1)*(this.columnResizerGifWidth); //position is relative!
						columnResizer.style.left=left-offsetResizerWidthSum+this.columnResizerGifWidthHalf+1+parseInt(elem);
                    }
				}
				left+=columnWidth;
			}
		}
	}


	mgnlTree.prototype.nodeHighlight = function(htmlObject,id,permissionWrite)
		{
		var doHighlight=true;
		if (mgnlTreeMoveNode)
			{
			//only highlight first column (_Name)
			var idPost=htmlObject.id.substring(htmlObject.id.lastIndexOf("_"));
			if (idPost!="_Name" || !permissionWrite) doHighlight=false;
			}

		//if (!mgnlTreeMoveNode || permissionWrite)
		if (doHighlight)
			{
			//note: this.nodes[i] may not be initialized yet; therefor build mainDiv manualy
			var mainDivId=this.name+"_"+id+"_DivMain";
			var mainDiv=document.getElementById(mainDivId);
			if (mainDivId!=this.selectedNode.divMainId)
				{
				mainDiv.style.backgroundColor=this.colors.nodeHighlight;
				}

			if (mgnlTreeMoveNode)
				{
				this.moveLastMouseoverId=htmlObject.id;
				this.moveDenied=false;
				this.divMoveDenied.style.visibility="hidden";
				}
			}
		}

	mgnlTree.prototype.nodeReset = function	(htmlObject,id)
		{
		//note: this.nodes[i] may not be initialized yet
		var mainDivId=this.name+"_"+id+"_DivMain";
		var mainDiv=document.getElementById(mainDivId);
		if (mainDivId!=this.selectedNode.divMainId)
			{
			mainDiv.style.backgroundColor="";
			}
		if (mgnlTreeMoveNode)
			{
			//to avoid flickering show the denied icon after a short timeout
			this.moveDenied=true;
			setTimeout("mgnlTreeMoveDeniedHide('"+this.name+"','"+htmlObject.id+"')",this.moveDeniedTimeout);
			//this.divMoveDenied.style.visibility="visible";
			}
		}
	function mgnlTreeMoveDeniedHide(treeName,mouseOutId)
		{
		var tree=eval(treeName);
		if (tree.moveDenied && tree.moveLastMouseoverId==mouseOutId)
			{
			tree.divMoveDenied.style.visibility="visible";
			}
		}

	mgnlTree.prototype.selectedNodeReset = function()
		{
		var divMain=document.getElementById(this.selectedNode.divMainId);
		divMain.style.backgroundColor="";
		this.selectedNode=this.getNode(this.path); //root
		}


	mgnlTree.prototype.mainDivReset = function()
		{
		this.menuHide();
		this.moveReset();
		}

	mgnlTree.prototype.menuShow = function(event)
		{
		if (this.menu)
			{
			this.menu.show(event);
			}
		}

	mgnlTree.prototype.menuHide = function()
		{
		if (this.menu)
			{
			this.menu.hide();
			}
		}

	mgnlTree.prototype.createRootNode = function(createItemType)
		{
		this.selectedNode=this.getNode(this.path);
		this.createNode(createItemType);
		}


	mgnlTree.prototype.createNode = function(createItemType)
		{
		//todo: select root / ...
		var parentNode=this.selectedNode;

		//todo:fix
		//if (!parentNode) parentNode=this.nodes["/"];


		var params=new Object();
		params.forceReload=true;
		params.createItemType=createItemType;

		parentNode.expand(params);
		//parentNode.expand(true,'','',createItemType,'');

		var shifter=document.getElementById(parentNode.shifterId);
		if (shifter) shifter.src=shifter.src.replace("EMPTY","COLLAPSE");
		}


	mgnlTree.prototype.deleteNode = function()
		{
		var text=mgnlMessages.get('js.tree.deletenode.confirm.text', null, [this.selectedNode.id]);
		var title=mgnlMessages.get('js.tree.deletenode.confirm.title');
		if (!this.selectedNode.isActivated || mgnlConfirm(text,title))
			{
			var parentNode=this.getNode(this.selectedNode.parentId);
			var deleteNode=this.selectedNode.label;

			//reset to tree's root path
			this.selectedNodeReset();


			var params=new Object();
			params.forceReload=true;
			params.deleteNode=deleteNode;

			parentNode.expand(params);
			//parentNode.expand(true,'','',null,deleteNode);
			}
		}

    mgnlTree.prototype.exportNode = function(keepVersions)
		{
		var text=mgnlMessages.get('js.tree.exportnode.confirm.text');
		var title=mgnlMessages.get('js.tree.exportnode.confirm.title', null, [this.selectedNode.id]);

		if (mgnlConfirm(text,title))
			{

			keepVersions = keepVersions!=null ? keepVersions: false;
		    var url="/.magnolia/mgnl-export/file.xml?exportxml=true&mgnlFormat=true&mgnlRepository=" + this.repository + "&mgnlPath=" + this.selectedNode.id + "&mgnlKeepVersions=" + keepVersions;

		    location.href=url;
			}
		}

    mgnlTree.prototype.importNode = function(link, keepVersions, uuidBehavior)
		{
			keepVersions = keepVersions!=null ? keepVersions: false;
			// create new uuid
			uuidBehavior = uuidBehavior!=null ? uuidBehavior: 0;

           	var strDiv ='<form method="post" enctype="multipart/form-data" action="/.magnolia/mgnl-import/import.html">';
			strDiv +='<input type="hidden" name="mgnlRepository" value="' + this.repository + '">';
			strDiv +='<input type="hidden" name="mgnlPath" value="' + this.selectedNode.id + '">';
			strDiv +='<input type="hidden" name="mgnlKeepVersions" id="mgnlKeepVersions" value="'+keepVersions+'"/>';
			strDiv +='<input type="hidden" name="mgnlUuidBehavior" id="mgnlUuidBehavior" value="'+uuidBehavior+'"/>';

			strDiv +='<input type="hidden" name="mgnlRedirect" value="/.magnolia/adminCentral/extractTree.html?name=' + this.handlerName + '">';
			strDiv +='<input type="file" name="mgnlFileImport" id="mgnlFileImport" /><br/>';

			strDiv +='<input type="submit" class="mgnlImportButton" name="importxml" value="' + mgnlMessages.get('js.import.button') + '" />';
			strDiv +='<input type="button" class="mgnlImportButton" value="' + mgnlMessages.get('js.import.button.close') + '" onclick="document.body.removeChild(this.parentNode.parentNode)" />';
            strDiv +='</form>';

            var resDiv = document.createElement('div');
		    resDiv.id= "mgnlImportdiv";
		    document.body.appendChild(resDiv);
		    resDiv.innerHTML = strDiv;

		    $('mgnlImportdiv').style.left = (mgnlGetPosX(link) + 20) + "px";
		    $('mgnlImportdiv').style.top = mgnlGetPosY(link) + "px";

		}


	mgnlTree.prototype.copyNode = function()
		{
		mgnlTreeMoveNode=true;
		mgnlTreeMoveNode_Tree=this;
		this.clipboardNode=this.selectedNode;
		this.clipboardMethod=1; //Tree.ACTION_COPY
		}

	mgnlTree.prototype.cutNode = function()
		{
		mgnlTreeMoveNode=true;
		mgnlTreeMoveNode_Tree=this;
		this.clipboardNode=this.selectedNode;
		this.clipboardMethod=0; //Tree.ACTION_MOVE

		var divMain=document.getElementById(this.selectedNode.divMainId);
		divMain.style.textDecoration="line-through";
		}

	mgnlTree.prototype.pasteNode = function(id,pasteType,permissionWrite,lineDivId){
		if (mgnlTreeMoveNode && permissionWrite){
			if (this.clipboardMethod==0 && id.indexOf(this.clipboardNode.id)==0 && pasteType!=0){
				//move into itself is not possible
				mgnlAlert(mgnlMessages.get('js.tree.pastenode.itself'));
			}
		    else if (this.clipboardMethod==1 && id.indexOf(this.clipboardNode.id)==0 && pasteType!=0){
                //move into itself is not possible
                mgnlAlert(mgnlMessages.get('js.tree.pastenode.itself'));
             }
			else{
				// confirm deactivation
				
				var text=mgnlMessages.get('js.tree.movenode.confirm.text', null, [this.selectedNode.id]);
				var title=mgnlMessages.get('js.tree.movenode.confirm.title');
				// only alert if this is a moving action
				if (!this.getNode(id).isActivated || this.clipboardMethod==1 || mgnlConfirm(text,title)){
					if (lineDivId){
						//for last line on root level
						var lineDiv=document.getElementById(lineDivId);
						lineDiv.style.backgroundImage="";
					}
					this.moveReset();
	
					this.selectedNode=this.getNode(id);
					var parentPath=this.selectedNode.id.substring(0,this.selectedNode.id.lastIndexOf("/"));
					if (parentPath=="") parentPath="/";
	
					var pathToReload;
					if (this.clipboardMethod==0){
						//paste after cut
						if (this.clipboardNode.id.indexOf(parentPath)==0){
							 //e.g. sort inside a directory or paste into sister: reload selected
							 pathToReload=parentPath;
						}
						else{
							//no hokums, reload root
							pathToReload=this.path;
						}
					}
					else{
						//paste after copy
						if (pasteType==2){
							//Tree.PASTETYPE_SUB: reload selected
							pathToReload=this.selectedNode.id;
	
							var shifter=document.getElementById(this.selectedNode.shifterId);
							if (shifter){
								var src=shifter.src;
								src=src.replace("EMPTY","COLLAPSE");
								src=src.replace("EXPAND","COLLAPSE");
								shifter.src=src;
							}
						}
						else {
							//reload parent of selected
							pathToReload=parentPath;
						}
					}
	
					var nodeToReload=this.getNode(pathToReload);
	
					var params=new Object();
					params.forceReload=true;
					params.treeAction=this.clipboardMethod;
					params.pathClipboard=this.clipboardNode.id;
					params.pathSelected=this.selectedNode.id;
					params.pasteType=pasteType;
	
					nodeToReload.expand(params);
				}
			}
			this.clipboardNode=null;
			this.clipboardMethod=null;
			this.moveReset();
		}
	}

	mgnlTree.prototype.moveNode = function(x,y)
		{
		if (this.divMoveShadow.style.visibility=="hidden")
			{
			//initalize
			var icon=document.getElementById(this.selectedNode.iconId);
			var shadowSrc=icon.src;
			var label=document.getElementById(this.selectedNode.labelId).innerHTML;

			this.divMoveShadow.innerHTML='<img src="'+shadowSrc+'"><span class="mgnlTreeText">'+label+'</span>';
			this.divMoveShadow.style.visibility="visible";
			this.divMoveDenied.style.visibility="visible";
			}
		this.divMoveShadow.style.left=x+6;
		this.divMoveShadow.style.top=y+11;
		this.divMoveDenied.style.left=x+10;
		this.divMoveDenied.style.top=y+2;
		}

	mgnlTree.prototype.moveNodeHighlightLine = function(divId)
		{
		if (mgnlTreeMoveNode)
			{
			mgnlDebug("highlight line" + divId, "tree");
			div=document.getElementById(divId);
			div.style.backgroundImage="url(" + contextPath + "/admindocroot/controls/tree/line_internode.gif)";
			this.divMoveDenied.style.visibility="hidden";
			this.moveLastMouseoverId=div.id;
			this.moveDenied=false;
			}
		}

	mgnlTree.prototype.moveNodeResetLine = function(divId)
		{
		if (mgnlTreeMoveNode)
			{
			div=document.getElementById(divId);
			div.style.backgroundImage="";

			//to avoid flickering show the denied icon after a short timeout
			this.moveDenied=true;
			setTimeout("mgnlTreeMoveDeniedHide('"+this.name+"','"+div.id+"')",this.moveDeniedTimeout);
			}
		}

	mgnlTree.prototype.moveReset = function()
		{
		if (mgnlTreeMoveNode && !this.moveDontReset)
			{
			mgnlTreeMoveNode=false;
			mgnlTreeMoveNode_Tree=null;
			this.moveDenied=false;
			this.divMoveShadow.style.visibility="hidden";
			this.divMoveDenied.style.visibility="hidden";
			var divMain=document.getElementById(this.selectedNode.divMainId);
            divMain.style.textDecoration="";
			divMain.style.backgroundColor="";
			}
		}

	mgnlTree.prototype.activateNode = function(action,recursive)
		{
		var parentPath=this.selectedNode.id.substring(0,this.selectedNode.id.lastIndexOf("/"));
		if (parentPath=="") parentPath=this.path; //root
		var nodeToReload=this.getNode(parentPath);

		var params=new Object();
		params.forceReload=true;
		params.treeAction=action;
 		params.pathSelected=this.selectedNode.id;
		if (recursive) params.recursive=recursive;

		nodeToReload.expand(params);
		}

	mgnlTree.prototype.deActivateNode = function(action)
		{
		var parentPath=this.selectedNode.id.substring(0,this.selectedNode.id.lastIndexOf("/"));
		if (parentPath=="") parentPath=this.path; //root
		var nodeToReload=this.getNode(parentPath);

		var params=new Object();
		params.forceReload=true;
		params.treeAction=action;
 		params.pathSelected=this.selectedNode.id;

		nodeToReload.expand(params);
		}



	mgnlTree.prototype.editNodeData = function(span,id,columnNumber)
		{
		var column=this.columns[columnNumber];
		var htmlEdit=column.htmlEdit;
		if (htmlEdit!="")
			{
			var value=span.innerHTML;

			if (value.toLowerCase().indexOf("<input")!=0 && value.toLowerCase().indexOf("<select")!=0)
			//else: already in edit mode!
				{
				span.innerHTML=htmlEdit;

				var control=document.getElementById(this.name+"_EditNodeData");
				if (value!=this.strings.saving && value!=this.strings.empty)
					{
					if (control.type=="select-one")
						{
						for (var i=0;i<control.options.length;i++)
							{
							var text=control.options[i].innerHTML;
							//alert(text+"::"+value+"::"+i);
							if (text==value)
								{
								control.selectedIndex=i;
								break;
								}
							}
						}
					else
						{
						control.value=value;
						}
					}

				//resize control
				var controlWidth=this.columns[columnNumber].width-10;
				if (columnNumber==0)
					{
					//first column, subtract padding and 30 for switcher and icon
					var outerSpan=document.getElementById(this.name+"_"+id+"_Column0Outer");
					var padding=outerSpan.style.paddingLeft;
					if (padding) padding=parseInt(padding);
					else padding=0;
					controlWidth=controlWidth-padding-30;
					}
				if (controlWidth<10) controlWidth=10;
				control.style.width=controlWidth;

				control.focus();

				this.lastEditedHtmlObject=span;
				this.lastEditedOriginalValue=value;
				this.lastEditedName=column.name;
				this.lastEditedIsMeta=column.isMeta;
				this.lastEditedIsLabel=column.isLabel;
				this.lastEditedIsNodeDataValue=column.isNodeDataValue;
				this.lastEditedIsNodeDataType=column.isNodeDataType;
				this.lastEditedNode=this.nodes[id];
				}
			}
		}

	mgnlTree.prototype.resetNodeData = function()
		{
		if (this.lastEditedHtmlObject)
			{
			this.lastEditedHtmlObject.innerHTML=this.lastEditedOriginalValue;
			this.lastEditedHtmlObject=null;
			this.lastEditedOriginalValue="";
			this.lastEditedName="";
			this.lastEditedIsMeta=false;
			this.lastEditedIsLabel=false;
            this.lastEditedIsNodeDataValue=false;
			this.lastEditedIsNodeDataLabel=false;
			this.lastEditedNode=null;
			}
		}

	mgnlTree.prototype.editNodeDataKeydown = function(event,control)
		{
		if (mgnlIsKeyEscape(event))
			{
			this.resetNodeData();
			}
		else if (mgnlIsKeyEnter(event))
			{
			control.blur(); //blur event calls saveNodeData!
			}
		}


	// display is optional. use it if the column display is not the same as the saved value
	// this is not a good solution, because the system should return the label instead of passing it

	mgnlTree.prototype.saveNodeData = function(value, displayValue)
		{
		var exit=false;
		if (value==this.lastEditedOriginalValue || (value=="" && this.lastEditedOriginalValue==this.strings.empty))
			{
			exit=true;
			}
		else if (this.lastEditedIsLabel && this.lastEditedNode.isActivated)
			{
			if (!mgnlConfirm(mgnlMessages.get('js.tree.savenode.confirmDeactivation.text'),
								mgnlMessages.get('js.tree.savenode.confirmDeactivation.title')))
				{
				exit=true;
				}
			}

		if (exit)
			{
			this.resetNodeData();
			return;
			}
		else
			{
			//todo: create params object (see node.expand()
			var node=this.lastEditedNode;
			var htmlObject=this.lastEditedHtmlObject;
			if (htmlObject == null) {
			  return;
			}
			var name=this.lastEditedName;
			var isMeta=this.lastEditedIsMeta;
			var isLabel=this.lastEditedIsLabel;
			var isNodeDataValue=this.lastEditedIsNodeDataValue;
			var isNodeDataType=this.lastEditedIsNodeDataType;
			if(displayValue==null) {
				displayValue="";
            }
			this.lastEditedHtmlObject=null;
			this.lastEditedOriginalValue="";
			this.lastEditedName="";
			this.lastEditedIsMeta=false;
			this.lastEditedIsLabel=false;
			this.lastEditedIsNodeDataType=false;
			this.lastEditedIsNodeDataValue=false;
			this.lastEditedNode=null;

			htmlObject.innerHTML=this.strings.saving;
			setTimeout("mgnlTreeSaveNodeData('"+htmlObject.id+"','"+node.id+"','"+this.name+"','"+name+"','"+escape(value)+"',"+isMeta+","+isLabel+","+isNodeDataValue+","+isNodeDataType+",'" + escape(displayValue)+"');",10);
			}
		}

	mgnlTree.prototype.refresh = function()
		{
		var rootNode=this.getNode(this.path);
		var params=new Object();
		params.forceReload=true;
		params.pathSelected=this.selectedNode.id;
		rootNode.expand(params);
		}

	mgnlTreeSaveNodeData = function (lastEditedHtmlObjectId,id,treeName,saveName,saveValue,isMeta,isLabel,isNodeDataValue,isNodeDataType, displayValue)
		{
		var tree=eval(treeName);

		var params=new Object();
		params.saveName=saveName;
		params.saveValue=saveValue;
		params.isMeta=isMeta;
		params.isLabel=isLabel;
		params.isNodeDataValue=isNodeDataValue;
		params.isNodeDataType=isNodeDataType;
		params.pathSelected='';
		params.pathOpen='';
		params.displayValue=displayValue;

		var callBackParams=new Object();
		callBackParams.id = id;
		callBackParams.treeName = treeName;
		callBackParams.lastEditedHtmlObjectId = lastEditedHtmlObjectId;
		callBackParams.isLabel = isLabel;

		// async
		tree.nodes[id].httpRequest(params, callBackParams, mgnlTreeSaveNodeDataCallback);
		}

	/**
	callback for mgnlTreeSaveNodeData
	**/
	mgnlTreeSaveNodeDataCallback = function (params, html)
		{

		var id = params.id;
		var treeName = params.treeName;
		var lastEditedHtmlObjectId = params.lastEditedHtmlObjectId;

		var tree=eval(treeName);
		var isLabel=params.isLabel;


		if (html=="") html=tree.strings.empty;

		html = mgnlAlertCallbackMessage(html);
		
		document.getElementById(lastEditedHtmlObjectId).innerHTML=html;

		if (isLabel)
			{
			//reload parent

			//todo: highlight renamed (s. copy/move; hidden field mgnlSelectNode)
			var parentPath=id.substring(0,id.lastIndexOf("/"));
			var selectedPath=parentPath+"/"+html;

			if (!parentPath) parentPath="/";

			var parent=tree.getNode(parentPath);

			var nodeParams=new Object();
			nodeParams.forceReload=true;
			nodeParams.pathSelected=selectedPath;

			parent.expand(nodeParams);

			//reset tree nodes
			tree.nodes=new Object();
			}
		}



	function mgnlTreeResize()
		{
		for (var elem in mgnlTreeControls)
			{
			var tree=mgnlTreeControls[elem];
			mgnlTreeControls[elem].resize();
			}
		}





	//#################
	//### TreeColumn
	//#################

	function mgnlTreeColumn(width,htmlEdit,name,isMeta,isLabel,isNodeDataValue,isNodeDataType)
		{
		this.width=width;
		this.htmlEdit=htmlEdit;
		this.name=name;
		this.isMeta=isMeta;
		this.isLabel=isLabel;
		this.isNodeDataValue=isNodeDataValue;
		this.isNodeDataType=isNodeDataType;
		}


	//#################
	//### TreeNode
	//#################

	function mgnlTreeNode(treeControl,id)
		{
		this.id = id;
		this.path = id;

		if (id.lastIndexOf("/")==0) this.parentId="/"; //parent is root
		else this.parentId=id.substring(0,id.lastIndexOf("/"));

		this.label=id.substring(id.lastIndexOf("/")+1);

		this.idPre=treeControl.name+"_"+id;
		this.repository=treeControl.repository;
		this.treeName=treeControl.name;
		this.tree=treeControl;

		if (document.getElementById(this.idPre+"_ItemType"))
			{
			this.itemType=document.getElementById(this.idPre+"_ItemType").value;
			}
		if (document.getElementById(this.idPre+"_IsActivated"))
			{
			if (document.getElementById(this.idPre+"_IsActivated").value=="true") this.isActivated=true;
			else this.isActivated=false;
			}
		if (document.getElementById(this.idPre+"_PermissionWrite"))
			{
			if (document.getElementById(this.idPre+"_PermissionWrite").value=="true") this.permissionWrite=true;
			else this.permissionWrite=false;
			}

		//html objects get lost, therefore use id and getElement on the float
		this.divMainId=this.idPre+"_DivMain";
		this.shifterId=this.idPre+"_Shifter";
		this.divSubId=this.idPre+"_DivSub";
		this.iconId=this.idPre+"_Icon";
		this.labelId=this.idPre+"_Column0Main";

        this.url=document.location.href.substring(0,document.location.href.indexOf("?"));
		}


	mgnlTreeNode.prototype.getHttpRequest = function()
		{
		var httpReq;
		if (window.XMLHttpRequest) httpReq = new XMLHttpRequest();
		else if (window.ActiveXObject) httpReq = new ActiveXObject("Microsoft.XMLHTTP"); //IE/Windows ActiveX
		return httpReq;
		}

	mgnlTreeNode.prototype.httpRequest = function(params, callBackParams, callback)
		{
		/*
		//todo: clean up ... (e.g. isMeta, isLabel etc. to treeAction)

		* params is object of key/value pairs
		* possible keys:
		--------------------------------------------------------------------
		pathOpen: path to open
		//check! and remove? pathSelected: path to select -> does not work (js is not executed at remote scripting);
		--------------------------------------------------------------------
		* create and remove nodes
		createItemType: String; type of the item [NT_CONTENT | NT_CONTENTNODE | NT_NODEDATA]
		deleteNode: node to delete
		--------------------------------------------------------------------
		* save node data values
		* save node data types
		* save names (label) of data or nodes (rename)
		saveName: name of the item which has to be saved
		saveValue: value to be saved
		isMeta: boolean - nodeData 'saveName' is meta data
		isLabel: boolean -> move 'this.path' to 'saveValue' (rename)
		isNodeDataValue: boolean - item to save is value of node data 'saveName' ('config admin')
		isNodeDataType: boolean - item to save is type of node data 'saveName' ('config admin')
		--------------------------------------------------------------------
		* paste nodes
		treeAction: [ MOVE | COPY ]
		pathClipboard: path to move or copy //todo: mutliple selection
		pathSelected: path to move to
		pasteType: put pathOrigin [ ABOVE | BELOW | SUB ] of pathDestination
		--------------------------------------------------------------------
		* activate
		recursive: activate selected and sub nodes

		*/

		var httpReq=this.getHttpRequest();
		if (httpReq)
			{
			var paramString = "treeMode=snippet";
			paramString+="&path="+this.path;
			paramString+="&name="+this.tree.handlerName;
			paramString+="&browseMode="+this.tree.browseMode;
			paramString+="&mgnlCK="+mgnlGetCacheKiller();
			for (var elem in params)
				{
				if (params[elem] || params[elem]=="0") {
				    // ="0": createItemType; MAGNOLIA_NODE_DATA is 0
					paramString+="&"+encodeURIComponent(elem)+"="+encodeURIComponent(unescape(params[elem])); //values seems to be passed escaped ...
					}
				}
			mgnlDebug("node.httpRequest: paramString: " + paramString, "tree");
            // paramters need to be passed in body to allow utf8 encoding (query string is always ISO-88591)
			httpReq.open("POST",encodeURI(this.url),true);
			httpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

			// register handler after the the request called after the request returned
			httpReq.onreadystatechange=function() {
			   if (httpReq.readyState==4) {
			    var returnText=httpReq.responseText;
			    callback(callBackParams, returnText);
			   }
			}

			httpReq.send(paramString);
			return;
			}

		else return;
		}

	mgnlTreeNode.prototype.shift = function()
		{
		var shifter=document.getElementById(this.shifterId);

		if (shifter && shifter.src.indexOf("EMPTY")==-1)
			{
			var divSub=document.getElementById(this.divSubId);
			if (divSub.style.display=="none") this.expand();
			else this.collapse();
			}
		}

	mgnlTreeNode.prototype.collapse = function()
		{
		mgnlDebug('node.collapse','tree');
		var divSub=document.getElementById(this.divSubId);
		if (divSub.style.display!="none")
			{
			divSub.style.display="none";
			var shifter=document.getElementById(this.shifterId);
			if (shifter) shifter.src=shifter.src.replace("COLLAPSE","EXPAND");

			if (this.tree.selectedNode.id.indexOf(this.id+"/")==0)
				{
				this.tree.selectedNodeReset();
				}
			}
		}



	mgnlTreeNode.prototype.expand = function(params)
		{
		mgnlDebug('node.expand','tree');
		/*
		* params is object of key/value pairs
		* see mgnlTreeNode.prototype.httpRequest
		*/

		if (!params) params=new Object();

		var shifter=document.getElementById(this.shifterId);
		var divSub=document.getElementById(this.divSubId);

		if (!params.forceReload && shifter && shifter.src.indexOf("EMPTY")!=-1) return;
		if (params.forceReload || (divSub && divSub.style.display=="none"))
			{
			//todo: find out, why divSub is not available always ...
			if (divSub) divSub.style.display="block";
			if (shifter) shifter.src=shifter.src.replace("EXPAND","COLLAPSE");
			if (params.forceReload || divSub.innerHTML=="")
				{
                var left=0;
                if (document.getElementById(this.idPre+"_Column0Main"))
                	{
                	left=parseInt(document.getElementById(this.idPre+"_Column0Outer").style.paddingLeft);
                	if (left) left+=30;
                	else left=30;
                	}
				//todo: find out, why divSub is not available always ...
                if (divSub) divSub.innerHTML="<div class=mgnlTreeTextLoading style=padding-left:"+left+";>"+this.tree.strings.loading+"</div>";

		        this.params=params;

				setTimeout("mgnlTreeDrawNodes('"+this.id+"','"+this.treeName+"');",10);
				}
			}
		}

	mgnlTreeDrawNodes = function (id,treeName)
		{
		var div=document.getElementById(treeName+"_"+id+"_DivSub");
		var tree=eval(treeName);

		var node=tree.getNode(id);
		var params=node.params;
		if (!params) params=new Object();

		var callBackParams=new Object();
		callBackParams.id = id;
		callBackParams.treeName = treeName;

		mgnlDebug('mglnTreeDrawNodes with treeName: ' + treeName, "tree");
		mgnlDebug('mglnTreeDrawNodes used params', "tree", params);
		mgnlDebug('mglnTreeDrawNodes used callBackParams', "tree", callBackParams);

		node.httpRequest(params, callBackParams, mgnlTreeDrawNodesCallback);

		}

/**
callback
**/
    mgnlTreeDrawNodesCallback = function (params, html) {

        var id = params.id;
        var treeName = params.treeName;

		var div=document.getElementById(treeName+"_"+id+"_DivSub");
		var tree=eval(treeName);
		
        if (div) div.innerHTML=html;

		if (id==tree.path){
			//reset tree
			tree.nodes=new Object();
			tree.selectedNode=tree.getNode(tree.path);
			tree.clipboardNode=null;
			tree.clipboardMethod=null;
		}

		html = mgnlAlertCallbackMessage(html);

		var selectPath=params.pathSelected;
		var selectNodePattern='<input type="hidden" id="mgnlSelectNode" value="';
		
		if (html.indexOf(selectNodePattern)==0)
			{
			mgnlDebug('mgnlTreeDrawNodesCallback', "tree");
			var tmp=html.substring(0,html.indexOf("\" />"));
			tmp=tmp.replace(selectNodePattern,"");

			if (tmp!="") selectPath=tmp;
			}

		if (selectPath)
			{
			mgnlDebug('selectPath: ' + selectPath, "tree")
			//tree.selectNode(tree.path);
			tree.selectNode(selectPath);
			}

		if (html=="")
			{
			var shifter=document.getElementById(tree.nodes[id].shifterId);
			if (shifter)
				{
				shifter.src=shifter.src.replace("COLLAPSE","EMPTY")
				}
			}

}

	function mgnlAlertCallbackMessage(html){
		var messagePattern='<input type="hidden" id="mgnlMessage" value="';

		// check if alert message was sent back
		if (html.indexOf(messagePattern) != -1){
			var start = html.indexOf(messagePattern);
			var end = html.indexOf("\" />", start);
			var msg = html.slice(start + messagePattern.length, end);
			alert(msg);
			html = html.slice(end);
		}
		return html;
	}
/* ###################################
### contextmenu.js
################################### */

/* ###################################
### ContextMenu Class
################################### */

/* ###################################
### Constructor
################################### */

function mgnlContextMenu(name){
	this.divMenu=document.getElementById(name+"_DivMenu");
	this.menuItems=new Array();
	this.colors=new Object();
	this.colors.menuHighlight="#F0F2E6";

	if(!this.divMenu){
		alert('no div for the context [' + name + '] menu found');
	}
}

mgnlContextMenu.prototype.show = function(event){
	if (this.divMenu)
		{
		//todo: (hack) find out height/width of div
		var divMenuHeight=0;
		var divMenuWidth=150;
		for (var i=0;i<this.menuItems.length;i++)
			{
			divMenuHeight+=18; //17: item height; 1: possible line
			var item=this.menuItems[i];

			//reset class name: remove _DISABLED (if existing)
			item.div.className=item.div.className.replace("_DISABLED","");
			var disabled=false;
			for (var elem in item.conditions)
				{
				if (item.conditions[elem].test()==false)
					{
					disabled=true;
					break;
					}
				}

			if (disabled)
				{
				item.div.className+="_DISABLED";
				item.div.onclick="";
				}
			else
				{
				item.div.onclick=item.onclick;
				}
			}
		var pos=mgnlGetMousePos(event);

		var left=pos.x+2;
		var top=pos.y+2;
		var windowSize=mgnlGetWindowSize();
		if (windowSize.h<top+divMenuHeight+25)
			{
			top=windowSize.h-divMenuHeight-25;
			if (top<0) top=0;
			}
		if (windowSize.w<left+divMenuWidth+30)
			{
			left=windowSize.w-divMenuWidth-30;
			if (left<0) left=5;
			}

		this.divMenu.style.left=left;
		this.divMenu.style.top=top;
		this.divMenu.style.visibility="visible";
		}
	//event.returnValue=false;
}

mgnlContextMenu.prototype.hide = function()
	{
	if (this.divMenu)
		{
		this.divMenu.style.visibility="hidden";
		}
	}


mgnlContextMenu.prototype.menuItemHighlight = function(item)
	{
	if (item.className.indexOf("_DISABLED")==-1)
		{
		item.style.backgroundColor=this.colors.menuHighlight;
		}
	}

mgnlContextMenu.prototype.menuItemReset = function(item)
	{
	item.style.backgroundColor="";
	}

//#################
//### TreeMenuItem
//#################

function mgnlContextMenuItem(id){
	this.id=id;
	this.div=document.getElementById(id);
	this.onclick=this.div.onclick;
}


//##########################################
//### Conditions for coloring the menu items
//##########################################

function mgnlTreeMenuItemConditionBoolean(bool){
	this.bool = bool;

	this.test = function(){
		return bool;
	}
}

function mgnlTreeMenuItemConditionSelectedNotRoot(tree){
	this.tree = tree;

	this.test = function(){
		if (this.tree.selectedNode.id!=this.tree.path) return true;
		else return false;
	}
}


function mgnlTreeMenuItemConditionSelectedNotNodeData(tree)
	{
	this.tree = tree;

	this.test = function(){
		if (this.tree.selectedNode.itemType!="mgnl:nodeData") return true;
		else return false;
	}
}

function mgnlTreeMenuItemConditionSelectedNotContentNode(tree)
	{
	this.tree = tree;

	this.test = function(){
		if (this.tree.selectedNode.itemType!="mgnl:contentNode") return true;
		else return false;
	}
}

function mgnlTreeMenuItemConditionSelectedNotContent(tree)
	{
	this.tree = tree;

	this.test = function(){
		if (this.tree.selectedNode.itemType!="mgnl:content") return true;
		else return false;
	}
}

function mgnlTreeMenuItemConditionPermissionWrite(tree)
	{
	this.tree = tree;

	this.test = function(){
		if (this.tree.selectedNode.permissionWrite) return true;
		else return false;
	}
}

//#################
//### Common Commands
//#################

	function mgnlTreeMenuItemOpen(tree)
		{
		var url= contextPath + tree.selectedNode.path+".html";
		var w=window.open(url,"mgnlInline","");
		if (w) w.focus();
		}

	function mgnlTreeMenuOpenDialog(tree,dialogPath)
		{
		var path=tree.selectedNode.id;
		mgnlOpenDialog(path,'','','',tree.repository,dialogPath);
		}


/* ###################################
### adminCentral.js
################################### */

function mgnlAdminCentralResize(){
	var divExtractTree=document.getElementById("mgnlAdminCentral_ExtractTreeDiv");
	var divExtractNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeDiv");
	var divButtons=document.getElementById("mgnlAdminCentral_ButtonsDiv");

	if (divExtractTree && divButtons){
		if (navigator.userAgent.toLowerCase().indexOf("safari")!=-1){
			divExtractNonTree.style.display="block";
		}

		var sizeObj=mgnlGetWindowSize();
		//80 is top position of divTrees
		var h=sizeObj.h-80-20;
		//20 is left position of divTrees
		var w=sizeObj.w-200-20;


		//todo: to be tested!
		var agent=navigator.userAgent.toLowerCase();
		if (agent.indexOf("msie")!=-1) divButtons.style.height=h-29;
		else divButtons.style.height=h-37;

		divExtractTree.style.width=w;
		divExtractTree.style.height=h;
		var iFrameTree=document.getElementById("mgnlAdminCentral_ExtractTreeIFrame");
		iFrameTree.style.height=h;

		divExtractNonTree.style.width=w;
		divExtractNonTree.style.height=h-30;
		var iFrameNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeIFrame");
		iFrameNonTree.style.height=h-30;
	}
}

function mgnlAdminCentralSwitchExtractTree(name,href){
	var divExtractTree=document.getElementById("mgnlAdminCentral_ExtractTreeDiv");
	var divExtractNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeDiv");

	divExtractTree.style.visibility="hidden";
	divExtractNonTree.style.visibility="hidden";

	if (navigator.userAgent.toLowerCase().indexOf("safari")==-1){
		divExtractTree.style.display="block";
		divExtractNonTree.style.display="none";
	}

	// clean only if this is an internal page (else one get's an security exception
	try{
		mgnlGetIFrameDocument('mgnlAdminCentral_ExtractTreeIFrame').open("plain/text");
	}
	catch(e){
	}
	
	if (!href) 
		href="/.magnolia/adminCentral/extractTree.html";

	href=mgnlAddParameter(href,"mgnlCK",mgnlGetCacheKiller());
	href=mgnlAddParameter(href,"name", name);
	document.getElementById('mgnlAdminCentral_ExtractTreeIFrame').src = contextPath + href;

	divExtractTree.style.visibility="visible";
}

function mgnlAdminCentralSwitchExtractNonTree(href, external){
	external = external == null? false : external;
		
	var divExtractTree=document.getElementById("mgnlAdminCentral_ExtractTreeDiv");
	var divExtractNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeDiv");

	divExtractTree.style.visibility="hidden";
	divExtractNonTree.style.visibility="hidden";

	if (navigator.userAgent.toLowerCase().indexOf("safari")==-1){
		divExtractTree.style.display="none";
		divExtractNonTree.style.display="block";
	}

	divExtractNonTree.style.visibility="visible";

	// clean only if this is an internal page (else one get's an security exception
	try{
		mgnlGetIFrameDocument('mgnlAdminCentral_ExtractNonTreeIFrame').open("plain/text");
	}
	catch(e){
	}
	
	if( ! external){
		href = contextPath + href;
		href=mgnlAddParameter(href,"mgnlCK",mgnlGetCacheKiller());
	}
	document.getElementById('mgnlAdminCentral_ExtractNonTreeIFrame').src = href;
}
/* ###################################
### inline.js
################################### */


/* ###################################
### preview
################################### */

function mgnlPreview(prev)
	{
	var href=mgnlUpdateCK(document.location.href)


   	href=mgnlRemoveParameter(href,"mgnlIntercept");
   	href=mgnlAddParameter(href,"mgnlIntercept","PREVIEW");

    href=mgnlRemoveParameter(href,"mgnlPreview");
   	if (prev) href=mgnlAddParameter(href,"mgnlPreview","true");
	else href=mgnlAddParameter(href,"mgnlPreview","false");

	document.location.href=href;
	}



/* ###################################
### delete paragraph
################################### */

function mgnlDeleteNode(path,paragraphName,nodeName)
	{
	var alertText = mgnlMessages.get("js.inline.delete.text");
	if (mgnlConfirm(alertText,mgnlMessages.get("js.inline.delete.title")))
		{
		var href=mgnlUpdateCK(document.location.href)

		href=mgnlRemoveParameter(href,"mgnlIntercept");
		href=mgnlAddParameter(href,"mgnlIntercept","NODE_DELETE");

		href=mgnlRemoveParameter(href,"mgnlPath");
		href=mgnlAddParameter(href,"mgnlPath",path+"/"+paragraphName+"/"+nodeName);

		window.location.href=href;
		}
	else return;
	}




/* ###################################
### move paragraphs
################################### */

var mgnlMoveNode; //selected container name
var mgnlMoveNodeCollection; //selected container list name

//divs which will be placed onMouseMove
//shadow: half transparent and scaled down editBar
document.write('<div id="mgnlMoveDivShadow"></div>');
//denied: denied sign
document.write('<div id="mgnlMoveDivDenied"></div>');
//allowed: text 'Move above here'
document.write('<div id="mgnlMoveDivAllowed" style="visibility:hidden">' + mgnlMessages.get('js.inline.move.aboveThisOne') + '</div>');

var mgnlMoveDont=false;
//move will not start as long as mgnlMoveDont is true
//set true when clicking a button on a editBar ((and on timeout at mgnlMoveReset()))

//var mgnlMove=false; //true as long as a container is selected
// -> moved to general.js

function mgnlMoveNodeStart(containerList,container,barId)
	{
	if (!mgnlMoveDont && !mgnlMove)
		{
		var bar=document.getElementById(barId);
		mgnlMoveNodeSetClassName(bar,"PUSHED");

		//var tmp=bar.id.split('__');
		mgnlMoveNodeCollection=containerList;
		mgnlMoveNode=container;

		var divShadow=document.getElementById('mgnlMoveDivShadow');
		divShadow.style.visibility='visible';

		var divDenied=document.getElementById('mgnlMoveDivDenied');
		var divAllowed=document.getElementById('mgnlMoveDivAllowed');
		if (divAllowed.style.visibility=='hidden') divDenied.style.visibility='visible'; // only if new selection

		mgnlMove=true;
		}
	}


function mgnlMoveNodeSetClassName(bar,state)
	{
    if (!state) state="NORMAL";
    var base=bar.className;
    if (base.indexOf("_")!=-1) base=base.substring(0,base.indexOf("_"));
    if (state=="NORMAL") bar.className=base;
    else if (state=="PUSHED") bar.className=base+"_PUSHED";
    else if (state=="MOUSEOVER") bar.className=base+"_MOUSEOVER";
 	}

 function mgnlMoveNodeHigh(bar)
	{
	var tmp=bar.id.split('__');
	if (mgnlMove)
		{
		if (tmp[0]==mgnlMoveNodeCollection && tmp[1]!=mgnlMoveNode)
			{
			//same container list and not the container to move: highlight this bar
		    mgnlMoveNodeSetClassName(bar,"MOUSEOVER");
			var divDenied=document.getElementById('mgnlMoveDivDenied');
			divDenied.style.visibility='hidden';
			var divAllowed=document.getElementById('mgnlMoveDivAllowed');
			divAllowed.style.visibility='visible';
			}
		}
	}

function mgnlMoveNodeReset(bar)
	{
	tmp=bar.id.split('__');
	if (mgnlMove)
		{
		if (tmp[0]==mgnlMoveNodeCollection)
			{
			//same containre list
			if (tmp[1]!=mgnlMoveNode)
				{
				//not the container to move: reset this bar
				mgnlMoveNodeSetClassName(bar,"NORMAL");
				}
			var divDenied=document.getElementById('mgnlMoveDivDenied');
			divDenied.style.visibility='visible';
			var divAllowed=document.getElementById('mgnlMoveDivAllowed');
			divAllowed.style.visibility='hidden';
			}
		}
	}

 function mgnlMoveNodeEnd(bar,path)
	{
	if (mgnlMove)
		{
		var tmp=bar.id.split('__');
		if (mgnlMoveNodeCollection==tmp[0] && mgnlMoveNode!=tmp[1])
			{
			//same container list and not container to move
			mgnlMoveNodeSetClassName(bar,"PUSHED");
			var href=document.location.href;
			var pathSelected=path+"/"+mgnlMoveNodeCollection+"/"+mgnlMoveNode;
			var pathSortAbove=path+"/"+mgnlMoveNodeCollection+"/"+tmp[1];


			//'MoveNodeCollection='+mgnlMoveNodeCollection+'&MoveNode='+mgnlMoveNode+'&MoveNodeAbove='+tmp[1]+'&path='+path+'&actions=moveNode';
			//var href='/.CMSadmin/tagRequestHandler.html?MoveNodeCollection='+mgnlMoveNodeCollection+'&MoveNode='+mgnlMoveNode+'&MoveNodeAbove='+tmp[1]+'&path='+path+'&actions=moveNode';
			href=mgnlUpdateCK(href)

			href=mgnlRemoveParameter(href,"mgnlIntercept");
			href=mgnlAddParameter(href,"mgnlIntercept","NODE_SORT");

			href=mgnlRemoveParameter(href,"mgnlPathSelected");
			href=mgnlAddParameter(href,"mgnlPathSelected",pathSelected);

			href=mgnlRemoveParameter(href,"mgnlPathSortAbove");
			href=mgnlAddParameter(href,"mgnlPathSortAbove",pathSortAbove);

			document.location.href=href;
			}
		}
	}




