var Events = { // Add event handler to data source addToDocumentEvent: function( eventName:String, expression:String, dataSourceId:String ){ try { if( expression.indexOf( 'javascript:' ) === -1 ){ expression = '#{javascript:' + expression + '}'; } var dataSource = this.getDataSource( dataSourceId ); var capitalizedEventName = eventName.replace( /^\w/, eventName.substring( 0,1 ).toUpperCase() ); // If the event handler is from the page, add to queue var previousEventHandler:javax.faces.el.MethodBinding = dataSource[ 'get' + capitalizedEventName ](); // If event handler exists if( typeof previousEventHandler === 'com.ibm.xsp.binding.javascript.JavaScriptMethodBinding' ){ var previousExpression = previousEventHandler.getExpressionString(); // Event came from page if( previousExpression.indexOf( 'Events.runEventQueue' ) === -1 ){ this.setInitialPageEvent( capitalizedEventName, previousEventHandler ); } } /* If the page doesn't have an existing event handler, or the event handler is from the page - add handler that runs all queued events */ var application = facesContext.getApplication(); if( !previousExpression || ( previousExpression && previousExpression.indexOf( 'Events.runEventQueue' ) === -1 ) ){ var queueRunnerEvent = application.createMethodBinding( '#{javascript:Events.runEventQueue( "' + capitalizedEventName + '" );}', null ); dataSource[ 'set' + capitalizedEventName ]( queueRunnerEvent ); } // Add event handler from expression-parameter var eventHandler = application.createMethodBinding( expression, null ); this.addEventToQueue( capitalizedEventName, eventHandler ); } catch( e ){ if( Debug ){ Debug.exception( e ); } } }, // Get the data source - If dataSourceId isn't specified, get first document data source getDataSource: function( dataSourceId ){ try { var dataSource, dataSources:java.util.ArrayList = view.getData(); for( var i = 0; i < dataSources.size(); i++ ){ dataSource = dataSources.get( i ); if( dataSourceId ){ if( dataSource.getBeanId().indexOf( '|' + dataSourceId ) > -1 ){ break; } } else { if( dataSource.getClass().getName() === 'com.ibm.xsp.model.domino.DominoDocumentData' ){ break; } } } } catch( e ){ Debug.exception( e ); } if( !dataSource ){ if( dataSourceId ){ throw new java.lang.Exception( 'Unknown data source, "' + dataSourceId + '"' ); } } return dataSource; }, addEventToQueue: function( capitalizedEventName, eventHandlers:java.util.ArrayList ){ var queuedEvents:java.util.ArrayList = this.getQueue(); queuedEvents.add( eventHandler ); this.setQueue( capitalizedEventName, queuedEvents ); }, setInitialPageEvent: function( capitalizedEventName, eventHandler:javax.faces.el.MethodBinding ){ try { viewScope.put( 'initial' + capitalizedEventName, eventHandler ); } catch( e ){ Debug.exception( e ); } }, getInitialPageEvent: function( capitalizedEventName ){ try { return viewScope.get( 'initial' + capitalizedEventName ); } catch( e ){ Debug.exception( e ); } }, setQueue: function( capitalizedEventName, eventHandlers:java.util.ArrayList ){ try{ viewScope.put( 'queued' + capitalizedEventName + 's', eventHandlers ); } catch( e ){ Debug.exception( e ); } }, // Returns java.util.ArrayList getQueue: function( capitalizedEventName ){ try{ var eventHandlers = viewScope.get( 'queued' + capitalizedEventName + 's' ); if( !eventHandlers ){ viewScope.put( 'queued' + capitalizedEventName + 's', new java.util.ArrayList() ); } return viewScope.get( 'queued' + capitalizedEventName + 's' ); } catch( e ){ Debug.exception( e ); } }, runEventQueue: function( capitalizedEventName ){ try{ var eventHandlers:java.util.ArrayList = this.getQueue( capitalizedEventName ); // Run the initial page event at the end var initialPageEvent = this.getInitialPageEvent( capitalizedEventName ); if( initialPageEvent ){ var eventResult = initialPageEvent.invoke( facesContext, null ); if( eventResult === false ){ // Exit - initial page event halted return; } } if( eventHandlers.size() > 0 ){ // Runs all queued event handlers for the event var eventHandler; for( var i = 0; i < eventHandlers.size(); i++ ){ eventHandler = eventHandlers[i]; eventHandler.invoke( facesContext, null ); } } } catch( e ){ Debug.exception( e ); } } } // Helper-class for debugging var Debug = { // Send a stack trace of an exception exception: function( exception ){ var stringWriter = new java.io.StringWriter(); exception.printStackTrace( new java.io.PrintWriter( stringWriter ) ); this.message( stringWriter.toString(), 'Exception!' ); }, // Send a message message: function( message, subject ){ var doc:NotesDocument = database.createDocument(); doc.replaceItemValue( 'Form', 'Memo' ); doc.replaceItemValue( 'Subject', subject || 'Debug..' ); doc.replaceItemValue( 'Body', message.toString() ); doc.replaceItemValue( 'SendTo', @Name( '[CN]', @UserName() ) ); doc.send() } };