/* Merged Plone Javascript file
 * This file is dynamically assembled from separate parts.
 * Some of these parts have 3rd party licenses or copyright information attached
 * Such information is valid for that section,
 * not for the entire composite file
 * originating files are separated by ----- filename.js -----
 */

/* ----- mark_special_links.js ----- */
/* Scan all links in the document and set classes on them if
 * they point outside the site, or are special protocols
 * To disable this effect for links on a one-by-one-basis,
 * give them a class of 'link-plain'
 */

function scanforlinks() {
    // terminate if we hit a non-compliant DOM implementation
    if (!W3CDOM) { return false; }

    contentarea = getContentArea();
    if (!contentarea) { return false; }

    links = contentarea.getElementsByTagName('a');
    for (i=0; i < links.length; i++) {
        if ( (links[i].getAttribute('href'))
             && (links[i].className.indexOf('link-plain')==-1) ) {
            var linkval = links[i].getAttribute('href');

            // check if the link href is a relative link, or an absolute link to
            // the current host.
            if (linkval.toLowerCase().indexOf(window.location.protocol
                                              + '//'
                                              + window.location.host)==0) {
                // absolute link internal to our host - do nothing
            } else if (linkval.indexOf('http:') != 0) {
                // not a http-link. Possibly an internal relative link, but also
                // possibly a mailto or other protocol add tests for relevant
                // protocols as you like.
                protocols = ['mailto', 'ftp', 'news', 'irc', 'h323', 'sip',
                             'callto', 'https', 'feed', 'webcal'];
                // h323, sip and callto are internet telephony VoIP protocols
                for (p=0; p < protocols.length; p++) {
                    if (linkval.indexOf(protocols[p]+':') == 0) {
                        // if the link matches one of the listed protocols, add
                        // className = link-protocol
                        wrapNode(links[i], 'span', 'link-'+protocols[p]);
                        break;
                    }
                }
            } else {
                // we are in here if the link points to somewhere else than our
                // site.
                if ( (links[i].getElementsByTagName('img').length == 0)
                      && (links[i].className.indexOf('state-published')==-1) ) {
                    // we do not want to mess with those links that already have
                    // images in them
                    wrapNode(links[i], 'span', 'link-external');
                    // uncomment the next line if you want external links to be
                    // opened in a new window.
                    // links[i].setAttribute('target', '_blank');
                }
            }
        }
    }
};

registerPloneFunction(scanforlinks);


/* ----- fckeditor.js ----- */
/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2008 Frederico Caldeira Knabben
 *
 * == BEGIN LICENSE ==
 *
 * Licensed under the terms of any of the following licenses at your
 * choice:
 *
 *  - GNU General Public License Version 2 or later (the "GPL")
 *    http://www.gnu.org/licenses/gpl.html
 *
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 *    http://www.gnu.org/licenses/lgpl.html
 *
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
 *    http://www.mozilla.org/MPL/MPL-1.1.html
 *
 * == END LICENSE ==
 *
 * This is the integration file for JavaScript.
 *
 * It defines the FCKeditor class that can be used to create editor
 * instances in a HTML page in the client side. For server side
 * operations, use the specific integration system.
 */

// FCKeditor Class
var FCKeditor = function( instanceName, width, height, toolbarSet, value )
{
	// Properties
	this.InstanceName	= instanceName ;
	this.Width			= width			|| '100%' ;
	this.Height			= height		|| '200' ;
	this.ToolbarSet		= toolbarSet	|| 'Default' ;
	this.Value			= value			|| '' ;
	this.BasePath		= FCKeditor.BasePath ;
	this.CheckBrowser	= true ;
	this.DisplayErrors	= true ;

	this.Config			= new Object() ;

	// Events
	this.OnError		= null ;	// function( source, errorNumber, errorDescription )
}

/**
 * This is the default BasePath used by all editor instances.
 */
FCKeditor.BasePath = '/fckeditor/' ;

/**
 * The minimum height used when replacing textareas.
 */
FCKeditor.MinHeight = 200 ;

/**
 * The minimum width used when replacing textareas.
 */
FCKeditor.MinWidth = 750 ;

FCKeditor.prototype.Version			= '2.6.3' ;
FCKeditor.prototype.VersionBuild	= '19836' ;

FCKeditor.prototype.Create = function()
{
	document.write( this.CreateHtml() ) ;
}

FCKeditor.prototype.CreateHtml = function()
{
	// Check for errors
	if ( !this.InstanceName || this.InstanceName.length == 0 )
	{
		this._ThrowError( 701, 'You must specify an instance name.' ) ;
		return '' ;
	}

	var sHtml = '' ;

	if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
	{
		sHtml += '<input type="hidden" id="' + this.InstanceName + '" name="' + this.InstanceName + '" value="' + this._HTMLEncode( this.Value ) + '" style="display:none" />' ;
		sHtml += this._GetConfigHtml() ;
		sHtml += this._GetIFrameHtml() ;
	}
	else
	{
		var sWidth  = this.Width.toString().indexOf('%')  > 0 ? this.Width  : this.Width  + 'px' ;
		var sHeight = this.Height.toString().indexOf('%') > 0 ? this.Height : this.Height + 'px' ;

		sHtml += '<textarea name="' + this.InstanceName +
			'" rows="4" cols="40" style="width:' + sWidth +
			';height:' + sHeight ;

		if ( this.TabIndex )
			sHtml += '" tabindex="' + this.TabIndex ;

		sHtml += '">' +
			this._HTMLEncode( this.Value ) +
			'<\/textarea>' ;
	}

	return sHtml ;
}

FCKeditor.prototype.ReplaceTextarea = function()
{
	if ( !this.CheckBrowser || this._IsCompatibleBrowser() )
	{
		// We must check the elements firstly using the Id and then the name.
		var oTextarea = document.getElementById( this.InstanceName ) ;
		var colElementsByName = document.getElementsByName( this.InstanceName ) ;
		var i = 0;
		while ( oTextarea || i == 0 )
		{
			if ( oTextarea && oTextarea.tagName.toLowerCase() == 'textarea' )
				break ;
			oTextarea = colElementsByName[i++] ;
		}

		if ( !oTextarea )
		{
			alert( 'Error: The TEXTAREA with id or name set to "' + this.InstanceName + '" was not found' ) ;
			return ;
		}

		oTextarea.style.display = 'none' ;

		if ( oTextarea.tabIndex )
			this.TabIndex = oTextarea.tabIndex ;

		this._InsertHtmlBefore( this._GetConfigHtml(), oTextarea ) ;
		this._InsertHtmlBefore( this._GetIFrameHtml(), oTextarea ) ;
	}
}

FCKeditor.prototype._InsertHtmlBefore = function( html, element )
{
	if ( element.insertAdjacentHTML )	// IE
		element.insertAdjacentHTML( 'beforeBegin', html ) ;
	else								// Gecko
	{
		var oRange = document.createRange() ;
		oRange.setStartBefore( element ) ;
		var oFragment = oRange.createContextualFragment( html );
		element.parentNode.insertBefore( oFragment, element ) ;
	}
}

FCKeditor.prototype._GetConfigHtml = function()
{
	var sConfig = '' ;
	for ( var o in this.Config )
	{
		if ( sConfig.length > 0 ) sConfig += '&amp;' ;
		sConfig += encodeURIComponent( o ) + '=' + encodeURIComponent( this.Config[o] ) ;
	}

	return '<input type="hidden" id="' + this.InstanceName + '___Config" value="' + sConfig + '" style="display:none" />' ;
}

FCKeditor.prototype._GetIFrameHtml = function()
{
	var sFile = 'fckeditor.html' ;

	try
	{
		if ( (/fcksource=true/i).test( window.top.location.search ) )
			sFile = 'fckeditor.original.html' ;
	}
	catch (e) { /* Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error). */ }

	var sLink = this.BasePath + 'editor/' + sFile + '?InstanceName=' + encodeURIComponent( this.InstanceName ) ;
	if (this.ToolbarSet)
		sLink += '&amp;Toolbar=' + this.ToolbarSet ;

	html = '<iframe id="' + this.InstanceName +
		'___Frame" src="' + sLink +
		'" width="' + this.Width +
		'" height="' + this.Height ;

	if ( this.TabIndex )
		html += '" tabindex="' + this.TabIndex ;

	html += '" frameborder="0" scrolling="no"></iframe>' ;

	return html ;
}

FCKeditor.prototype._IsCompatibleBrowser = function()
{
	return FCKeditor_IsCompatibleBrowser() ;
}

FCKeditor.prototype._ThrowError = function( errorNumber, errorDescription )
{
	this.ErrorNumber		= errorNumber ;
	this.ErrorDescription	= errorDescription ;

	if ( this.DisplayErrors )
	{
		document.write( '<div style="COLOR: #ff0000">' ) ;
		document.write( '[ FCKeditor Error ' + this.ErrorNumber + ': ' + this.ErrorDescription + ' ]' ) ;
		document.write( '</div>' ) ;
	}

	if ( typeof( this.OnError ) == 'function' )
		this.OnError( this, errorNumber, errorDescription ) ;
}

FCKeditor.prototype._HTMLEncode = function( text )
{
	if ( typeof( text ) != "string" )
		text = text.toString() ;

	text = text.replace(
		/&/g, "&amp;").replace(
		/"/g, "&quot;").replace(
		/</g, "&lt;").replace(
		/>/g, "&gt;") ;

	return text ;
}

;(function()
{
	var textareaToEditor = function( textarea )
	{
		var editor = new FCKeditor( textarea.name ) ;

		editor.Width = Math.max( textarea.offsetWidth, FCKeditor.MinWidth ) ;
		editor.Height = Math.max( textarea.offsetHeight, FCKeditor.MinHeight ) ;

		return editor ;
	}

	/**
	 * Replace all <textarea> elements available in the document with FCKeditor
	 * instances.
	 *
	 *	// Replace all <textarea> elements in the page.
	 *	FCKeditor.ReplaceAllTextareas() ;
	 *
	 *	// Replace all <textarea class="myClassName"> elements in the page.
	 *	FCKeditor.ReplaceAllTextareas( 'myClassName' ) ;
	 *
	 *	// Selectively replace <textarea> elements, based on custom assertions.
	 *	FCKeditor.ReplaceAllTextareas( function( textarea, editor )
	 *		{
	 *			// Custom code to evaluate the replace, returning false if it
	 *			// must not be done.
	 *			// It also passes the "editor" parameter, so the developer can
	 *			// customize the instance.
	 *		} ) ;
	 */
	FCKeditor.ReplaceAllTextareas = function()
	{
		var textareas = document.getElementsByTagName( 'textarea' ) ;

		for ( var i = 0 ; i < textareas.length ; i++ )
		{
			var editor = null ;
			var textarea = textareas[i] ;
			var name = textarea.name ;

			// The "name" attribute must exist.
			if ( !name || name.length == 0 )
				continue ;

			if ( typeof arguments[0] == 'string' )
			{
				// The textarea class name could be passed as the function
				// parameter.

				var classRegex = new RegExp( '(?:^| )' + arguments[0] + '(?:$| )' ) ;

				if ( !classRegex.test( textarea.className ) )
					continue ;
			}
			else if ( typeof arguments[0] == 'function' )
			{
				// An assertion function could be passed as the function parameter.
				// It must explicitly return "false" to ignore a specific <textarea>.
				editor = textareaToEditor( textarea ) ;
				if ( arguments[0]( textarea, editor ) === false )
					continue ;
			}

			if ( !editor )
				editor = textareaToEditor( textarea ) ;

			editor.ReplaceTextarea() ;
		}
	}
})() ;

function FCKeditor_IsCompatibleBrowser()
{
	var sAgent = navigator.userAgent.toLowerCase() ;

	// Internet Explorer 5.5+
	if ( /*@cc_on!@*/false && sAgent.indexOf("mac") == -1 )
	{
		var sBrowserVersion = navigator.appVersion.match(/MSIE (.\..)/)[1] ;
		return ( sBrowserVersion >= 5.5 ) ;
	}

	// Gecko (Opera 9 tries to behave like Gecko at this point).
	if ( navigator.product == "Gecko" && navigator.productSub >= 20030210 && !( typeof(opera) == 'object' && opera.postError ) )
		return true ;

	// Opera 9.50+
	if ( window.opera && window.opera.version && parseFloat( window.opera.version() ) >= 9.5 )
		return true ;

	// Adobe AIR
	// Checked before Safari because AIR have the WebKit rich text editor
	// features from Safari 3.0.4, but the version reported is 420.
	if ( sAgent.indexOf( ' adobeair/' ) != -1 )
		return ( sAgent.match( / adobeair\/(\d+)/ )[1] >= 1 ) ;	// Build must be at least v1

	// Safari 3+
	if ( sAgent.indexOf( ' applewebkit/' ) != -1 )
		return ( sAgent.match( / applewebkit\/(\d+)/ )[1] >= 522 ) ;	// Build must be at least 522 (v3)

	return false ;
}


/* ----- fck_plone.js ----- */
var FCKBaseHref = {};


// adapted from $Id: kupuploneeditor.js 9879 2005-03-18 12:04:00Z yuppie $
makeLinksRelative = function(basehref, contents) {
    var base=basehref.replace('http://www.mlc-wels.edu','');
    var href = base.replace(/\/[^\/]*$/, '/');
    var hrefparts = href.split('/');
    return contents.replace(/(<[^>]* (?:src|href)=")([^"]*)"/g,
        function(str, tag, url, offset, contents) {
            url=url.replace('http://www.mlc-wels.edu','');
            // gruikkk patch for old gecko content inner anchors fck bug
            if (url.substring(0,1)== '#') {
                str = tag + url +'"';
            }
            else {
                var urlparts = url.split('#');
                var anchor = urlparts[1] || '';
                url = urlparts[0];
                var urlparts = url.split('/');
                var common = 0;
                while (common < urlparts.length &&
                       common < hrefparts.length &&
                       urlparts[common]==hrefparts[common])
                    common++;
                var last = urlparts[common];
                if (common+1 == urlparts.length && last=='emptypage') {
                    urlparts[common] = '';
                }
                // The base and the url have 'common' parts in common.
                if (common > 0) {
                    var path = new Array();
                    var i = 0;
                    for (; i+common < hrefparts.length-1; i++) {
                        path[i] = '..';
                    };
                    while (common < urlparts.length) {
                        path[i++] = urlparts[common++];
                    };
                    if (i==0) {
                        path[i++] = '.';
                    }
                    str = path.join('/');
                    if (anchor) {
                        str = [str,anchor].join('#');
                    }
                    str = tag + str+'"';
                }
            }    
            return str;
        });
};

finalizePublication = function ( editorInstance ) {
   var oField = editorInstance.LinkedField;
   var fieldName = oField.name;
   var baseHref = FCKBaseHref[fieldName];
   if (baseHref) {
       relativeLinksHtml = makeLinksRelative(FCKBaseHref[fieldName], editorInstance.GetXHTML());
       oField.value = relativeLinksHtml;
   }  
   // for control only
   // alert(oField.value);
}


getParamValue = function (id) {
    value = document.getElementById(id).value;
    if (value=='true') return true;
    if (value=='false') return false;
    return value;
}


FCKeditor_Plone_start_instance = function (fckContainer, inputname) {
        var inputContainer = document.getElementById (inputname + '_' + 'cleaninput');
        if (inputContainer) {        
            var fckParams = [
                             'path_user', 'base_path', 'fck_basehref', 'links_basehref',
                             'input_url', 'allow_server_browsing', 'browser_root', 
                             'allow_file_upload', 'allow_image_upload', 'allow_flash_upload', 
                             'fck_skin_path', 'lang', 'fck_default_r2l', 'force_paste_as_text',  
                             'allow_latin_entities', 'spellchecker', 'keyboard_entermode', 
                             'keyboard_shiftentermode', 'fck_toolbar', 'editor_width', 'editor_height'
                             ];
            var fckValues = {};
            
            for (var i=0; i<fckParams.length; i++)  {
               var id = inputname + '_' + fckParams [i];
               fckValues [fckParams [i]] = getParamValue(id);
            }
            
            var oFck = new FCKeditor(inputname); 
            var pathUser = fckValues ['path_user'] + '/';          
            oFck.BasePath = fckValues ['base_path'] + '/';  
            oFck.Config['CustomConfigurationsPath'] = fckValues ['input_url'] + '/fckconfigPlone.js?field_name='+ inputname;
            oFck.BaseHref = fckValues ['fck_basehref'];
            FCKBaseHref[inputname] = fckValues ['links_basehref'];
            if (inputContainer.innerText != undefined) oFck.Value = inputContainer.innerText;
            else oFck.Value = inputContainer.textContent;
            oFck.Config['LinkBrowser'] = fckValues ['allow_server_browsing'];
            oFck.Config['LinkBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;
            oFck.Config['LinkUpload'] = fckValues ['allow_file_upload'] ;
            oFck.Config['LinkUploadURL'] = fckValues ['input_url'] + '/uploadPlone?field_name='+ inputname + '&CurrentPath=' + pathUser;
            oFck.Config['ImageBrowser'] = fckValues ['allow_server_browsing'];      
            oFck.Config['ImageBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Type=Image&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;
            oFck.Config['ImageUpload'] = fckValues ['allow_image_upload'] ; 
            oFck.Config['ImageUploadURL'] = fckValues ['input_url'] + '/uploadPlone?field_name='+ inputname + '&CurrentPath=' + pathUser;
            oFck.Config['FlashBrowser'] = fckValues ['allow_server_browsing'];
            oFck.Config['FlashBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Type=Flash&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;
            oFck.Config['FlashUpload'] = fckValues ['allow_flash_upload'] ; 
            oFck.Config['FlashUploadURL'] = fckValues ['input_url'] + '/uploadPlone?field_name='+ inputname + '&CurrentPath=' + pathUser;
            oFck.Config['MediaBrowser'] = fckValues ['allow_server_browsing'];
            oFck.Config['MediaBrowserURL'] = fckValues ['base_path'] + '/fckbrowser/browser.html?field_name='+ inputname + '&Type=Media&Connector=' + fckValues ['input_url'] + '/connectorPlone&ServerPath='+ fckValues ['browser_root'] + '&CurrentPath=' + pathUser ;        
            oFck.Config['SkinPath'] = fckValues ['base_path'] + '/editor/' + fckValues ['fck_skin_path'];
            oFck.Config['AutoDetectLanguage'] = false;
            oFck.Config['DefaultLanguage'] = fckValues ['lang'];
            oFck.Config['ForcePasteAsPlainText'] = fckValues ['force_paste_as_text'];
            oFck.Config['IncludeLatinEntities'] = fckValues ['allow_latin_entities'];
            oFck.Config['SpellChecker'] = fckValues ['spellchecker'];
            oFck.Config['EnterMode'] = fckValues ['keyboard_entermode'];
            oFck.Config['ShiftEnterMode'] = fckValues ['keyboard_shiftentermode'];
            oFck.ToolbarSet = fckValues ['fck_toolbar']; 
            oFck.Width = fckValues ['editor_width']; 
            oFck.Height = fckValues ['editor_height'];
            try {
               fckContainer.innerHTML = oFck.CreateHtml();
               document.getElementById(inputname + '_fckLoading').style.display = 'none';
            }
            catch(e) {
               document.getElementById(inputname + '_fckLoading').style.display = 'none';
               document.getElementById(inputname + '_fckError').style.display = 'block';
            }
        }  

}

Save_inline = function ( fieldname, form, editorInstance ) {  
    if (editorInstance.Commands.GetCommand('FitWindow').GetState()){
        kukit.log('Full screen mode must be disabled before saving inline');
        editorInstance.Commands.GetCommand('FitWindow').Execute();
    } ;
    saveField = document.getElementById(fieldname + '_fckSaveField');
    if (saveField) {
        kukit.log('Fire the savekupu server event = save inline without submitting');
        saveField.style.visibility='visible';
        if ( saveField.fireEvent ) {
            saveField.fireEvent('onChange');
        }
        else {
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent("change",true,true);
            saveField.dispatchEvent( evt );        
        }
        comp = (setTimeout("saveField.style.visibility='hidden'",2000));
        return false;
    }
    else {
        kukit.log('Try to submit the form in portal_factory');
        window.onbeforeunload = null;
        form.submit();
    }
}        



/* ----- fck_ploneInit.js ----- */
// only for Plone without kss

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}

function FCKeditor_OnComplete( editorInstance )
{
    editorInstance.Events.AttachEvent( 'OnAfterLinkedFieldUpdate', finalizePublication ) ;
}

// start all instances found in the page
FCKeditor_Plone_Init = function () {
    var fckContainers = getElementsByClassName (document, 'div', 'fckContainer');
    for(var i=0; i<fckContainers.length; i++){
        var fckContainer = fckContainers [i];
        var fckContainerId = fckContainer.getAttribute('id');
        var inputname = fckContainerId.replace("_fckContainer","");
        FCKeditor_Plone_start_instance (fckContainer, inputname);
    }     
}

registerPloneFunction(FCKeditor_Plone_Init);


/* ----- dragdropreorder.js ----- */
var ploneDnDReorder = {}

ploneDnDReorder.dragging = null;
ploneDnDReorder.table = null;
ploneDnDReorder.rows = null;

ploneDnDReorder.isDraggable = function(node) {
    return hasClassName(node, 'draggable');
};

ploneDnDReorder.doDown = function(e) {
    if (!e) var e = window.event; // IE compatibility
    var target = findContainer(this, ploneDnDReorder.isDraggable);
    if (target == null)
        return;
    for (var i=0; i<ploneDnDReorder.rows.length; i++)
        ploneDnDReorder.rows[i].onmousemove = ploneDnDReorder.doDrag;
    ploneDnDReorder.dragging = target;
    ploneDnDReorder.dragging._position = ploneDnDReorder.getPos(ploneDnDReorder.dragging);
    addClassName(ploneDnDReorder.dragging, "dragging");
    return false;
}

ploneDnDReorder.getPos = function(node) {
    var children = node.parentNode.childNodes;
    var pos = 0;
    for (var i=0; i<children.length; i++) {
        if (node == children[i])
            return pos;
        if (hasClassName(children[i], "draggable"))
            pos++;
    }
    return null;
}

ploneDnDReorder.doDrag = function(e) {
    if (!e) var e = window.event; // IE compatibility
    if (!ploneDnDReorder.dragging)
        return;
    var target = this;//findContainer(e.target, ploneDnDReorder.isDraggable);
    if (!target)
        return;
    if (target.id != ploneDnDReorder.dragging.id) {
        ploneDnDReorder.swapElements(target, ploneDnDReorder.dragging);
    }
    return false;
}

ploneDnDReorder.swapElements = function(child1, child2) {
    // currently, this works by building a list of all the
    // children, swapping the elements in this list, then
    // removing all the children and replacing them with our
    // list. there must be a more efficient way, but other approaches
    // i tried were buggy.
    var parent = child1.parentNode;
    var children = parent.childNodes;
    var items = new Array();
    for (var i = 0; i < children.length; i++) {
        var node = children[i];
        items[i] = node;
        if (node.id) {
            removeClassName(node, "even");
            removeClassName(node, "odd");
            if (node.id == child1.id)
                items[i] = child2;
            if (node.id == child2.id)
                items[i] = child1;
        }
    }
    Sarissa.clearChildNodes(parent);
    var pos = 0;
    for (var i = 0; i < items.length; i++) {
        var node = parent.appendChild(items[i]);
        if (node.id) {
            if (pos % 2)
                addClassName(node, "even");
            else
                addClassName(node, "odd");
            pos++;
        }
    }
}

ploneDnDReorder.doUp = function(e) {
    if (!e) var e = window.event; // IE compatibility
    if (!ploneDnDReorder.dragging)
        return;
    removeClassName(ploneDnDReorder.dragging, "dragging");
    ploneDnDReorder.updatePositionOnServer();
    ploneDnDReorder.dragging._position = null;
    try {
        delete ploneDnDReorder.dragging._position;
    } catch(e) {}
    ploneDnDReorder.dragging = null;
    for (var i=0; i<ploneDnDReorder.rows.length; i++)
        ploneDnDReorder.rows[i].onmousemove = null;
    return false;
}

ploneDnDReorder.updatePositionOnServer = function() {
    var delta = ploneDnDReorder.getPos(ploneDnDReorder.dragging) - ploneDnDReorder.dragging._position;

    if (delta == 0) // nothing changed
        return;
    var req = new XMLHttpRequest();
    req.open("POST", "folder_moveitem", true);
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    req.send("item_id="+ploneDnDReorder.dragging.id+"&delta:int="+delta);
}

ploneDnDReorder.initializeDragDrop = function() {
    ploneDnDReorder.table = cssQuery("table#sortable")[0];
    if (!ploneDnDReorder.table)
        return;
    ploneDnDReorder.rows = cssQuery("table#sortable > tr," +
                                    "table#sortable > tbody > tr");
    var targets = cssQuery("table#sortable > tr > td," +
                           "table#sortable > tbody > tr > td");
    for (var i=1; i<targets.length; i++) {
        targets[i].onmousedown=ploneDnDReorder.doDown;
        targets[i].onmouseup=ploneDnDReorder.doUp;
        addClassName(targets[i], "draggingHook");
    }
}

registerPloneFunction(ploneDnDReorder.initializeDragDrop);

