/******************************************************************************
 *	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( );
