This example source is a copy of the Google Pie Chart example widget which is shipped with Visual LANSA.

function( PROTOTYPE, WIDGET )
\{
  //--------------------------------------------------------------------------
  // LOAD GOOGLE PIECHART ONLY WHEN THAT IS COMPLETED CAN WE FINALIZE THE WIDGET 
  //--------------------------------------------------------------------------
  google.load( 'visualization', '1', \{ packages:\["corechart"\], callback: WIDGET.Finalize \} );
 
  //--------------------------------------------------------
  // WIDGET-INTERFACE FUNCTIONS (CALLED FROM THE VL-RUNTIME)
  //--------------------------------------------------------
 
  //
  // 'onCreateInstance' - gets called when LANSA creates an instance of this class.
  //
  PROTOTYPE.onCreateInstance = function()
  \{
    // Create the datatable
    this.m_DataTable = new google.visualization.DataTable();
 
    this.m_DataTable.addColumn( 'string', 'Caption' );
    this.m_DataTable.addColumn( 'number', 'Value' );
  \} 
   
  //
  // 'onRealizeControl' - gets called when LANSA creates a visual representation of an instance of this class.
  //
  // Parameters:
  //
  // - parentDiv : the div that's been created as a container for this control. Its size and style are controlled by 
  //               RDMLX, its content by the JavaScript below.
  //
  PROTOTYPE.onRealizeControl = function( parentDiv )
  \{
    // Create the piechart
    this.m_Chart = new google.visualization.PieChart( parentDiv );
 
    // Hook up event handlers
    this.AttachEvents();
 
    // We're ready to draw it
    this.DrawChart();
  \}
 
  //
  // 'onSizeChanged - gets called when the widget changes size.
  //
  PROTOTYPE.onSizeChanged = function()
  \{
    this.DrawChart();
  \}
 
  //////////////// 
  // Properties //
  //////////////// 
 
  //
  // getTitle
  //
  PROTOTYPE.getTitle = function()
  \{
    return this.m_Title;
  \}
 
  //
  // setTitle
  //
  PROTOTYPE.setTitle = function( strTitle )
  \{
    this.m_Title = strTitle;
 
    this.DrawChart();
  \}
 
  ///////////// 
  // Methods //
  ///////////// 
 
  //
  // Insert - Insert data into the piechart
  //
  // Parameters:
  // - Value: Integer
  // - Caption: String
  //
  // Return Type: Integer
  //
  PROTOTYPE.Insert = function( iValue, strCaption )
  \{    
    var index = this.m_DataTable.addRow( \[ strCaption, iValue \] );
 
    this.DrawChart();
 
    return index;
  \}
 
  //
  // Clear - Clears all data
  //
  PROTOTYPE.Clear = function()
  \{
    // Initialize member data
    this.m_DataTable.removeRows( 0, this.m_DataTable.getNumberOfRows() );
 
    this.DrawChart();
  \}
 
  //
  // Remove - Removes the given index from the piechart
  //
  // Parameters:
  // - Index: Integer
  //
  PROTOTYPE.Remove = function( index )
  \{
    index -= 1;
 
    if ( ( index >= 0 ) && ( index < this.m_DataTable.getNumberOfRows() ) )
    \{
      this.m_DataTable.removeRow( index );
 
      this.DrawChart();
    \}
  \}
 
  ////////////////////// 
  // Helper functions //
  ////////////////////// 
 
  //
  // DrawChart
  //
  PROTOTYPE.DrawChart = function()
  \{
    if ( this.m_Chart )
    \{
      // Draw it using our data.
      this.m_Chart.draw( this.m_DataTable, 
      \{
        title          : this.m_Title,
        legend         : 'none',
        pieSliceText   : 'label',
        backgroundColor: 'transparent'
      \}); 
    \}
  \}
 
  //
  // AttachEvents
  //
  PROTOTYPE.AttachEvents = function()
  \{
    var pThis = this;
 
    // EVENT: select
    google.visualization.events.addListener( this.m_Chart, 'select', function()
    \{
      var 
        selectedItem = pThis.m_Chart.getSelection()\[0\];
 
      if ( selectedItem ) 
      \{
        pThis.fireItemSelected( ( selectedItem.row + 1 ), pThis.m_DataTable.getValue( selectedItem.row, 1 ), pThis.m_DataTable.getValue( selectedItem.row, 0 ) );
      \}
    \});  
  \}
 
  // We're still loading (waiting for a callback)
  return WIDGET.Loading;
\}