Back Navigation and Browser Buttons

What is the best way to implement back navigation in JSF, such that the application also behaves as expected when the user sometimes uses the browser's back button?
Say, we have a page "index.jsp" and a page "results.jsp". From both pages it should be possible to navigate to the page "help.jsp" (which contains a back button). From "help.jsp" it might be possible to further navigate to, say, "about.jsp" (which also contains a back button and is, for example, also accessible directely from "index.jsp").
After the sequence "index->help->about", the user expects to be at "index" again after clicking back on about.jsp and then clicking back on help.jsp. If the same sequence starts at "results.jsp", the user would expect to be at "results.jsp" after clicking the two back buttons, etc.
What is the best way to achieve this behaviour? I guess I best store the entire navigation history in a session bean (something like a stack or so). Is that a good idea? I wonder how I best treat the case when the user hits the browser's back button (for example to navigate back from about.jsp to help.jsp). Any ideas? I could imagine that I could send a unique id (e.g. an increasing counter, or a long random variable) for every button click (using a hidden input, maybe?), such that I can always find the right point again in my navigation stack. But how would I nicely integrate something like this in JSF?
Thanks for any hints!
Michael

This one is nice. But it doesn't redirect to a GET-formed URL.
I just had taken 20 mins to refine it:
test.jsp<h:form>
    <h:inputText id="paramname1" value="#{myBean.paramname1}" />
    <h:inputText id="paramname2" value="#{myBean.paramname2}" />
    <h:commandButton value="submit" action="#{myBean.action}" />
</h:form>MyBeanpublic class MyBean {
    private String paramname1;
    private String paramname2;
    // + getters + setters
    public void action() {
        System.out.println("meep");
}faces-config.xml<lifecycle>
    <phase-listener>mypackage.PostRedirectGetListener</phase-listener>
</lifecycle>
<managed-bean>
    <managed-bean-name>myBean</managed-bean-name>
    <managed-bean-class>mypackage.MyBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>paramname1</property-name>
        <value>#{param.paramname1}</value>
    </managed-property>
    <managed-property>
        <property-name>paramname2</property-name>
        <value>#{param.paramname2}</value>
    </managed-property>
</managed-bean>PostRedirectGetListenerpublic void beforePhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        FacesContext facesContext = event.getFacesContext();
        HttpServletRequest request = (HttpServletRequest) facesContext.getExternalContext().getRequest();
        if ("POST".equals(request.getMethod())) {
            Set paramKeys = facesContext.getExternalContext().getRequestParameterMap().keySet();
            List params = new ArrayList();
            for (Iterator it = paramKeys.iterator(); it.hasNext();) {
                String componentId = (String) it.next();
                UIComponent component = facesContext.getViewRoot().findComponent(componentId);
                if (component instanceof UIInput) {
                    String paramname = componentId.substring(componentId.lastIndexOf(':') + 1);
                    Object value = ((UIInput) component).getValue();
                    String paramvalue = value != null ? value.toString() : "";
                    params.add(paramname + "=" + paramvalue);
            String url = facesContext.getApplication().getViewHandler().getActionURL(
                facesContext, facesContext.getViewRoot().getViewId());
            for (int i = 0; i < params.size(); i++) {
                switch (i) {
                    case 0: url += "?" + params.get(i); break;
                    default: url += "&" + params.get(i); break;
            try {
                System.out.println("PRG to " + url);
                event.getFacesContext().getExternalContext().redirect(url);
            } catch (IOException e) {
                e.printStackTrace();
public void afterPhase(PhaseEvent event) {
    // Do nothing.
public PhaseId getPhaseId() {
    return PhaseId.ANY_PHASE;
}For restoring facesmessages, just add the relevant code of the PRG thingy you have found.

Similar Messages

  • How can I disable back, forward and refresh button in browser running ADF 11.1.2.2

    How can I disable back, forward and refresh button in browser running ADF 11.1.2.2?

    I insert the java script into ADF page. But it does not work. The ADF source look like below. Did I insert into wrong region?
       <f:view>
            <af:document id="d1">
                <af:messages id="m1"/>
                <af:resource type="javascript">
                  window.history.forward();
                  function noBack() {
                      window.history.forward();
                </af:resource>
                <af:form id="f1">
                    <af:pageTemplate viewId="/template/temp2.jspx" id="pt1">
                        <f:facet name="body">
                            <af:panelStretchLayout id="psl1" topHeight="30px">
                                <f:facet name="bottom"/>
                                <f:facet name="center">
                                    <af:panelBox text="Incident List" id="pb1">
                                        <f:facet name="toolbar"/>
                                        <af:panelCollection id="pc1">
                                            <f:facet name="menus"/>
                                            <f:facet name="toolbar"/>
                                            <f:facet name="statusbar"/>
                                            <af:table value="#{bindings.ServiceRequestMain.collectionModel}" var="row"
                                                      rows="#{bindings.ServiceRequestMain.rangeSize}"

  • The forward, back, refresh, and stop buttons are not working. Even after installing the latest version. Anyone else having this issue?

    The forward, back, refresh, and stop buttons are not working. Even after installing the latest Firefox update. Also my home page stopped loading upon startup even tho I have it setup to do so. Anyone else experiencing these issues? This is my second request for help and of course, Firefox on-line support is always closed.

    Those are all symptoms of a problem with the places.sqlite file, for details see http://kb.mozillazine.org/Locked_or_damaged_places.sqlite

  • Why did the back, forward and refresh buttons stop working

    When I started the computer for first time today I opened firefox I no longer can use the back, forward or refresh buttons when visiting sites. Alaso even though I have selected firefox to open with home page it opens with a bland until I hit home button. It is acting very strange,

    See http://kb.mozillazine.org/Bookmarks_history_and_toolbar_buttons_not_working_-_Firefox

  • Adobe form: Issue with BACK, CANCEL and EXIT buttons

    I am new to Adobe forms. I created a simple demo Adobe form and was able to print it successfully except a strange problem.
    Whenever I opt for print preview it shows me a blank page. On pressing enter it shows me the form, But now none of the BACK, EXIT, CANCEL buttons work. On pressing any of them I keep getting the print form.
    So the only way I can come out of it is /n.
    Can anyone please help with the reason for such an issue and how to get rid of it.
    Regards,
    Ashutosh

    Maybe you can tell us something more about the code you use to print your form. I think thatis the problem. Otto

  • Back, Start, and Search button lights turn off and...

    the led lights under the touch buttons at the bottom of the screen sometimes turn off, then come back on again after a few seconds. I can't find a reference to this anywhere in the manual - is this normal?
    could it indicate an area of low connectivity?
    Solved!
    Go to Solution.

    Ok. Found how to fix it:
    You need to remove your version to original and then resotre back up.
    This video shows is exatly how it is done.
    http://www.youtube.com/watch?v=K3JdQY5FGiw
    After that you can resotore all your phone (just make sure you made bakups), all besides the start screen setup wich you need to orgenzie again- all the rest is the same.
    Good luck

  • The File/edit/view/history/tools/help bar and the Back/refresh/and home buttons that used to be on the top left of the screen are no longer there. I want them back

    I don't know what I did, maybe download a more recent version of firefox, but I no longer have any of the file/edit/view/history/bookmarks/tools/help bar on upper left hand of the screen.
    I also lost the BACK button the refresh or undo button and the home button.
    where did they go and how do I get them back?
    Thanks
    Jim F

    Aha! I found the "refresh" button at the end of the place where I enter the URL. don't know where "home" is yet, but my home page has mysteriously appeared in the tool bar above the URL.

  • 8530 curve back symbol and end button

    when i am on the dialer or a text and i hit the back arrow next to the track pad or the end but it places a B if i hit the back arrow or a P if i hit the end button.

    Uh oh...that's a shame...hopefully the seller is reputable...
    The next suspicion is moisture intrusion, for which this applies:
    REMOVE YOUR BB BATTERY NOW!!!
    Run, don't walk, to this FAQ:
    http://www.blackberryfaq.com/index.php/Got_Your_BlackBerry_Wet%3F
    Do everything it says, including waiting the maximum recommended time. Applying power to your BB between it getting wet and doing this process reduces the chances of success. Further, the only thing predictable about moisture intrusion into a BB (indeed, any electronic device) is that the results will be unpredictable. I've seen some come back up right away and be fine. I've seen others never work at all. I've seen still others run for a bit, and then die later. And every thing in between.
    On the other hand, you may want to see if the seller will remedy the situation...if they represented the BB as fully functional, then they misrepresented it, which would incline me to not trust them for anything. And, if they did not do all necessary steps before selling it, then you may never be able to get this device to work properly on any carrier...see this:
    KB05099 Steps to take before selling or after buying a previously owned BlackBerry smartphone
    If the seller did not conduct their steps (most importantly getting the BB PIN released from any BIS or BES systems with which it may have been associated), then it is possible that no carrier will be able to properly register it on their system for your use. Further, if perhaps the device was reported as lost or stolen, then that as well will preclude your ever being actually able to use it.
    I know I may sound overly cautious, but used BBs have a huge Black Market, and way too many people have been stuck with non-functional devices due to unscrupulous sellers.
    Good luck!
    Occam's Razor nearly always applies when troubleshooting technology issues!
    If anyone has been helpful to you, please show your appreciation by clicking the button inside of their post. Please click here and read, along with the threads to which it links, for helpful information to guide you as you proceed. I always recommend that you treat your BlackBerry like any other computing device, including using a regular backup schedule...click here for an article with instructions.
    Join our BBM Channels
    BSCF General Channel
    PIN: C0001B7B4   Display/Scan Bar Code
    Knowledge Base Updates
    PIN: C0005A9AA   Display/Scan Bar Code

  • After upgrading to Snow Leopard two weeks ago, I get a little square grey box under the upper-left Apple icon which doesn't move and blocks the back arrow and three buttons for minimizing, deleting, etc. Why?

    It's very annoying, since I have to move the screens down to x-out or go back to the previous page. I have upgraded to the current FireFox and re-started the computer any number of times. Please help. Thanks. Susan Freedman-Varbero (Should I un-install, for example?)

    It's very annoying, since I have to move the screens down to x-out or go back to the previous page. I have upgraded to the current FireFox and re-started the computer any number of times. Please help. Thanks. Susan Freedman-Varbero (Should I un-install, for example?)

  • Commands for back, play and next button.

    I used to have three quicklaunch shortcuts, where I could change the song.
    Now I cant remember what the commands are?
    basicly they are just shortcuts to itunes.exe and some command for the buttons at the end.

    AFAIK, you cannot use arguments to itunes.exe to control iTunes -- you can only add songs to the library.
    You can, however, control iTunes with scripts (VBS, JS, etc.). For example, here's a series of scripts you can use:
    http://maximized.com/freeware/scriptsforitunes/default.asp
    (see the "documentation" link on that page for how to use them)

  • Opening link in a new tab disables back navigation to the first page

    If I am on page A (for an example, let's say it is www.yahoo.com) and I chose a link on that page and by right-clicking open pop-up menu and choose '''Open Link in New Tab''', the page B (let's say finance.yahoo.com) opens in a new tab. Now, if I click on any link on this page B to be opened in the same tab the page (we will call it C) opens, but all options to navigate back ('''Go Back One Page''' browser button, Alt-Left Arrow, '''Back''' option on pop-up menu) appear disabled. However, if I continue to navigate from page C in the same tab to let's say page D, and from there to pages E and F, I can go back all the way to page C, but no further. It looks like for some reason the opening link in a new tab fails to put it in that tab navigation history.
    I am running Firefox 4.01. It happens only on my office computer and not on any other computers I use. I had this problem before on the same office computer with Firefox 3.6. I could not get rid of it. Only after I uninstalled 3.6, cleaned all remnants of it and installed 4.0 – the problem went away. I updated to 4.01 and it worked fine for a while. But recently (I don't know what triggered it) the problem came back.

    Thanks for your post.
    I've seen it, and that's what I want to avoid. Like I said, if I click on a link which was suppose to open in a new window, it should open in new tab instead.
    Thanks.

  • What are logics for the SAP UI icons of "Back", "Exit" and "Cancel"?

    Hi SAP experts,
    This question may sound kind of strange - isn't that obvious?
    While, it is in fact a very important and difficult issue for UI app implementations when UI flow should be kept persistant. I have been feeling confused when doing UI implementations in Personas, specially when at some screens I need to add my own "BACK" button in order to go back to the previous screen (which can be different screens depending flow conditions.)
    Can anyone explain what the basic logic is used for the SAP "Back", "Exit" and "Cancel" buttons (see below)?
    Here are my understandings (which may not be accurate or correct):
    1. "Back" icon (left): By pressing this icon, all the changes made in the current screen are discarded, and UI moves back to the previous screen. If there are some fields already been filled with values in the previous screen, there can be two UI behaviours depending on the platforms used:
        a) Some platform will restore the values so the screen looks EXACTLY like before.
        b) Some others will leave all fields empty (While, this can be annoying if you have to re-fill all the fields).
    2. "Exit" icon (middle): By pressing this icon, all the changes made in the current screen are discarded, and UI moves back to the "Initial (or Home)" screen which in most time should be the first launching page of the app.
    3. "Cancel" icon(right): I am very confused by this key - what is the special functionality of this key compared to those of the "Back" key and "Exit" key?
    I have been working in many years on developing UI apps for mobile devices, and there were no such three types of keys for UI navigations. Maybe I missed some special points that is special only on SAP?
    Thanks a lot in advance!
    Dong Zhu

    This may not sound that interesting so I will close it to keep our track "clean".
    By the way, just want to share some finding - in Personas, when replacing the Exit or Cancel buttons by transactions, I found that "/n" and "SMEN" does not give the same result, and it depends on whether it is the Exit button or Cancel button that is to be replaced.
    Close this question.
    Dong Zhu

  • Back, cancel and exit - disabled problem!!!

    hi,
    please find the code of my program below. it is working fine but i am not able to make the back, exit and cancel button in the standard toolbar(buttons beside the box where we write the trascaction code) enabled. can any one tell me how to make those buttons enabled???
    thanks in advance,
    pushpa
    tables kna1.
    data: begin of itkna1 occurs 0,
             ktokd like kna1-ktokd,
             kunnr like kna1-kunnr,
             name1 like kna1-name1,
             name2 like kna1-name2,
             ktokd_hdl type int4,
          end of itkna1.
    *creating an instance of grid
    data it_custom_control_name type scrfname value 'C_C_ALV'.  "custom control name
    data it_container type ref to cl_gui_custom_container.      "container
    data it_alvgrid type ref to cl_gui_alv_grid.                "grid control
    data it_lyo type lvc_s_layo.                                "layout internal table
    data it_fcat type lvc_t_fcat.                               "fieldcatagory internal table
    data it_hype type lvc_t_hype.                               "hyperlink internal table
    data tmp_hype type lvc_s_hype.                              "temp hyperlink internal table
    data gs_toolbar type stb_button.                            "toolbar instance
    data ok_code like sy-ucomm.
    data gt_hypetab type lvc_t_hype.
    data ls_hype type lvc_s_hype.
    ls_hype-handle = '1'.
    ls_hype-href = 'http://www.sap.com'.
    append ls_hype to gt_hypetab.
    ls_hype-handle = '2'.
    ls_hype-href = 'http://www.yahoo.com'.
    append ls_hype to gt_hypetab.
    ls_hype-handle = '3'.
    ls_hype-href = 'http://www.gmail.com'.
    append ls_hype to gt_hypetab.
    ls_hype-handle = '4'.
    ls_hype-href = 'http://www.orkut.com'.
    append ls_hype to gt_hypetab.
    ls_hype-handle = '5'.
    ls_hype-href = 'http://www.rediffmail.com'.
    append ls_hype to gt_hypetab.
    ls_hype-handle = '6'.
    ls_hype-href = 'http://www.hotmail.com'.
    append ls_hype to gt_hypetab.
    ls_hype-handle = '7'.
    ls_hype-href = 'http://www.deals2buy.com'.
    append ls_hype to gt_hypetab.
    *class lcl_event_receiver definition
    class lcl_event_receiver definition.
      public section.
      methods handle_toolbar_set
        for event toolbar of cl_gui_alv_grid
        importing e_object e_interactive.
      methods handle_double_click
       for event double_click of cl_gui_alv_grid
       importing e_row e_column.
      methods handle_user_command
       for event user_command of cl_gui_alv_grid
       importing e_ucomm sender.
      methods handle_hotspot_click
        for event hotspot_click of cl_gui_alv_grid
        importing e_row_id e_column_id es_row_no.
      private section.
      data i type i.
    endclass.
    data event_receiver type ref to lcl_event_receiver.
    *creating screen to enter selection  criteria
    selection-screen begin of block enter_data with frame title text-001.
      parameters pktokd like kna1-ktokd obligatory.
      select-options skunnr for kna1-kunnr.
    selection-screen end of block enter_data.
    *copying the data from the database table to the internal table
    select ktokd kunnr name1 name2
      from kna1 into corresponding fields of table itkna1
           where ktokd = pktokd and kunnr in skunnr.
    *prepare field catalog
    perform prepare_fieldcat using:
    1 'KTOKD' 'KNA1'  8  '' 'KTOKD_HDL' it_fcat,
    2 'KUNNR' 'KNA1' 10 'X' '' it_fcat,
    3 'NAME1' 'KNA1' 15  '' '' it_fcat,
    4 'NAME2' 'KNA1' 15  '' '' it_fcat.
    *loop at itkna1.
    itkna1-ktokd_hdl = sy-tabix."gt_hypetab-handle.
    *ENDLOOP.
    *modify itkna1.
    *prepare layout
    it_lyo-grid_title = 'Custormer details'.
    call screen 200.
    module status_0200 output.
    set pf-status 'MAIN100'.
    set titlebar 'MAIN100'.
    *creating an instance of container class
    create object it_container
        exporting container_name = it_custom_control_name.
    *creating an instance of the grid
    create object it_alvgrid
        exporting i_parent = it_container.
    create object event_receiver.
    set handler event_receiver->handle_toolbar_set for it_alvgrid.
    set handler event_receiver->handle_double_click for it_alvgrid.
    set handler event_receiver->handle_user_command for it_alvgrid.
    set handler event_receiver->handle_hotspot_click for it_alvgrid.
    *displaying the grid
    call method it_alvgrid->set_table_for_first_display
       exporting
         is_layout = it_lyo
         "it_hyperlink = it_hype
         it_hyperlink = gt_hypetab
       changing
         it_outtab = itkna1[]
         it_fieldcatalog = it_fcat
       exceptions
         invalid_parameter_combination = 1
         others = 2.
    endmodule.
    *class definition for hotspot click
    class lcl_event_receiver implementation.
      method handle_hotspot_click.
        data t_d1 like line of itkna1.
        read table itkna1 into t_d1 index es_row_no-row_id.
        set parameter id 'KUN' field t_d1-kunnr.
        call transaction 'XD03' and skip first screen.
      endmethod.
      method handle_user_command.
        case e_ucomm.
          when 'REFR'.
            perform refresh.
          when 'TOOLBAR'.
            call method sender->set_toolbar_interactive.
         endcase.
      endmethod.
      method handle_double_click.
    message i000(0k) with 'Zeile'(010) e_row 'SpaltenID'(002) e_column.
        message 'double click' type 'S'.
        call method cl_gui_control=>set_focus
          exporting control = it_alvgrid.
      endmethod.
    method handle_toolbar_set.
      clear gs_toolbar.
      move 'DELE' to gs_toolbar-function.
      move icon_delete to gs_toolbar-icon.
      move 'Mein Löschen'(111) to gs_toolbar-quickinfo.
      move ' ' to gs_toolbar-disabled.
      append gs_toolbar to e_object->mt_toolbar.
      clear gs_toolbar.
      move 'REFR' to gs_toolbar-function.
      move icon_refresh to gs_toolbar-icon.
      move 'Mein Refresh'(112) to gs_toolbar-quickinfo.
      move ' ' to gs_toolbar-disabled.
      insert gs_toolbar into e_object->mt_toolbar index 1.
    *del  APPEND GS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
      clear gs_toolbar.
      move 'MBUT' to gs_toolbar-function.
      move icon_checked to gs_toolbar-icon.
      move 'My Menubutton'(101) to gs_toolbar-quickinfo.
      move 2 to gs_toolbar-butn_type.
      move space to gs_toolbar-disabled.
      append gs_toolbar to e_object->mt_toolbar.
      clear gs_toolbar.
      move 'MBUT1' to gs_toolbar-function.
      move icon_cancel to gs_toolbar-icon.
      move 'My Menubutton disabled'(102) to gs_toolbar-quickinfo.
      move 2 to gs_toolbar-butn_type.
      move 'X' to gs_toolbar-disabled.
      append gs_toolbar to e_object->mt_toolbar.
      call method cl_gui_control=>set_focus
        exporting control = it_alvgrid.
    endmethod.
    endclass.
    module user_command_0200.
      case ok_code.
        when 'BACK'.
          perform exit_program.
        when 'EXIT'.
          perform exit_program.
        when 'CANCEL'.
          perform cancel.
        when 'REFRESH'.
          perform refresh_table.
      endcase.
    endmodule.
    *module to perform cancel function to cancel the action
    form cancel.
    endform.
    *module to refresh the screen
    form refresh.
    message 'REFRESH' type 'S'.
    endform.
    *module to make the exit button on the toolbar to exit
    form exit_program.
      call method it_container->free.
      set screen 0.
      leave screen.
    endform.
    *module to refresh the internal table after a modification is made
    form refresh_table.
      message 'refresh table' type 'S'.
    endform.
    *filling the field catalog internal table
    form prepare_fieldcat using pos p_fname p_tabname len p_hspot p_hdl t_fcat type lvc_t_fcat..
    data tmp_fcat like line of it_fcat.
    clear tmp_fcat.
    tmp_fcat-fieldname = tmp_fcat-ref_field = p_fname.
    tmp_fcat-ref_table = p_tabname.
    tmp_fcat-outputlen = len.
    tmp_fcat-col_pos = pos.
    tmp_fcat-hotspot = p_hspot.
    tmp_fcat-web_field = p_hdl.
    append tmp_fcat to it_fcat.
    endform.

    did you use pf-status in ur program,if so click on pf-status ,then use BACK,EXIT,CANC all are should be Upper case

  • Reg: save exit and cancel buttons

    Hi,
    In normal report programs when we enable the back , exit and cancel buttons they work fine without writing any code.but its not in the case of Module pool why?
    In thr normal reports where does the code come from?
    regards
    prasanth

    Hi....
    Module pool programs is nothing but screen flow + reports...
    Here we designing the screens....
    So we hav to to give every functionality.. for all buttons and menu items of the appeared screen...
    Where as in reports...,
    We are just using the standard screen (sellection screen and list output screen ) s mostly...,
    Here also some times we hav to go for created screens.. nothing but.... interactive reports...,
    There we need to give again all those functionalities...
    And..,
    To see the BACK button logic and other logics in the reports...,
    Ex: PAI event of SAPLWBABAP program..., 
    You can find that name with...
    By giving /H and enter before ur action...
    Thanks,
    Naveen.I

  • Input File browse button missing

    The browse button is missing for the input file component where MaximumFiles is set to a value > 1. All that is displayed is the box for the list of files and a blank white space where the input field and browse button should be. Any thoughts?
    JDeveloper 11.1.1.7

    It looks like the button is rendering in Firefox and Chrome but not in IE8. Using the fusionFx-v1.1.desktop skin (extended) and on Windows 7. All I did was add the component to the page and set the MaximumFiles attribute.

Maybe you are looking for

  • Assistance required for deploying a validation handler in OIM 11g

    Hi All, I wanted to deploy a validation handler in OIM 11g so that I can check that the telephone number that is entered by the user has length of ten and all of them are digits. I created a new eclipse workspace called TelephoneValidationHandler on

  • Word,Excel etc - is there an application?

    Would really like to carry an excel file around with me on my iphone - can this be done? I have tried attaching it to an email where I thought I could open it but I can't open attachments?? Any help suggestions greatly appreciated. 3GS and Excel on M

  • DW CC Displaying Duplicate Stylesheets

    Dreamweaver has started showing duplicate stylesheets for every one that I create. When I select the duplicate one it gives me the "...is not on the local disk. Get" dialog. Every time I create or add a new css doc to the site it automatically create

  • How to execute a query than open a popup?

    Hi, We created a custom OA module. This module has buttons on it. Those buttons generates events. Depending on each event, I should execute a query, transform the result in a xml than open a popup and pass the xml content to the jsp page that was ope

  • Mac shuts down after security update 2007-005

    I installed security update 2007-005 and now after going to sleep the mac just shuts down. I have repaired permissions and run DiskWarrior. It just keeps happening. Karen iMac G5   Mac OS X (10.3.9)