    <JSB>
        <JSB_DESCRIPTOR NAME="netscape.peas.DummyCursor" DISPLAYNAME="Dummy Cursor"
            ISHIDDEN ENV="client"
            SHORTDESCRIPTION="Dummy client-side database cursor">

        <JSB_PROPERTY NAME="name" DISPLAYNAME="Name" PROPTYPE="JS" TYPE="string"
            READMETHOD="" WRITEMETHOD=""
            SHORTDESCRIPTION="Name of object">

        <JSB_PROPERTY NAME="numRows" DISPLAYNAME="NumRows" PROPTYPE="JS" TYPE="number"
            READMETHOD="" WRITEMETHOD=""
            SHORTDESCRIPTION="Number of Rows">

        <JSB_PROPERTY NAME="currentRowNumber" DISPLAYNAME="CurrentRow" PROPTYPE="JS" TYPE="number"
            READMETHOD="" WRITEMETHOD="setCurrentRowNumber"
            SHORTDESCRIPTION="Current Row Number">

        <JSB_PROPERTY NAME="updatable" DISPLAYNAME="Updatable" PROPTYPE="JS" TYPE="boolean"
            READMETHOD="" WRITEMETHOD=""
            SHORTDESCRIPTION="Is Cursor Updatable">

        <JSB_METHOD NAME="nextRow" TYPE="boolean"> </JSB_METHOD>

        <JSB_METHOD NAME="previousRow" TYPE="boolean"> </JSB_METHOD>

        <JSB_METHOD NAME="setCurrentRowNumber" TYPE="void" ENV="client">
            <JSB_PARAMETER NAME="newRowNumber" TYPE="number">
        </JSB_METHOD>
        <JSB_METHOD NAME="getCurrentRowNumber" TYPE="number"> </JSB_METHOD>

        <JSB_METHOD NAME="getNumRowsFetched" TYPE="number" ENV="client"> </JSB_METHOD>

        <JSB_METHOD NAME="getInterface" TYPE="object">
          <JSB_PARAMETER NAME="className" TYPE="string">
        </JSB_METHOD>

        <JSB_METHOD NAME="executeQuery" TYPE="void" ENV="client"> </JSB_METHOD>

        <JSB_EVENT NAME="onChange" LISTENERMETHODS="onChange" LISTENERTYPE="onChangeListener" EVENTMODEL="JS">
        <JSB_EVENT NAME="netscape.peas.RowChange" LISTENERMETHODS="rowChange" LISTENERTYPE="netscape.peas.RowChangeListener" EVENTMODEL="AWT11">

        <JSB_INTERFACE NAME="netscape.peas.GetInterface">
        <JSB_INTERFACE NAME="netscape.peas.Row">
        <JSB_INTERFACE NAME="netscape.peas.RowChangeListener">

        <JSB_CONSTRUCTOR>

    function _getInterface( sInterface ) {
        if ( sInterface == "netscape.peas.Row" || sInterface == "netscape.peas.RowChangeListener" ) {
            if ( null == this.oRowSupport ) {
            	oRowSupport = new Packages.netscape.peas.RowSupport(true);
                this.oRowSupport = oRowSupport;
            }
            return oRowSupport;
         } else {
            return null;
        }
    }

    function _next() {
        return this.setCurrentRowNumber(this.currentRow+1);
    }

    function _previous() {
        return this.setCurrentRowNumber(this.currentRow-1);
    }// _previous

    function _setCurrentRowNumber(iNewRowNumber) {
        if (iNewRowNumber<0||iNewRowNumber>=this.numRows) {
            alert("setRowNumber out of range!")
            return false
        } else {
            iOldRowNumber = this.currentRow;
            if ( iOldRowNumber != iNewRowNumber ) {
                this.currentRow = iNewRowNumber;
                for (prop in this) {
                    if (prop.indexOf("records_") != -1) {
                        if (iOldRowNumber==-1) {
                           oldValue = null;
                        } else {
                           oldValue = Rows[iOldRowNumber][prop];

                            // if we allow "writes", get value from RowSupport's buffer
                            if (null!=this.oRowSupport) {
                                // update our table from what rowsupport holds
                                Rows[iOldRowNumber][prop] = this.oRowSupport.getValueByName( prop );
                            } else {
                                Rows[iOldRowNumber][prop] = this[prop]
                            }
                        }

                        this[prop] = Rows[iNewRowNumber][prop]
                        this.fireChangeEvent(prop, oldValue, Rows[iNewRowNumber][prop], true )

                        if (null!=this.oRowSupport) {
                            this.oRowSupport.setValueByName( prop, Rows[iNewRowNumber][prop], null );
                        }
                    }
                } // for
                this.fireChangeEvent( "currentRowNumber", iOldRowNumber, iNewRowNumber, false);
            } // if
            return true
        } // else
    } // _setRowNumber

    function _setValueByName( sName, newValue ) {
        this[sName] = newValue;
        if (null!=this.oRowSupport) {
           this.oRowSupport.setValueByName( sName, newValue, null )
        }
    }

    function _getNumRowsFetched() {
        return this.numRows;
    }

    function _executeQuery() {

       if (null!=this.oRowSupport) {
          // tell our helper object about our data...
          this.oRowSupport.setNumColumns(7);
          this.oRowSupport.setColumnName(0,"records_custname");
          this.oRowSupport.setColumnName(1,"records_address");
          this.oRowSupport.setColumnName(2,"records_city");
          this.oRowSupport.setColumnName(3,"records_state");
          this.oRowSupport.setColumnName(4,"records_zip");
          this.oRowSupport.setColumnName(5,"records_phone");
          this.oRowSupport.setColumnName(6,"records_id");

           this.currentRow = -1
           // tell our listeners about our data
          this.oRowSupport.fireRowChange(1,null,null,null,oRowSupport,null);
       }
    }

    function _fireChangeEvent( prop, oldValue, newValue, bJSOnly ) {

       if (null!=this.oRowSupport&&(!bJSOnly)) {
           this.oRowSupport.firePropertyChange(prop,oldValue,newValue)
           this.oRowSupport.fireRowChange(2,prop,oldValue,newValue,oRowSupport,null)
       }

       if (null!=this.onChange) {
           this.onChange(prop,oldValue,newValue)
       }
    }

    function Row() {
       this.records_custname = arguments[0]
       this.records_id = arguments[1]
       this.records_address = arguments[2]
       this.records_city = arguments[3]
       this.records_state = arguments[4]
       this.records_zip = arguments[5]
       this.records_phone = arguments[6]
    }

    function netscape_peas_DummyCursor(params) {
       dc = new Object()
       for (p in params) {
            if (p.indexOf("records_") != -1) {
                dc[p] = params[p]
            }
       }

        dc.records_id = "";
        dc.records_custname = "";
        dc.records_address = "";
        dc.records_city = "";
        dc.records_state = "";
        dc.records_zip = "";
        dc.records_phone = "";

       dc.numRows = 10
       dc.nextRow = _next
       dc.previousRow = _previous
       dc.currentRow = -1
       dc.setCurrentRowNumber = _setCurrentRowNumber
       dc.fireChangeEvent = _fireChangeEvent
       dc.executeQuery = _executeQuery
       dc.getInterface = _getInterface
       dc.getNumRowsFetched = _getNumRowsFetched

       dc.setValueByName = _setValueByName

       Rows = new Array(10)
       Rows[0] = new Row("Ishikawa, Eli & Sally","100","1143 N 16th Street","Nashville","TN","33214","(503)555-6045")
       Rows[1] = new Row("Barnes, Allie","101","206 N 10th Street","Newport","OR","99999","(503)555-3195")
       Rows[2] = new Row("Tunison, Micheal J.","102","981 S Sycamore Avenue","Portland","OR","92349","(503)555-0116")
       Rows[3] = new Row("Maxwell, Steve & Tanya","103","435 N Westview Place","Santa Cruz","CA","93105","(503)555-3171")
       Rows[4] = new Row("Curtis, T Gray","104","1205 W 26th Street","Lincon City","OR","99999","(503)555-6517")
       Rows[5] = new Row("Breinholt, Sean & Vibeke","105","432 S 6th Street","Newport","OR","99999","(503)555-3818")
       Rows[6] = new Row("Richter, Bill & Joan","106","22554 Wells Creek Road","Toledo","OH","99999","(503)555-2814")
       Rows[7] = new Row("Corwin, Gerald","107","805 Cline Hill Loop","Newport","OR","99999","(503)555-4388")
       Rows[8] = new Row("Reid, Boots","108","247 S Twin Fir Circle","Dallas","TX","76114","(503)555-5123")
       Rows[9] = new Row("Luttrell, Jessica","109","1715 W 29th","Lincon City","OR","99999","(503)555-4926")
       return dc
    }
        </JSB_CONSTRUCTOR>
    </JSB>

    <JSB_LISTENER NAME="onChangeListener">
        <JSB_METHOD NAME="onChange" TYPE="void">
            <JSB_PARAMETER NAME="propertyName" TYPE="string">
            <JSB_PARAMETER NAME="oldValue" TYPE="undefined">
            <JSB_PARAMETER NAME="newValue" TYPE="undefined">
        </JSB_METHOD>
    </JSB_LISTENER>