You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ha...@apache.org on 2009/10/15 06:48:58 UTC

svn commit: r825391 [11/18] - in /ofbiz/branches/addBirt/framework: base/config/ webapp/lib/ webapp/src/org/ofbiz/webapp/control/ webtools/ webtools/config/ webtools/data/helpdata/ webtools/servicedef/ webtools/src/org/ofbiz/birt/ webtools/src/org/ofbi...

Added: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtEventDispatcher.js
URL: http://svn.apache.org/viewvc/ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtEventDispatcher.js?rev=825391&view=auto
==============================================================================
--- ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtEventDispatcher.js (added)
+++ ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtEventDispatcher.js Thu Oct 15 04:48:28 2009
@@ -0,0 +1,244 @@
+/******************************************************************************
+ *	Copyright (c) 2004 Actuate Corporation and others.
+ *	All rights reserved. This program and the accompanying materials 
+ *	are made available under the terms of the Eclipse Public License v1.0
+ *	which accompanies this distribution, and is available at
+ *		http://www.eclipse.org/legal/epl-v10.html
+ *	
+ *	Contributors:
+ *		Actuate Corporation - Initial implementation.
+ *****************************************************************************/
+
+/**
+ *	BirtEventDispatcher
+ *	...
+ */
+BirtEventDispatcher = Class.create( );
+
+BirtEventDispatcher.prototype =
+{
+	__focusId : null,
+	
+	__event_map : { },
+	
+	/**
+	 *	Initialization routine required by "ProtoType" lib.
+	 *
+	 *	@return, void
+	 */
+	initialize : function( )
+	{
+	},
+
+	/**
+	 *	Register birt event handler with global birt event dispatcher to
+	 *	handle birt events (Not native events).
+	 *
+	 *	@eventType, pre-defined birt event type
+	 *	@id, ui object id
+	 *	@handler, birt event handler
+	 *	@return, void
+	 */
+	registerEventHandler : function( eventType, id, handler )
+	{
+	    if ( !this.__event_map[eventType] )
+	    {
+			this.__event_map[eventType] = { };
+	    }
+	    
+		this.__event_map[eventType][id] = handler;
+	},
+	
+	/**
+	 *	Register birt event handler with global birt event dispatcher to
+	 *	handle birt events (Not native events).
+	 *
+	 *	@eventType, pre-defined birt event type
+	 *	@id, ui object id
+	 *	@handler, birt event handler
+	 *	@return, void
+	 */
+	unregisterEventHandler : function( eventType, id )
+	{	
+		if( this.__event_map[eventType] && this.__event_map[eventType][id] )
+		{   
+			delete this.__event_map[eventType][id]; //deletes 'id' property
+		}
+	},
+	
+	/**
+	Unregisters all handlers associated with a particular id
+	@param id ui object id
+	*/
+	unregisterEventHandlerById : function( id )
+	{	
+		debug(birtEventDispatcher.toString());
+		for( var eventType in this.__event_map)
+		{
+			if( this.__event_map[eventType][id])
+			{
+				delete this.__event_map[eventType][id]; //deletes 'id' property
+			}
+		}
+		debug(birtEventDispatcher.toString());
+	},
+	
+	/**
+	 *	Register birt event handler with global birt event dispatcher to
+	 *	handle birt events (Not native events).
+	 *	If the event has already been registered under another handler,
+	 *  replace that handler with new handler.
+	 *
+	 *	@eventType, pre-defined birt event type
+	 *	@id, ui object id
+	 *	@handler, birt event handler
+	 *	@return, void
+	 */
+	replaceEventHandler : function( eventType, id, handler )
+	{
+	    if ( !this.__event_map[eventType] )
+	    {
+			this.__event_map[eventType] = { };
+	    }
+	    else
+	    {
+			for( var eventId in this.__event_map[eventType] )
+			{
+				delete this.__event_map[eventType][eventId]; //unregister previous event handler
+			}
+	    }
+	    
+		this.__event_map[eventType][id] = handler;
+	},
+	
+	/**
+	 *	Fire birt event. Objects that is or is the child of current focused object are waken.
+	 *	Their registered event handlers are triggered.
+	 *
+	 *	@eventType, pr-defined birt events.
+	 *	@object, event parameters.
+	 *	@return, void
+	 */
+	fireEvent : function( eventType, object )
+	{
+		var handled = this.sendEvent( eventType, object, false );
+		if ( !handled )
+		{
+			this.broadcastEvent( birtEvent.__E_WARN );
+		}
+	},
+	
+	/**
+	 *	Fire birt event. Objects that is or is the child of current focused object are waken.
+	 *	Their registered event handlers are triggered.
+	 *
+	 *	@eventType, pr-defined birt events.
+	 *	@object, event parameters.
+	 *	@return, void
+	 */
+	broadcastEvent : function( eventType, object )
+	{
+		this.sendEvent( eventType, object, true );
+	},
+
+	/**
+	 *	Fire birt event. Objects that is or is the child of current focused object are waken.
+	 *	Their registered event handlers are triggered.
+	 *
+	 *	@eventType, pr-defined birt events.
+	 *	@object, event parameters.
+	 *	@return, void
+	 */
+	sendEvent : function( eventType, object, isBroadcast )
+	{
+		var processed = false;
+		var serverCall = false;
+		var focus = this.__focusId ? this.__focusId : birtReportDocument.__instance.id;
+		
+		for ( var id in this.__event_map[ eventType ] )
+		{
+			if ( !isBroadcast && focus && focus != id )
+			{
+				// TODO: need more complex scheme.
+				continue;
+			}
+			
+			var handler = this.__event_map[ eventType ][ id ];
+			if ( handler )
+			{
+				processed = true;
+			}
+			if ( handler( id, object ) )
+			{
+				serverCall = true;
+			}
+		}
+		
+		if( serverCall )
+		{
+			birtCommunicationManager.connect( );
+		}
+		
+		return processed;
+	},
+
+	/**
+	 *	@param id id of current DOM element in focus.
+	 */
+	setFocusId : function( id )
+	{
+		this.__focusId = id;
+	},
+	
+	/**
+	 *	@return id id of current DOM element in focus.
+	 */
+	getFocusId : function( )
+	{
+		return this.__focusId;
+	},
+	
+	/**
+	 *	Convenience method.
+	 *
+	 *	@param element current DOM element in focus, must have id
+	 */
+	setFocusElement : function( element )
+	{
+		this.__focusId = element.id || null;
+	},
+	
+	/**
+	 *	Convenience method.
+	 *
+	 *	@return element current DOM element in focus
+	 */
+	getFocusElement : function( )
+	{
+		return $( this.__focusId );
+	},
+	
+	
+	toString: function( )
+	{
+		var str = "";
+		str += "----start-------BirtEventDispatcher.toString------------";
+		str += "\n";
+		str += ("    focusId = " + this.__focusId);		
+		for(var i in this.__event_map)
+		{
+			str += "\n";
+			str += ("    eventType = " + i);
+			for(var k in this.__event_map[i])
+			{
+				str += "\n";
+				str += ("        id = " + k);
+			}
+		}
+		str += "\n";
+		str += "------end-------BirtEventDispatcher.toString------------";
+		return str;
+	}
+}
+
+var birtEventDispatcher = new BirtEventDispatcher( );
\ No newline at end of file

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtEventDispatcher.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtEventDispatcher.js
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtEventDispatcher.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapRequest.js
URL: http://svn.apache.org/viewvc/ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapRequest.js?rev=825391&view=auto
==============================================================================
--- ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapRequest.js (added)
+++ ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapRequest.js Thu Oct 15 04:48:28 2009
@@ -0,0 +1,356 @@
+/******************************************************************************
+ *	Copyright (c) 2004 Actuate Corporation and others.
+ *	All rights reserved. This program and the accompanying materials 
+ *	are made available under the terms of the Eclipse Public License v1.0
+ *	which accompanies this distribution, and is available at
+ *		http://www.eclipse.org/legal/epl-v10.html
+ *	
+ *	Contributors:
+ *		Actuate Corporation - Initial implementation.
+ *****************************************************************************/
+
+/**
+ *	BirtSoapRequest
+ *	...
+ */
+BirtSoapRequest = Class.create( );
+
+BirtSoapRequest.prototype =
+{
+	SOAP_NAMESPACE_URI : "http://schemas.xmlsoap.org/soap/envelope/",
+	BIRT_NAMESPACE_URI : "http://schemas.eclipse.org/birt",
+
+	__url : null,
+	__message : null,
+	__xml_document : null,
+	__operation_content : null,
+
+	/**
+	 *	Initialization routine required by "ProtoType" lib.
+	 *
+	 *	@return, void
+	 */
+	initialize : function( )
+	{
+		/* 
+		   XML namespaces are supported by the following browsers :
+		   - Firefox 2 and 3
+		   - Safari 3
+		   - Mozilla 1.7.13
+		   Unsupported by:
+		   - IE6 nor IE7
+		*/ 
+		this.hasXmlNamespaceSupport = ( typeof( document.createElementNS ) != "undefined" );
+		
+		this.reset();
+	},
+	
+	/**
+	 *	Init the request message. There's only one request message DOM instance at any time,
+	 *	when client running.
+	 *
+	 *	@message, request message DOM
+	 *	@return, void
+	 */
+	setMessage : function( message )
+	{
+		// TODO: need to use dom contrcture the request.
+		this.__xml_document = message;
+	},
+
+	/**
+	 *	Retrieve the request message.
+	 *
+	 *	@return, request message in DOM
+	 */
+	getMessage : function( message )
+	{
+		return this.__message;
+	},
+
+	/**
+	 *	Retrieve the request message.
+	 *
+	 *	@return, request message in DOM
+	 */
+	setURL : function( url )
+	{
+		this.__url = url;
+	},
+	
+	/**
+	 *	Retrieve the request message.
+	 *
+	 *	@return, request message in DOM
+	 */
+	getURL : function( )
+	{
+		return this.__url;
+	},
+
+	/**
+	 * Clears the message body
+	 */
+	reset : function( )
+	{
+		// Soap envelope
+		this.__xml_document = this.createXMLDom( this.SOAP_NAMESPACE_URI, "soap:Envelope" );
+		
+ 		var soapEnv = this.__xml_document.documentElement;
+
+		// Soap body
+		var soapBody;
+		
+		if ( this.hasXmlNamespaceSupport )
+		{
+		 	soapBody = this.__xml_document.createElementNS( this.SOAP_NAMESPACE_URI, "Body" );
+		}
+		else
+		{
+		 	soapBody = this.__xml_document.createElement( "soap:Body" );
+		}
+		 	
+  		soapEnv.appendChild( soapBody );
+  		
+		// Get updated objects method
+		var getUpdatedObjects = this.createBirtElement( "GetUpdatedObjects" );
+		if ( !this.hasXmlNamespaceSupport )
+		{
+			// only the first element needs the xmlns attribute
+			getUpdatedObjects.setAttribute( "xmlns", this.BIRT_NAMESPACE_URI );
+		}
+		
+  		soapBody.appendChild( getUpdatedObjects );
+		
+		this.__operation_content = getUpdatedObjects;
+		
+		var str = this.prettyPrintXML( this.__xml_document.documentElement, false );
+		debug( "RESET XML : new message body is\n" + str );
+	},
+
+	/**
+	 * Utility method to create an XML element in the birt namespace.
+	 *
+	 * @param qualifiedName qualified name
+	 */
+	createBirtElement : function( qualifiedName )
+	{
+		if ( this.hasXmlNamespaceSupport )
+		{
+			return this.__xml_document.createElementNS( this.BIRT_NAMESPACE_URI, qualifiedName );
+		}
+		else
+		{
+			return this.__xml_document.createElement( qualifiedName );
+		}			
+	},
+
+	/**
+	 * Utility method creates an XML document.
+	 *
+	 * @param rootName the name of documentElement
+	 * @return xmlDocument a new XML document
+	 */
+	createXMLDom : function( namespaceUri, qualifiedName )
+	{
+		if ( document.implementation && document.implementation.createDocument )
+		{
+			// DOM Level 2 Browsers
+			var dom = document.implementation.createDocument( namespaceUri, qualifiedName, null );
+			if ( !dom.documentElement )
+			{
+				dom.appendChild( dom.createElement( qualifiedName ) );
+			}
+			
+			return dom;
+		}
+		else if ( window.ActiveXObject )
+		{
+			// Internet Explorer
+			var createdDocument = new ActiveXObject( "Microsoft.XMLDOM" );
+			var documentElement = createdDocument.createElement( qualifiedName );
+			createdDocument.appendChild( documentElement );
+
+			// check for a namespace prefix
+			var namespacePrefix = null;
+			var nameParts = qualifiedName.split(":");
+			if ( nameParts.length > 0 )
+			{
+				namespacePrefix = nameParts[0];
+				qualifiedName = nameParts[1];
+			}
+			
+			var nsAttribute = "xmlns";			
+			if ( namespacePrefix )
+			{
+				nsAttribute += ":" + namespacePrefix;
+			}
+			
+			documentElement.setAttribute( nsAttribute, namespaceUri );
+			return createdDocument;
+		}
+		else
+		{
+			throw "Unable to create new Document.";
+		}
+	},
+	
+	/**
+	 * Adds Operation type to message.
+	 *
+	 * @param id id of UIComponent
+	 * @param operator name of desired operation (from Constants.js)
+	 * @param data xmlElement type 'Data' or null if not applicable
+	 * @param (optional) argument[1] - argument[n] object  {name: "paramName1", value: "paramValue1"}
+	 */
+	addOperation : function( id, type, operator, data )
+	{
+		var optionalArgs = 4; //number of params
+	 	var operation = this.createBirtElement( "Operation" );
+	 	
+  		// Target
+  		var target = this.createBirtElement( "Target" );
+  		operation.appendChild( target );
+  		
+  		// Target id
+  		var reportId = this.createBirtElement( "Id" );
+		target.appendChild( reportId );
+  		var reportIdText = this.__xml_document.createTextNode( id || "Error-id" );
+		reportId.appendChild( reportIdText );
+		
+  		// Target type
+  		var reportType = this.createBirtElement( "Type" );
+		target.appendChild( reportType );
+  		var reportTypeText = this.__xml_document.createTextNode( type || "Error-id" );
+		reportType.appendChild( reportTypeText );
+		
+		// Operator
+		var operatorEl = this.createBirtElement( "Operator" );
+		var targetText = this.__xml_document.createTextNode( operator || "Error-operator" );
+		operatorEl.appendChild( targetText );
+		operation.appendChild( operatorEl );
+		
+		// Oprands
+		if( arguments.length > optionalArgs ) //there are optional parameters
+		{	
+	  		var operand, name, value;
+	  		for( var i = optionalArgs; i < arguments.length; i++ )
+	  		{
+				if( arguments[i].length && arguments[i].length > 0 )
+				{
+					for( var j = 0; j < arguments[i].length; j++ )
+					{
+						if ( !arguments[i][j].name )
+						{
+							continue;
+						}
+						
+						operand = this.createBirtElement( "Oprand" );
+						name = this.createBirtElement( "Name" );
+						nameText = this.__xml_document.createTextNode( arguments[i][j].name );
+						name.appendChild( nameText );
+						operand.appendChild( name );
+						value = this.createBirtElement( "Value" );
+						valueText = this.__xml_document.createTextNode( arguments[i][j].value );
+						value.appendChild( valueText );
+						operand.appendChild( value );
+						operation.appendChild( operand );
+					}
+				}
+				else
+				{
+					if ( arguments[i].name )
+					{
+						operand = this.createBirtElement( "Oprand" );
+						name = this.createBirtElement( "Name" );
+						nameText = this.__xml_document.createTextNode( arguments[i].name );
+						name.appendChild( nameText );
+						operand.appendChild( name );
+						value = this.createBirtElement( "Value" );
+						valueText = this.__xml_document.createTextNode( arguments[i].value );
+						value.appendChild( valueText );
+						operand.appendChild( value );
+						operation.appendChild( operand );
+					}
+				}
+			}
+	  	}
+	  	
+	  	// Data
+	  	if( data )
+	  	{
+	  		operation.appendChild( data.documentElement );
+	  	}
+	  	
+  		this.__operation_content.appendChild( operation );
+  		
+		var str = this.prettyPrintXML( this.__xml_document.documentElement, false );
+		debug( "ADDED OPERATION : new message body is\n" + str );
+	},
+		
+	/**
+	 * Creates string of xml, optionally prints to debug window.
+	 *
+	 * @param xmlRoot documentElement of xml Element
+	 * @param str leave empty -- used in recursive call
+	 * @param offset leave empty -- used in recursive call
+	 * @return String with indented tree of elements and text contents
+	 */
+	prettyPrintXML : function( xmlRoot, isDebug, str, offset )
+	{	
+		if( !str )
+		{
+			str = "";
+		}
+		
+		var myIndent = 6;
+		if( offset == null )
+		{
+			myIndent = 2;
+		}
+		else
+		{
+			myIndent += offset;
+		} 
+		var spacer = "";
+		for( var i = 0; i < myIndent;i++ )
+		{
+			spacer += " ";
+		}		
+		var topLevel = xmlRoot.childNodes;
+		var size = topLevel.length;
+		var temp;
+		for( var i = 0; i < size; i++ )
+		{	
+			var curNode = topLevel[i];
+			
+			//either node or a leaf
+			if( curNode.nodeType == "1" )
+			{	
+				str += 	spacer + "&lt" + curNode.nodeName + "&gt\n";			
+				if( isDebug )
+				{
+					debug( spacer + "&lt" + curNode.nodeName + "&gt" );
+				}
+				str = this.prettyPrintXML( curNode, isDebug, str, myIndent );
+				str += spacer + "&lt/" + curNode.nodeName + "&gt\n";
+				if( isDebug )
+				{
+					debug( spacer + "&lt/" + curNode.nodeName + "&gt" );
+				}
+			}
+			else
+			{
+				str += spacer + curNode.data + "\n";
+				if( isDebug )
+				{
+					debug( spacer + curNode.data );
+				}
+			}
+		}
+		
+		return str;
+	}
+}
+
+var birtSoapRequest = new BirtSoapRequest( );
\ No newline at end of file

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapRequest.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapRequest.js
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapRequest.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapResponse.js
URL: http://svn.apache.org/viewvc/ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapResponse.js?rev=825391&view=auto
==============================================================================
--- ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapResponse.js (added)
+++ ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapResponse.js Thu Oct 15 04:48:28 2009
@@ -0,0 +1,82 @@
+/******************************************************************************
+ *	Copyright (c) 2004 Actuate Corporation and others.
+ *	All rights reserved. This program and the accompanying materials 
+ *	are made available under the terms of the Eclipse Public License v1.0
+ *	which accompanies this distribution, and is available at
+ *		http://www.eclipse.org/legal/epl-v10.html
+ *	
+ *	Contributors:
+ *		Actuate Corporation - Initial implementation.
+ *****************************************************************************/
+
+/**
+ *	BirtSoapResponse
+ *	...
+ */
+BirtSoapResponse = Class.create( );
+
+BirtSoapResponse.prototype =
+{
+	/**
+	 *	Initialization routine required by "ProtoType" lib.
+	 *
+	 *	@return, void
+	 */
+	initialize: function( )
+	{
+	},
+	
+	/**
+	 *	Process the soap response, dispatcher message content to designated
+	 *	message handlers.
+	 *
+	 *	@message, incoming soap message DOM
+	 *	@return, void
+	 */
+	process: function( message )
+	{
+		// TODO: will gradually remove it since not all response are in soap now.
+		var soapBody = message.getElementsByTagName( 'soapenv:Body' )[ 0 ];
+		if ( !soapBody )
+		{
+			soapBody = message.getElementsByTagName( 'Body' )[ 0 ];
+		}
+		
+		if ( soapBody )
+		{
+			for ( var i = 0; i < soapBody.childNodes.length; i++ )
+			{
+				if ( soapBody.childNodes[i].nodeType == 1 ) // Need to use NodeType definition.
+				{
+					if ( soapBody.childNodes[i].tagName == 'soapenv:Fault' )
+					{
+						birtExceptionDialog.__cb_bind( soapBody.childNodes[i] );
+					}
+					else
+					{
+						var handler = eval( 'birt' + soapBody.childNodes[i].tagName + 'Handler' );
+						if ( handler )
+						{
+							handler.__process( soapBody.childNodes[i] );
+						}
+					}
+					
+					break;
+				}
+			}
+			
+			return;
+		}
+		
+		if ( message )
+		{
+			var handler = eval( 'birt' + message.tagName + 'ResponseHandler' );
+			if ( handler )
+			{
+				handler.__process( message );
+			}
+		}
+	}
+}
+
+var birtSoapResponse = new BirtSoapResponse( );
\ No newline at end of file

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapResponse.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapResponse.js
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/BirtSoapResponse.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/Mask.js
URL: http://svn.apache.org/viewvc/ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/Mask.js?rev=825391&view=auto
==============================================================================
--- ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/Mask.js (added)
+++ ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/Mask.js Thu Oct 15 04:48:28 2009
@@ -0,0 +1,195 @@
+// Copyright 1994-2006, Actuate Software Corp., All rights reserved.
+
+Mask = Class.create();
+
+Mask.prototype = {
+
+	zIndexStack: [],
+	zIndexBase: 200, //Lowest zIndex for mask
+	zIndexCurrent: null,
+	opacity: 0, //Default opacity is zero
+	_baseElements : null,
+
+	initialize: function(useIframe, opacity)
+	{
+		this.zIndexCurrent = this.zIndexBase;
+		
+		if(useIframe)
+		{
+			this.__useIFrame = true;
+			this.__mask = document.createElement( 'iframe' );
+			// Workaround for IE https secure warning
+			this.__mask.src = "birt/pages/common/blank.html";
+		}
+		else
+		{
+			this.__useIFrame = false;
+			this.__mask = document.createElement( 'div' );
+		}
+
+		this.__mask.id = "Mask";
+		//default opacity to zero
+		if(opacity)
+		{
+			debug("setting opacity to : " + opacity);
+			this.opacity = opacity;
+		}
+		document.body.appendChild( this.__mask );
+		this.__mask.style.position = 'absolute';
+		this.__mask.style.top = '0px';
+		this.__mask.style.left = '0px';
+		var width = BirtPosition.viewportWidth();
+		this.__mask.style.width = width + 'px';
+		var height = BirtPosition.viewportHeight();
+		this.__mask.style.height = height + 'px';
+		this.__mask.style.zIndex = '200';
+		this.__mask.style.backgroundColor = '#0044ff';
+		this.__mask.style.filter = 'alpha( opacity=' + ( this.opacity * 100 ) + ')';
+		this.__mask.style.opacity = this.opacity;
+		this.__mask.scrolling = 'no';
+		this.__mask.marginHeight = '0px';
+		this.__mask.marginWidth = '0px';
+		this.__mask.style.display = 'none';
+		// Support low version Mozilla/NS
+		this.__mask.style.MozOpacity = 0;
+		
+		if(useIframe)
+		{
+			this.__useIFrame = true;
+			this.__progressBarMask = document.createElement( 'iframe' );
+			// Workaround for IE https secure warning
+			this.__progressBarMask.src = "birt/pages/common/blank.html";
+		}
+		else
+		{
+			this.__useIFrame = false;
+			this.__progressBarMask = document.createElement( 'div' );
+		}
+	
+		document.body.appendChild( this.__progressBarMask );
+		this.__progressBarMask.style.position = 'absolute';
+		this.__progressBarMask.style.top = '0px';
+		this.__progressBarMask.style.left = '0px';
+		var width = BirtPosition.viewportWidth();
+		this.__progressBarMask.style.width = width + 'px';
+		var height = BirtPosition.viewportHeight();
+		this.__progressBarMask.style.height = height + 'px';
+		this.__progressBarMask.style.zIndex = '200';
+		this.__progressBarMask.style.backgroundColor = '#ff0000';
+		this.__progressBarMask.style.filter = 'alpha( opacity=' + ( this.opacity * 100 ) + ')';
+		this.__progressBarMask.style.opacity = this.opacity;
+		this.__progressBarMask.scrolling = 'no';
+		this.__progressBarMask.marginHeight = '0px';
+		this.__progressBarMask.marginWidth = '0px';
+		this.__progressBarMask.style.display = 'none';
+		this.__progressBarMask.style.cursor = "move"; //cursor is set to a different value than desired so that change is trigged in IE
+		
+		this.__eh_resize_closure = this.__eh_resize.bindAsEventListener( this );
+		Event.observe( window, 'resize', this.__eh_resize_closure, false );
+	},
+	
+	/**
+	 * Sets the element DOM objects present on the main window.
+	 * They will be disabled when the mask is floating on the top
+	 * of them.
+	 * @param baseElements array of base elements
+	 */
+	setBaseElements : function( baseElements )
+	{
+		this._baseElements = baseElements;
+	},
+	
+	/*
+	If mask is not shown, shows mask, otherwise, moves mask zIndex above last returned zIndex.
+	@returns zIndex for element to place directly above mask
+	*/
+	show: function()
+	{
+		if(this.zIndexStack.length == 0)
+		{
+			this._updateElements(this._baseElements, false);
+			
+			Element.show( this.__mask );
+		}
+		this.__mask.style.zIndex = this.zIndexCurrent;
+		this.zIndexStack.push(this.zIndexCurrent);
+		this.zIndexCurrent++;
+		var dialogZIndex = this.zIndexCurrent;
+		this.zIndexCurrent++;
+		
+		return dialogZIndex;
+	},
+	
+	/*
+	Resizes masks to current screen width (not including scrollbars)
+	*/
+	__eh_resize: function()
+	{
+		var width = BirtPosition.viewportWidth();
+		var height = BirtPosition.viewportHeight();
+		
+		this.__mask.style.width = width + 'px';
+		this.__mask.style.height = height + 'px';
+		this.__progressBarMask.style.width = width + 'px';
+		this.__progressBarMask.style.height = height + 'px';
+	},
+	
+	/*
+	Shows progress bar mask above the highest regular item zIndex.
+	*/
+	showProgressBarMask: function()
+	{		
+		this.__progressBarMask.style.cursor = "wait";
+		
+		Element.show( this.__progressBarMask );
+
+		this.__progressBarMask.style.zIndex = this.zIndexCurrent;
+		
+		return (this.zIndexCurrent + 1);
+		
+	},
+	
+	hide: function()
+	{
+		if(this.zIndexStack.length == 1)
+		{
+			this._updateElements(this._baseElements, true);
+			
+			Element.hide( this.__mask );
+			this.zIndexStack.pop();
+			this.zIndexCurrent = this.zIndexBase;
+		}
+		else
+		{
+			this.zIndexCurrent = this.zIndexStack.pop();
+			this.__mask.style.zIndex = this.zIndexStack[this.zIndexStack.length -1];
+		}
+	},
+	
+	hideProgressBarMask: function()
+	{	
+		this.__progressBarMask.style.cursor = "move";
+			
+		Element.hide( this.__progressBarMask );
+	},
+	
+	isIFrame: function()
+	{
+		return this.__useIFrame;
+	},
+	
+	_updateElements : function(elements, enable)
+	{
+		if ( !elements )
+		{
+			return;
+		}
+		
+		var func = enable?birtUtility.restoreTabIndexes:birtUtility.disableTabIndexes;
+		for ( var i = 0; i < elements.length; i++ )
+		{
+			func.call(birtUtility, $(elements[i]));
+		}
+	}
+
+}

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/Mask.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/Mask.js
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/core/Mask.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/lib/prototype.js
URL: http://svn.apache.org/viewvc/ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/lib/prototype.js?rev=825391&view=auto
==============================================================================
--- ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/lib/prototype.js (added)
+++ ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/lib/prototype.js Thu Oct 15 04:48:28 2009
@@ -0,0 +1,1785 @@
+/*  Prototype JavaScript framework, version 1.4.0
+ *  (c) 2005 Sam Stephenson <sa...@conio.net>
+ *
+ *  THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
+ *  against the source tree, available from the Prototype darcs repository.
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.4.0',
+  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
+
+  emptyFunction: function() {},
+  K: function(x) {return x}
+}
+
+var Class = {
+  create: function() {
+    return function() {
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+  for (property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+}
+
+Object.inspect = function(object) {
+  try {
+    if (object == undefined) return 'undefined';
+    if (object == null) return 'null';
+    return object.inspect ? object.inspect() : object.toString();
+  } catch (e) {
+    if (e instanceof RangeError) return '...';
+    throw e;
+  }
+}
+
+Function.prototype.bind = function() {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function() {
+    return __method.apply(object, args.concat($A(arguments)));
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this;
+  return function(event) {
+    return __method.call(object, event || window.event);
+  }
+}
+
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    var digits = this.toString(16);
+    if (this < 16) return '0' + digits;
+    return digits;
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  }
+});
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0; i < arguments.length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.callback();
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+function $() {
+  var elements = new Array();
+
+  for (var i = 0; i < arguments.length; i++) {
+    var element = arguments[i];
+    if (typeof element == 'string')
+      element = document.getElementById(element);
+
+    if (arguments.length == 1)
+      return element;
+
+    elements.push(element);
+  }
+
+  return elements;
+}
+Object.extend(String.prototype, {
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(eval);
+  },
+
+  escapeHTML: function() {
+    var div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
+  },
+
+  toQueryParams: function() {
+    var pairs = this.match(/^\??(.*)$/)[1].split('&');
+    return pairs.inject({}, function(params, pairString) {
+      var pair = pairString.split('=');
+      params[pair[0]] = pair[1];
+      return params;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  camelize: function() {
+    var oStringList = this.split('-');
+    if (oStringList.length == 1) return oStringList[0];
+
+    var camelizedString = this.indexOf('-') == 0
+      ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
+      : oStringList[0];
+
+    for (var i = 1, len = oStringList.length; i < len; i++) {
+      var s = oStringList[i];
+      camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
+    }
+
+    return camelizedString;
+  },
+
+  inspect: function() {
+    return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'";
+  }
+});
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+var $break    = new Object();
+var $continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != $continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+  },
+
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!(iterator || Prototype.K)(value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      if (result = !!(iterator || Prototype.K)(value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator(value, index));
+    });
+    return results;
+  },
+
+  detect: function (iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inject: function(memo, iterator) {
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.collect(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (value >= (result || value))
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (value <= (result || value))
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator) {
+    return this.collect(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.collect(Prototype.K);
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (typeof args.last() == 'function')
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      iterator(value = collections.pluck(index));
+      return value;
+    });
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+var $A = Array.from = function(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) {
+    return iterable.toArray();
+  } else {
+    var results = [];
+    for (var i = 0; i < iterable.length; i++)
+      results.push(iterable[i]);
+    return results;
+  }
+}
+
+Object.extend(Array.prototype, Enumerable);
+
+Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0; i < this.length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != undefined || value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(value.constructor == Array ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  indexOf: function(object) {
+    for (var i = 0; i < this.length; i++)
+      if (this[i] == object) return i;
+    return -1;
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  shift: function() {
+    var result = this[0];
+    for (var i = 0; i < this.length - 1; i++)
+      this[i] = this[i + 1];
+    this.length--;
+    return result;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  }
+});
+var Hash = {
+  _each: function(iterator) {
+    for (key in this) {
+      var value = this[key];
+      if (typeof value == 'function') continue;
+
+      var pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  },
+
+  keys: function() {
+    return this.pluck('key');
+  },
+
+  values: function() {
+    return this.pluck('value');
+  },
+
+  merge: function(hash) {
+    return $H(hash).inject($H(this), function(mergedHash, pair) {
+      mergedHash[pair.key] = pair.value;
+      return mergedHash;
+    });
+  },
+
+  toQueryString: function() {
+    return this.map(function(pair) {
+      return pair.map(encodeURIComponent).join('=');
+    }).join('&');
+  },
+
+  inspect: function() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
+}
+
+function $H(object) {
+  var hash = Object.extend({}, object || {});
+  Object.extend(hash, Enumerable);
+  Object.extend(hash, Hash);
+  return hash;
+}
+ObjectRange = Class.create();
+Object.extend(ObjectRange.prototype, Enumerable);
+Object.extend(ObjectRange.prototype, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    do {
+      iterator(value);
+      value = value.succ();
+    } while (this.include(value));
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+}
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
+      function() {return new XMLHttpRequest()}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+}
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responderToAdd) {
+    if (!this.include(responderToAdd))
+      this.responders.push(responderToAdd);
+  },
+
+  unregister: function(responderToRemove) {
+    this.responders = this.responders.without(responderToRemove);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (responder[callback] && typeof responder[callback] == 'function') {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) {}
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate: function() {
+    Ajax.activeRequestCount++;
+  },
+
+  onComplete: function() {
+    Ajax.activeRequestCount--;
+  }
+});
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+  },
+
+  responseIsSuccess: function() {
+    return this.transport.status == undefined
+        || this.transport.status == 0
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  responseIsFailure: function() {
+    return !this.responseIsSuccess();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    var parameters = this.options.parameters || '';
+    if (parameters.length > 0) parameters += '&_=';
+
+    try {
+      this.url = url;
+      if (this.options.method == 'get' && parameters.length > 0)
+        this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
+
+      Ajax.Responders.dispatch('onCreate', this, this.transport);
+
+      this.transport.open(this.options.method, this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous) {
+        this.transport.onreadystatechange = this.onStateChange.bind(this);
+        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
+      }
+
+      this.setRequestHeaders();
+
+      var body = this.options.postBody ? this.options.postBody : parameters;
+      this.transport.send(this.options.method == 'post' ? body : null);
+
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  setRequestHeaders: function() {
+    var requestHeaders =
+      ['X-Requested-With', 'XMLHttpRequest',
+       'X-Prototype-Version', Prototype.Version];
+
+    if (this.options.method == 'post') {
+      requestHeaders.push('Content-type',
+        'application/x-www-form-urlencoded');
+
+      /* Force "Connection: close" for Mozilla browsers to work around
+       * a bug where XMLHttpReqeuest sends an incorrect Content-length
+       * header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType)
+        requestHeaders.push('Connection', 'close');
+    }
+
+    if (this.options.requestHeaders)
+      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
+
+    for (var i = 0; i < requestHeaders.length; i += 2)
+      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState != 1)
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  header: function(name) {
+    try {
+      return this.transport.getResponseHeader(name);
+    } catch (e) {}
+  },
+
+  evalJSON: function() {
+    try {
+      return eval(this.header('X-JSON'));
+    } catch (e) {}
+  },
+
+  evalResponse: function() {
+    try {
+      return eval(this.transport.responseText);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  respondToReadyState: function(readyState) {
+    var event = Ajax.Request.Events[readyState];
+    var transport = this.transport, json = this.evalJSON();
+
+    if (event == 'Complete') {
+      try {
+        (this.options['on' + this.transport.status]
+         || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(transport, json);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      if ((this.header('Content-type') || '').match(/^text\/javascript/i))
+        this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
+      Ajax.Responders.dispatch('on' + event, this, transport, json);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
+    if (event == 'Complete')
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Updater = Class.create();
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.containers = {
+      success: container.success ? $(container.success) : $(container),
+      failure: container.failure ? $(container.failure) :
+        (container.success ? null : $(container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function(transport, object) {
+      this.updateContent();
+      onComplete(transport, object);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.responseIsSuccess() ?
+      this.containers.success : this.containers.failure;
+    var response = this.transport.responseText;
+
+    if (!this.options.evalScripts)
+      response = response.stripScripts();
+
+    if (receiver) {
+      if (this.options.insertion) {
+        new this.options.insertion(receiver, response);
+      } else {
+        Element.update(receiver, response);
+      }
+    }
+
+    if (this.responseIsSuccess()) {
+      if (this.onComplete)
+        setTimeout(this.onComplete.bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = {};
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this),
+      this.decay * this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+document.getElementsByClassName = function(className, parentElement) {
+  var children = ($(parentElement) || document.body).getElementsByTagName('*');
+  return $A(children).inject([], function(elements, child) {
+    if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
+      elements.push(child);
+    return elements;
+  });
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element) {
+  var Element = new Object();
+}
+
+Object.extend(Element, {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      Element[Element.visible(element) ? 'hide' : 'show'](element);
+    }
+  },
+
+  hide: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = 'none';
+    }
+  },
+
+  show: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = '';
+    }
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+  },
+
+  update: function(element, html) {
+    $(element).innerHTML = html.stripScripts();
+    setTimeout(function() {html.evalScripts()}, 10);
+  },
+
+  getHeight: function(element) {
+    element = $(element);
+    return element.offsetHeight;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return Element.classNames(element).include(className);
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return Element.classNames(element).add(className);
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return Element.classNames(element).remove(className);
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    for (var i = 0; i < element.childNodes.length; i++) {
+      var node = element.childNodes[i];
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        Element.remove(node);
+    }
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.match(/^\s*$/);
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var x = element.x ? element.x : element.offsetLeft,
+        y = element.y ? element.y : element.offsetTop;
+    window.scrollTo(x, y);
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    var value = element.style[style.camelize()];
+    if (!value) {
+      if (document.defaultView && document.defaultView.getComputedStyle) {
+        var css = document.defaultView.getComputedStyle(element, null);
+        value = css ? css.getPropertyValue(style) : null;
+      } else if (element.currentStyle) {
+        value = element.currentStyle[style.camelize()];
+      }
+    }
+
+    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
+      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
+
+    return value == 'auto' ? null : value;
+  },
+
+  setStyle: function(element, style) {
+    element = $(element);
+    for (name in style)
+      element.style[name.camelize()] = style[name];
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    if (Element.getStyle(element, 'display') != 'none')
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = '';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = 'none';
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (window.opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return;
+    element._overflow = element.style.overflow;
+    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+      element.style.overflow = 'hidden';
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return;
+    element.style.overflow = element._overflow;
+    element._overflow = undefined;
+  }
+});
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content.stripScripts();
+
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      try {
+        this.element.insertAdjacentHTML(this.adjacency, this.content);
+      } catch (e) {
+        if (this.element.tagName.toLowerCase() == 'tbody') {
+          this.insertContent(this.contentFromAnonymousTable());
+        } else {
+          throw e;
+        }
+      }
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.insertContent([this.range.createContextualFragment(this.content)]);
+    }
+
+    setTimeout(function() {content.evalScripts()}, 10);
+  },
+
+  contentFromAnonymousTable: function() {
+    var div = document.createElement('div');
+    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
+    return $A(div.childNodes[0].childNodes[0].childNodes);
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment, this.element);
+    }).bind(this));
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+
+  insertContent: function(fragments) {
+    fragments.reverse(false).each((function(fragment) {
+      this.element.insertBefore(fragment, this.element.firstChild);
+    }).bind(this));
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.appendChild(fragment);
+    }).bind(this));
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment,
+        this.element.nextSibling);
+    }).bind(this));
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set(this.toArray().concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set(this.select(function(className) {
+      return className != classNameToRemove;
+    }).join(' '));
+  },
+
+  toString: function() {
+    return this.toArray().join(' ');
+  }
+}
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+var Field = {
+  clear: function() {
+    for (var i = 0; i < arguments.length; i++)
+      $(arguments[i]).value = '';
+  },
+
+  focus: function(element) {
+    $(element).focus();
+  },
+
+  present: function() {
+    for (var i = 0; i < arguments.length; i++)
+      if ($(arguments[i]).value == '') return false;
+    return true;
+  },
+
+  select: function(element) {
+    $(element).select();
+  },
+
+  activate: function(element) {
+    element = $(element);
+    element.focus();
+    if (element.select)
+      element.select();
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Form = {
+  serialize: function(form) {
+    var elements = Form.getElements($(form));
+    var queryComponents = new Array();
+
+    for (var i = 0; i < elements.length; i++) {
+      var queryComponent = Form.Element.serialize(elements[i]);
+      if (queryComponent)
+        queryComponents.push(queryComponent);
+    }
+
+    return queryComponents.join('&');
+  },
+
+  getElements: function(form) {
+    form = $(form);
+    var elements = new Array();
+
+    for (tagName in Form.Element.Serializers) {
+      var tagElements = form.getElementsByTagName(tagName);
+      for (var j = 0; j < tagElements.length; j++)
+        elements.push(tagElements[j]);
+    }
+    return elements;
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name)
+      return inputs;
+
+    var matchingInputs = new Array();
+    for (var i = 0; i < inputs.length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) ||
+          (name && input.name != name))
+        continue;
+      matchingInputs.push(input);
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.blur();
+      element.disabled = 'true';
+    }
+  },
+
+  enable: function(form) {
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.disabled = '';
+    }
+  },
+
+  findFirstElement: function(form) {
+    return Form.getElements(form).find(function(element) {
+      return element.type != 'hidden' && !element.disabled &&
+        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    Field.activate(Form.findFirstElement(form));
+  },
+
+  reset: function(form) {
+    $(form).reset();
+  }
+}
+
+Form.Element = {
+  serialize: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+
+    if (parameter) {
+      var key = encodeURIComponent(parameter[0]);
+      if (key.length == 0) return;
+
+      if (parameter[1].constructor != Array)
+        parameter[1] = [parameter[1]];
+
+      return parameter[1].map(function(value) {
+        return key + '=' + encodeURIComponent(value);
+      }).join('&');
+    }
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+
+    if (parameter)
+      return parameter[1];
+  }
+}
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'submit':
+      case 'hidden':
+      case 'password':
+      case 'text':
+        return Form.Element.Serializers.textarea(element);
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+    }
+    return false;
+  },
+
+  inputSelector: function(element) {
+    if (element.checked)
+      return [element.name, element.value];
+  },
+
+  textarea: function(element) {
+    return [element.name, element.value];
+  },
+
+  select: function(element) {
+    return Form.Element.Serializers[element.type == 'select-one' ?
+      'selectOne' : 'selectMany'](element);
+  },
+
+  selectOne: function(element) {
+    var value = '', opt, index = element.selectedIndex;
+    if (index >= 0) {
+      opt = element.options[index];
+      value = opt.value;
+      if (!value && !('value' in opt))
+        value = opt.text;
+    }
+    return [element.name, value];
+  },
+
+  selectMany: function(element) {
+    var value = new Array();
+    for (var i = 0; i < element.length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) {
+        var optValue = opt.value;
+        if (!optValue && !('value' in opt))
+          optValue = opt.text;
+        value.push(optValue);
+      }
+    }
+    return [element.name, value];
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    var elements = Form.getElements(this.element);
+    for (var i = 0; i < elements.length; i++)
+      this.registerCallback(elements[i]);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        case 'password':
+        case 'text':
+        case 'textarea':
+        case 'select-one':
+        case 'select-multiple':
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) {
+  var Event = new Object();
+}
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX +
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY +
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) {
+      event.preventDefault();
+      event.stopPropagation();
+    } else {
+      event.returnValue = false;
+      event.cancelBubble = true;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0; i < Event.observers.length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    var element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.attachEvent))
+      name = 'keydown';
+
+    this._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    var element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.detachEvent))
+      name = 'keydown';
+
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      element.detachEvent('on' + name, observer);
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+Event.observe(window, 'unload', Event.unloadCache, false);
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        p = Element.getStyle(element, 'position');
+        if (p == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  offsetParent: function(element) {
+    if (element.offsetParent) return element.offsetParent;
+    if (element == document.body) return element;
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return element;
+
+    return document.body;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  clone: function(source, target) {
+    source = $(source);
+    target = $(target);
+    target.style.position = 'absolute';
+    var offsets = this.cumulativeOffset(source);
+    target.style.top    = offsets[1] + 'px';
+    target.style.left   = offsets[0] + 'px';
+    target.style.width  = source.offsetWidth + 'px';
+    target.style.height = source.offsetHeight + 'px';
+  },
+
+  page: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent==document.body)
+        if (Element.getStyle(element,'position')=='absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      valueT -= element.scrollTop  || 0;
+      valueL -= element.scrollLeft || 0;
+    } while (element = element.parentNode);
+
+    return [valueL, valueT];
+  },
+
+  clone: function(source, target) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || {})
+
+    // find page position of source
+    source = $(source);
+    var p = Position.page(source);
+
+    // find coordinate system to use
+    target = $(target);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(target,'position') == 'absolute') {
+      parent = Position.offsetParent(target);
+      delta = Position.page(parent);
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
+    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.style.position == 'absolute') return;
+    Position.prepare();
+
+    var offsets = Position.positionedOffset(element);
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';;
+    element.style.left   = left + 'px';;
+    element.style.width  = width + 'px';;
+    element.style.height = height + 'px';;
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.style.position == 'relative') return;
+    Position.prepare();
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+  }
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely
+// positioned.  For performance reasons, redefine Position.cumulativeOffset for
+// KHTML/WebKit only.
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  Position.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return [valueL, valueT];
+  }
+}
\ No newline at end of file

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/lib/prototype.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/lib/prototype.js
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/lib/prototype.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtBaseResponseHandler.js
URL: http://svn.apache.org/viewvc/ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtBaseResponseHandler.js?rev=825391&view=auto
==============================================================================
--- ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtBaseResponseHandler.js (added)
+++ ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtBaseResponseHandler.js Thu Oct 15 04:48:28 2009
@@ -0,0 +1,52 @@
+/******************************************************************************
+ *	Copyright (c) 2004 Actuate Corporation and others.
+ *	All rights reserved. This program and the accompanying materials 
+ *	are made available under the terms of the Eclipse Public License v1.0
+ *	which accompanies this distribution, and is available at
+ *		http://www.eclipse.org/legal/epl-v10.html
+ *	
+ *	Contributors:
+ *		Actuate Corporation - Initial implementation.
+ *****************************************************************************/
+ 
+/**
+ *	BirtBaseResponseHandler
+ *	...
+ */
+BirtBaseResponseHandler = function(){}; 
+
+BirtBaseResponseHandler.prototype =
+{
+	
+	associations: {}, //map of response types, handlers
+	
+	/**
+	* Add handler for response target types
+	* Holds one handlerObject per targetType with newer handlerObject overwriting existing handlerObject
+	* @param targetType String name of target, length 5 
+	* @param handlerObject 
+	*/
+	addAssociation: function(targetType, handlerObject)
+	{
+		this.associations[targetType] = handlerObject;			
+	},
+	
+
+	/**
+	 *	Process update response message. Trigger necessary UI updates.
+	 *	See response schema for details.
+	 *
+	 *	@message, update response DOM.
+	 *	@return, void
+	 */
+	__process: function( message )
+	{
+		this.__process( message );
+	}
+	
+	////////////////////////////////////////////////////////////////////////////
+	//	Local methods
+	///////////////////////////////////////////////////////////////////////////
+	
+
+}
\ No newline at end of file

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtBaseResponseHandler.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtBaseResponseHandler.js
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtBaseResponseHandler.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtGetUpdatedObjectsResponseHandler.js
URL: http://svn.apache.org/viewvc/ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtGetUpdatedObjectsResponseHandler.js?rev=825391&view=auto
==============================================================================
--- ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtGetUpdatedObjectsResponseHandler.js (added)
+++ ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtGetUpdatedObjectsResponseHandler.js Thu Oct 15 04:48:28 2009
@@ -0,0 +1,177 @@
+/******************************************************************************
+ *	Copyright (c) 2004 Actuate Corporation and others.
+ *	All rights reserved. This program and the accompanying materials 
+ *	are made available under the terms of the Eclipse Public License v1.0
+ *	which accompanies this distribution, and is available at
+ *		http://www.eclipse.org/legal/epl-v10.html
+ *	
+ *	Contributors:
+ *		Actuate Corporation - Initial implementation.
+ *****************************************************************************/
+ 
+/**
+ *	birtGetUpdatedObjectsResponseHandler
+ *	...
+ */
+BirtGetUpdatedObjectsResponseHandler = function( ){ };
+
+BirtGetUpdatedObjectsResponseHandler.prototype = Object.extend( new BirtBaseResponseHandler( ),
+{
+	/**
+	 *	Process update response message. Trigger necessary UI updates.
+	 *	See response schema for details.
+	 *
+	 *	@message, update response DOM.
+	 *	@return, void
+	 */
+	__process: function( message )
+	{
+		if ( !message ) return;
+		this.__processUpdateContent( message.getElementsByTagName( 'UpdateContent' ) );
+		this.__processUpdateData( message.getElementsByTagName( 'UpdateData' ) );
+	},
+	
+	/**
+	 *	Process update response message. Trigger necessary UI updates.
+	 *	See response schema for details.
+	 *
+	 *	@message, update response DOM.
+	 *	@return, void
+	 */
+	__processUpdateContent: function( updates )
+	{
+		if ( !updates ) return;
+		
+		for ( var i = 0; i < updates.length; i++ )
+		{
+			try
+			{
+				var target = updates[i].getElementsByTagName( 'Target' )[0]; //assumes only 1 target per UpdateContent
+				var targetData = target.firstChild.data				
+				var targetType = targetData.substring( 0, 5 );
+				var handler = this.associations[targetType];
+				
+				if ( !handler ) 
+				{
+					var error = { name : "CustomError",
+								  message : ( "__processUpdateContent no handler registered for type: " + targetType ) };
+					throw error;
+				}
+								
+				var content = updates[i].getElementsByTagName( 'Content' )[0]; //assumes only 1 context per UpdateContent	
+				if ( !content ) 
+				{
+					var error = { name : "CustomError",
+								  message : ( " __processUpdateContent empty contents" ) };
+					throw error;	
+				}
+				
+				/**************************************************************
+				 * Data is too large, seems firefox will wrap the content into
+				 * several children nodes of text type. Need more verification.
+				 **************************************************************/
+				
+				// firefox can use textContent to retrieve the complete node content,
+				// check this property first to avoid string concatation which is very
+				// slow for large node.  
+				var contentData = content.textContent;
+				
+				if (!contentData)
+				{
+					// for non-fireforx browser, we still use string concatation 
+					// to retrieve the complete content.
+					
+					contentData = "";
+					
+					if ( content.hasChildNodes )
+					{
+						for( var j = 0; j < content.childNodes.length; j++ )
+						{
+							if( content.childNodes[j].nodeType == 3 ) //Text type
+							{
+								contentData += content.childNodes[j].data;
+							}
+						}		
+					}
+				}
+				
+				if ( contentData )
+				{
+					handler.__cb_disposeEventHandlers( targetData );
+					handler.__cb_render( targetData, contentData );
+					var inits = updates[i].getElementsByTagName( 'InitializationId' );
+					var bookmarks = updates[i].getElementsByTagName( 'Bookmark' );
+					if ( bookmarks.length > 0 )
+					{
+						handler.__cb_installEventHandlers( targetData, inits, bookmarks[0].firstChild.data );
+					}
+					else
+					{
+						handler.__cb_installEventHandlers( targetData, inits );
+					}
+				}
+			}
+			catch( error )
+			{
+				debug( "ERROR in birtGetUpdatedObjectsResponseHandler" );
+				
+				for( var i in error )
+				{
+					debug( "ERROR " + i + " : " + error[i] );
+				}
+			}			
+		}
+	},
+
+	/**
+	 *	Process update response message. Trigger necessary UI updates.
+	 *	See response schema for details.
+	 *
+	 *	@message, update response DOM.
+	 *	@return, void
+	 */
+	__processUpdateData: function( updates )
+	{
+		if ( !updates ) return;
+		
+		for ( var i = 0; i < updates.length; i++ )
+		{
+			var targets = updates[i].getElementsByTagName( 'Target' );
+			if ( !targets || targets.length <= 0 ) continue;
+			
+			var datas = updates[i].getElementsByTagName( 'Data' );
+			if ( !datas || datas.length <= 0 ) continue;
+
+			var handler = null;
+			try
+			{
+				handler = eval( targets[0].firstChild.data );
+			}
+			catch ( e )
+			{
+			}
+			if ( !handler || !handler.__cb_bind ) continue;
+			
+			handler.__cb_bind( datas[0] );
+		}
+	},
+	
+	/**
+	 *	Helper function to handle "Init" type
+	 *	@param init "Init" element
+	 */
+	initList: function( init )
+	{
+		var initData = init.firstChild.data;
+		var targetType = init.firstChild.data.substring( 0, 5 );
+		var handler = this.associations[targetType];	
+		if ( !handler ) 
+		{
+			var error = {name:"CustomError", message: ("initList invalid Init")};
+			throw error;					
+		}
+		handler.__cb_installEventHandlers( initData );
+	}
+} );
+
+var birtGetUpdatedObjectsResponseHandler = new BirtGetUpdatedObjectsResponseHandler( );
\ No newline at end of file

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtGetUpdatedObjectsResponseHandler.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtGetUpdatedObjectsResponseHandler.js
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/branches/addBirt/framework/webtools/webapp/birt/webcontent/birt/ajax/mh/BirtGetUpdatedObjectsResponseHandler.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain