From 65fe46e524ed1a3597416b40213cf6059e932191 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 25 May 2012 16:44:45 -0400 Subject: [PATCH] Add samples from Web Flow distribution --- .gitignore | 21 +- README.md | 35 +- booking-faces/build.xml | 18 + booking-faces/pom.xml | 245 +++++++++ .../webflow/samples/booking/Amenity.java | 5 + .../webflow/samples/booking/Booking.java | 226 ++++++++ .../samples/booking/BookingService.java | 62 +++ .../webflow/samples/booking/Hotel.java | 110 ++++ .../samples/booking/HotelLazyDataModel.java | 54 ++ .../samples/booking/JpaBookingService.java | 109 ++++ .../samples/booking/ReferenceData.java | 83 +++ .../samples/booking/SearchCriteria.java | 65 +++ .../webflow/samples/booking/User.java | 62 +++ .../resources/JsfMessageResources.properties | 6 + .../main/resources/META-INF/persistence.xml | 18 + .../resources/ValidationMessages.properties | 2 + booking-faces/src/main/resources/import.sql | 27 + booking-faces/src/main/resources/log4j.xml | 52 ++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../webapp/WEB-INF/classes/log4j.properties | 11 + .../WEB-INF/config/data-access-config.xml | 33 ++ .../webapp/WEB-INF/config/security-config.xml | 38 ++ .../WEB-INF/config/web-application-config.xml | 18 + .../webapp/WEB-INF/config/webflow-config.xml | 33 ++ .../webapp/WEB-INF/config/webmvc-config.xml | 36 ++ .../src/main/webapp/WEB-INF/faces-config.xml | 11 + .../WEB-INF/flows/booking/booking-flow.xml | 33 ++ .../flows/booking/enterBookingDetails.xhtml | 141 +++++ .../WEB-INF/flows/booking/messages.properties | 2 + .../WEB-INF/flows/booking/reviewBooking.xhtml | 83 +++ .../flows/main/enterSearchCriteria.xhtml | 74 +++ .../webapp/WEB-INF/flows/main/main-flow.xml | 43 ++ .../WEB-INF/flows/main/reviewHotel.xhtml | 43 ++ .../WEB-INF/flows/main/reviewHotels.xhtml | 52 ++ .../src/main/webapp/WEB-INF/intro.xhtml | 44 ++ .../webapp/WEB-INF/layouts/standard.xhtml | 63 +++ .../src/main/webapp/WEB-INF/login.xhtml | 58 +++ .../main/webapp/WEB-INF/logoutSuccess.xhtml | 14 + .../webapp/WEB-INF/springsecurity.taglib.xml | 31 ++ booking-faces/src/main/webapp/WEB-INF/web.xml | 117 +++++ booking-faces/src/main/webapp/images/bg.gif | Bin 0 -> 172 bytes .../src/main/webapp/images/btn.bg.gif | Bin 0 -> 349 bytes .../src/main/webapp/images/diplomat.jpg | Bin 0 -> 17957 bytes .../src/main/webapp/images/header.jpg | Bin 0 -> 29843 bytes .../src/main/webapp/images/input.bg.gif | Bin 0 -> 122 bytes .../main/webapp/images/powered-by-spring.png | Bin 0 -> 6591 bytes .../src/main/webapp/images/springone2gx.jpeg | Bin 0 -> 1643 bytes .../src/main/webapp/images/th.bg.gif | Bin 0 -> 1074 bytes booking-faces/src/main/webapp/images/tse.gif | Bin 0 -> 2814 bytes booking-faces/src/main/webapp/index.html | 5 + .../webapp/styles/blueprint/icons/cross.png | Bin 0 -> 655 bytes .../webapp/styles/blueprint/icons/key.png | Bin 0 -> 455 bytes .../webapp/styles/blueprint/icons/tick.png | Bin 0 -> 537 bytes .../src/main/webapp/styles/blueprint/ie.css | 36 ++ .../blueprint/plugins/buttons/icons/cross.png | Bin 0 -> 655 bytes .../blueprint/plugins/buttons/icons/key.png | Bin 0 -> 455 bytes .../blueprint/plugins/buttons/icons/tick.png | Bin 0 -> 537 bytes .../blueprint/plugins/buttons/readme.txt | 32 ++ .../blueprint/plugins/buttons/screen.css | 97 ++++ .../blueprint/plugins/fancy-type/readme.txt | 14 + .../blueprint/plugins/fancy-type/screen.css | 71 +++ .../plugins/link-icons/icons/doc.png | Bin 0 -> 777 bytes .../plugins/link-icons/icons/email.png | Bin 0 -> 641 bytes .../plugins/link-icons/icons/external.png | Bin 0 -> 46848 bytes .../plugins/link-icons/icons/feed.png | Bin 0 -> 691 bytes .../blueprint/plugins/link-icons/icons/im.png | Bin 0 -> 741 bytes .../plugins/link-icons/icons/pdf.png | Bin 0 -> 591 bytes .../plugins/link-icons/icons/visited.png | Bin 0 -> 46990 bytes .../plugins/link-icons/icons/xls.png | Bin 0 -> 663 bytes .../blueprint/plugins/link-icons/readme.txt | 18 + .../blueprint/plugins/link-icons/screen.css | 40 ++ .../styles/blueprint/plugins/rtl/readme.txt | 10 + .../styles/blueprint/plugins/rtl/screen.css | 110 ++++ .../main/webapp/styles/blueprint/print.css | 29 ++ .../main/webapp/styles/blueprint/screen.css | 280 ++++++++++ .../webapp/styles/blueprint/src/forms.css | 65 +++ .../main/webapp/styles/blueprint/src/grid.css | 281 ++++++++++ .../main/webapp/styles/blueprint/src/grid.png | Bin 0 -> 161 bytes .../main/webapp/styles/blueprint/src/ie.css | 76 +++ .../webapp/styles/blueprint/src/print.css | 85 +++ .../webapp/styles/blueprint/src/reset.css | 38 ++ .../styles/blueprint/src/typography.css | 106 ++++ .../src/main/webapp/styles/booking.css | 59 +++ .../le-frog/images/ui-anim_basic_16x16.gif | Bin 0 -> 1553 bytes .../ui-bg_diagonals-small_0_aaaaaa_40x40.png | Bin 0 -> 128 bytes .../ui-bg_diagonals-thick_15_444444_40x40.png | Bin 0 -> 253 bytes .../ui-bg_diagonals-thick_95_ffdc2e_40x40.png | Bin 0 -> 266 bytes .../images/ui-bg_glass_55_fbf5d0_1x400.png | Bin 0 -> 123 bytes .../ui-bg_highlight-hard_30_285c00_1x100.png | Bin 0 -> 121 bytes .../ui-bg_highlight-soft_33_3a8104_1x100.png | Bin 0 -> 123 bytes .../ui-bg_highlight-soft_50_4eb305_1x100.png | Bin 0 -> 126 bytes .../ui-bg_highlight-soft_60_4ca20b_1x100.png | Bin 0 -> 134 bytes .../ui-bg_inset-soft_10_285c00_1x100.png | Bin 0 -> 118 bytes .../images/ui-icons_4eb305_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_72b42d_256x240.png | Bin 0 -> 5355 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes .../styles/le-frog/jquery-ui-1.8.2.custom.css | 489 ++++++++++++++++++ .../booking/BookingFlowExecutionTests.java | 83 +++ .../booking/MainFlowExecutionTests.java | 119 +++++ booking-faces/src/test/resources/.gitignore | 0 booking-mvc/build.xml | 17 + booking-mvc/pom.xml | 262 ++++++++++ .../webflow/samples/booking/Amenity.java | 5 + .../webflow/samples/booking/Booking.java | 215 ++++++++ .../samples/booking/BookingDateRange.java | 22 + .../booking/BookingDateRangeValidator.java | 19 + .../samples/booking/BookingFlowHandler.java | 30 ++ .../samples/booking/BookingService.java | 52 ++ .../webflow/samples/booking/Hotel.java | 107 ++++ .../samples/booking/HotelsController.java | 50 ++ .../samples/booking/JpaBookingService.java | 94 ++++ .../samples/booking/SearchCriteria.java | 56 ++ .../webflow/samples/booking/User.java | 59 +++ .../main/resources/META-INF/persistence.xml | 18 + booking-mvc/src/main/resources/import.sql | 27 + booking-mvc/src/main/resources/log4j.xml | 48 ++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../webapp/WEB-INF/classes/log4j.properties | 11 + .../WEB-INF/config/data-access-config.xml | 38 ++ .../webapp/WEB-INF/config/security-config.xml | 37 ++ .../WEB-INF/config/web-application-config.xml | 18 + .../webapp/WEB-INF/config/webflow-config.xml | 37 ++ .../webapp/WEB-INF/config/webmvc-config.xml | 48 ++ .../WEB-INF/hotels/booking/booking-flow.xml | 50 ++ .../hotels/booking/enterBookingDetails.jsp | 196 +++++++ .../WEB-INF/hotels/booking/messages.jsp | 5 + .../hotels/booking/messages.properties | 16 + .../WEB-INF/hotels/booking/reviewBooking.jsp | 65 +++ .../webapp/WEB-INF/hotels/booking/views.xml | 16 + .../webapp/WEB-INF/hotels/bookingsTable.jsp | 53 ++ .../src/main/webapp/WEB-INF/hotels/list.jsp | 74 +++ .../src/main/webapp/WEB-INF/hotels/search.jsp | 5 + .../main/webapp/WEB-INF/hotels/searchForm.jsp | 36 ++ .../src/main/webapp/WEB-INF/hotels/show.jsp | 22 + .../src/main/webapp/WEB-INF/hotels/views.xml | 21 + booking-mvc/src/main/webapp/WEB-INF/intro.jsp | 29 ++ .../main/webapp/WEB-INF/layouts/standard.jsp | 69 +++ .../src/main/webapp/WEB-INF/layouts/views.xml | 10 + booking-mvc/src/main/webapp/WEB-INF/login.jsp | 66 +++ .../src/main/webapp/WEB-INF/logoutSuccess.jsp | 8 + booking-mvc/src/main/webapp/WEB-INF/views.xml | 20 + booking-mvc/src/main/webapp/WEB-INF/web.xml | 59 +++ booking-mvc/src/main/webapp/images/bg.gif | Bin 0 -> 163 bytes booking-mvc/src/main/webapp/images/btn.bg.gif | Bin 0 -> 70 bytes .../src/main/webapp/images/diplomat.jpg | Bin 0 -> 17957 bytes booking-mvc/src/main/webapp/images/header.jpg | Bin 0 -> 29843 bytes .../src/main/webapp/images/input.bg.gif | Bin 0 -> 122 bytes .../main/webapp/images/powered-by-spring.png | Bin 0 -> 6591 bytes .../src/main/webapp/images/spring-logo.jpg | Bin 0 -> 31339 bytes .../src/main/webapp/images/springone2gx.jpeg | Bin 0 -> 1643 bytes booking-mvc/src/main/webapp/images/th.bg.gif | Bin 0 -> 1074 bytes booking-mvc/src/main/webapp/images/tse.gif | Bin 0 -> 2814 bytes .../src/main/webapp/images/webflow-logo.jpg | Bin 0 -> 2383 bytes .../webapp/styles/blueprint/icons/cross.png | Bin 0 -> 655 bytes .../webapp/styles/blueprint/icons/key.png | Bin 0 -> 455 bytes .../webapp/styles/blueprint/icons/tick.png | Bin 0 -> 537 bytes .../src/main/webapp/styles/blueprint/ie.css | 36 ++ .../blueprint/plugins/buttons/icons/cross.png | Bin 0 -> 655 bytes .../blueprint/plugins/buttons/icons/key.png | Bin 0 -> 455 bytes .../blueprint/plugins/buttons/icons/tick.png | Bin 0 -> 537 bytes .../blueprint/plugins/buttons/readme.txt | 32 ++ .../blueprint/plugins/buttons/screen.css | 97 ++++ .../blueprint/plugins/fancy-type/readme.txt | 14 + .../blueprint/plugins/fancy-type/screen.css | 71 +++ .../plugins/link-icons/icons/doc.png | Bin 0 -> 777 bytes .../plugins/link-icons/icons/email.png | Bin 0 -> 641 bytes .../plugins/link-icons/icons/external.png | Bin 0 -> 46848 bytes .../plugins/link-icons/icons/feed.png | Bin 0 -> 691 bytes .../blueprint/plugins/link-icons/icons/im.png | Bin 0 -> 741 bytes .../plugins/link-icons/icons/pdf.png | Bin 0 -> 591 bytes .../plugins/link-icons/icons/visited.png | Bin 0 -> 46990 bytes .../plugins/link-icons/icons/xls.png | Bin 0 -> 663 bytes .../blueprint/plugins/link-icons/readme.txt | 18 + .../blueprint/plugins/link-icons/screen.css | 40 ++ .../styles/blueprint/plugins/rtl/readme.txt | 10 + .../styles/blueprint/plugins/rtl/screen.css | 110 ++++ .../main/webapp/styles/blueprint/print.css | 29 ++ .../main/webapp/styles/blueprint/screen.css | 280 ++++++++++ .../webapp/styles/blueprint/src/forms.css | 65 +++ .../main/webapp/styles/blueprint/src/grid.css | 281 ++++++++++ .../main/webapp/styles/blueprint/src/grid.png | Bin 0 -> 161 bytes .../main/webapp/styles/blueprint/src/ie.css | 76 +++ .../webapp/styles/blueprint/src/print.css | 85 +++ .../webapp/styles/blueprint/src/reset.css | 38 ++ .../styles/blueprint/src/typography.css | 106 ++++ .../src/main/webapp/styles/booking.css | 53 ++ .../booking/BookingFlowExecutionTests.java | 81 +++ booking-mvc/src/test/resources/.gitignore | 0 .../main/webapp/WEB-INF/faces-config.pageflow | 2 + booking-portlet-faces/build.xml | 11 + booking-portlet-faces/pom.xml | 219 ++++++++ booking-portlet-faces/readme.txt | 8 + .../webflow/samples/booking/Booking.java | 198 +++++++ .../samples/booking/BookingService.java | 59 +++ .../webflow/samples/booking/Hotel.java | 110 ++++ .../samples/booking/JpaBookingService.java | 93 ++++ .../samples/booking/ReferenceData.java | 83 +++ .../samples/booking/SearchCriteria.java | 66 +++ .../webflow/samples/booking/User.java | 62 +++ .../samples/booking/ViewFlowHandler.java | 11 + .../main/resources/META-INF/persistence.xml | 18 + .../src/main/resources/import.sql | 28 + .../src/main/resources/log4j.xml | 52 ++ .../webapp/WEB-INF/classes/log4j.properties | 11 + .../WEB-INF/config/application-config.xml | 44 ++ .../config/hotelbooking-portlet-config.xml | 56 ++ .../src/main/webapp/WEB-INF/faces-config.xml | 10 + .../webapp/WEB-INF/flows/booking/booking.xml | 31 ++ .../flows/booking/enterBookingDetails.xhtml | 122 +++++ .../WEB-INF/flows/booking/reviewBooking.xhtml | 74 +++ .../flows/main/enterSearchCriteria.xhtml | 77 +++ .../main/webapp/WEB-INF/flows/main/main.xml | 48 ++ .../WEB-INF/flows/main/reviewHotel.xhtml | 52 ++ .../WEB-INF/flows/main/reviewHotels.xhtml | 48 ++ .../webapp/WEB-INF/flows/view/intro.xhtml | 35 ++ .../main/webapp/WEB-INF/flows/view/view.xml | 16 + .../src/main/webapp/WEB-INF/portlet.xml | 40 ++ .../src/main/webapp/WEB-INF/web.xml | 65 +++ .../src/test/java/.gitignore | 0 .../src/test/resources/.gitignore | 0 booking-portlet-mvc/build.xml | 11 + booking-portlet-mvc/pom.xml | 224 ++++++++ .../webflow/samples/booking/Booking.java | 192 +++++++ .../samples/booking/BookingDateRange.java | 22 + .../booking/BookingDateRangeValidator.java | 19 + .../samples/booking/BookingService.java | 59 +++ .../samples/booking/BookingValidator.java | 31 ++ .../webflow/samples/booking/Hotel.java | 107 ++++ .../samples/booking/JpaBookingService.java | 93 ++++ .../samples/booking/SearchCriteria.java | 68 +++ .../webflow/samples/booking/User.java | 59 +++ .../samples/booking/ViewFlowHandler.java | 11 + .../main/resources/META-INF/persistence.xml | 18 + .../src/main/resources/import.sql | 28 + .../src/main/resources/log4j.xml | 48 ++ .../src/main/webapp/META-INF/MANIFEST.MF | 2 + .../webapp/WEB-INF/classes/log4j.properties | 11 + .../WEB-INF/config/application-config.xml | 44 ++ .../config/hotelbooking-portlet-config.xml | 49 ++ .../webapp/WEB-INF/flows/booking/booking.xml | 31 ++ .../flows/booking/enterBookingDetails.jsp | 142 +++++ .../WEB-INF/flows/booking/messages.properties | 16 + .../WEB-INF/flows/booking/reviewBooking.jsp | 65 +++ .../flows/main/enterSearchCriteria.jsp | 64 +++ .../main/webapp/WEB-INF/flows/main/main.xml | 55 ++ .../webapp/WEB-INF/flows/main/reviewHotel.jsp | 53 ++ .../WEB-INF/flows/main/reviewHotels.jsp | 63 +++ .../main/webapp/WEB-INF/flows/view/intro.jsp | 28 + .../main/webapp/WEB-INF/flows/view/view.xml | 16 + .../src/main/webapp/WEB-INF/portlet.xml | 40 ++ .../src/main/webapp/WEB-INF/web.xml | 54 ++ booking-portlet-mvc/src/test/java/.gitignore | 0 .../src/test/resources/log4j.properties | 9 + pom.xml | 17 + 255 files changed, 11428 insertions(+), 7 deletions(-) create mode 100755 booking-faces/build.xml create mode 100644 booking-faces/pom.xml create mode 100644 booking-faces/src/main/java/org/springframework/webflow/samples/booking/Amenity.java create mode 100755 booking-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java create mode 100755 booking-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java create mode 100755 booking-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java create mode 100644 booking-faces/src/main/java/org/springframework/webflow/samples/booking/HotelLazyDataModel.java create mode 100755 booking-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java create mode 100644 booking-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java create mode 100755 booking-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java create mode 100755 booking-faces/src/main/java/org/springframework/webflow/samples/booking/User.java create mode 100644 booking-faces/src/main/resources/JsfMessageResources.properties create mode 100755 booking-faces/src/main/resources/META-INF/persistence.xml create mode 100644 booking-faces/src/main/resources/ValidationMessages.properties create mode 100755 booking-faces/src/main/resources/import.sql create mode 100644 booking-faces/src/main/resources/log4j.xml create mode 100644 booking-faces/src/main/webapp/META-INF/MANIFEST.MF create mode 100755 booking-faces/src/main/webapp/WEB-INF/classes/log4j.properties create mode 100644 booking-faces/src/main/webapp/WEB-INF/config/data-access-config.xml create mode 100644 booking-faces/src/main/webapp/WEB-INF/config/security-config.xml create mode 100644 booking-faces/src/main/webapp/WEB-INF/config/web-application-config.xml create mode 100644 booking-faces/src/main/webapp/WEB-INF/config/webflow-config.xml create mode 100644 booking-faces/src/main/webapp/WEB-INF/config/webmvc-config.xml create mode 100644 booking-faces/src/main/webapp/WEB-INF/faces-config.xml create mode 100755 booking-faces/src/main/webapp/WEB-INF/flows/booking/booking-flow.xml create mode 100644 booking-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml create mode 100644 booking-faces/src/main/webapp/WEB-INF/flows/booking/messages.properties create mode 100755 booking-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml create mode 100644 booking-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml create mode 100755 booking-faces/src/main/webapp/WEB-INF/flows/main/main-flow.xml create mode 100644 booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml create mode 100644 booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml create mode 100755 booking-faces/src/main/webapp/WEB-INF/intro.xhtml create mode 100644 booking-faces/src/main/webapp/WEB-INF/layouts/standard.xhtml create mode 100755 booking-faces/src/main/webapp/WEB-INF/login.xhtml create mode 100755 booking-faces/src/main/webapp/WEB-INF/logoutSuccess.xhtml create mode 100644 booking-faces/src/main/webapp/WEB-INF/springsecurity.taglib.xml create mode 100755 booking-faces/src/main/webapp/WEB-INF/web.xml create mode 100644 booking-faces/src/main/webapp/images/bg.gif create mode 100644 booking-faces/src/main/webapp/images/btn.bg.gif create mode 100644 booking-faces/src/main/webapp/images/diplomat.jpg create mode 100644 booking-faces/src/main/webapp/images/header.jpg create mode 100644 booking-faces/src/main/webapp/images/input.bg.gif create mode 100644 booking-faces/src/main/webapp/images/powered-by-spring.png create mode 100644 booking-faces/src/main/webapp/images/springone2gx.jpeg create mode 100644 booking-faces/src/main/webapp/images/th.bg.gif create mode 100644 booking-faces/src/main/webapp/images/tse.gif create mode 100755 booking-faces/src/main/webapp/index.html create mode 100755 booking-faces/src/main/webapp/styles/blueprint/icons/cross.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/icons/key.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/icons/tick.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/ie.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/icons/cross.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/icons/key.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/icons/tick.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/readme.txt create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/screen.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/doc.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/email.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/external.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/feed.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/im.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/pdf.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/visited.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/xls.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt create mode 100755 booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/screen.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/print.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/screen.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/src/forms.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/src/grid.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/src/grid.png create mode 100755 booking-faces/src/main/webapp/styles/blueprint/src/ie.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/src/print.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/src/reset.css create mode 100755 booking-faces/src/main/webapp/styles/blueprint/src/typography.css create mode 100644 booking-faces/src/main/webapp/styles/booking.css create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-anim_basic_16x16.gif create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_inset-soft_10_285c00_1x100.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-icons_4eb305_256x240.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-icons_72b42d_256x240.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-icons_cd0a0a_256x240.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/images/ui-icons_ffffff_256x240.png create mode 100644 booking-faces/src/main/webapp/styles/le-frog/jquery-ui-1.8.2.custom.css create mode 100644 booking-faces/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java create mode 100644 booking-faces/src/test/java/org/springframework/webflow/samples/booking/MainFlowExecutionTests.java create mode 100644 booking-faces/src/test/resources/.gitignore create mode 100755 booking-mvc/build.xml create mode 100644 booking-mvc/pom.xml create mode 100644 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Amenity.java create mode 100755 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java create mode 100644 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java create mode 100644 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java create mode 100644 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingFlowHandler.java create mode 100755 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java create mode 100755 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java create mode 100644 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/HotelsController.java create mode 100755 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java create mode 100755 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java create mode 100755 booking-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java create mode 100755 booking-mvc/src/main/resources/META-INF/persistence.xml create mode 100755 booking-mvc/src/main/resources/import.sql create mode 100644 booking-mvc/src/main/resources/log4j.xml create mode 100644 booking-mvc/src/main/webapp/META-INF/MANIFEST.MF create mode 100755 booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties create mode 100644 booking-mvc/src/main/webapp/WEB-INF/config/data-access-config.xml create mode 100644 booking-mvc/src/main/webapp/WEB-INF/config/security-config.xml create mode 100644 booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml create mode 100644 booking-mvc/src/main/webapp/WEB-INF/config/webflow-config.xml create mode 100644 booking-mvc/src/main/webapp/WEB-INF/config/webmvc-config.xml create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/booking/booking-flow.xml create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/booking/enterBookingDetails.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.properties create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/booking/reviewBooking.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/booking/views.xml create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/bookingsTable.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/list.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/search.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/searchForm.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/show.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/hotels/views.xml create mode 100755 booking-mvc/src/main/webapp/WEB-INF/intro.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/layouts/standard.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/layouts/views.xml create mode 100755 booking-mvc/src/main/webapp/WEB-INF/login.jsp create mode 100755 booking-mvc/src/main/webapp/WEB-INF/logoutSuccess.jsp create mode 100644 booking-mvc/src/main/webapp/WEB-INF/views.xml create mode 100755 booking-mvc/src/main/webapp/WEB-INF/web.xml create mode 100644 booking-mvc/src/main/webapp/images/bg.gif create mode 100644 booking-mvc/src/main/webapp/images/btn.bg.gif create mode 100644 booking-mvc/src/main/webapp/images/diplomat.jpg create mode 100644 booking-mvc/src/main/webapp/images/header.jpg create mode 100644 booking-mvc/src/main/webapp/images/input.bg.gif create mode 100644 booking-mvc/src/main/webapp/images/powered-by-spring.png create mode 100644 booking-mvc/src/main/webapp/images/spring-logo.jpg create mode 100644 booking-mvc/src/main/webapp/images/springone2gx.jpeg create mode 100644 booking-mvc/src/main/webapp/images/th.bg.gif create mode 100644 booking-mvc/src/main/webapp/images/tse.gif create mode 100644 booking-mvc/src/main/webapp/images/webflow-logo.jpg create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/icons/cross.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/icons/key.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/icons/tick.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/ie.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/icons/cross.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/icons/key.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/icons/tick.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/readme.txt create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/screen.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/doc.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/email.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/external.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/feed.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/im.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/pdf.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/visited.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/xls.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/screen.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/print.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/screen.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/src/forms.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/src/grid.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/src/grid.png create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/src/ie.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/src/print.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/src/reset.css create mode 100755 booking-mvc/src/main/webapp/styles/blueprint/src/typography.css create mode 100644 booking-mvc/src/main/webapp/styles/booking.css create mode 100644 booking-mvc/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java create mode 100644 booking-mvc/src/test/resources/.gitignore create mode 100644 booking-portlet-faces/.metadata/src/main/webapp/WEB-INF/faces-config.pageflow create mode 100644 booking-portlet-faces/build.xml create mode 100644 booking-portlet-faces/pom.xml create mode 100644 booking-portlet-faces/readme.txt create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/User.java create mode 100644 booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java create mode 100644 booking-portlet-faces/src/main/resources/META-INF/persistence.xml create mode 100644 booking-portlet-faces/src/main/resources/import.sql create mode 100644 booking-portlet-faces/src/main/resources/log4j.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/classes/log4j.properties create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/config/application-config.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/faces-config.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/booking.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/main.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/intro.xhtml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/view.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/portlet.xml create mode 100644 booking-portlet-faces/src/main/webapp/WEB-INF/web.xml create mode 100644 booking-portlet-faces/src/test/java/.gitignore create mode 100644 booking-portlet-faces/src/test/resources/.gitignore create mode 100644 booking-portlet-mvc/build.xml create mode 100644 booking-portlet-mvc/pom.xml create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingValidator.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java create mode 100644 booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java create mode 100644 booking-portlet-mvc/src/main/resources/META-INF/persistence.xml create mode 100644 booking-portlet-mvc/src/main/resources/import.sql create mode 100644 booking-portlet-mvc/src/main/resources/log4j.xml create mode 100644 booking-portlet-mvc/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/classes/log4j.properties create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/config/application-config.xml create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/booking.xml create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.jsp create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/messages.properties create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/reviewBooking.jsp create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.jsp create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/main.xml create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotel.jsp create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotels.jsp create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/intro.jsp create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/view.xml create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/portlet.xml create mode 100644 booking-portlet-mvc/src/main/webapp/WEB-INF/web.xml create mode 100644 booking-portlet-mvc/src/test/java/.gitignore create mode 100644 booking-portlet-mvc/src/test/resources/log4j.properties create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore index 0f182a0..0533520 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,17 @@ -*.class +*.java.hsp +*.sonarj +*.sw* +.DS_Store -# Package Files # -*.jar -*.war -*.ear +target + +# Eclipse metadata +.classpath +.project +.settings +.springBeans + +# IDEA metadata and output dirs +*.iml +*.ipr +*.iws diff --git a/README.md b/README.md index 74fca80..75462e0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,33 @@ -spring-webflow-samples -====================== \ No newline at end of file +Spring Web Flow Samples +======================= + +This is the official samples repository for the [Spring Web Flow](http://github.com/SpringSource/spring-webflow) project. + +Build and Run +============= + +Running 'mvn package' from this directory generates .war files for all samples. + +Samples without a Portlet dependency can be run with the Tomcat Maven plugin. For example: + +```` +cd booking-mvc +mvn tomcat:run +```` + +Eclipse +======= + +Generate Eclipse settings for all samples: + +```` +mvn eclipse:clean eclipse:eclipse +```` + +Import the projects into Eclipse. The Eclipse preferences must have an `M2_REPO` under "Java", "Build Path", "Classpath Variables". + +Contributing +============ + +[Pull requests](http://help.github.com/send-pull-requests) are welcome. + diff --git a/booking-faces/build.xml b/booking-faces/build.xml new file mode 100755 index 0000000..f1d8198 --- /dev/null +++ b/booking-faces/build.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/booking-faces/pom.xml b/booking-faces/pom.xml new file mode 100644 index 0000000..5447762 --- /dev/null +++ b/booking-faces/pom.xml @@ -0,0 +1,245 @@ + + + 4.0.0 + org.springframework.webflow.samples + booking-faces + war + Hotel Booking : Spring MVC + Web Flow + JSF/PrimeFaces + 1.0.0.BUILD-SNAPSHOT + + + 3.1.1.RELEASE + 3.0.2.RELEASE + 2.3.1.RELEASE + 1.5.10 + 2.1.7 + 3.1.1 + + + + + spring-repository + Spring project snapshots, milestones, and releases + http://repo.springsource.org/snapshot + + + primefaces-repository + Prime Technology Maven Repository + http://repository.primefaces.org + default + + + + + + + org.springframework + spring-context + ${springframework-version} + + + + commons-logging + commons-logging + + + + + org.springframework + spring-jdbc + ${springframework-version} + + + org.springframework + spring-orm + ${springframework-version} + + + org.springframework + spring-webmvc + ${springframework-version} + + + org.springframework.webflow + spring-faces + ${webflow-version} + + + org.springframework.security + spring-security-web + ${springsecurity-version} + + + + commons-logging + commons-logging + + + + + org.springframework.security + spring-security-config + ${springsecurity-version} + + + + commons-logging + commons-logging + + + + + + org.hsqldb + hsqldb + 1.8.0.10 + runtime + + + org.hibernate + hibernate-entitymanager + 3.5.0-Final + + + + com.sun.faces + jsf-api + ${mojarra-version} + + + com.sun.faces + jsf-impl + ${mojarra-version} + + + org.primefaces + primefaces + ${primefaces-version} + + + + org.slf4j + slf4j-api + ${slf4j-version} + + + org.slf4j + jcl-over-slf4j + ${slf4j-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + runtime + + + log4j + log4j + 1.2.15 + + + javax.mail + mail + + + javax.jms + jms + + + com.sun.jdmk + jmxtools + + + com.sun.jmx + jmxri + + + runtime + + + + javax.servlet + servlet-api + 2.5 + provided + + + + org.hibernate + hibernate-validator + 4.0.2.GA + + + + javax.xml.bind + jaxb-api + 2.1 + + + + org.easymock + easymock + 2.5.2 + test + + + junit + junit + 3.8.2 + test + + + org.springframework + spring-test + ${springframework-version} + test + + + + + swf-booking-faces + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.1.12 + + junit:junit + + **/*Tests.java + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.0-SNAPSHOT + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + true + false + 2.0 + + + + + diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Amenity.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Amenity.java new file mode 100644 index 0000000..9b1c225 --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Amenity.java @@ -0,0 +1,5 @@ +package org.springframework.webflow.samples.booking; + +public enum Amenity { + OCEAN_VIEW, LATE_CHECKOUT, MINIBAR; +} diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java new file mode 100755 index 0000000..5bbc7f0 --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java @@ -0,0 +1,226 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.Future; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + +import org.hibernate.validator.constraints.NotEmpty; +import org.springframework.binding.message.MessageBuilder; +import org.springframework.binding.message.MessageContext; +import org.springframework.binding.validation.ValidationContext; + +/** + * A Hotel Booking made by a User. + */ +@Entity +public class Booking implements Serializable { + + private static final long serialVersionUID = 1171567558348174963L; + + private Long id; + + private User user; + + private Hotel hotel; + + private Date checkinDate; + + private Date checkoutDate; + + private String creditCard; + + private String creditCardName; + + private int creditCardExpiryMonth; + + private int creditCardExpiryYear; + + private boolean smoking; + + private int beds; + + private Amenity[] amenities; + + public Booking() { + } + + public Booking(Hotel hotel, User user) { + this.hotel = hotel; + this.user = user; + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckinDate(calendar.getTime()); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckoutDate(calendar.getTime()); + } + + @Transient + public BigDecimal getTotal() { + return hotel.getPrice().multiply(new BigDecimal(getNights())); + } + + @Transient + public int getNights() { + if (checkinDate == null || checkoutDate == null) { + return 0; + } else { + return (int) (checkoutDate.getTime() - checkinDate.getTime()) / 1000 / 60 / 60 / 24; + } + } + + @Id + @GeneratedValue(strategy = GenerationType.TABLE) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Basic + @Temporal(TemporalType.DATE) + @Future + @NotNull + public Date getCheckinDate() { + return checkinDate; + } + + public void setCheckinDate(Date datetime) { + this.checkinDate = datetime; + } + + @ManyToOne + public Hotel getHotel() { + return hotel; + } + + public void setHotel(Hotel hotel) { + this.hotel = hotel; + } + + @ManyToOne + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Basic + @Temporal(TemporalType.DATE) + @Future + @NotNull + public Date getCheckoutDate() { + return checkoutDate; + } + + public void setCheckoutDate(Date checkoutDate) { + this.checkoutDate = checkoutDate; + } + + @Pattern(regexp = "[0-9]{16}", message = "{invalidCreditCardPattern}") + public String getCreditCard() { + return creditCard; + } + + public void setCreditCard(String creditCard) { + this.creditCard = creditCard; + } + + @Transient + public String getDescription() { + DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); + return hotel == null ? null : hotel.getName() + ", " + df.format(getCheckinDate()) + " to " + + df.format(getCheckoutDate()); + } + + public boolean isSmoking() { + return smoking; + } + + public void setSmoking(boolean smoking) { + this.smoking = smoking; + } + + public int getBeds() { + return beds; + } + + public void setBeds(int beds) { + this.beds = beds; + } + + @NotEmpty + public String getCreditCardName() { + return creditCardName; + } + + public void setCreditCardName(String creditCardName) { + this.creditCardName = creditCardName; + } + + public int getCreditCardExpiryMonth() { + return creditCardExpiryMonth; + } + + public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { + this.creditCardExpiryMonth = creditCardExpiryMonth; + } + + public int getCreditCardExpiryYear() { + return creditCardExpiryYear; + } + + public void setCreditCardExpiryYear(int creditCardExpiryYear) { + this.creditCardExpiryYear = creditCardExpiryYear; + } + + @Transient + public Amenity[] getAmenities() { + return amenities; + } + + public void setAmenities(Amenity[] amenities) { + this.amenities = amenities; + } + + public void validateEnterBookingDetails(ValidationContext context) { + MessageContext messages = context.getMessageContext(); + if (checkinDate.before(today())) { + messages.addMessage(new MessageBuilder().error().source("checkinDate") + .code("booking.checkinDate.beforeToday").build()); + } else if (checkoutDate.before(checkinDate)) { + messages.addMessage(new MessageBuilder().error().source("checkoutDate") + .code("booking.checkoutDate.beforeCheckinDate").build()); + } + } + + private Date today() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + return calendar.getTime(); + } + + @Override + public String toString() { + return "Booking(" + user + "," + hotel + ")"; + } + +} diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java new file mode 100755 index 0000000..dc60e9f --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java @@ -0,0 +1,62 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +/** + * A service interface for retrieving hotels and bookings from a backing repository. Also supports the ability to cancel + * a booking. + */ +public interface BookingService { + + /** + * Find bookings made by the given user + * @param username the user's name + * @return their bookings + */ + public List findBookings(String username); + + /** + * Find hotels available for booking by some criteria. + * @param criteria the search criteria + * @param firstResult the index of the first result to return + * @param sortBy the field to sort by + * @param ascending true if the sorting should be in ascending order, false for descending + * @return a list of hotels meeting the criteria + */ + public List findHotels(SearchCriteria criteria, int firstResult, String sortBy, boolean ascending); + + /** + * Find hotels by their identifier. + * @param id the hotel id + * @return the hotel + */ + public Hotel findHotelById(Long id); + + /** + * Create a new, transient hotel booking instance for the given user. + * @param hotelId the hotelId + * @param userName the user name + * @return the new transient booking instance + */ + public Booking createBooking(Long hotelId, String userName); + + /** + * Persist the booking to the database + * @param booking the booking + */ + public void persistBooking(Booking booking); + + /** + * Cancel an existing booking. + * @param id the booking id + */ + public void cancelBooking(Booking booking); + + /** + * Return the total number of hotels for the given criteria. + * @param criteria the criteria to use + * @return the number of matching hotels + */ + int getNumberOfHotels(SearchCriteria criteria); + +} diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java new file mode 100755 index 0000000..3715a98 --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java @@ -0,0 +1,110 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * A hotel where users may book stays. + */ +@Entity +public class Hotel implements Serializable { + + private static final long serialVersionUID = 4011346719502656269L; + + private Long id; + + private String name; + + private String address; + + private String city; + + private String state; + + private String zip; + + private String country; + + private BigDecimal price; + + @Id + @GeneratedValue + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + @Column(precision = 6, scale = 2) + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public Booking createBooking(User user) { + return new Booking(this, user); + } + + @Override + public String toString() { + return "Hotel(" + name + "," + address + "," + city + "," + zip + ")"; + } +} diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/HotelLazyDataModel.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/HotelLazyDataModel.java new file mode 100644 index 0000000..cdcb2cb --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/HotelLazyDataModel.java @@ -0,0 +1,54 @@ +/** + * + */ +package org.springframework.webflow.samples.booking; + +import java.util.List; +import java.util.Map; + +import org.primefaces.model.LazyDataModel; +import org.primefaces.model.SortOrder; + +public class HotelLazyDataModel extends LazyDataModel { + + private static final long serialVersionUID = -8832831134966938627L; + + SearchCriteria searchCriteria; + + BookingService bookingService; + + private Hotel selected; + + public HotelLazyDataModel(SearchCriteria searchCriteria, BookingService bookingService) { + this.searchCriteria = searchCriteria; + this.bookingService = bookingService; + } + + @Override + public List load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) { + searchCriteria.setCurrentPage(first / pageSize + 1); + return bookingService.findHotels(searchCriteria, first, sortField, sortOrder.equals(SortOrder.ASCENDING)); + } + + @Override + public int getRowCount() { + return bookingService.getNumberOfHotels(searchCriteria); + } + + public Hotel getSelected() { + return selected; + } + + public void setSelected(Hotel selected) { + this.selected = selected; + } + + public int getCurrentPage() { + return this.searchCriteria.getCurrentPage(); + } + + public int getPageSize() { + return this.searchCriteria.getPageSize(); + } + +} \ No newline at end of file diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java new file mode 100755 index 0000000..3f23df1 --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java @@ -0,0 +1,109 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +/** + * A JPA-based implementation of the Booking Service. Delegates to a JPA entity manager to issue data access calls + * against the backing repository. The EntityManager reference is provided by the managing container (Spring) + * automatically. + */ +@Service("bookingService") +@Repository +public class JpaBookingService implements BookingService, Serializable { + + private static final long serialVersionUID = 1L; + + private EntityManager em; + + @PersistenceContext + public void setEntityManager(EntityManager em) { + this.em = em; + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findBookings(String username) { + if (username != null) { + return em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate") + .setParameter("username", username).getResultList(); + } else { + return null; + } + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findHotels(SearchCriteria criteria, int firstResult, String orderBy, boolean ascending) { + String pattern = getSearchPattern(criteria); + orderBy = (orderBy != null) ? orderBy : "name"; + String orderDirection = (ascending) ? " ASC" : " DESC"; + return em + .createQuery( + "select h from Hotel h where lower(h.name) like :pattern or lower(h.city) like :pattern " + + "or lower(h.zip) like :pattern or lower(h.address) like :pattern order by h." + + orderBy + orderDirection).setParameter("pattern", pattern) + .setMaxResults(criteria.getPageSize()).setFirstResult(firstResult).getResultList(); + } + + @Transactional(readOnly = true) + public int getNumberOfHotels(SearchCriteria criteria) { + String pattern = getSearchPattern(criteria); + Long count = (Long) em + .createQuery( + "select count(h.id) from Hotel h where lower(h.name) like :pattern or lower(h.city) like :pattern " + + "or lower(h.zip) like :pattern or lower(h.address) like :pattern") + .setParameter("pattern", pattern).getSingleResult(); + return count.intValue(); + } + + @Transactional(readOnly = true) + public Hotel findHotelById(Long id) { + return em.find(Hotel.class, id); + } + + @Transactional(readOnly = true) + public Booking createBooking(Long hotelId, String username) { + Hotel hotel = em.find(Hotel.class, hotelId); + User user = findUser(username); + Booking booking = new Booking(hotel, user); + return booking; + } + + @Transactional + public void persistBooking(Booking booking) { + em.persist(booking); + } + + @Transactional + public void cancelBooking(Booking booking) { + booking = em.find(Booking.class, booking.getId()); + if (booking != null) { + em.remove(booking); + } + } + + // helpers + + private String getSearchPattern(SearchCriteria criteria) { + if (StringUtils.hasText(criteria.getSearchString())) { + return "%" + criteria.getSearchString().toLowerCase().replace('*', '%') + "%"; + } else { + return "%"; + } + } + + private User findUser(String username) { + return (User) em.createQuery("select u from User u where u.username = :username") + .setParameter("username", username).getSingleResult(); + } + +} \ No newline at end of file diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java new file mode 100644 index 0000000..4c499aa --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java @@ -0,0 +1,83 @@ +package org.springframework.webflow.samples.booking; + +import java.util.ArrayList; +import java.util.List; + +import javax.faces.model.SelectItem; + +import org.springframework.stereotype.Service; + +@Service +public class ReferenceData { + + private List bedOptions; + + private List smokingOptions; + + private List creditCardExpMonths; + + private List creditCardExpYears; + + private List pageSizeOptions; + + public List getBedOptions() { + if (bedOptions == null) { + bedOptions = new ArrayList(); + bedOptions.add(new SelectItem(new Integer(1), "One king-size bed")); + bedOptions.add(new SelectItem(new Integer(2), "Two double beds")); + bedOptions.add(new SelectItem(new Integer(3), "Three beds")); + } + return bedOptions; + } + + public List getSmokingOptions() { + if (smokingOptions == null) { + smokingOptions = new ArrayList(); + smokingOptions.add(new SelectItem(Boolean.TRUE, "Smoking")); + smokingOptions.add(new SelectItem(Boolean.FALSE, "Non-Smoking")); + } + return smokingOptions; + } + + public List getCreditCardExpMonths() { + if (creditCardExpMonths == null) { + creditCardExpMonths = new ArrayList(); + creditCardExpMonths.add(new SelectItem(new Integer(1), "Jan")); + creditCardExpMonths.add(new SelectItem(new Integer(2), "Feb")); + creditCardExpMonths.add(new SelectItem(new Integer(3), "Mar")); + creditCardExpMonths.add(new SelectItem(new Integer(4), "Apr")); + creditCardExpMonths.add(new SelectItem(new Integer(5), "May")); + creditCardExpMonths.add(new SelectItem(new Integer(6), "Jun")); + creditCardExpMonths.add(new SelectItem(new Integer(7), "Jul")); + creditCardExpMonths.add(new SelectItem(new Integer(8), "Aug")); + creditCardExpMonths.add(new SelectItem(new Integer(9), "Sep")); + creditCardExpMonths.add(new SelectItem(new Integer(10), "Oct")); + creditCardExpMonths.add(new SelectItem(new Integer(11), "Nov")); + creditCardExpMonths.add(new SelectItem(new Integer(12), "Dec")); + } + return creditCardExpMonths; + } + + public List getCreditCardExpYears() { + if (creditCardExpYears == null) { + creditCardExpYears = new ArrayList(); + creditCardExpYears.add(new SelectItem(new Integer(2008), "2008")); + creditCardExpYears.add(new SelectItem(new Integer(2009), "2009")); + creditCardExpYears.add(new SelectItem(new Integer(2010), "2010")); + creditCardExpYears.add(new SelectItem(new Integer(2010), "2011")); + creditCardExpYears.add(new SelectItem(new Integer(2010), "2012")); + } + return creditCardExpYears; + } + + public List getPageSizeOptions() { + if (pageSizeOptions == null) { + pageSizeOptions = new ArrayList(); + pageSizeOptions.add(new SelectItem(new Integer(5), "5")); + pageSizeOptions.add(new SelectItem(new Integer(10), "10")); + pageSizeOptions.add(new SelectItem(new Integer(20), "20")); + } + return pageSizeOptions; + } + +} diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java new file mode 100755 index 0000000..ddae095 --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java @@ -0,0 +1,65 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +import javax.faces.model.DataModel; + +/** + * A backing bean for the main hotel search form. Encapsulates the criteria needed to perform a hotel search. + */ +public class SearchCriteria implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * The user-provided search criteria for finding Hotels. + */ + private String searchString = ""; + + /** + * The maximum page size of the Hotel result list + */ + private int pageSize = 5; + + /** + * The page the user is currently on. + */ + private int currentPage = 1; + + /** + * Returns a {@link DataModel} based on the search criteria. + * @param bookingService the service to use to retrieve hotels. + */ + public DataModel getDataModel(BookingService bookingService) { + return new HotelLazyDataModel(this, bookingService); + } + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(int currentPage) { + this.currentPage = currentPage; + } + + public String toString() { + return "[Search Criteria searchString = '" + searchString + "'"; + } + +} \ No newline at end of file diff --git a/booking-faces/src/main/java/org/springframework/webflow/samples/booking/User.java b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/User.java new file mode 100755 index 0000000..494e9dd --- /dev/null +++ b/booking-faces/src/main/java/org/springframework/webflow/samples/booking/User.java @@ -0,0 +1,62 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * A user who can book hotels. + */ +@Entity +@Table(name = "Customer") +public class User implements Serializable { + + private static final long serialVersionUID = -3652559447682574722L; + + private String username; + + private String password; + + private String name; + + public User() { + } + + public User(String username, String password, String name) { + this.username = username; + this.password = password; + this.name = name; + } + + @Id + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User(" + username + ")"; + } +} diff --git a/booking-faces/src/main/resources/JsfMessageResources.properties b/booking-faces/src/main/resources/JsfMessageResources.properties new file mode 100644 index 0000000..497baf8 --- /dev/null +++ b/booking-faces/src/main/resources/JsfMessageResources.properties @@ -0,0 +1,6 @@ +# +# Overrides default pattern in JSF for Bean Validation messages from "{0}" to "{1} {0}" where +# the {0} is the Bean Validation constraint message (e.g. "may not be empty") and {1} is the +# field name or the field label if defined (e.g. "First name"). +# +javax.faces.validator.BeanValidator.MESSAGE={1} {0} \ No newline at end of file diff --git a/booking-faces/src/main/resources/META-INF/persistence.xml b/booking-faces/src/main/resources/META-INF/persistence.xml new file mode 100755 index 0000000..f4e3d6a --- /dev/null +++ b/booking-faces/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + org.hibernate.ejb.HibernatePersistence + org.springframework.webflow.samples.booking.User + org.springframework.webflow.samples.booking.Booking + org.springframework.webflow.samples.booking.Hotel + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/resources/ValidationMessages.properties b/booking-faces/src/main/resources/ValidationMessages.properties new file mode 100644 index 0000000..0909702 --- /dev/null +++ b/booking-faces/src/main/resources/ValidationMessages.properties @@ -0,0 +1,2 @@ +# Custom messages for JSR-303 validation +invalidCreditCardPattern=is not a valid 16 digit card number. diff --git a/booking-faces/src/main/resources/import.sql b/booking-faces/src/main/resources/import.sql new file mode 100755 index 0000000..9a7ed4a --- /dev/null +++ b/booking-faces/src/main/resources/import.sql @@ -0,0 +1,27 @@ +insert into Customer (username, name) values ('keith', 'Keith') +insert into Customer (username, name) values ('erwin', 'Erwin') +insert into Customer (username, name) values ('jeremy', 'Jeremy') +insert into Customer (username, name) values ('scott', 'Scott') +insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 199, 'Westin Diplomat', '3555 S. Ocean Drive', 'Hollywood', 'FL', '33019', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 60, 'Jameson Inn', '890 Palm Bay Rd NE', 'Palm Bay', 'FL', '32905', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 199, 'Chilworth Manor', 'The Cottage, Southampton Business Park', 'Southampton', 'Hants', 'SO16 7JF', 'UK') +insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (7, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (8, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (9, 300, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (10, 300, 'Conrad Miami', '1395 Brickell Ave', 'Miami', 'FL', '33131', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (11, 80, 'Sea Horse Inn', '2106 N Clairemont Ave', 'Eau Claire', 'WI', '54703', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (12, 90, 'Super 8 Eau Claire Campus Area', '1151 W Macarthur Ave', 'Eau Claire', 'WI', '54701', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (13, 160, 'Marriot Downtown', '55 Fourth Street', 'San Francisco', 'CA', '94103', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (14, 200, 'Hilton Diagonal Mar', 'Passeig del Taulat 262-264', 'Barcelona', 'Catalunya', '08019', 'Spain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (15, 210, 'Hilton Tel Aviv', 'Independence Park', 'Tel Aviv', '', '63405', 'Israel') +insert into Hotel (id, price, name, address, city, state, zip, country) values (16, 240, 'InterContinental Tokyo Bay', 'Takeshiba Pier', 'Tokyo', '', '105', 'Japan') +insert into Hotel (id, price, name, address, city, state, zip, country) values (17, 130, 'Hotel Beaulac', ' Esplanade Léopold-Robert 2', 'Neuchatel', '', '2000', 'Switzerland') +insert into Hotel (id, price, name, address, city, state, zip, country) values (18, 140, 'Conrad Treasury Place', 'William & George Streets', 'Brisbane', 'QLD', '4001', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (19, 230, 'Ritz Carlton', '1228 Sherbrooke St', 'West Montreal', 'Quebec', 'H3G1H6', 'Canada') +insert into Hotel (id, price, name, address, city, state, zip, country) values (20, 460, 'Ritz Carlton', 'Peachtree Rd, Buckhead', 'Atlanta', 'GA', '30326', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (21, 220, 'Swissotel', '68 Market Street', 'Sydney', 'NSW', '2000', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (22, 250, 'Meliá White House', 'Albany Street', 'Regents Park London', '', 'NW13UP', 'Great Britain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (23, 210, 'Hotel Allegro', '171 West Randolph Street', 'Chicago', 'IL', '60601', 'USA') \ No newline at end of file diff --git a/booking-faces/src/main/resources/log4j.xml b/booking-faces/src/main/resources/log4j.xml new file mode 100644 index 0000000..4c3ff1c --- /dev/null +++ b/booking-faces/src/main/resources/log4j.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/META-INF/MANIFEST.MF b/booking-faces/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..58630c0 --- /dev/null +++ b/booking-faces/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/booking-faces/src/main/webapp/WEB-INF/classes/log4j.properties b/booking-faces/src/main/webapp/WEB-INF/classes/log4j.properties new file mode 100755 index 0000000..992d816 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/classes/log4j.properties @@ -0,0 +1,11 @@ +log4j.rootCategory=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +# Enable web flow logging +log4j.category.org.springframework.webflow=DEBUG +log4j.category.org.springframework.faces=DEBUG +log4j.category.org.springframework.binding=DEBUG +log4j.category.org.springframework.transaction=DEBUG \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/config/data-access-config.xml b/booking-faces/src/main/webapp/WEB-INF/config/data-access-config.xml new file mode 100644 index 0000000..581e73b --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/config/data-access-config.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/config/security-config.xml b/booking-faces/src/main/webapp/WEB-INF/config/security-config.xml new file mode 100644 index 0000000..ef58ed9 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/config/security-config.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/config/web-application-config.xml b/booking-faces/src/main/webapp/WEB-INF/config/web-application-config.xml new file mode 100644 index 0000000..942c9c1 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/config/web-application-config.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/config/webflow-config.xml b/booking-faces/src/main/webapp/WEB-INF/config/webflow-config.xml new file mode 100644 index 0000000..73b3f04 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/config/webflow-config.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/config/webmvc-config.xml b/booking-faces/src/main/webapp/WEB-INF/config/webmvc-config.xml new file mode 100644 index 0000000..571e501 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/config/webmvc-config.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/faces-config.xml b/booking-faces/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000..2893236 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,11 @@ + + + + + JsfMessageResources + + + diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/booking/booking-flow.xml b/booking-faces/src/main/webapp/WEB-INF/flows/booking/booking-flow.xml new file mode 100755 index 0000000..5deff5b --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/booking/booking-flow.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml b/booking-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml new file mode 100644 index 0000000..fe286ec --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml @@ -0,0 +1,141 @@ + + + +

+ Check the calendar widget and the tooltips on the credit card fields. + The form uses Ajax-based validations to redisplay server-side errors without refreshing the entire page. + The booking bean backing the form is a flow-scoped object (see booking-flow.xml). +

+
+ + + + +
+ ${booking.hotel.name}, + ${booking.hotel.address} + ${booking.hotel.city}, ${booking.hotel.state}, ${booking.hotel.zip} + ${booking.hotel.country} +
+
+
+
+ Nightly Rate: +
+
+

+ + + +

+
+
+
+
+ Check In: +
+
+

+ +

+
+
+ Check Out: +
+
+

+ +

+
+
+
+
+ Room Preference: +
+
+

+ + + +

+
+
+ Smoking: +
+
+ + + +
+
+ +
+
+ Credit Card Number: +
+
+

+ + +

+
+
+ Credit Card Name: +
+
+

+ + +

+
+
+
+
+ Expiration Date: +
+
+

+ + +   + + + +

+
+
+
+ + +
+
+
+
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/booking/messages.properties b/booking-faces/src/main/webapp/WEB-INF/flows/booking/messages.properties new file mode 100644 index 0000000..cbae4eb --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/booking/messages.properties @@ -0,0 +1,2 @@ +booking.checkinDate.beforeToday=The Check In Date must be a future date +booking.checkoutDate.beforeCheckinDate=The Check Out Date must be later than the Check In Date diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml b/booking-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml new file mode 100755 index 0000000..1f15098 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml @@ -0,0 +1,83 @@ + + + +

+ Note that the command button actions raise events (e.g. "revise") instead of specifying method expressions. + The events result in transitions on the server side (see reviewBooking state in booking-flow.xml). +

+
+ +
+

${booking.hotel.name}

+
+ ${booking.hotel.address} +
+ ${booking.hotel.city}, ${booking.hotel.state}, ${booking.hotel.zip} +
+ ${booking.hotel.country} +
+
+
+ + +
+
Check In:
+
+

+ + + +

+
+
+
+
Check Out:
+
+

+ + + +

+
+
+
+
Nights:
+
+

+ +

+
+
+
+
Total payment:
+
+

+ + + +

+
+
+
+
Credit Card:
+
+

+ #{booking.creditCard} +

+
+
+
+   +   + +
+
+
+
+
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml b/booking-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml new file mode 100644 index 0000000..1d8e38b --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml @@ -0,0 +1,74 @@ + + + + +

+ This page uses the PrimeFaces panel component to display a search form. + Mouse over the "Search String" field to see its tooltip. + If you are logged a second panel will show your current bookings. + Both panels can be toggled on and off. +

+
+ + + + + + + + Search String: + + Maximum Results: + + + + + + + + + + + + + + + + Hotel + #{booking.hotel.name}
+ #{booking.hotel.address}
+ #{booking.hotel.city}, #{booking.hotel.state} +
+ + Check in + + + + + + Check out + + + + + + Confirmation # + #{booking.id} + + + Action + + +
+
+
+
+ +
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/main/main-flow.xml b/booking-faces/src/main/webapp/WEB-INF/flows/main/main-flow.xml new file mode 100755 index 0000000..0ad4cc8 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/main/main-flow.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml b/booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml new file mode 100644 index 0000000..cbe13aa --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml @@ -0,0 +1,43 @@ + + + +

+ Clicking "Book" will launch the booking sub-flow (see the subflow state in main-flow.xml). +

+

+ The booking flow is protected with Spring Security (see the secured attribute in booking-flow.xml). +

+

+ Clicking "Back to Search" will take you to the stateful search results. +

+
+ +

${hotel.name}

+
+ ${hotel.address} +
+ ${hotel.city} +
+ ${hotel.state} ${hotel.zip} +
+ ${hotel.country} +
+ +
+ Nightly Rate:  + + + +
+
+ + +
+
+
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml b/booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml new file mode 100644 index 0000000..8a79fe3 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml @@ -0,0 +1,52 @@ + + + +

+ This page uses the PrimeFaces data table backed by a lazily loaded DataModel (see HotelLazyDataModel.java). + Page navigation is Ajax-based and uses JSF 2 partial rendering. + The name and city columns support forward and reverse sorting. +

+

+ The DataModel is created and stored in view scope when the view is first entered (see main-flow.xml). + When the user makes a selection, the selection is stored in a flow-scoped "hotel" variable before transitioning to the detail page. +

+
+ + + + + Hotel Search Results
+ +
+ + Name + #{h.name} + + + Address + #{h.address} + + + City, State + #{h.city}, #{h.state}, #{h.country} + + + Zip + #{h.zip} + + + Action + + + + +
+
+
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/intro.xhtml b/booking-faces/src/main/webapp/WEB-INF/intro.xhtml new file mode 100755 index 0000000..d9e3852 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/intro.xhtml @@ -0,0 +1,44 @@ + + + + +

+ This is a simple standalone JSF page. +

+

+ Clicking the "Start" link below will launch the main to search for hotels (see main-flow.xml). + The main flow in turn launches the booking sub-flow to book the hotel (see booking-flow.xml). +

+

+ The main flow is accessible without logging in while the booking flow requires authentication. +

+
+ + +
+

Welcome to Spring Travel

+

Spring Web Flow and JSF 2 with PrimeFaces components

+
+

+ Key features illustrated in this sample: +

+
    +
  • A declarative navigation model enabling full browser button support and dynamic navigation rules
  • +
  • A fine-grained state management model, including support for conversation, view, and flash scopes
  • +
  • Partial page rendering via Ajax with JSF 2
  • +
  • Modularization of web application functionality by domain use case, illustrating project structure best-practices
  • +
  • Spring Security integration
  • +
  • Page layout with Blueprint CSS
  • +
  • Exception handling support across all layers of the application
  • +
+

+ Start your Spring Travel experience +

+
+
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/layouts/standard.xhtml b/booking-faces/src/main/webapp/WEB-INF/layouts/standard.xhtml new file mode 100644 index 0000000..bb14d6b --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/layouts/standard.xhtml @@ -0,0 +1,63 @@ + + + + + + + + Spring Faces: Hotel Booking Sample Application + + + + + + + + +
+
+

+ + Welcome, ${currentUser.name} | Logout + + + Login + +

+
+
+ Spring Travel +
+
+
+
+

Comments:

+ +
+
+ +
+
+
+
+ + Powered by Spring + +
+
+
+
+ diff --git a/booking-faces/src/main/webapp/WEB-INF/login.xhtml b/booking-faces/src/main/webapp/WEB-INF/login.xhtml new file mode 100755 index 0000000..b37fb94 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/login.xhtml @@ -0,0 +1,58 @@ + + + +

+ Form-based authentication with Spring Security. + Spring Security is first enabled in web.xml via DelegatingFilterProxy. + It's configuration is located in security-config.xml. + Flow definitions can further be protected using the secured attribute (see booking-flow.xml). +

+
+ +
+

Valid username/passwords are:

+
    +
  • keith/melbourne
  • +
  • erwin/leuven
  • +
  • jeremy/atlanta
  • +
  • scott/rochester
  • +
+
+
+ +
+ Your login attempt was not successful, try again.
+ Reason: #{sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message} +
+
+
+
+ Login Information +

+ User: +
+ + + + +

+

+ Password: +
+ +

+

+ + Don't ask for my password for two weeks: +

+

+ +

+
+
+
+
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/logoutSuccess.xhtml b/booking-faces/src/main/webapp/WEB-INF/logoutSuccess.xhtml new file mode 100755 index 0000000..618425a --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/logoutSuccess.xhtml @@ -0,0 +1,14 @@ + + + + +
+

Logout

+

You have successfully logged out.

+
+

Continue

+
+
+
\ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/springsecurity.taglib.xml b/booking-faces/src/main/webapp/WEB-INF/springsecurity.taglib.xml new file mode 100644 index 0000000..ea37d89 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/springsecurity.taglib.xml @@ -0,0 +1,31 @@ + + + + http://www.springframework.org/security/tags + + authorize + org.springframework.faces.security.FaceletsAuthorizeTagHandler + + + areAllGranted + org.springframework.faces.security.FaceletsAuthorizeTagUtils + boolean areAllGranted(java.lang.String) + + + areAnyGranted + org.springframework.faces.security.FaceletsAuthorizeTagUtils + boolean areAnyGranted(java.lang.String) + + + areNotGranted + org.springframework.faces.security.FaceletsAuthorizeTagUtils + boolean areNotGranted(java.lang.String) + + + isAllowed + org.springframework.faces.security.FaceletsAuthorizeTagUtils + boolean isAllowed(java.lang.String, java.lang.String) + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/WEB-INF/web.xml b/booking-faces/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 0000000..d967883 --- /dev/null +++ b/booking-faces/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,117 @@ + + + + + + contextConfigLocation + + /WEB-INF/config/web-application-config.xml + + + + + + javax.faces.DEFAULT_SUFFIX + .xhtml + + + + + javax.faces.PROJECT_STAGE + Development + + + + + javax.faces.FACELETS_REFRESH_PERIOD + 1 + + + + + + + + javax.faces.FACELETS_LIBRARIES + /WEB-INF/springsecurity.taglib.xml + + + + + charEncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + + charEncodingFilter + /* + + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + + springSecurityFilterChain + /* + + + + + org.springframework.web.context.ContextLoaderListener + + + + + Spring MVC Dispatcher Servlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + + + 2 + + + + + Spring MVC Dispatcher Servlet + /spring/* + + + + + Faces Servlet + javax.faces.webapp.FacesServlet + 1 + + + + + Faces Servlet + *.faces + + + + index.html + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/images/bg.gif b/booking-faces/src/main/webapp/images/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..013cfa6f731faddb7ee4d9d51ddc35e9f552842b GIT binary patch literal 172 zcmV;d08{@*Nk%w1VfX?H0Du4h|NsBPyS5?z6+?1mVRU6=Aa`kWXdqN*WgtgMO;7+V z00000_yP(500MG^kEzS;52Kv4+KU6;y!#J^;z*X}iKgnxw(bkZhbGtdjpzE#_x=wI z?r6fI@rX<+m&~S9NqkDD)T;H0&1yH%t@jHKi^t?Lqias9*X*|Y%|XNG^t%0yH_G$; azW)yx=&&bPXn2U2h()N_==dmA002AoP*;5b literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/images/btn.bg.gif b/booking-faces/src/main/webapp/images/btn.bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..83516847b111bdc805db9662161fdbe84294538e GIT binary patch literal 349 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%0D||y-s?!IaYc77pjuz%bRgfG zXYSy48q~oZ>qs!QUdPsHkOVdqUyn#P#P8C5^y=?{KBsCpWysRSCzo%1aEd47pUJ7` z+KYvBT{o~@$tyvPBv2+^)$d%y`StZJzxB7wCxA%U%?G+OV;#WfiiaCJKSI^h~dU&n-&Z zEC#3u)wF3edfUlqhAA`jUF@9^#>8d2DL9WaJlV{0?8gX zVIgX2+0z^q0~4xo5CI#89W$Ma!9$o!Cir^GL=fx3;7Rwgop9?AVYNQ5rXIY&&uoZHXxM7{`Nm`x> za@@_B`x+7q4c^dWwToZjZ$M63Nd$=a-y@x!go1;peJ@Unv?gQ8!&Y4WlymJv*>%JXtMMfUZBgGZTZR?9{uA$XKL^>NxUh;=PXBnh#;Zvw}!BU_c73ZD!o@bm1pERKa6B^32YZ1Ulg>Rtp!P}@xiP;={Q z-*pLiwA7f%!NBV3GvQR8wRc@&&Gd$$LusRAgB6v9wFVCkdkO?j3Mow8W`FYuYuppX zZYgu;K2YA-oz!wc>*LZ6h#pswg1@AcXzDMHjKgOKos$<7<44hk%FdSic9KZJ`_HaJ z-3AAi!QVP1JIyNt!4-3!92^9KE&5@@PESLbx4XRqkRR{uT6E>@+Y*<_>|(zIIMaxwDJ}nr^v%uH2KWoy8FhI! zx@Rtg8_N!@(bhY|*BPVAeo=9oi*|=Ppri_OHTX72MJ?JSr`QLRRP+Ll#R%4>g#S7) zuTMajYrc?y(+Wo-?b&^us4m1NJ#!A7^lTD_7{8UApgC(2y>(O(f-|uw}`hsn6H&t!&dHU+s_@reI0o-*T)hD=d3OB4j!0bK-q~eD%>t zER`>n`{#mCIe4a`h)-W|M`VJ<+j|B6d5pbYcr)%ufV@e5VW~gJKvqg+%%mtT@xKRq z+uEQU0}<%##jqL;&5!yd-5)uPbmy;mN{2L84^6Z=3bcVtKr>(3qPJwP<7ToAdEP=+ zwtt)t{+e8<>{9F6ORz+b6jPdnbQh`TvZ>!7$#W0?q~X2)k;)rgW-Z=_ChES2RHK~^ z`u13D3K>g~nf|F#Xbbuf;Gc8v7^nB}fTQdkKK`juLE++-LiT4hQq-J9h*nvk^$1p+ z)uc>tyK(UXSRJ@}di4>JGEh^@3We=)Qyk*wr}-Elh9b_;2qc+w7NA?I1HH{x$2t4k zMx%OQ<%iA27SBY6nm3}6tZEr9ZRP3iKlwE+uU11Iy|Eda=K0OGW(1KN{bp=sz81dJ z1P~d^x@V*FnBdfDeh#h)Z7rJd+Sw%dUO{mz&RBq@yVej@OU%`g=DdowQS&NW1koahSGUtIPrm(h* z^r-6Q5O}^?g-y;51keJ51tzU_4)v#uQN4U)S@a>2(QY44*-38V0?}R}b8Z%mofek; z^}wK>bt_r3kRWQcPDY-yv)uN{>V?*mI61^sJh?EACHccqF-a8pU!l!XITld}fUY!r zhaGa0xODun!nXaIq@J?rX?v(&3Q3iix;H%6-KqUNV60~Q3_Y~^syn0__n#7Zr3LQr z#l!hQrGyZS=f4DI+Rx+*hb&W~{9>aO`dSD>y$PdfZ^)t0Y$4<2Wc`VZETD)LQ|!^v z!T3MkWrqo%8AlU@2U-r}XAtB7e6dH%u|2O88|HW&+b`yqD2{QM$?>UK{pQh`)T;-D zKnXRfZyyvc1dR6{jR_JEH`VA0nAnE>IjDk+8 zu1MlR*v1XoOG-dN>yBHFw_HT%%zN!|<*Eiim7rp(o_)f-G~G|lL!18TJEidA()^MN z!)#uMf0H57&$;i6SBj>|;+*8OT_fpO-a3wP$9aj5Mifr@0DGt(i0yKOIzDLG1FCTQ zmGg~kPGRph8|uS_ZcZ*i%@_EgF)8%jx3(YB=Qzr7KY4lqp?*S_v&Zr@0{pW98;y_E z^@hG+ai+R^4FF1~_!K!pmOJ{hUGdXD4|s~<{?L&4m+x_VwuuD9#@<$Hu<&K_E6DI#c4(H29zMhNWkwLV*^_%!_Ig*jqRKkLYyu z2%}h%vpD{8bJq;?;EvnjcY-uiA2QcoYeKvl!l0wTpPp5VW9@ngA8F*iHVA&&Z+iiV z+oY^ivD&rK<@j%o^xtIp&w1mK{3LuU3tJLl!_ZdgZ~IH5yFTWWzDOnKxyqcyuHsq$ zp`12Tcurov`_iWTu9Bcga9|kv{n7rMr-VN^%JH2(>XL#)d2`9o>@&xts+CBUTDa0< z@{tpl6+OMZ?)3?Z`L!`masZCU&Kb?v%fVPACnr2d;10tgp2RK_t`>0>Y&jR&j~ZwdzZaiR9S_X%wE41_ z<2s(^JvOFfYP@Or>e?O+3^bEUajfpm8v%65Q_!et{l>$rqHyR2VsV)w^t>!v8b1j9 zs_At-qEkTL+SxYN;YN{E?1IRu0*aYa>7Vy?KluROYeLi;B8iBn(P-S!VsLELU1;+F zMPYd341{wRd>?{2e|Y6QRr)buHbVr*HfNI3!NZ0f9|vknLGgh1x;11aC!A5lw(QvO zKCa*m&G&@4qtYW2Uu--3u8UC0!kF1i&e=_2$v2#XUW0`1HYP1j3KL6@D`cI&d#eRy zJA9TQKlm&3b0@65KIcZ#Ougy_V8iCD9#`ZjZ>{D`{S793NaxvYaG_q=olm1huxj_|7(467Okj{F}cjyghNqH5$jIsw~F- zlfNzI2X?RH-o~MtOE0DSc?*WkeqD#uIwai9P(SjwNuRUDsS&g zqcRnYzziNW`JPD%-)|8a_H6IdeEfC@b#+H{Ha`utC_=j^Cpe*rL>T(%`9B@jVx2c> zq(me8K5Ew=z`HZv{GMGzv~r}&qP4(Er4EZ|`aXtj99672%F7D;b6$`(Ff5;uAsET~ zW~$_L3%~2(9dqKR2I!W`=@XwzI12rSxLDY(lp+YPO){6Db7nrETC)UfdCR5IRl> z?#NETedG*+h*{gFme$VfM1mBC&)KRrQ3)}7 z-bQZ5Tb7w;!Noh&@&359MX|Kp(r<3lE)EPQXbVev=iYv-gryh^Psa7$`{i-jWQg>C z$#*a%S&K^3- z7=P%v^NE*KOnCn5#f8(;B>#q8$2FIBvj1&B9KA(ksa>8#(CGdPV2Y_!=};Tor-19Z z>*WD0cjjpHq>~?IQ4QkQ{!nEL#9OWHm^But>F+O`Fm)@B*sz)gNwmLiGCV{a0xxizW|*6etuJWvT)?2Z38yz%1`VUy8%?%o*or<#0rd6 zw0gg94jq%Q``zGqBdT#dFIHnZ&a?l#PiTVjAUhwi5`azAaymywK1LcRuS2Osp77dz zKY?d50-|MR#6qKX?2tAzrgO_Fr6>N4K^;H14I$K_QW(h}4SKQNieBq@914`Xp4Y zl$cseZ;{%9T!e>wk^++V_9~5%8QxQWJlK<8DF_s)80|g2xP+gUaQK_S_wbmDmM8in zOOq{cOEZ}mbo!{eX|W{CI-0b_bSa|S$V^WHRbt+|ydKN;Koxx|3H*z6ZV%A+bl4lHUPv39hFBNo5QM@k&9nDD@wgRg-59;H?FaxPt6vr zTVUH)zTw2en+9L9rb5fVCJK&(d4-b8Pw#H*lL$eXY%uerlR(~hu{cL$P z*B8#)X1)44c{Yt)YenSt#G4MW${e!- zu0#@=_~YN6;!^ueX1~Fvj(GlbyL)B}V;AvwvN?Q^3<^*62IF3e6?_+J42^~T{Bc8_ z+oR^sIQ59+dKb8<8KS25j7&k|U6vkJ7FRISERcV60tU@&eT(S7yq&Bvg9$h41ihgv zm_-1ZB04%ud;GJ(s-vr#NyntU-6YvwK?6coOM!(djE( zPQ;~m`WO;I#XBNq_(@Y*yme>p;i#DzJ^8J@fg zem_GU+;Og^^jGM^qV-8qaQSYB`cjcS&Oxyy2iu?(k&}BVsV#O$Pf>+PEG-jjZ#{!x#&u|W1-mwHDS%=|^4E@-<;Y=jx3_g|xpvc_vjTVbq6W}Knwpz#Jh@ios#Xm# zJ1$}>629Rj!$+Y-qCPwmMtzxjKYdd58=0%8$664T)i)IuX?=C~B?!mfoE6l=R6y+! zS)em0XwSCwjbKoR9m=&m%*2KaJIhJfF|4G00sQH>^{vS<{9RJb##`GZPmHyk;QJwn z@1SZL*H9wkl}FZ}C4bKnt^``g(0JuD>uLxvPn};Orm-j&27}eal+1qck@I9*0kXs$ zmfgh9HoGI8$pQpA3YDr6+b{|uZrn`jBwz)_&Z5j8XUKFHRY;FHhBb}VbPOev7z?8! zu4gMvn_2Kf<2S9$W}bQ!cY0%@S@ohDbMz=B`*JJG$=$-q5Uq;Sg&;oH2Cfqv;H{wp zE~_4i34vI5_IZy|vo-0BuY%uq(h&cgxJ@Z^16JA~X z2BU15ZWJ_Dtl%COzv>WoAZgt&cr4N9(WbLnP||`mMv+$Ky!FxcB%pi&QoCn^3T+YThwjOeOuOB00U~ zGt)*(weske0~?^iV4Pv)p4xpQ*RL=F>HOhpV`iREokX+{eavsC733F&RIrz9A_ZN| z@~`o@$xnSb7s=hd$Mq%Og$*Q{zJI6tNjPpW)&i=byf*LOa(L_MQpS^yt=+($f&RA) z7GMkWT6^>#`TSHXo%j4t53MO*>Z)I1chq}(;27qI>C0~)b}Ol-YVNouQBR>?dSr;w zCqd+XJjF*r_B{IB4)KVnnY2&}HAYm$qP{;0W{5`tNLVb6>_ z6%^9juUn~H^+me`ZiJjO#w|+Hm~?-|gLOt+({48{BT7|Borva(Z`tx1C+YFc`XA@~5aK&gn-gW~Z;b(6}D z_V-P(VoebDAG7qI`)%#@$cIj4H&nV_TZ?mfb}XInry%J&<;K-O^C(cgSog8Zuu$n? zx^eLR7xz4773ta*iZ@<$1&=?dbl!Ftk+JTSTgNjedQ=WcaXdIgAI5M*PV6NNiVt~g z@`*E2&@y77TL--R=lVMYKu&rJIFlBcO?;JQ>{WEP1k`n z2}NZGTUN!{;aH5?lceG3v}JRKCA41-I*-x7c#|pbeaqvDip z&9Z;LcGQ`a$}r&0245aP=nCZyKoP6 zDxL5O+*CUts=EJFY2dX(d{P2J@p(4D3!+VDvklM`v3hGCjBM52Kzh%_T4$kY)2;F{ zC7T4R%s)%!>=Zq*l8aig#))C6e@BE?uO;S2-7GBQ8JzGsWh?>rRYN7^{BKstYAAZL(iwj4`HG>;Da;xt5#hV$)H%aU6Jcq^% zEJY_3@*kx}Q8tZwR+?PS>S83^I`xA+gqh~*5bHUukk#A)xq|fG_f#lJQoRGgUh216 z)S?>$kz*dD;}Hn~mL_x+@m!%(VgY8}3ZwBEZTsl%34!OuwiAiu@w!~URI2Jnno(Gw z4R2SlLROPupLc_r-iey-3>(b80JNy3td7HR%dh&(UjW=*M91@_e4HQd8?t1K+%|xj z7pFI;L-btcXH7U3cACrQf5y9+7n>$L24BXL--df-*xwEnxI7S8mH*s(?ZI!HD}AUA245P&^O5AaXHFqlvM^PEDJ z?r*~0p{{gjJ66(PY58@gv2F;9{&tk92P!aDx#X+g{8YoH@0{GOL7+M^`K9}_@GdG} zj{on54>p>5_eq^7zg~4bYPD$@GbO-l?5k%);?MAEqMOc^c4>Zmj0!e=`)G6IlHYb! zf;+7%U^z3@?bpjbwn<6E^!2e;_Y#s=8W}yap7MjdW$zYv zc2p_U3SJ%~?B}!fpW(@yUo6M_MPF8GwFBf1MIn<=R7X}pE_4F9X9^!7zbxUkCX_y* z$IIgG?3)1h?uM0*Fqlnoh_CcENd_lhBW*sa@J`NUt;VCkjUssV0}d}M!CGOeS0V;j zN_t3NXiotXvuX#o|39sKr=jl9uI0@pojDc16o-m#Mu$C{^r@^}+@R0}$8UzNm6{;1 zt0<)5%?&*HftSXnnk($5;j3-GgbBpI-CLrjelSE`cUG#N56V+&8hWSeAqwMPJjR(o zG(O^$w$HEF=T#A9PH4xBlyVPmFPwFAEZ0$Uh||4YX_GMnOr zca-{Hmid4GDgBXNH3-EQIuYGB`*!ojr%NwD_>k>%UT?&u^^)Ir8G}oOqI(=hS$L=!UI21R|=~1DJ>roY_!28_3qmL`Wa0xtzFD{A4;Ah`h zJGNpbFIA*3kAfQM4tnR}bp;y6yHidfO5JwlB_Y{|E7e?5+$BGhOo2c^uAl3p@l|^G zguYF6{fx+J4TPx6lNmhj!|+vj_(x!Uyl=fZP2gRX2&ubIY*^de@=emN;8F8U1`D6nk@q9KdiFDosF*H)zPFv;~ZxyMDK z*OB8$&~5~YdTn+NV~84Y&Ceq)6cYIqbwTWZu#rZjlte4bdruN-Qw~wy2v) z&Y~Gpz&N^AF~7si&V@<=Qtf#uNuS>I_Hgnqpd9BJkuR8gUM$f*279H4#!lr*@ympx z&STg%9J#|`$kVdde@-0>Dvny3O4YJPK-HKwxW0(7cg z_y00@CdtS^V`w}S61LrW;-TIp>wOrdTSlO7KRPJwf5xb`eY`~54Q$pS1EkFlA8~$= z`LPU}JB(pY=%zy<;y;U;*9zqhY+59=jWiGWnSV2He@t}ATr;QWRowYAiPR^z#M&Z; zpI?gO9eY4(Yu8w>3T5bOGJeDo<@) z+4o5ROMR)Ug^|MVO~a9a59uEwUSZvr6fmS7lqW`p+;*D@x(D=cLlSDl(0zE+dDgt%1fP!zksu3a1nC zr=cEBCH?kEKgl^t<9gGYWZjvo?{@Sm#nvV3zoe-hQ$A}0HiHBlX97gmj2(+>+ow2P z#Oy7VWSjvt3SgF>i9=bjG#7=k0=MFHw(ZDrE`Hrv6V|k0)CyXW-K3s3bT!5JHFY&S z9^tByL%kEZy~#^{q3ZA>>xP(R>w<7r%QBLigIv;Yd%Q^`p7%4UI2Bf9u^yGq7#~sG z>W}FNdoM-mo4+Hd+JavIUQs*lQP2cGBFDH&H4Txu41)TvBQ)vtLp%>VkinxzF^z!3 z>@oOcPbqX?2h%F?#!Y84HSYLz@5pH-K74EQJMHE=f0D%S{!&E?zB@E|dy(uGhU`*# zmfx7k>Aq*GKI5n*T3S!ADi1D_^jvv<%z3pFzoMe}Kq)W{M08m+%=Ne|@b%$IEEV%wB%_x(9FO59c(kV749Tm`80+KDD$=F=qOT`Y4!GMy^Swt+}kU$KXf={+EYF@}jJe)73hb+KS58d}+ z#-o^4Y>-^e(D$A2P++qJ{8F#LNF+MV`Z8P;8&j-HXz{}rF0iS>drV!knGRdHgZ&RT z<9E%PVIXZqHMtt4F^g~y1@6zgwh|rE^^gCK(~o84r)27-j$YUAnsulgelW^5?lUWy zdEV}ur5|!kjG<{VR#vE$oPW_mwn8fd5{<6+Fl45{ChyXwBxs>ctgLO%KuvMUSP`w6 zU)1x_13G19*yYQD4Y1t&u30m#TjhS}y<9AMav!7eccLm(x7T9$-YXkVd0Z`DSySFM zmX{jA)1kQ-WLw*zhHk#p7PhIwl!=Zv(H7~07?Y%pQylLs%gymjzh1bXr9L<;mK}=R z{Vs^geM4BTm6{q>oTfk}1&6ly=@52Y7Qb5<<484mXt@rFvcnBN-{|OWUJwHqhi~*@heGxdZ?~l$uI-stGd*F3tv%?y_RRY@rqTb>R9fKJAL02t&z%a z3cQ33V~l=5RH)YB`IIOTGMie24L-NfVU2CKvluT_*)^=|b*Pm9vU2aWS$E)P6GMLnbxOAC-jg8&q zPp@AX{HAExH1g<}uTP7MqQZ~$7lBi+mo`bAA{dX(XIrGl>sj(S3|4tATZ!9Q;{`EioM=WKP{mu>WeS)Qg|bDzukDL47;#j?fKX zT$qPq9USf!>x;|rV+t1-GNkV;Ew9G6``vr4 z=IWX#Owh^+`2Ug!kU7dWPKTIkl~**&Gk>2MSECY%e*rwsGkpG-urh&mbE`5R#AmGU zK)iagaO#y%0`lc+a)?YGT^mB-7zOq~8#UeABx5w%B$9Em_rMM<3dNtghqU;zq}<8+x#H4|3|&* zOUjZZ?Wqd>JWW3!zz!W={i+ZMAaEn0^%go4OnsBbn@1r2yi7W_UJqd(!^B!GCak92 zTKFJZiCA{r^>=PRi;dC>`}O6CUqM$hw2^v$i`jkn0^#?|suClY+z&QPK5aWwYDO;I zS2G&AlI8A&x4nZ9r&IH+(!rCh#3X#*t8|H$cT}z`*g=&xr>G$=ZXXwXMvswt@+G-C z2)1e@kxGD-1n(pOen|@c5dm*N+QXY4H3g0Qqh%&dU;pq!-_Hqw)qhiZjH!)2sCPub zp_iO1zkkzULv-DrX~q+WQs2+0p!X}SVB-=+TR!ba9j;wqG36W}Hz=&Qv}n&1J^Y>& zDR)fu9agNelHV*?Z-&exuV+0zc@bSSh*iFuzb2LWovOmgYch?K!3}ChqxsrLF)ViA zFy=xQkjp#-`+Sl}TpOzzM{27HW`L@r>|XFxmMV*SCSAzwhyi6#^Tuxe{(hr%HLEWb zVtogu7v>z!2_pA|_uaG{ViH@RLq>eNTVoEq8W&BR(@B11?G~l86DZZ9kN@)1IcE%k zHJVB;vnvPHq(dUZcQCrCpCzY6CR9W=1eun2xEzW5R8j8>yc571wQ3O(Ff&NG? zstku+xHG-0ATVjFm6(GGLGkk?86_^h{k5PqU|!z`0pj~%poJ7yJi!Z1t)H|$j5MPypq_WLyi zb=;O8=;?}c{^xl7>08M#zDk@%J_(nPSl`(T3&H=%f7TNcZ5G4%oXOM_Uw2O+NP|(7 z=vDccb&HBWJDj+;AqQnqTsmT4!s{JnI{7?9%dENhlTAZ6kC>=u3*!sg{|SHvfBI9F zv6V?kj?uxvC;ItlLii&JSp)ZA=W#!#x}?)E+MfdFzBtF%IvS1-3@o#(h_W!t_Xn{0 z>$rAaR&Ec=o!3sb=y!z{ch5=LFx)PvH-b`V$PZ*>z_+cc^lMTfG0LpkHpCUCnl4g3?UOx=B;CUGO5Odo~an2S% zqM}G8KPgZdNcAVaKH8m2T)y?-%b2Akv~nB-U{BYd&Z-`e%C7|N<3EmdU&77rF`S%<2cOqYlM<7{$V#)Hh>i<(@9V7$ zX68Mf;g!8X7-V8$1l8WS)@5U64?E91ghcA(Vl#?LW!6{STP3& zkaW?+quWDJ+hG*s)YizS<|`UIgZeH%o}!rIjqnS1;5%TS#&ja4d9fewr2g~#M^k42 zQ^Lc$wiy2ai=RC!%z3KdLQzQ?kfUU5IKp6)_r|cz95_iBuRIRmpRma~(%l++&&a*k z%kQlt0L;LEal0Q*+B$=GJ3~`ZJwOZ=IKrK$vFE;|Zh7QU5tqZ>5d1?q^~c!iHF~O3 z#k2+ZfZ$`xL@Zz4$UOl%AUw$i%}=va%B7=qX%LJTVS;hrI2>b*Xlhz&krgzqB`9!H zCyek&BcDAhKn>mGKDUoxnC5pHZlFb#*jU zz8qB(#vE=i8e)82ek=i_JMotC*2L}g`eLDcJ8vs0MPa8`BKuHO}2mk<3 z-p)6AT>?k~5aAIJ5a1EtE{KSTNXTd?$Zv#+iuxW63-i+_EKDpcY&;TtY#bt7EGz;_ z0wPjUa&mHPd@33$G8z&xaNt04jus! zixTM*hqx*-HkAnuE~kcbJVZk6doDFsLTwKUo~Efw;s!nqx1_r3JK-;r>&Mg#5;2!~(o~_huIX{y&-j=^5NREO>-ZlsFu! zh}cx(xSS>uYR=!OUl##r@NXVr!D9i$0K5AV_@e|tAAbOTPy#4XzMy;-Uk{YWx)>N0 zK*Jt8Suph(k7J~n@u?$$oc2%lD5)NI?*4km&|c%!vZ3_##?OcyNhjEKkUJ@1M%*t= z_*|Op^LVO(Xk@)L5?Ynd&rQz4gPV5?e=uEE1P|*EHy`OnR*S@Bw}id0?`WF@NRNS( zWJ*kJ(sf!b-J~N%5=*gGCzDYqdUrgUhdcl9R1ept_&*kx3NsXm-D>%Ls!n2FlfTBc zpMn1&Mv=&(0spMMo2B>)n29N-4<5IKRA39W{ zKP9?zy#iEcRi0HulI7QI8HmK{AjKhT>P@q zON(J?BwAX?xQR3$e^4M$qQId@03<#J{=dKZgZDA9Cy|+wA(#n8#$7-eNb%zzDT|VM zo}je>Q!E8PQ*^K?sZjdElwkm@Iq)tiS#culddMp`_F)Lb!y~Pjk$Bz(^ySu45be{q z<1^qm{r*TDad4BBm7f;{M@%GoB#|CnE5+UqK+44Du2&AIMyC0Ponjhmef$uECTe-s z{;;EKUBQi00Tm-)L4e@^u`4{w$m)XZ>lz8z_tLvdBUJF`p+`{a5Uuj0w6X&jKp%im9Y8EhlrMt38 zq_8^2jxR6(K*Z3~983aD@$x+lY$p6pXoI6K=3$XDJ%7(cw=%y#-X}MuuBHx8*qfZjC zEqVusY3;%+NgX^yRX^=$kuSFwiCQIF`+E?~oes4$r!H#aTLks&GpffASGvnW+*vfy z`iWW$h`&!$OWsv2d*zCboDO6Y;=?PT%x_#stVS#5ntWh@SfHZF8xQ@jx8n0R33a5e zH9v~ba!uYV5=#8}l*$?MgO>gOd$F`rM7c99))24}z-~K?J^sKi8M=5x& z)%lOjb`r7pjUEoq>r=_>sSMX)gwYZ%y=ASpYj`#cU067iOpeLB*VbJjL|Rs4;zrl2 z+<;kRJ31tgCrglVT$OcjdpOI#78NlWg^0TNr!>Ll#@})tVQ2LkPQ1|A)wHO(&%p%j z!~>|5ePigxu8}bSYpC<3ItuvGY;!d5S>>IU(3s$1F(?Dyr{af-n5*RbSAebiK}$Q1~7ECl57PCs)m|(iydp`S))zB%#_zY&`$$S0Ke`{e0gz;u=t|UjbS8@kQ4w zbt~~%Y5xut%$2g9TqlhOz26-C#y0d%zv7DJIRi;@))>0mcss|}sA>*-s|pZvMSNy_ zM7+V;mkYBF;Rq`)GX@h5N6KNf4M_!~_Yq|j=Rgu$?CqTo_!yI7i`_95~ z<{$Yaj@ar45f#;EEa~U;U_nMR|D>o?hk zcfKz+l46&d-Urcrrb6guW5iauFX!sVFuQ~nof5H*avq_d9=I%u8-X>@L!JBuhtFH) z4#hA1&94COZ~jmNT~7N31TRh2XyS(5WMEhdh63&(tUA7BhqZ2&r>|&SGX53Nfs>=5 z5g?@+;K_L68rGh=MM2I}uxr8RTb`X>#%md3mdssZu5g<$mN7Ww@wW%pjr zs9sg-vX)Yn<9<5ZQc|pz(lZwD(WN4W%;CO(pIq#3Ig5G!W*cZKhBrcGDKSBu;uTQG zAZD-e_yWg$bJcy%J$3(Mui+WPT`H|N!U*o^wW;jGxK&=l z3dSEd>-X7uL`w>$UjgR+GiUylV{Ws(*3X@S1@ z89qXXnCXb}c_s9}+T|7;f~wX9EH*vQ9Fr!=2ZkhiRs}-&^w)hVs;zk*Jl!7d@W{&V ziyhT90%atXNd!Zrt8*6WSZ=(FmW-V6Y=M%57pG$iVcEE*#nvG1`!f&=f!Mr(q!l9} zx_N_ZX3y7^l@)f^-PTy^Ib=PDtKJsA_k+{%1`p`+BR3;!IA*N7kvH>Jy0X0E&;xo0 zUe^b{OYdC$UmPNfu9VhxnE{B`UnjRx=+&mBv)Jx0>dm5CFonfFNX$0y`b5RoF}ZPg z#Pk|)E%#h8r5&GitT<}S-K`Sb8?(Ih)ogL@j2H)c{j?BZVips*O2g%qGxkQ z@Rt|pI&S~0Hln%S2xZp|w16#kZz5ku~daR;;u z1Ae`uYwYWqN4nGBN}6?WPO%RTMg6T(Iv%GlX`BBFD8vZv6B2M?VInx-XqI_q70c6H zlC-u)SfZZUifouQ2O$>sWayjugoO{)fBiGx#Y(z_jpwxv^C)8zD7ti*mAxG^UJvA1#?Y*o>yy-%0EVx8wonfUklA!u3X zLZcG$v*{H;Xa{`2Mmfl3YPb=B59!+H=s>jDx+|9yj~+_PRuVR?#7cZl2eC+s$3Sgo zt}5XeH()W-6HAsYD&`HhSU!4<-8qocCRsy@Sc;2XjjXB2->~!t4}izgq#K)Jk8i31 zkwWlja#r9XaV34B>bK7{kv<-D<;YB~Pst|%EU9^79}1U+=yRivNBTx6kIS5(0@`Ad z#<71UFyplS(~7%307>(Q^Xocmsi`e&R9*ot^)K>G!-OxkY5`t`iRpaoao74Ct%R zI5A*gvhciLi@jf-d|O84P;6H+(2?WxVxxPT@ckxtKhnFs3>8n9E>nntc~iu2(wBk4 zw)|FmDRfk#KY;sBr3usQ1GQD$1rek?259G^W|GpVW@E1a9}b68!5!OK!xNnA&D?A5 zY7_op8rK@%xs%<{CT}y+Hu+{Cg7oPKk?d-$KhhQOUvq5wj^?$deGp+m5eJa%(0uTs zITmqTOl1Ja5lz+VORSB3b@V0g!U+4j6a6%Y`ETK3*WU*8MZOwWaNs|8Y*B0xQRxow z@6_^C((5CpNJmW?fA@8O**}I#*Z5}FK3&3|r=)8>3TL;r>+^NHO4fhRTR?Lzjx!7F z^-a9~$}-)(?*amk_d7lMAf=Jb$^Z2+F-;Ik&O3Iqo5i=PbZDE$^QdinUJAzqAH|5h zD?UkHl(Y#d@@;&4hMJo()4bC?{x?X@z5h#lA)NK35jNNEKKEzJIjZrY*mUs`Et}FF z-O|bMmJN+R=%jCv1Ji_yDmUCFKwV`3~hEIi#V9*Dy5HdBcR z$?spm^R}L3UCC=``}Ji>L1EbAJK{n=SD#J=Z$#uuV>7B>UigGSU%vORhHWnzSi7(p zqm8X0+3hIVi#flu6^XIyI%k_QRM)I|;V)%If#TNpXs#+zX{m;Rjm7kV|G@mqJ_ z(f_c@)z)RU@U|xDz0Y@l3HfiQ0lbnwct#h0-f`#nNc~-oJx20UePWC0Se(Q|!!{u& zf-fxn-a(mBB1Y>35;<-Aq;s0;D=%_-zF)Z{rnG-^W3w6O_$hZ$;NPdk7MgT;0;0*# z?}2zHrM(?qyYD8))4k&#AtbIEk-KBKdg1=pW;BOwM&`)`=+xE!oWsOuzL53=Ix{5_ z3b-4L*LkOwHIXGnffZ0w&jq)u&88^{cWrJTgt%=4>N7xHGg_;x3H@}w8qTtMIQC#p zq%@DMBt1^~vP`{&@;Q9+qS?}ZE7)^`})?d7&;W95n zVB1K&z^PC8Xhx?#OS7%^)a=k4VfsL`5AdBggTrjO&~t?-yCkJGfuQ>fW1N-4m7LR{ zD0VNy;kU!`!zDy+mzlSMVUY$E<5AA@Uu%MCrVR-p`}EE;&>7t^kv7+lmQ@7A#0YAU zH!{_JKPSEn)zo*q^upU|lX}fe2Pv-0NqP`NcG|L{kjU5Mj_^eAz?(^W<(mwbmS??7YmLn-z zK`q-N+9EbV|G1}mwL9Ba;uEsJ9TrzE!8ImTS%d0ZZ07x~9A3m-2QcIWqwJv)E^hHg zoXmtso~6%?un(0f5rHZijAcxy87=)LzoMM(%Mruse4;_v^sV}c*sE|K8`G#a8)71b zFZn-TMluuXm3_WxyK-z()8+}1RN*pTp$7syS)&^biYN5JU|S+axlSt2Tk=&tbW7j+ zvP%E%6KvM$$%)CXx@WAX z7AQJ`%k_E3gVeN)xj2@+3+&K#It)@dDB&0#KIMt&^Nxm}yoYF@uwt!Wr-UkJ%ly!&~hbK#N=hAw_C zJZ1CIlU7pg9zaFC^{3S(vQN;8=jan)l2-R*-fCFozZ2vGV>dIPbfM zRlDIpGO_X({=qoo`$~&n<7D8J(&H?YOQqH^=P}jHXjLb1EdFc8ycM6~!|6#-EsT(8 zzaAXfl@HFQv;8pBtniy)oW#ToBCN9%s+UAuIpo|{fWe@&*_u|;l!;3(`}Dmma%iO> z05Mdvn~sW_s5odga1Yg(6d(1=M8_X;jJr)7;=992EX_Lj?6(AqFRC?``pXW!SC}jobhahT2RTJmV8zGS zep&XX69|j_m_ZYx&tHuEy}Lq@{VB$_g1~c(BrWb#n4dl^OI+5IxWM%THuy_Q989u% z;zDIQzT-~zyu-S2>!N@6>b)Y^%&u!%`8OgOh7@TqCbEpnY^%Oh!^JGz$sNsIrC=wm zg`ySEStkXem{KmET;^ zWibdI**=)|2-_#?e#lIvLkwH@s^l>DykwxdTb=WIw6-3k?I~8m)zwPwxHhnJJg)xL zGOl=&$(=Pl!)oJF#L=p)Ts;VR9N46ou zii7acJUY!4_%CC8vz6Yg5*d_FlSSom%G9dHhmFjA8py-Hb;njPIp1hS7O)bhu_Rz$ zX;TT)ZCOwHT~QEFbH+@no0%JZuEh&!OIPqS`?(ywI{engY5vkZV4|_Fj_Tom)}PFp z$6OD3Ezm$2k|2(=|N8UCAlPm)5pDGa^56;7N+?Cn9Y>_~f@LKy*~*|4xa0oG z{_<^V1*R7$LxR~LiaI`A6yXy;A12~7&OcjISLT87&XT-W>d2I}G#6RI@_t9>X3yNA zUC6x*WKS`zz(k5LO7kS|K0sZpc|}IUSJF@yK@?h*;{p96DVI?}-F?!NX5uUg(-u&Y5LBDVN(7+ga#MSUn&Ps zUD7UF?_BwG8CqE1s4@mfj3j!VPE?{iwPOdt-pjO>n z?m}y$ObAz82k#MqFN!0hi+3c#tUul%OG~Z6lD}2XFgYGpr}&KcaMb1YUHXUSHLeaq z`}eomd7iL^&|!FEi}_`(2EQOjIx2M6m?iUUBp1`3Sh2K=m2-!TgocOT2#GT%-oyVK z6Tb@yQychAgRI5Bv({-Ls?%X6A3s#aD(Tu4k!&n- z_|Zg$syOwQHV?0b9sZYt=RL`#;c;;&e~CpXUH=5plT{V}lXjGl+%M6x$`aogYx7II z+I(am8jH1{0YQ!E8odUW!2=izN1Q|BWDVXcK#!pbNa>pEA4aIBaUC)vqb=mx9>w2q zHB*fE1}Z2~Gj=!!D(Lc8X}M{7P-S45Kq>f1eATj{9tu8lca1DeCL?Ert4R36nF+VP z({MY5k7H2bi@p!1b-mUxFwkl#B)=oT1>SV8!z+Xf-JJ!u?lYtL%1Tmkij>0`%OQ^%zH7|p{Z%)|tuBsT8nJ{sJ zZL}{Q>IVAHA#qo^C73rdLqH7XO*trp#}H;P9liI^Z!@w`nEtSFStS zHPH1^d9HVLKv+#+G?YTWyZ_PQN^gk=H9C*(dw!jquxpZ6p0UYAv@avwGX}$V>fodp zPX!#2Ys&=wM{(C}eIl8Pid*4sh2p5Qqxd_PWG;arC510xe-vDEDJs;s*A)&wmzLey zmN9JE@v!;^npmqeG||m=WJD>`s{m-|c*&slEi2XTxXE{nhC^uziWO`8t5;f#cG)8X z8a52H`B4LbyG;~Rm`d-CV{r9T1)2_Uy?7ynsGVeME@cFR9MdGY(dmo2dOOkv%sBPa zql&_&TI)|K3dIrf>69!&%Xc|BR-yQ$3nfy1xgaT}v4j@83w2>e#!0Mn-1}%8^A#_%0GNL+Y#K1r`yqyRn}W`Y}rwoLMNPqTc5OSact8aB17spe)q;{ zMSQL&Rz`|ww<8eyh}*U}dT1Z>O)F@-pyX>*aF6idCHBe$RNjnRPc^|zWKGJ$>aD4J zFP+Yi*W_e?hk;cM>Bp45pwC2rrvV+FSF;BWrcO>U5|15iIZwNHm-lf8$x_Gvw)s_( zV-}{h1`oUY#UC7(kZ570Pg31U%$%5s;j0;J#@n?~kL%#aj;$^qpag#nJru;%8sixg zL)Z^>RXqHTmep&}W^R4Hx7joR@!Z|P%)8tBe1+YtdedA#)i1)CU6r;hyNp53-mKFs z1h4&YP`YUJGM96^{|2~qe1WgVvGAz=HmpgL^Fk`(pddo5WWVs%)2&9TIFwKKtpt)F z_e$UkosgSt!|3b&nPht&+&1gOT}Y`&PO9>PcQkD}r?jSIb*L?@UB$bd=n3vwuNEsV z$VQI}GYBDoZ>HKrbnhOgOSY0K zm&hhY?K_G6Dx-@^(kW~i2aZTq6_FvcFDgL3_EZuC7FCg!D9~}vQ@dDD!IjcJ_V2nX z$0EfdQ5~9u4&OR~`>}hk)$suV?bTu4xedn-aoZM+uDsCPrD#slJ*m@H;S`ba9+1uw zb4vQ>P5KVEMq$F5rB=@_#BEn%^h& zK1^n6b$3Z#SH3+yCs2dSSX(%SZ?6Ug)y7s@@0~=0*lamjj zM`e2I@_YUe(r)fuUCoqxDWPkvcwi z;+nk&Jut{De{r!V;o(uT>tsxAQjLB;gMDS_oX$B^$`D#*UKofOi@1*gRTkpO6`M_X z1rVp?l+*Y)s4K4M!V|T@SX(IA^gzT<1WqZi z@00#;>U(5v?vd)NeDbcA(Jg0bx2r88D2}>4caR@BBEA^$!tHg;pl!gjou3+Y$ObpW zL8&aS^aaSnHUE*Q*waVrTSw~?N9p_EIrLV|;$$cv8OJ?{D4;eAAY<6}EHw_b!FXz~ zwFwWRzW0no->t%@|2&=>I>|^jC|=a&4f?!EMNr7^({Wzv_v?h~rr4TPA3j6Ar&V!! zz@vIIf7R1XkM70D=sfFkAk2=cy!^0y_w2BYwj^m0f6&Ew(k@|^FNfRQ-B7_NtJw9N<-3Rp^w z3$EtK*`-rLWt|u0hPVXvwwrT9a~kYO;d+~wE-GHBd8No0Ca2pZ0}?6nLjA+?p0U`z zL#CPji8cE)#4+Qv5dBXg&DUhDu-%m{2V07BrI^gvGktCA&o%P``LWyWW8=#GP?o0h ze_RcJk6)x+M(Z2pKyBla)G9yXro5u61Ew0ux2z1`C!q(j75^T)fei3wy-+yc$geJ( zly**n6s42YW}0-GjflgYUHy-M%>Q&?L=2<>rS^)hYy0DHznuA*jLbpW#Nbt3C3og? z=I-HTbjIYPNjJ%w?HLo2uX6Hwz6f!(jNrWT<;L!st=;s(dF8nd-2le5xam$y^b zGJU-^Y$Es>btp=UBaDfhJ0@D_R#Y^tPgr9@Vd^|IYNH=rO`QSTAuCBOd}#TAZ+l9dyY$RQ)`T2zzCK7*I#jxHB9s4R-nk}vptH#gaBi=oiL|67^?HBM-D^o|T zMb`W5PD;C%<#F4`6zNN^$;!wQ2uznSd6=_YX@G>N!$YP7lm6N~TUH%dH$`}Re%^9` zCqQl3l!ZPG?f&qGO+z$X1X;(@u!&EI5SCLtcr-sPE!=v; z@jKnq5bBCUx6@V}$v$Ju1iovUDw9@d`U(Y0Z>6pd3^L|iI$B$}!xrY-08g_6jdYI3 z(aPz!j?Y7B3pjZ~S^e0#r$O42QER;5BCJ*Tz*=m{vO=)vpzeg2XBe3@s9#L>_8fuP zyflkob(2V&=SRbH<=Jva)?yMn~;u}dFGP30!r-OEEoHGDO$n7m zgGT*KY>OM#E$c-AI%~3M)ZSF(^!CN4MuT265Qpdrse)cu|CzP(0LO0LX@TbcbfWCYH zZ}tz^l@^IvtYh|df7S)|BGjJ=xyd|_KpLRkf#tz&j2QPXKg1evI{&o&Xn&U{_P6Bl z!Bq#%Nn*2s)SEo`t?ZNsmYZFZ!&=aimI$Q# z)5i8_PCogt0rkXXSpH2myI|!n-E^ej!)}mn>KpA5%%(_-RX!bfoYXCT22ClB#%9xH zn)y2y_qdWmnpX81=iC4FXA62Bg}Z@1o$;IRX(nsq5=rNRmIQr2o_*m19JU(SyY&x_f>+H*>=(#?%&7<^h&Dp6@v(R+@G`!=e3^k*oFHh6S4lv&AB|;13adpjR!Q|hF zHY95LlZgdYvEmN@bkOI6HfzC`eB%Z7m9p~&^XGc!;45=h(tiH`ERD{pM!P=ld3MTw7Q&h%!@qa=A9G9QHvL=QMRb9VPC`i z5?S(aRLwwU>Rt18o7?mcn%f)877Luk95cfmn|8ed4(%nz(qZM+sQ3#6YkxZ}{=%e< z_#Wn1VR&k1F$&yWve}zJV5>GzTyuAqW_U4cz4>Wz9#kB#h7}xAK2YSa#rylbK8Bom ztmjx7q@=HHx9$JkzL-kwAm+dyBN+LsD1%=Gs6hLEt6_=!6(BQB(xzzE>9i3`Q8s^4 z)U{^t3Xq#0yz3bZFGfRN&*KE5fAUTu@t@-vSh`dg$|tRP6pX#}qMz4haX;02(i#9| zFnN@AJlsTN&Wf)f$qx1#F1rq}H~vm&e#v}W=GtuIPnaC4m-w0-^Yh%;3Ql!TPi6Ly z6{~?neG`Q#jaeLD52jMg;&0VG@>n+=u0nS=R>yk@wLw3c)W6xn8rr{ZNF%^=H(dHR zX+N)zQTS>xwSVo@sJX>k@)IubZ>$XhrfLj5EDlF2l$9USl%(y^j*DG|>=Z{LDV>8S zhYDj!x`Y#!0va`m)je@pO+q0gP1&E^N#*WJ$@)ueX_tl=q&|5lnyv1gew-`{7RKex zwwj&+3VW_aZ=4{Q+sx`yo(S2Rkmp_#^ox#AFqsS^Cs_>L*G5v^@{Ojj?Vu}h?VltJ zV6PF=czW3>G`q$`#-Lr<5E2r(JULaV-Q+hyn!(zWot>m8l-f-Z&qn^~40dVCz1Rx6 zlu_It-Di#T5-{vzY4li1vIROPc}_I0G?q(s(6HqdkI9hm%?v#af1C(HysO5Ueg)CX zQJY|(Ik-3v2W`$Nwg1+sJfE0|;O#@9ESv~BQFa%Li1V;*H{4wxl?6T)HpQw2BMC@1 zkDqs;wbb?$Jtji+XdIk;)%w>(QrP!y*(AU`Xz}0xDYAjau{AKsGP!k?vJY?(D8w4G ztdhk)D?)Cor$_9e!$SRK9pMY0Ja4pkTE(w9;19bB9v^t9^Hd$6Zu82rSgmUATBnqZ$n}s(~W{a!I4{UJ!YzhshIPe4?1A4=oR~2?Y_^?=F zHq(dBoe>IJk-4~f`^-siO>D!m>SS960%0&)a8Z(d#NeSJNpghkI~b(F5W$lM%ZDB| zh)r1WUEa8e>We4+wqYILKz(V0Yu2pym31;7dr2IW*?K&h2&OtKa`nqk@foC=Kcu%6 zUm&S%B5(BAwk{R_MHyF(dIj{jv0c_XZ5^U&tMMU4<{pE3tsW&{u&vTYakR;eguXV; zDVZO*QQR&6IBf|9UIC$YI4+{J_E&TMMyc`$4Cv*J4+%C*CpyD6J5*eg#a~6GWh}hj zU<_M>F`LS&oQaN@a%5!1E#WCnUx;N|ywm}ihwfx%wr%OhRvxw_2_mJnM*1HJD@C7% zz}v=2#3Xh4ML{$jY0feG2OBiaX9bUsg<^yB`!jsBYFEdT(L63pGrf>xM0=r=%+6eS$0b zT7W?van{H5MIi{Z?3?hzoaSTWmoG#G0)n0e{8o@gNT@j>36B!VmSzo*)uuR#sqZ`b z_`3|x6&l}!m}$*$ATok^xWBW2ZIK5s4E=)Sn95ZeBW|#z|csoJ{JUBByKHY_0Awx#lct6%cTl&7%GZp=_|7Ih zVQ-C~-?Gjdgb=s1b^ z4%<*gdHVCO5#7gpLq9ueZTZC1>HR>N>6jSqP*Z37a~+86G-IxMb9N?EkKRrbuGmO( z;7OZ#u|{u6^P+vxJ9n+eN_3Fb9LD5X%ym;STMeSnJSU~n3q8$8R8i#F|B3ij5^$0}nLwdK8EeilXl zp$M4T6?>+N#J`Rnsee}s!ARBYpYMsq)zsd=60Z)-Vk~!i1;B7chc2~x8*=c5H0`Rv zXUna7=4_{I{|Y|x<-_TL+dPYFG{G zL5{H-doJ&N1pwDL0%h)>=JO9zNep7jgKsM3r|lN;bLvTc_}f8z^M8LR^4e$^`==O7 z;)fgd3K%T?X@XwifJu-))KkRL;DFUe4#W`6Yi3+r^j9AI7*z&!*4T znDtG~>K(r;4Jt`a;ns9mxDI!t@2@6JZV=@)cET9nF5#2AU@oR6?lbbCkCO|WuG$c5 zwF>uzW@sp$;BrL^WzR(k=H@;t3#LzH5>@O z*m|5*Xb6LAQ2su4qdSuG_+7@zra_M!Bckz7fkI~>JHIh&IqakjsI%TS$Bj>LfsJz1 zvqt*{k}Y%hi~z_=FBUPT`v{6b(39{ebh|G^CN3LLg7)}^_3cv9G6}T3Uwd(h@Cpj9 z_Zu#H%5xyvZV#tfQ5}O!$O`q+nNUV}aG;#F|&Yc#k$6j9Bk8sg5?!rndR1W$WGicKLHQDCG3EvANyiPwmtInmv0n z38#!^?GiC*{{i=`_J?p&(NO^}bQ?JL;x^u>a!8hD9XLG&PE%yeVEN;`zC|}VT9sez zi95b^hNMG;cd*iXs?R$~<10N^v|t~@!5$UuZ=fWs(AHlj_ku^WE<}tBC(qR&1hw_s zj4=fFRn!b-10wN)VYD%!wUkkpm!)!|!IFKzZ2OhX-uEYbwK(&HsP)5EWQTagr6iJ_ zn74^CVRz`HOK&Hs4bh{J+!2$b7usZ)O&tIEZgY-l26<(yrV>m(Bdf_-M?r~e-DV|@ zryvX?*Uj4Y??pJlJo-i^Rur2IVfIQ9*^naycTPSOoi>`4N#p+6-d6K6>rB{5u})Ep zrV>x<=M5DXZk_#l7qjoDf~HKTA6};+Ep+f|Zu>PB7&BNQj$moOL|N--JYm@jwsA~u z3;~+X@9V);YK=0j>Tb+RbsH>Y4h}^g4T4M{7AeiIw-dr5T|iA$2>V489Yu203V(Xq zc5?N1)J89UGD-3;pj;Oikea!z+%>AW~FV%o#v2!_W8zj61UCHa0S$< zN4@*{E*0Y5TG>5n3=w}6gpZk3e%y_&a&o8}#jGQ$tuPico6Mvwko*{4`40y8Tsf$W zyz0A#t1k=!Oo$7c5?}G6vFWsef6)}QS&@B{rwh9coLQ$4w2UFDbdfuZmPp6pKhXEI zuFX7DS$2;w%dd^hIADJpik3WKFXwcQZf3jJ-`A{J6ANE zOIr#^48he;egysDUwyEqVTt>mwS2Dsb?f{oMG}@h%f!IaRl4{AX{Dsu13vuX^jct| zQg^5ddPHJ@qg{r~e?+2>+~aYmB_cKVO}PU$onvX$${D3UmziRW?*78m1g8D+oC!;R z&g-y*5O%wP5+qxYKM7y|DHQiVewo-{DYvq#(qw+tJ1QVn1g_>;NLY9J~ntP)?T@)8VP%W%*nMhh_}G$?!Cbm?#FbH|Gh=I*p$Crq|Pcc0wfp zqT|s@|5%^pov9s_gpZnpsd2{+e&A?D1xGKk`o^yZ8FIyCUFl9_qgn~F(#fU~|Hd-e zEl^NFhvW1Ch2DDo4#qARz0x zo8>9HGb(Rv(MxNL7Bo}e$9I$b6Fp8>d>k4e@2H3M?_!ail=y^-_yIk=85utp*5NG^=cT?utJhz zi8{lKXzS5-1vbh}NcfD-b+5dr zps6xHpR4~7%r-zh$=2a6U0c;}Q7BaWNXzxnZi$8W0&c4#a;r~m@l>3);aaI8CdHcJ zUwp;sA;&#=GA_}5$_Z`y7p``8rd<0h1v>NOgBn5&KGJL;q;PG2O}fFYR(2j^7v%eb zy8le9SNoYOk98%*+beU?%Uz$(j@I>2C)asL9rFyey3hH0?GV`uQ#45bqPgLL@M<0V z@1{3E;xT-CEt=aV#AO^fsgyl`$UVs0GJdB2+df-w$?uqae*km2vexJT(SU!B5ISyA_{2E6 zVu40ok;*KR6(MvhuZnw#ML^p$;9f`#DrX6U*IM1bO|sb7BW`0iuKr@*r-_C)uP#`Z zE+Djr*EkjEd8nP(1V;5++)i5AXWvps{N{MyKeVWg%c<7NW$SLjqwgUTO=`D#o)9x0xKRFn zJqnxNE<2ux%QLlr^W+;z^Ux+}=MJ~|(A|@MAY(Hk(;?BVw_7*&)`D##h=-#rq{26d zWjb>kbG5t@2XA4GloCMn@D{ll%WUy*WX z!8TxKWsaVX!s=#Z9skDKRl8;%r{2FQ1T|ptWjSQmI8~hOPc%vF zR+0>l3cPz2Ww8Ni$fbAex6uf9TC3LBsoGt+s=hs&qZ7QLqCTMT{QGnl*_3V+y$qJc zES};indzC1Itc{Id>FxY>u*nkTmd5E7)ENl0};+~reJXhg@V6A*kxN(t9oLK(8U9o z#LgDzlhU{nb>4$CA5=~MEh2W5d8?KRS)Xrn{F=(xx z0D4z?+CTTpz=y*u4(bQ^0r)Sm25gt>yEE3cJ!;$FptL1Y1r@uqo$?@pTO(FJmreKX zeY~t&dyoc1VCq3#vIPr6!eI9iw_lRlly*R0c>7&GUD_Fq{BFB&q)cR}Ve#jopP@0h zLrj_(Iu7aDynGr$z6ljlti20~dEow=9QZ9TCe&5;z}jZhZE65sch!@Sabsa@QrE21 zEkR=d&(!lYyk{p0qr6?bJXt?xGNxJuMRGG-Z-&#rN6&(i3<>Wn>e_a8Nyvu@oL3^K zG|}G>91~35Lv4C?&C^*mucgF9(A%-lJl5fahr@oPzWtlFKiL5^3n%5{%pB7 zKUaHvuQ=SapsJTeO`P(Q@|TlvBnj2W4?V_qUUQiEb6(mg7j`amf|>j{T8KKJPH;$% z+=fs02+Dm8ndYfgqQ=;cL9piN1J8k~Mmq~94Xjg*MzYpcTZ;NYy948H`4)30awIt2 z$@o!GTe+ye#+$OzG=$p}M&s|N5rb8rKK#UsURV0(IwoDmM+J1moi)Pk{MgM#qi>Up z{rERfx8&?RLS3R)05%!P`&CkWC47gGJ@7?&?QiN|s91|lRC~a0C)q)Bc6{%B4t}nV zs}*yuAW3?RyNadc8M&1$_U?lNE7d{-rC~mchA-FA{ia7@u^^d;xbyw?yYZ zI9=BD7uZSTWm#R1-Vxb{UMA4b!;*@*+PHo^?YMGce;qC2vuk!+ttBRN+3)&2&r%La zfbkKmqRLi3gd%~zSNuQP`^vC5nyyU8=Rg2kAhMVv zmS`vp98MT+c0pL~MH;?^L@0>8qAhBF>!A}mvEfdXPydjTDmc<2AQhNbhJY>tdm3P2 zY!0(qjv<(m@ z?%8N+hEp)gK^SPhbA3^1?fo;4{2Au|gVN zMxaC^S*4rY_9wz(g95iP+4zLmEw_1A@lC%x=wPDBjq9r2kWOh#W`%2ST`K2Os%;WV zORUJ)ITcK^C|Py0DA>Bs>ZG;(#`F7?udf~awZ;VIO(Oo@B~wNaXZHN-`8Zi zW=s@)bQ${UlGUEyf&j$Lj6B6kcHJ)%bwBW^9fvpe#OK=qwLdC{+J~HCX%U^H+pVn8 zBcE?3+f;rj?VG15A6&u5!Ofh&WM9q_n^hcmQJ+0ET0v74IkA;pXa!qS8t zy=Q^KzX`2nz!GH4;saqx4NFIq$sh-)h`n_Xr;(>Wn_SUy7r+@np;6fYL<4GfB7BuI zdILz0O2N}tyw@tA%>|Zv^`R@j2f$h^gtq|Xr$M4X)KG} z*YYCrQMNnL2$o+U*vcWBry;p>ScIG$kazN>_=46#az~-E(k9B9k`iUEtGBOk-w|vC zLG0G--8GkDP*tzD&Lm1MwapCNU=|>Yg3}L9pBxIH-J&#uODt#-tFfo9$3(F$2L`v z_J*?lhOsz`X9X-j5ip8eu^IrB8vB&`&O*GpUy{-%gqrV$oYG<_nr@;u!6VF`Wi>Fd zA_0#ipYNmJPAPm1j$%DEqetv4`HQsx8_~!kKZ>os1JOQ*TM-^U{)pp11<( z*pE}3vrt!`%=r3G#n9OL2Vy1haS^vAHZQ(@yQ6H7X4k%DMs>*XnJ|%Tn=HpDoKGj; zzJtH0D0{gU?GPixTl9J4u+gOf3mRs1eBJN(gtREHGDyBRk86rBvB8_Ndoq7i%0UTT zDPud>f~D#Kgava<=XS6yk?z<=tbABVk^;8FrdPAQ4Qi?lZBII5?5)Z|6hz=Y9z!N+ zH;V^kZ%6!KMQdk5AMq}9#zq@62B>-s#aJ(;k;@C6FRe-}j0MlhCSBmp6N{?R)6!lA zi2@3fYtPgwNI5`%E3aaCD`4Uf6MruKqu!jd+O`;N1gC)UE-tpV#3f{DX~-gL2sbJ! zgp9+(cMlX(IS-Z2pABHl9>?Gg(V2^AB z6^~uE$2Bd=?QH+O2dYtEz|&l=ZW8SuM=kK!4aR^sI6@EOjh~@ zBZLJ6PR*6oy@i&rj8y|qp!wL>VWp4K2U^Lip{6^L-Z0yJNm03@A?n0-F&>_$1ijL( zw!v+ZvX2d*SBkFFl}EnJh9X%ND#h2M~MAy%ns;ETV)SsIkjRU1T)qZ1})+Q_*_;?oQNHI>xq{~ zXQ$)tM+uQ!ZK4NvIvlKygKOKgRS4VIROw@_MTXXl_i~RAf*u4Ej%`_V#UG_l~>?~!Ka7xJa7(gQrdgl?}$mTxNzaDVW5U%=Eun@ z)u6=t$fy8a@DupDbZYObWho+)u~^yK#}*h(8=!;@Rgc#!o5ZwlVP|DL$E)MBceHBz zowwl@QqYm&)9~p+c^jx&=jLTw>UZO8B5jHgQe!l>r8g;E0IM!+Bzi__PG8y{UmFv6 zuzzI4>?`fEmK~Fn*45x#ZI2AYViPT0LyBg}^DMK+`RY82SJ9cHCpUD+SM+gbhS*l( z(tTpjpDCnHj1q1)X{SUGtQLUSzTu9(E5uU_>{Ek)ftV+bxV6MgY%ik7dw_Ll6v+~W3 z0m<%)EL*mhERvzHEZmw86ZuGa?=sWU-}VFEg0aI9lWqS#CrM5xW9G@c5%RJd;T&CI zC&X@&t4E!;a(O4_~_xOt5R=?W^fOMIrxM zRGgJ)#!ck-<6_e{P%VL{QU|XxTALB*$(if6@P2CbwC251y;Jr3xq|yjoMyt6msd3x z22T#o1NW8^n#z^ell_%+&#QlRp9}yiXvBkn1(zWXq(W0=q$=Omyf>1)Sed~t@|O*p*5q@C(23`TRyhcXSf%iyGll82Q1Uvu zAY?x%s_vGtH0nz__@RUikSe1yMQgu!;m@5u%`!L~@5mFPcA>&~rdGdSJRHZl5#EH< zVCW=V5v4S&5TVfPo&$U_8@@(Vz3TP+NcmUu4>K(M=5VmN^&qhz15#LWLN{BQdUuP$ zlWz&L$(LDaN%%aAl8;@=PzsV?JF${9W&8^ReNNle&GoQAEW#Rs?W)f|;0y&)~K9DPUyDqCh(2}UY!2ELn zvrmlJcJJ$E^AdJJ5!eS^8f8TsK*B`9_lY4vTg?LJqiR8S`6JqaCHrD>voQ;%jat+z ztI92WwH(@cZK&(hX7?}|rpwRdo%h9KUy>d*bPYw|uI40MTBYr{TInP81 zKO9g|(0d{5KfPRly&&J~y51#Q2H)ji7@|ghNd>ssuG#dljCm$c4o+`tkU%_1MVQQi420|QTnfoR_S%#gvuq* zyR5p>rJ0Tw9`c`gZ>A*c_RkHTQGhwk?Pd>H#$|cLxFB}i;@_ewyNc<6pJ%@rLDN^- z$S?4XyC$$ha4Q=`M06Y%*eG}9MOv!@E0BN!KEYe1bERY_B=$!ZPbp+K#gjl=ZhA9sLDX=4CU<}Z@p z2nB_7HL;*kmtMG3kAj%C6~+fr1QtPZjOFZ?Wv?M43pu@7@YUARM2FtSO}S0RD;le= zgV-R}{6|SyuK^&9!l=Kbx=jmyvy5 zf$T>8x@@Rtzg(>M?il1v(7?}l?d1~FWaISHqq}`zl=+-0x5E@NuiyK$xtQr-ED2!h zfixRG+>yxJlvR8^Zn#**{Hfm75nYFrnh?KvhjNfmv&;s@prqZ)o`pJt3n4$c2M_p% z(OBLCjf#QNS@0WPAm%=x+kOfT=H=s=(bAaan-&T1NOIe0lfP897Q~>W0{qlmtZn0; zj9A$33@04C&Yc!jUM?J5ZQPs()Wmw$A18T*A$r_C^fxzDpN4v*%sjK9L_V_;q zI(uH{lR}|DT^ZcNMiCd5$MVjVh<3?_I)Wf!R%R9X3qi5a#%B!rR4Jgl(74~Kg%7uJ zU~9@^8~^dQ&HSQ`>%p4y}rm5YoVWP_>IH!HreS;x^rkpTRvZw zhModjU4HiXRW8>(#UGn=W`{OSaU@|GAFSqyA?y(DxAd+q*%~h7MTfb?l44zaqjvWe zH9qh5Z@yYEYl&kD|7`S`tqp1zI#kEY)hMjYhbh%Lcp^pfb2!lfYP;${I(LDX|FU`+ zvfstBaH21?Zo;+DtOT(U;DFZ-Gl=qp2xGqX83WL+1kO-!#InyG^snR(;N6xLsi*OA zzu?pgtyT9@-`eQ84t3S#jI(8-NhaEHXXe{Dch%^bpn929CP3@RERJs(qInYU5b@pv~wWqsuX_T;-+N5J9fyJ+y zpL~pp>22`1sL8jj)!TaI{zm>R1+P<2U)c_2GHulyNQclAf7WfHwxXH;(Df0DZooPS zj8e(C-t&3Mt#lk~Ou$j@vW8Ij!u%%^5KSfH!~9FypOINzcl6>7uqD?=!caA(qA++7 zLx~*~31;yktD$`OMxbuXXRXd%i(+PUbXMTx)<$|_F%>zx^lKSkOLu$udK^16{&jVn z7isUMjxG(=l1!*FJz+yASr*ubV3E=>kc{QkyDU=Dp4NQq!@8tNGBMo${TSKJU}zsA zs{TTVj+9x_5-~iq8r`5@Qqm$rxuXCo!4Qoq2O@moT8kPbtq~?DhZ~N-38sCCU{3lL z7ZvZBvGVzVFytHOM;c6Ib2LfI521;2=}O<%c11D#@vbJQ5NUP4=-oIcNGyS zm^i#JD4R*i!tj_v8NHcsMe*=Ncn_O5H#UiA0%q_=^$D7DKDs^zqqf2%dkM0e64|$6 z;+`HI28Cbb#a&G-l%)f&rP%S*AQ+}Easjfv^E4x#ThLQCT$u`&KBesp`$}3qktN?v zL;Rwb%gyC>VIP~Cy!v2?a-7&C(CjZ3iOS#f=#h$wySlgHePPBEI2m?b=fkaLRvSO~ zePOG2MOnNX^)erG7+(l6Zqvpgp9wS3(FJ&(u{1T2xp0Q4jIPAjyRvY_?h2*Pwi7@o zcW76Z(wV%v;ldv3vx)eL`vazS1h}^u=Ww34x$G3rBNwidymKe*)o0$hG2t5}X=@e< ziAXT~Tr51DPM#0Iu%6orX2dxrHvooh&UHc+)rve|ql6b=OM38ENmKJJUybde-v1^0>*0+a<1IzoR-d36V1u8 zaT7Quay`yIoPM7{t&}RjuiKr4KjE&Y0~cxX4Uk%>spDKEbM9GWvkc7aTW*?yTpUNY?pjg zIBMhQI}_#xN!}F5xn(T3&hTZmx1lnMjuYnW$6A`(oV!}eDw)sDfU639XFguU@1NSu ze3op7ByhFs-Vmi=JJ5L6es;w~8DmhmmbI=kxwcnYPN8FE4VO;y>cRpbYZCg*l99b&YD*8Qj#RO8eaP+W3ow_~LvS`%5bI2QSN zqs7UISC3U-LR*6$nxP^zIhqf8eCc7nZ{O(uec7_%TM=`P3fVRV4(i^JfokV>UY`K# zg~=HiF?v$VvC^QN)*RQxSLs#eqRmwjGwT*1n_~{y6GV98)2oX#i5Zm&=~)qxY#nby zcbFS>MZ6bOt3Errh^Vp`{;Ei{QCe*4k3+Z^0}=I`7!ZJBbhnQWJ6Ob*HBDHIRO{;_ z8WLjX+I%Aspr!n8EKcb<8jLqT44Cfbg?zZJRLP`=Q!X?R#1#4cMwrs~h$aUm7!ZUN zAwKFEbY45?DZzL3500Qe*g3JsH%hz$M4TX1ttItCDvyV*hDPTGnsv@lZBOw*$HpVC z0@D-DT4u0tG_TFx~6$ny4Le+{thX=Ot@& zFn$t6UGZ4@g-Jr9qQ>sds*sTgA&K}!r=E-LWj66$i-0d6=}VXKR>Z+34$jyqAFFe~ z1rBv2*_fV+J8&wJp?B`Zab$9lZcDpq$!N8?+@8lsTSn(jOa54X0y&%J7}|RBvQ@1q_g|1r#_5 zGj}vm&F|K}ae5fZph(KR{*Az!Yd9FRfV5R;V;NwhVYOKhH-&uOS`T&!A2#yy6~qTW zYMrlHjnxL(9|>UtKtJOL>hZCLA~W`|Iu(Kzo^!Klme(5V2si82$WbL0ogTe^K+yRk z5eHkBU-$5`m9rP}<7`Lo;F3YMK@JMP{kRV5aNYNm>LKNtP?#H`LOMjS=zH%ok?U?o z9*ilpam&_oaLbDYCtzTSg=3sbnXX^BFhQZGAc<;9y2y1J-3GC{ZDCku;{~^Nk+!`5 zqbp03GLvSONV`B1h<%3b44JH8UV9};F;)%Vco!nU8`)A|D+Qd;_}*|B>tDW+j}qkS zkv3n-cUTt+CPd}?=OkjRe?I-|jdCgl6k0T9Ow97IA&ZTO9YRzPek5iCGVlu!OoLl3 z_~ig9NcbW?Bpma_|KeSKi~IZs72A)-hFNGQ;#`v1igXx&lKr*}$r&AefN{8%HpaXg z!#vzRtn__28ETK3<}%bSGSrhu5y_sebS-@G8zd^LVu3Pc{1w*1um^eskf|Hlb=GXS zhJ$oSa_ocEBe5`RJWHXN+OY^a#Lg{CkafrqxsT_{$Z^I^;|emtehbMZ>f=+v#w-sH z2VWRK6&&itW`1

VDA0C>MhZ`S2fp0dkW#lNr*07($6Pb{fr;`{l8;)W~5;E~LUG zQDj}Syk|My;Q}<%Y%)V+blAh+7X*DqvA4rheKQP$Si78gA~()lRa@GsUekpd)t%Ao zM@L*5F&{-TztH!|r_1!E2W{E<{zgcQz+dEw1=dPpy?zWPA|zeez*>wH7d#}GDTI3D z{-s9y>b1DQH{Weq0kT1aJz1PYz=)-TWzlVF;iS+{{-$Zcpp5k8b4bO04cEG*7lLnC zm~pMKodaDl_|^lK<6Fx3V(xnIu6Xr$Y#ir0bYbzn$>;=c@c38kg6pqJFT)haE5iX{ zo{0MBR}#%kmCsB3U-k=J>9A9*FKuWm>Z_%fE$PHhnW7kTC8_EQq)G05=kR#{q28@E zCp*6*sdozpanieoto^udALw&vcd@UyMZ(dnZYeI0L*OX{oS(Q?%QKzx{wtH2i&#pR z(Hj#2Am4lWRdfDj3DvGx-U+>>xq%B_NA2*|R!_D7I*`b@(J;CcGb#ODC8FCH$utYo z!pTXrSX5QSVgs*N1HM>7?`69_y6DTJ1b82E1xH@JDF=juo@&3II){X~{$7W{(+eEF z=eb8ZQI>+W>)(W`Vxnp_@8a-GTFsqmV77{@J+=@ASO*9W zFSnSSHjY@pQ*Kyo^U__~@YQ&J)zhnq5V4n#hV+OVs zgL1lIG7>g~H!nxndN>-+de*<OoAx!g6>gJQs4Z*1?(f%V$Fr#(s2_@OvMCC%++?MOO3 zz7$Ko?qO*}b5dKDxoZ5Rz15rrSn=a;go>gKAlhMBd62IS2L3ERu42;JTjpAfbUN;4 z-uK(x0taq0g62QIoRQ6xW_f^gn5me+8v=EycmAutGA2k4YYGhDEz3jMsM_c1SizDR<$x9nhThwC^fQuICg`jxPv z8B=|O3qZJ1Y=;)*59Sd8KK+)Qq1a=ve830?nwj{#vM$V^EzZ*&8-C(5e;~m6CoXO0cmFz zzM|+`DGX|;XY-rA%%48S7JrOKvWbh#nBc3sk(1*kBNtT_of>3hEJyq$aMFAh{Hozc zd4Lp7k4JaU2lew+x)N-2B+&(5cBPVBytVL$(cLwv*W~1$a@oXua%Gomfxv4UwWw)m zfAOrmI7<37ly^U=bgX3jgSF>=7~~UqUdvdi-`Q)5(s2|B_Jx6{w#NplMz$_4EEhpn zomU@&Wjuuc@drBSnYaHVF*7Bxdm^#6E9MU}{kM=n44z~wbM)t;+`;9vLT9hXG*Uh? zJy$Z!UHx&dt4>IfoG2x%?^&SEqKI&qng`p^e_s1yNq8C7oO$Qj1!a#JWSFup5zQ zrjQ@WTYpBYS4MYI3Y_99t$rbo%_{yA+i+3xw!(F|PzLt|5T!q!sG%_H!-z?!z|9?6 zQ?eCewXK~5COrCPSq4=fiNG#F-T=FS6!=sH?Hd#_xHtjWz}wd{fgtdi>)>r+9HA8~ zY9m9~yeCSBko!2)(2t>c2N3IDIDXne`+7{k8XHJm zwUNA;HsaSL8}Z|6KzzpLLR}U|69+SSK>arYt{B=zQW85`W>!Z=NT$U~*N{AMZpK2c zJ9+Ug(v_BPCzVnx625hSg%$abnh)jfnymHOxJr}ugy62iznl?^cCHjgFF4Jq90toX*{zpYGBFNI_96)6pEj7s7) zX`;BH>pDw6%I2z+YF)_B6NmqdmrI&qY#bhHxynAqW&MX7K5 z!7dg^mquKg-E7illxL#E_L=P6P>pxM1WFn6g>OOga%Rq0+Ad5_T1G?O59;@hZNrZ* ziyCykKWa4WU}?R!?DA|qR8>n0-qK~4v}ArDh6>k zLQ>wRD~lW_RMdD=lzUbdmJ}B@MJnx`jxdJNr`W+3%e3VE+?VX#NC4veB!RW1UI7NS zd9D`Lr%}Q;PHPf;7+!E}#q^cw<;B&oem#QQO`WaYbgrzOcL(qXHnFbhNn`uN?J=aR z)d9gfq(0>ltHncH6q$fZ(SQRWCdbe#psIPT}a*0;#DUswa$M>`l^^Ysy+qh)voS zVSCMe46U5ch_Kgqy^#?;d)}hIo_scDK8FN-E7sS=mM|lq#eTWd4piPp5;hNr)JV)& z+;!SyILPPr)AYr-+yeVDO1(OgO9||h_X$1ds6Q}fRL|zRamD6ClagBqf=v(t_I~@N zQwgVbH2s>8pdElzi%=k=nbqAoRgMg46_};gp_8?ByA)GA%2o%3i+4L&)m+R-+3`&B zx{wUe1ReQjxvFa{mzj|GVJ3VR@CbPddifi{0sc0EV{{Z+SUYOGpNq(_JnHA|7Pf(~Qr31XH_Nn6}vc z9lfE$>iX)=(116$FcGEkjqnd*)Yxvi${69@NJPOR)p_yikwOaBOzL_tojhy{KvG(7E!IbH!GVr0=d;D#VH$_;^w0=c-eE?AmQp z_|FsUOk;|4_t$avKJGM?ERFqWetu13)Pe3iWMehr)2;@FSZw53Euk00pFGIJ{a8o# z0%5+{ibkF)wEgl9P%Y%V(tv1o;pEdoA1iJus0ki$j*2&$_&@;m~i`*^IcTAo7kM$qlC$*o#?_B9aIHjq9XxMQ+@Up~Bp!u1AMQ%6MK|uwxx%nv9g!=-`Ng4sCGI z2=DuRmW!)SF{?f!f(SyPaKof%YBOF+sci-EXF+1T+z*CHq846zVmPv7SOHl)?R=MN z8L^v{L~tT+dp!b>pr5lvP$aZ$r8l*;QK$De0@8Y~EBTr35C&81ITbY#id!B>Q6kTl z9Tjm7Lh)Y%23}U$e<>)e+tdSiM@=N@ru2`o%~-=J9p~=%xO$L*R3H7=@7uCmgHpgx z1Xr$OuG&mH8Fk)mt?3<4Y+VVh@x=84xO-`ZB5}aMtvm;3Fs#I}hQ|}f0obiNw_;ur z`!#>&5Qu{!5)TcSKKOO{OX2E1_?dDmaqg$=^h(ja#^EPei|SQX?7=x{plU7%_Aq`& z_isgIqgfJ=d**?BDM!u^fvIe9+H?N*;<=|1J8}QkVt3It5gT?Xq$+L=NM2X+yp8N# z{HJWOf2kc9uKg_$)9}1u=}bO2$BC|WIH=_do_hYN>04Kt{lf$pC@N6(!#ma4-v~XZ%~je0A?!b+6m>w`p;I8zLMiz2$iSp37Mv_o~3(OYnKVUm?%m z?&bgOie|Ni^p@Dc%+tH8@|eS*s(Y<}jQ_{PYqz+l-v}_RpTSdcYOurS>$(28USoQT z8t*s4-y*7P(7#Nz_-`mtU;V3Sjel2D^iRqD(1R1L_bmT6uQ!|jm!0YV4MX`pFA2RT z7SrmY-FH_N|A$8U87`prm`Z7)=1cOP?cIMfAIKMP^Qlw8$r35EQ}OE`ZJd*fdz;B# z1p}^M!6@8|fX2@V+5PPr^WS!8|0@jQo#wzE!Bg3gbD1gb1MzU8KS0#+S9vo;VW!6Y zBq=`g^{vPJ^@+>peVyM3e^gZ^8+I?ZK+F%vs(#<{)jD-Gzu_`){cZXEzk&R(+5|;w zYEfW!BlgtJE{hCUMfH$3nb%4se^jV3VRkXN2yU#iccOXl2pV$kY2?>M?4W<12!W#aU& zDVIgo|A^)>mqN!5i5CwRmKah?BA^GwuU5a%+tX0on zcfI@c`L=*EuVHT~b6;ou4@gt;y4u4@iAmnUBg1y@37k8PIq8Z0-6-#`+h_{toAXpMJ+a?C{Q=gsnakQbxnDFzqK$^q;|J?KBt zPu_R+vvllN9SZ!Cx=M&Iu69ol(dO|2_F$3_J;#H!PKFriP|(u zaHqM@#^TO-x*p1bAWouJjftJ5ZwJIGJ|zH9^gI4eaeqe#+eA0>h7N)4j>fTeZ09Dj zRq|E!pa)!7#U)5_!JfZ18}7v*hKY7Jdb^v_qZeG zyg$9=$o%s@mq&vSG9S?3W-7$-LDss9i6?*~b)#{G>eaNc8YW za?CGJ5L0GVUn*1i=C@2>0zo`zGC0cCwp@+#d9dF;{FM9LkN(rqXw25kd}ZLfHr(b6 zFruDIFR3wRNT^)-gmiy+{zsdrRX_^wnCl#Wx{<}!*o+>0sMBK-coT#9bKL|mOCs?f z-LDa)GV|mDTiS|`Mxf6$bjSqk+z+^(o&GNqgZ|Y?KWniRO_~ml=nqC8nl`9H;3X@O zOp&qg{zw?C{{6zKI<^%J$=-YXjQxk7ALN5W*XoRDpcXcn1Uh(?zI6JabN*|jHH*}UCEyb#w(HPu0%mbV{-u6mCgI*u6$c|;91fi{^}auLE~7h z_glZAc^l(&v*ujlt~<6Zi1Hdz{n3;zgFC@T1swY~A2(o4jyNnFs@X~%Vo|5VN$viybDLhb_{9$eb*!Vk;Z zMs(0>bcRokO*U_ag?+iy{4=1a6NVm{R%EU1$uB9=CJDL(QO352>xoCeF5+l6AVs3D z{{{ZPo{(}A20^W{KpZ07mAXW#!9 L|Gxsu@5TQC+YR2f literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/images/input.bg.gif b/booking-faces/src/main/webapp/images/input.bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ebf87e3108dbbec8565935bb1fa42ebac04d0a3 GIT binary patch literal 122 zcmZ?wbhEHbWMzKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}000i!NklAB^yhYjIo0qgA=Pm z_=vMp2XM-Eip!8vN@izm|0z37Tu%s-Y!m9;AB8}=&9G#EOeU~9gXwf9P=>6Rusa09 zR6qD^2y*Jwv5SeZjBK!ES+eexbniW9e;jjB#u5$rvLTZ%Ub~ezp6bd@aEIKA06r3 z<*}7}tYumSkF}hwL6XNpQZOV1*>fP;v+k+aCQdyAf=Or6G3YyZdF!)9s|DUXX@#kp zKU=hVUF9Z*?1vYB@#=H$r%!bn(YE%(i@!M6|4BNU4x?*D$xFw(_m?>q^@J|0FKM?H+M0@^e$-l8xttj14<*ex#{KGd|ITkVOdP0}V9E%)+i#-dx zIm?wyl#mz{c=JRkvzK+1n*80p3B0+=S<^FoNm61SYq`VdV$V~tOe6b5rZb&7(z(lH zEla1;#0uG{xyM@03{;l;$L!2h9j>d~^p3Bg%&};q{oy8^qQmI=$8WB|V=HI0)c_Uc z*u?QX*788KJ1hp*J@r~x4EhKE5Eg?gN?)3ET6bi+$5#H~#edG&vn-jOE`eyb$CfQQ zw5<(9d)_<*k`0S--(XLn(0OJ@@ERl$K7rg&UJX^<^PR)A&kH?^YssU6kD#TuqbcF zyX77o9L)k+T&7<*mrp75v%e%C=vYp--DuMPZKBC@aMdDVrB@glQC)WY-{-^!I$XXp zr=T!*3g66rD9G^25I_Lg!=sMoPrhraUSQ}A%5!osLhz404^}br3v83(NGYZ4m)weT zC;$*Z2mt^PQ3xSqukaB@bABP;JE&Mq$Sk0b&&J0j^5Dj@=UMVH(7c5pA(RqI2_-6} z6i{*tO#~qX2t$YN3q;T(o?lv&zUD#MIDOVlW|(=rPST84{^jOd1PD;(a60Q7Osk z5ato!0K%DoW`$eO&?n-ecQlYLVA&$gS=2L)bQp)o3ysGN7a? zT$ty5e*T)9@lM}g{?lnIDXdt63)wL`wui0{7W4pgiE8Kf*TTC3Ck>y#9wufm_jOmI=08y!3@A!`E zDIF#XiI@#myU``eV5CRIWhWkqGMR|f<0jeJJlu|;7LR5ENPVbG8 zXez1l5Mf9ugft7?jEbXfM{!eK%QQZxVP&)1QEV~Vb{u+Rd*eRltYT86wSA8UdaZX& zMNyU8QQX?Thgpwyf7_M=8(H~_)%BW&Hr2IMc)acYwwO5DRM+Bm6axU-{cSrAy%Ccl z>7-d(UC+kq3iw;w_e@Hli77ZuHz}dHdL2eGQR4`3QZjXQ_)i2V6u@y015rXr4adVy zbH1V|5JDZt%c{y@*<#Smv6{j|5~rt>r<77g^*f;X@!5k-buA4mn;TX(xBJ^Pb~A7* zJl+GFPq31%fdA)pEn5z3j7gDN@0zB%7KX)+!>^xw`zwo(!|E(8uW9~Z{qCO~j)|iO zHlL{Qcv(5ym8QBDZRmD?+mGH}Y7ug_H}0$Tu5mkxHBZHAZaJ{A`GfVf-ZgLigs$|4x}Pa}(Iym}yZSqYBoW{!Au72Y zv|)&NgfYSxVY^vS2dJtLq9Q~9#q`cOq}Efr_a58El%m$VhQZpfvibbZp{BZ)u7H2p z=7NvU9%Pkw9DbeEZ1=albNF=tz}o71x1;!lUp~oJ=ynt{ZEg3rMWsmN&Q<9vZ#}hp z+2(=^-9Cmd>oz7uSXUJuFWZs|kGH9=;N0D!8J+lO%q z3_OC6VnnZxUh4>U0Dwe!M3SQrK#U;5R50iqW}A-3Jcl`q1RXEvbqFE|kjvj~ct*)=|c$b#fG^}jC*zLQ}?PCg?;gndp+fiKM@eYLgqT*k}^mp8`RWd2x&J|Ih5U3LM>yiGD6u}VbIibS2+-`M6 zBGQ#F6>$`qK<;QP*?Bd1=;UW#^j<&n#g$86^%DvZ0*RDD*#!^R!%)@o8oM{1(D9mQP%|BQsC z>8jlo@NYS=u`A$js%tsFbLhb46Ca;FIK8>lL>x!?h}U^+a@q7&J`QR@d)&`OrY9Z_9y=8KL7Gv$41d)x^@T$^Bd0fUIss!IVGcqBeJ45|p*zbgWqaek3Xk_k zZ!gVo_wASer^4f9u5X&=;o;cu&}iNq8$y6`5cBZrNFSwhQ%YDeNoGTiqJ;E1y2^WZ$O+5Ar7MKz0e~lOUrAfi4(F3!fpUjkRXJV0t%=?l$aR35vEsy(v7iUoxte?JWg;7Ap&=i zEq>I5C1NZ>P6lvmtLwW0{%l;+&B2I0&r;yZMTh}_0RT4=!J)n(r@1iKm=tuQ7L(qf z;}R)#G%m)*U}#hwj1B?}^d_D+AYP9-J;vWu%$Y%RDu4Zer1jM9x7NSAy>Z{(W7`<1 zYrSh4YJVP+BH0`6!GW;FW;7c02x|!qs9-WE_6H(FRVYyjRRIMQ0thic7;ysPbO`G( zyBES7L>Ok=T;7)#O3xu_e)%D!KGV~2Ed0Ef-B~DI3gjsGHiODof$^qrUqpZ@KY(sGw)UjE(Rr^89_)4!EIeFmlf>zkOvE{}cu zBMt;8g_Ke>`L`b6+wrZ(UrXeaa_!0xA;jfzjHl^TiZBA00{YFHatI)Rgb)ZJL?H7k xB|s5Ex4$iZY$chLuXJ6%(slj*yMhq@{{UhLYPTH~7d-#~002ovPDHLkV1l^6h*$ss literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/images/springone2gx.jpeg b/booking-faces/src/main/webapp/images/springone2gx.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b43bcb2868a599695283608392169f713bcc1097 GIT binary patch literal 1643 zcmb7=dpOg39LIm#uvrtEOS0I-<~lUDt?A}|8DSemBr4^W9H}Jb7P;Ss3S~*pndX$m zNU1!fWw}d6qL7t3qN{|R)p>e)&Y$P~`RDU}UeD+Ce7+y4So#7`adUEY0ze=D0LcoF zJ_GClMFl7fs-Osi!r*YlRZ1GlN(h7!T1{O=1FMb4W3@3Df`KK8phwonU`#fdkgX^* z8co-Di^CSGz2ycP<%a|Whr^W+N?OXwS`;FNNcrE9-UE;@KnIA1fbakq34$O&(g%PR z06;*p0KX#-Rgi;$Wz13q071YIIYl`z81j>YWG{Inpny`vk-ecBYit?8#q2&cd`xl( zN8OxRI47IZ1pP4n*2y}VMNUSHkv}^*dHG)y1b`t(lpKy+sA}u|k`c_Q?=!cHNp6#l z00@W-A|Xg%3s5%{k<;(*MU?N&y_B8ZpI$iOH;c~AP~9`Ch+52WM`{&ZZZt}Gf%%fV z_A+I0Brs@9{qTKeVi%jmOLI#c3S6;;_a-j@kb?>+mrB^SImo{ zecNOA8eW2T@f2-N=e>&w_!i)C0P0C%(?3@E?;2h^Ke%i#u4%J(zi|7f$rF1vR@B(W zvs!jWv&wla!!Eb5L5)Gofd=&h__nQRWI}mBjL?Td>YWHRa)1rg>Qx)j2!^%-L8Sb8 zU*=cBjDBL%4luQ1^V)gs{^l#oe2dAei{5wEA9>W1ckPYS!o#q5|0IEb%KZ{cA0HQw zt<*;AD{4n<7}+}v4mK-DzUHMCfB4P_XC2+eHLU}Kr);o>4Z;y3&JkyAgbhc}n(awV zKjD0M7jx|A;?!S@SD)B}^RMf!eo7eNa{ipdHT$`Th*%lmqo`Z?%~vz^FVG^?;E3(1 z{pgC`664VHNkfg0zXg1l*UkDvd7H#jsz`cfkNexDZ;s0vPNy!O zQ$pkhP3bW6sUv}B?lGf?#s=`fuC8|;8KAT$0nO)bW{Ox%k6riC>Df_42X^@mWs6+C z?`Fa6sq9KGS}im(XJKZA9i5~7>mscyIoy|UB^KfI9Gt;mD8I$fUyIJBtIbG6cBmA7 z&1;BDYfmNbP}+Q@PU1=RPK#XUYjL%Y0}UOyB8S6ne(|9lA+ceR*E)=ypPj-}Cd$AO z7L!o1-Vnctvkzx~M)%?hx?VE*+^osdoPiz0{>M5@6-h;w|dwzB_=ewKtBL zR+R$A5wz06rJ}!PeI=QnEy%YV5H(qw$SrAJj8UPc@37o>ycUmT_8{lD|6Xgo8~h@% zzgf)fl;Te0Z45choS(LTi0eu04)WG+f-Q?r9UD$}qMm(iyUcvpuz32rnb@PN-t*5)+X@L;JT6I)38!Z{lysOHEwUTKT9@wh z<=e&S=~FMXYto8UD?CGTT!N<*IH@Nez1aBCD{Mn@2d8f{!jLu^6IF()@_XuvBN(6q z#vU%1kL^B^M2N&+|8Q}DyG=a+l=v)PNec9~OSt3>555?*Jvm!3k)XC)Gaf>ZR9pJu zQSUMYg@&qyjeaC{KH`h&h+to=v;9hS4YWg4DL!VItN%|G>) zErVri&0;lJtZQ2~(=WTl2HSyc+IOvXhjqtcb?j|B_Uz8RZ6{pUw#)5sxt*?khil(? zaNs^TbRT(+Jf1@j+~Xs!*ZbRd;Qfv7@_+yI1u))-jEbVds-mapS7lYD=={-tSsEb&6cY3wQxdWEmJ%1}~&(u`9A&pLXVOyy4FF6^VRB7UrtwZyl zNoA_Oe2@^@(H5_0##BOg<`bSwzC~Rx?rrOOI9`qTL<@Ulydt zocM4iq4>&c#YA98~p`Vy6{+Rb9~<808}_8?Ohn6#~F00FSXOgO7|y*Mkf^r z9$_*FAyKgwa&GPIK$IW`i$hat{ewbDsRcNk@J&E)WLSJ!H?Gz{06+p^fB*mx2q5_n DQ1KmG literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/images/tse.gif b/booking-faces/src/main/webapp/images/tse.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1fa98cf57617b6c613572f4db3e70518f5ed0c9 GIT binary patch literal 2814 zcmd^L0fB*m3Zp-^1CdR3`Z zUb}X!va+(Os;auWx~8T^rBYqLe*MOc8@08y_4V})4GlMM-fV1aY-(z{b?esc+qavW zn_F61?%cU^_wL<$_wL=lfB(UQ2M-@U)MzxVt*vcsZCb6iy}iAoqvMZ1{^;!N?CR?3 z?(XjC>FMq5?d$7%^ypE4fB)mhj|T<@1_uY9Jb5xSG&DRsJTfveIyyQwHumSAe?EQs z^sm4EdiLzu-+%u-K0ZD%F)=wg`TY6wsi~^)u&}te`2PL-rKP10A3l8i`0>-HPs_{8pFe;8=bwMReEG7nvhwxo z*VWb4Z~w>OR?T66baF!R61xpo4ZEeqLvsYIby+jOVVcqgMPa{iTRG~qjvU8`u&o3{#47kyhv8l(XT9_3N*)Yv57Bh_tH^=R1ChG8EWCxAhk9e% z6J|+bs-aG5QEdbd&E3P2>`ET%`Z3RXwTO#?qiOB!S$TwCT1lpoI*EbdPB)k7qJ_7Y{h=p6mA zK)&hR;dUvQVlTOJpC;wFfcib2Xo{%oZ`(T3e5rY0qT4=)P{{%|(*{Q-UIk>)e3C8y zM^BPzLS04h5&Sr~FdR#+@4Q(UGgPR*g^e0BKJR6ZjH-q!GS?D#bW2of9eMJr)!O#eZS~#v|5XHNU$7XcQ$B;vkjtzx_ zX|8^fB{gK-IxD_xwezQJZ=L;SLN30ZdY47VGfI%y#^l*ZM#Mqxg2rZ>!R+oe2L}h? zcXNJCxg;W#a=O;D>gsG5NDAi%kn#Swu4_KFZr~b26;3x&35n$!vE=3?2DkCU5c5{w z=>fcdL7mnhl)28zG-)JJUo|(#rg?I%xi-ho9emDY8IQ>2J(~5>r4PTUaW;6x!*r(oJc9w5K%K2X;+qIR z1=#C>T;Q-(i&)}Dm?^|sEFl9$vZ9);IBV^fD#}gF1n6%pB+k=J4t1#9!FLi1ZQ>++ zu9#%WhvD25IFkel1`8=&flXQ{kpQ?NeyxpSQEeof$YSQIH{5aB$QPMyH%`Su$JlKx zbo#kdAU)?anZQf!Xr4mRpaHW2jas|r2MUpsPbXP-%TY0lJfrh~z)=i8=gt+{0#Jx) zG9Rx}7Xk!aI&wv4%>F*i3TVSdJ2QM~=ak6PJIf`a+d#I8ZG-5?^35n<3l?-jVm4~w6QjyqvwN7i@;?u9EHi3B>ks%-p7lesBaU6!G<=b*_Bw+!hBU zWP@tB2k{JN-p{01$JT*26MB?MV}Q{iks)(XjM-5Kw$pa4z4u^R^F(BijDmD3gSPbVtZeUNTti}RdqYnvt*m#{5o)9ZEkNV&y91-iZ;0HTQb`_QyH z_Cq^D8**+K?8B|bLU)wL*y*hixqY2I4~|ic2_fN35kQfJ^U@ zk!pFkAG?Zuy~MsfJj1zt3yq6*;u{JeLtrPBcgz`BF3WWI;Pb+Z{SpWPu)Vkpw2#x9)?loG{AA;Q);kG}*=j>UHpvJ#!V&Fm zw(6R4X6dogvCMI&j{CmQQ?U!cEL~7iKZ!aZ + + + + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/icons/cross.png b/booking-faces/src/main/webapp/styles/blueprint/icons/cross.png new file mode 100755 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 zcmV;A0&x9_P)uEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#4^nI0$7`a(T+P4hBKZ7hk58-_j0w;$<(*=f7ic$nT z*Wgd55in08>183j3?S=MAoDDTLoLSL$!_UDxXqSf-?qdd@H%8(We~hQu&uVIo$6NV z(zMY7wn6r5i617ZGZ)-J($xXssTcN*&WujcIDRIp6J4_PqOvJ}9!p6+yo8LmAGS3~ xN#Qq?aIt$6X#&>gHs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1pbody p code {*white-space:normal;} +hr {margin:-8px auto 11px;} +img {-ms-interpolation-mode:bicubic;} +.clearfix, .container {display:inline-block;} +* html .clearfix, * html .container {height:1%;} +fieldset {padding-top:0;} +textarea {overflow:auto;} +input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} +input.text:focus, input.title:focus {border-color:#666;} +input.text, input.title, textarea, select {margin:0.5em 0;} +input.checkbox, input.radio {position:relative;top:.25em;} +form.inline div, form.inline p {vertical-align:middle;} +form.inline label {position:relative;top:-0.25em;} +form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} +button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/icons/cross.png b/booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/icons/cross.png new file mode 100755 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 zcmV;A0&x9_P)uEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#4^nI0$7`a(T+P4hBKZ7hk58-_j0w;$<(*=f7ic$nT z*Wgd55in08>183j3?S=MAoDDTLoLSL$!_UDxXqSf-?qdd@H%8(We~hQu&uVIo$6NV z(zMY7wn6r5i617ZGZ)-J($xXssTcN*&WujcIDRIp6J4_PqOvJ}9!p6+yo8LmAGS3~ xN#Qq?aIt$6X#&>gHs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1p and + + + Change Password + + + + Cancel + diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/screen.css b/booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/screen.css new file mode 100755 index 0000000..bb66b21 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/plugins/buttons/screen.css @@ -0,0 +1,97 @@ +/* -------------------------------------------------------------- + + buttons.css + * Gives you some great CSS-only buttons. + + Created by Kevin Hale [particletree.com] + * particletree.com/features/rediscovering-the-button-element + + See Readme.txt in this folder for instructions. + +-------------------------------------------------------------- */ + +a.button, button { + display:block; + float:left; + margin: 0.7em 0.5em 0.7em 0; + padding:5px 10px 5px 7px; /* Links */ + + border:1px solid #dedede; + border-top:1px solid #eee; + border-left:1px solid #eee; + + background-color:#f5f5f5; + font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; + font-size:100%; + line-height:130%; + text-decoration:none; + font-weight:bold; + color:#565656; + cursor:pointer; +} +button { + width:auto; + overflow:visible; + padding:4px 10px 3px 7px; /* IE6 */ +} +button[type] { + padding:4px 10px 4px 7px; /* Firefox */ + line-height:17px; /* Safari */ +} +*:first-child+html button[type] { + padding:4px 10px 3px 7px; /* IE7 */ +} +button img, a.button img{ + margin:0 3px -3px 0 !important; + padding:0; + border:none; + width:16px; + height:16px; + float:none; +} + + +/* Button colors +-------------------------------------------------------------- */ + +/* Standard */ +button:hover, a.button:hover{ + background-color:#dff4ff; + border:1px solid #c2e1ef; + color:#336699; +} +a.button:active{ + background-color:#6299c5; + border:1px solid #6299c5; + color:#fff; +} + +/* Positive */ +body .positive { + color:#529214; +} +a.positive:hover, button.positive:hover { + background-color:#E6EFC2; + border:1px solid #C6D880; + color:#529214; +} +a.positive:active { + background-color:#529214; + border:1px solid #529214; + color:#fff; +} + +/* Negative */ +body .negative { + color:#d12f19; +} +a.negative:hover, button.negative:hover { + background-color:#fbe3e4; + border:1px solid #fbc2c4; + color:#d12f19; +} +a.negative:active { + background-color:#d12f19; + border:1px solid #d12f19; + color:#fff; +} diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt b/booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt new file mode 100755 index 0000000..85f2491 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt @@ -0,0 +1,14 @@ +Fancy Type + +* Gives you classes to use if you'd like some + extra fancy typography. + +Credits and instructions are specified above each class +in the fancy-type.css file in this directory. + + +Usage +---------------------------------------------------------------- + +1) Add this plugin to lib/settings.yml. + See compress.rb for instructions. diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css b/booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css new file mode 100755 index 0000000..028e05b --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css @@ -0,0 +1,71 @@ +/* -------------------------------------------------------------- + + fancy-type.css + * Lots of pretty advanced classes for manipulating text. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Indentation instead of line shifts for sibling paragraphs. */ + p + p { text-indent:2em; margin-top:-1.5em; } + form p + p { text-indent: 0; } /* Don't want this in forms. */ + + +/* For great looking type, use this code instead of asdf: + asdf + Best used on prepositions and ampersands. */ + +.alt { + color: #666; + font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif; + font-style: italic; + font-weight: normal; +} + + +/* For great looking quote marks in titles, replace "asdf" with: + asdf” + (That is, when the title starts with a quote mark). + (You may have to change this value depending on your font size). */ + +.dquo { margin-left: -.5em; } + + +/* Reduced size type with incremental leading + (http://www.markboulton.co.uk/journal/comments/incremental_leading/) + + This could be used for side notes. For smaller type, you don't necessarily want to + follow the 1.5x vertical rhythm -- the line-height is too much. + + Using this class, it reduces your font size and line-height so that for + every four lines of normal sized type, there is five lines of the sidenote. eg: + + New type size in em's: + 10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems) + + New line-height value: + 12px x 1.5 = 18px (old line-height) + 18px x 4 = 72px + 72px / 5 = 14.4px (new line height) + 14.4px / 10px = 1.44 (new line height in em's) */ + +p.incr, .incr p { + font-size: 10px; + line-height: 1.44em; + margin-bottom: 1.5em; +} + + +/* Surround uppercase words and abbreviations with this class. + Based on work by Jørgen Arnor GĂĽrdsø Lom [http://twistedintellect.com/] */ + +.caps { + font-variant: small-caps; + letter-spacing: 1px; + text-transform: lowercase; + font-size:1.2em; + line-height:1%; + font-weight:bold; + padding:0 2px; +} diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/doc.png b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/doc.png new file mode 100755 index 0000000000000000000000000000000000000000..834cdfaf48a509ca51d93250fb28dd12e5ea0a13 GIT binary patch literal 777 zcmV+k1NQuhP)XPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTNAz`{eoOom?Tf*9)f$7n8&|1&5M4#i^32;+&E? zC3Q;bRFQN#y*%%=_V)Mfa<$xe^kB0TO;vJPkN*k(2v-CI7)OaWj?&eKPos(H4wGh_ zIC;6#q1B5SMap5{(Hc0~XO7OfqZ=x{kupu8-H&9azl`L1pTuu^Znm3EA)kCoG=JuwsyNLEtY83i->Z~j3y~F)`RA1k>zTES07po!kBVS2y#L{jCt|CMY&v{ zxmqM|`OA#P2{R&)OcQd}v0kt6_Dh#`Z$i5_;q|93je3Q^PcfR{TmBHRmr;rWahz~G z2x-&;d_O~HkmKXt5Cd#Bs?-+qj3zOiUdU24KowBIUPg(gPNmxqX)Fiia~V*$y;5L( zrGNmU;81MA$F2k%oeUXQ@}N%bXz=qOij$4IYk4W=jfhDxfCz{PGXe-#ge#VfYTyoj zh4JvDePrW{lf(Oux2xG;VZmlSvDU+Qf@i=O!B`MLglhttCUHDIKkc7SE*sqBsxVsZ1NU-2;A-D&3cXziC+}$BK1b5fq?(R0opaTpr$dd27cfZ~J zW9!zvw`yy<=JeZh`t3e%pL4pWrk?&qC@DyyA`u}$K|!HPOMUwEdbe{=btHuOd8 z`A|^Yqjol`D(|E5)A3jzN@S+tk7d&7{_JB$b|h|-!+R$1nV5TvOk6n`M+HmlM{_nl z3kJ2VJkGjKYKm#&!?vQD8~2PQhX~Xj6Dzfj{NCD&+MUMY;$rW0)cxf7c;D4tGp7$P zPj_pR`DS0PDvG~QQ2$MiRhN2R4*343j>~-}ZcQv-UzOQ3TAYL`+I?7`9qicd>PMhG zc`q)^Q^uW7SJt{a`77`|R%nw*XK3XrhFfAgo#=9RKE#QapN}_G5Z!3nXT^k2xOWSA zADw5+^_ByeH*7Z=Ytd`wwYAuJV(iB2qO(p`J)urXrstAwT(dghQCEg)Pyv|a# z!oQ2ZaybX?3r9O`KGE?I8AM#?0mAa#Y55Ge$F3|&in%A5xC^S2oEtMK)~X*>x>)ON zaOKxtv*oCSMKaqq=GSWN8nTXuOaz?9v${v?t$3qu2LvjnDR~dkuCQx;HeVuTZAcAS zrHWk*a{Acn%dyqhZDW!d5i?$!VQy$*U3dLLz-11{<)37eM*Mq`|uTZW{}hbDo^Nd z^XP_t#o!#$#^AlqFw3e#SHTMxYN1{1EQM_krQ2EG7I^%$aS}%~? ziB~d<3zybnmq&1RZ(y~YN5Teh#wh=X^_MkD{#p)4xmcy(>$r7d7o|SmuQ_)6XyLcS z+yq?kstrmBQShkAS1%NrF3H?qRt&#RUu!3Wdog-dgDSp&BFY( z@kh;-R#CpBi5{|*>2lpP0M&hu!{qawkZtK;j$qNug}_k!;U7#kCxZ)TnoD$`21iLZ zCj^@j8$-;Y||(i^Ob~y zd0Tr6jnmsWLo+zlMX)i=lJbu%FooR-5KY!`u@DnW{rom*d;fvj*vHIc|Kg164 z3C*OWh4bTIi{5%m1}(S>fzJ1Q@w`8AW{Fy^`rAXSQ@aR293(8H& zYGik;yzWJcrq;5p9!xlB*8+@bdCd2s0Qf$p2bG%5F@L7q`96*iyf4F3BYAPizZM`D zjeJF<@&4-8#0;$vl6jg&$`IUsY}>gTAn8OgHl4&Ys6U#tf)+Rw;Wti?HIHn^JGoW2 z%cT9%V9c{lNtZ-2ckuTj{%p^zEa{6oWk3*#O}(gjWdpm1!0f8Lo&_y`9{11=6K=<| z(q^32F*qtmaf*6&ps^fL9Wa{%VAW>-VF+1G=Mc zo~-?1)LU`{$PB|}Xf1Q!(cs7J*;+z?eax${dpvSMqL3Y9X?;g~l(0auOk+8Nhvcxq z@3o2psZ0*u%PVZdbtO9l%iIh76rZI^vNrhgj`B~)!cxKu_t{CxUCXFR5L=*kKWF3i zPv^#M7h(u!N8dllDK(Q`HHvi#So36NLetL-|sn8G5+A}HYPDg2%p=Tob@VshGSXXgX9cUT|JF#_c_zmlLf%` z+sa-D0%zu{5D}vdCua}_I|cvDe_Droa1;cuFM3axwF~a^d2ktc1{pBXIK?v=2t04BNvW~i>WdIbx@&Q!Ue-GQ%{bW7qz`gJIB>&InG7kXkdHwzRZ zYY}hzb_25@Aj`v3W@6W$wC8CB@m%{#!Ni82hw*JiiaRXglN6t?ackf>&lWNCRM37V z1!=VUq}kV{ebp0O!?E_}imbJ21=dNn41xaN!}$Fx8wDySN~5aPQ-1*k9tmu+@*L@|?D`hu8XBj=4?E1|4$Wky%ECiD?VeZ~c+1Gm8JTIYf zb*5{-`dS_e!sr~vbd6SsVEieO`=JviaIxtCzC?xnbb`BI5f-H@o03N`+VN-p0W@!9 zj|EjpQ{SUA-bd3VU!PqYyIRi0J3Skw_?-TGo5+}H9mWQP5$nf7VkFb5M;diG$}i1E zqJef{OShz-%M3~UGNn#bMJv)!VRRl#G5eizR9J*SUxvs)>ZxRrnAb+m-v!Xy0r~P> zMFaH(*JLjfJDZR%hc{BtX%ZPp zm`bY51;X(xt3v(#zeyuq-QkqE7%ZerD?da-Se!=^^U+al7t-~r@nPS5&|YPckRXj^ z0Boi)NwPuCIsOF0$fzK*hQmeMDxAGgow{#0QnF*e;}6|EUHf;>{C-mtUYX)+O+q#b zqXz>lp_s*!vaSuCMHN922Uf453FD+lq`3E-^t=_lU*eUJE}lgdPlly;%4p!lRa8eD zES-%l(Q>%L(P7Sn$Tf_ywKg<~EPp(EE}gsC+jra`Z3LRK76opEG=8W5M3_AT3+qpH zl3jeU%XY#h(mpZgmciu?Mr^$JEf$6XXS+?oFjbfCc34MJfnjhJRR>cnbCcV!Ab9x4 zwBd`W6UNdp@4_%Txd`iSwj-0E;;stM_nSvK1gsW^XC!L|GL2b5PsH9lU|ke>A0Svr zD5!Xxtj>6DT5ioOLht#Jq4kpUg8kB;wBq3N0Q2+7*a-r(;%NKtl?w~&o-ZxXk}T!# zmveS@N#Dqpu@^tM|21w0HS#c{9i7{$Rs^O_PPj;KAQ?_hDjTLgRl{PUoDDNl9QZ_$ zso)h&AO-!s?vl~OfOoV_&e{HR8=GH(^iF2y3`0=b9RA&K_94%a0?=A3MJg(s9~rEyHELQ$cJg((m1VMW(gSawxkK^v8(O5$@B+uSJ@ zWfBHDMT#XvYwX^6&YI1Nlfeo%VabHK%CB4fj_NuKm@RO0GfV2k1rB$vw`J98{-TAK zaOlT8&LzJefJ6%pc0`?5TRB^(Iy^XF=Y34cjvTRKAlWc7Fq-c80e>({<|aaRPEXr_ zn6z4ys6|+DABlxpidcbX_n(2N&{SEy2NHbl&moKb^nfmQskG&hT33^O07KLENxkk| zDW+s-$2i}$$5g+zCmTmGe7q0^5TDx>!BtmtRfX!bbb7kvC`}J1mDE5jqJWqD ze5_9hEs5lYUa9HF?o^HR_B^ZOe}4}!)*(WDB~UZAUCT`yQci+$ANFWoU}rCP?BmvM zIYK{SHRFyvvLP%wYz%yxCm3kD=8h2^YN}&zo+BvAbw!|r%aFU)K!$ljn(X}0I=g6) zMkJ7c;3&s+ovD8I$4@@0%!*HbkuVB_Q@-Pna}ML9a6#_r$cciTX|{Da=U6cYvEGXt z{Xk(nzR=ACjBow914xzP1OlCUGxbZBCFs!XQ^Xst37($%rd9dkXfb@24%m&pPo?@p zdhTOTePd0G%4=^#3n=Wuef-wCsxcvT$*k+I+mfKG1yvKZne|x`s|1!wh3?Ej$5i`W zm?(B^?a`y77U_?I>4n^2i<6ZAEp9FRPRc)cLvsZWYrZck`?RClhx0uG%Ua*BJbKpK z+BPp`K$$8(Pr}(UoT#@$d$?~$q*+3-VZ|wv%7$2gZ(ATnXPuCz8b5QA@r-&Fs28@ z7Wrd&SNWBtKtY<9rQ;E}=O#mR|E$4_cHE{}0>Xd-t0RwR^uN)hk4k(uxJ)>0TwB*B zJ^e(3vHpytOo?gLn$&CprA76$7}Mv_eB#}Q}1+vG>o#sRHVXFMGly!n$d2&mzL_znIFz4d57=k^!g^xISho=+dO z(<@%KgG^5>CY>f3R=KGGMZEtagFpd;uCw*rq5+={uZxt;Uz!D^&5R$DxWN0zzn7x2 z(aZ@(H(S>0NkpvFdatC^tX!{Qch3G7f@MsxaYCO7^5uVYl)SQ2Pj)Dr=S>f;$@m|r z{TcdWVIN}g=S5ra<_#LF=i5sMbqGCSBm;AdO6&0FV`d+Td57Ogd6%jblx?VjA!DuIl#iLI~LLe^%Oz0mTgs zW4O5d8o=kz4Gj`WJtGtR6~+KmL%s#3*Y_qhVAl8=+=kO>VLMHfDc_P zAR@y9SJDASQsbZ1Ajt_UteEJCY~T)V_z%l4#f;E3ys%f=#@_9FP~kcJjyR`1)YDfHQPDYt_;#HUq)pn*_kr8mp~yYht@t`d3T8(u68Fe($%!si;b-YsSE!&h8CS*Qc?CI*$kW^_ zlvcIJJ=d!00WZ8#o5}w6(5>(n{H11E-F4HBLhk}}6wJvxgy0?@Mh&xiR|8eS`#`2MQG{_I-1>VCg_R^BqoKJC6`( zha0K{m`9dR3Wrwx%rSO+>0w8p%=)APH^u2oWm({SSo?!ry{Inefo-?sNx!Px4X&CVVKd;=5 zAM0N3tUJM_U3R4((NYSvC^mYrU>44L@S+eG`S5yR77!*?|POTyu^s&SUzGTm}O3US5zplvhc zdn&k|K7+d_^{FLA6%#70s<^4K?WbG*;wB*ov-R2G*|5$VWAU8>>UAur5z~nX<}{=I zNpSY}*UMPNCaHtA^+E!oQApV}i6Es(a94zq0YC0=S?D#$_0FeKlnP?6*r++tGyj(W z>r}8Z#t;A)qUaih80d*E(i*+>wSFSM zoCp3!4clT|b6 z%Z{|JjtN^2yv88FU+y!#$7q&e20J5nVf1G-I;z1B(w{CY-C#4xV~z;q>IdlJ?zD~l zqBLgr6OV=Wua&Mpq>^4x0Q*yf_fSL-rB|q7v%F&^sbtAz(#&hk^2#JY{EuwmsZka z7u$+JTzcegTg8tFM5}1u@rzZ0{g{Zz3#nngZ5be5tTGuSG8R?%%iiID@wDS-X&tf5Lvq$sj5AO8p?uqQ&>I6Oz5c8R<6O zSz$ikgtPQwaoTpG2&#`dcqCY`rtRUPd8Z{HMN4hm}ha#l6%mXg@#)2(%KbCVod}l zoK2~On!ix+?%7nPoG&(4|Ma>ma~N*f8U^%i2xPr3d*-S~c^gp~*@>%fw_hnb+&xiW zreuLJ!eVLzQ30VI05l8;=FIaqwx+<-&t})rj>~Gz+ z$PUP9a+Zz&XV2)8PJM}b?U7Y?pj}hZ-YzNPr7=5>rJp)VQs6ap^Skia-zKV(#L56z z+LW5sIWcx-zUD2Rw))*3mvK9iJE;m;`IQQS*jX0uK33$O^*Ge3gYux5E3{eGGmCSZfgbQtYrgF4&urMaH6ZLe6{f$nJP&t0g&UgnirW$^=_ z*=B5R)S!zY8e#)FF8X#t*rE$pP?%a*g=VYqZVx#!w@bs-7xf<{bywVhH=n)ku#fYM z7c)DnCXV@khqFbwJ_y{bB(g!TBH3eWx^ywL?lbAVYWhTJUMo&YA^1o}Nd%==%>Hm) zK)1>8H;*z`&LO$+Q{WqSY@EE`p8QhS_|ZtU(cvvDr1lUvAzgP-gtg2l_` z?4+GfjfWHQ2cegVc3_sYaD%;Y@-1wnUw1^VBBli2&+kS1jBeAvUHG~~&SKZ_HGv-G z1Y`yqYgcxzPBxS6!Dysx1hsx)l{~}7Tzn4O8}-E7u%KWleS*t;UKV?MgS*}I5?=m; zL(2zbU36_$zMtyRv3&R~F@}3^zj}{5JJOLS@24T$Et~t8Tt+pLDHq@!9nzhUzr4SJ zlD+F?UMelD!LW)~jY7Gh+{bYWE02MRoa^UcP1Yh~k2qY?FQJZ6^dzf&*l1UwN5In8 zY5W#W#xUR+J;M{iu_zcJDlgPC8valS!q-3k!eNVj+$EIn_jAqZD{!}Y>k1_bjlo+i zacb*|KyiJWxL`y{vxU*A}g}onO(q+gFyF4Y1Tcu5uXnao&}^VsFIl0cmB0&~~;zc$!5o8e}h| ziJSBDt^aPpp@K<{|F}K$C??NA?au^FbM~GS>|RcWo}uuo{r;gf>81iN=A; zHI#~3?*h=%Ve^4^Wy-^1d>5W^%=5gI3BbEr*vtLTVEvu@7qTrIE+4NCcK)MinUh#x z_Qw~;=aJm?sK*V)AN&!UvlDK^h5Nyde;=*Vmg;LMyX!;RbEmy?r}^~Rw=R9RbLlQd z2$d!XG3JFZIvu$W?fw`&5)nD24LYJ*&Y?=bFezuH=gKR#sl(HZv)dRPVGRT*F_4-W zrg#tY zr8VUQ{oJK!hc@bL44S3nJcY0?pxqJNmsy!!7yMhItOt<}w5wS4+zn#Ap=&Uh{jrTx`ov^Uynd1Z4eH-Oee&kFpk1Qfn?{e(#uktK{;5V@8;{u9#PfX< z4$E_s72xFBUq3!eDfNn&Zgd0J0us6?2+zS#qfnU{?X%gI5U!+a+xCLe>R8!pud`5y zhnb^e57|5g{!u_HHqT6y+#}l+_=?Loi@y{svoTG5W~6A3VZKm804NCtj}>gwLn^bc zyZygP^v1u2DDcTp2>& zB?0U%*3@~EHe*$-8(nNHQUD&(-b?RqHeUmVh9w45b9kPG> zJqp{RbdR7ar>23Ud|4*O}9p&iR(LH zO}{1c!YZl4C_(2C?&d3Ho&N~lOiZ2pFWM&u7eg3qo+Z|REH|NF=`KFo?=hB+ZekU1 zwX!G>Ph!VixLHo8#T1()I7Rd@i%|odQ9Pr3Cw*D}LHgiQ#wGkyHzUzsYUw%bgHXkL zeS7;R0Az;n35Jy&UXD0xORmVjdD;rIGT_CIsoK8!_OosjuIk|3;_QYBr|9$l#^5wx z=!~OSP5(-lC4@fHh-XULz-MRWuwZ{ATE{41hlE8XL0%uMnZ3qH3l1D&+uZxQCh8djwYmT{G#-ayF7k{uJ`iz7Tw`fDC{qlfMsn*qDXCeJa!xE z@Y12Hy5+4$IxcbOUU&L_ETlX3blB8bN|U1{0`nzJX!-BS@}Ze|;?FBFM_}=KWGs8P z3ri(hT_i_q1C&vNp)2KZ3LU7!d4U2V59Yn#9Q{2*8|4c(yh^Nj{1#6;Z^xP-#lX~Rx#pqv^x3)*pqlXn~Fzp>mynld{T5vWx3Qxq4S{O=72Lv1Z$0CQGAP-57a{ zxUtH}snlUVA|Gfbp|Y9e1qb-%wh{tqwA^tBwK3_MWkM?F#@c(}qpa1U^Q~rust7!Ct8LO^mhRBO-k4mpCTM378PSj;!fx zO-yA>B`jZ;w*w~XPI?{uR37;WD=Ybdc~-t_USx9?b%DN^o#~{3B>HiVAld48W_5yF z&j3nlS0&_B4kw@#qm~PnH=0(Q%GG&iFs!fK^rQR`nGEH*Z*){^B{Z1w=R4-}B;noD5-5XT{p9&F zH;4C|=`^JD12ZiU;o;pXGc@s+cJ&$upgETwDzw<-6e5_IBg(;woECF&WUlAGeU!Vt!FuPxAs6l~1aPma6wJGP51DWM$5b z<{$UJ{}@h*U6D!7u=0JbMZ&xNG z+{(_eJ6jw&gL7N|L7UiC-py}W8`%`dYn8@}H_ixCul;%)3ZrGy9f6w^9%-kEVYr^p z={KytKi}@mS*-H0N}mhC_ApNZVc1Qf>tUjTz-K~7%bQMOAZ!%#THrW0jO#8DYdmtu z=axO#mK-Z}}2tG(nwn9y4_cMBbnfx666tY#GpnsUTYbuHr_J5NqwM#33H?97;nQdNgAd z{P3yv0_60WD`7CEIEZF2&SFy^aOA#EX0enq>|FWHw~u8ADf!E&&(sfaaz*0gpAUng znuP!*a$#Sn!Cx-@O}7Fein|!20CtMBXDj8J{$Vv&bbXkshX_Bb^_J&|D^e-L!Ey1vP)FJrJk?vlEn&RaV$@k&v#y}=5$7#6vn8L8=*9_tdeWt zkR*s`Yv{=rpxfz^v-3?x_OpzF_(3Bs+C^zi*W{sF`JMj>CO^tKi&h%1=M(L+-|$mM zdT>Ng(+G#Gl|iPDfGir)QIg(uK+PK;PQL#EOh8EO^j7Hvb|$2VBNA3-YiPM;`oyjINI{qJ^m zN%PVI>Q0uv-PzUxcNIsIy#C4$o8*dRJJ-AAVjLY^`upQab@I_I3G1Cx>v`)|xA7?M zWyCvQ0jnn@rAbGJ&6d*C+@O*^Q=npEfvzI%(&tzJ5~9p4ZFBMLPMq@Rp^|eiD-upb zLl0jISwZ$BBz)gOH=EaZG8Oki%kETBZ3W~9;TTa};(&PqQ(a{5g3Ne}6j5U`lMp6jN8O_;Gjqi*7n%X!9Sv3LH&(vBK zzE5cYz9@v(3lDzomN|ZI@+2*96B1<__Sl2<+wT7ITc~L(oss@a4GI1S|c1uTcYjmS02=xE_tj<8EtjudV+3CZq) z5X$ADjt7SH;zDv+$*6;32D}KAX)C(RQePAVx#RQ3haD*G2L+bUZVnoHH*dMiH6K~` z@11(#J*#X2f0egPz2ur6IPW~~&}R2<_?~&$$;`s#id$SW5i1KC`iW$Q`DMmiesiVa z(52H9DXDBV5RrPxNoOoSzi{Jo%*^$~f#?n1X`9uFeD$pC?DgQToXZ}Q_qQlO06;FP z%P^5A0C|eL*kBj|hY>wOwY~;Js^=7!Y!;W9m-FP5C8sKzx2VYo+dAYzuKXy1d%Zqv zdmr+n<9q0+PlcVL^+3GqqeuL}$^-e*_+M}i9EZ?Tvf(c->GRB|>3EJyzNP>nd>e+x z1dVc{irhBb-12*yyOG0AcJO~Pv?*hU@43@cI@vh^`Q2dTjlzHQENyy5;UDqRK*p!_1bMH)|#yd9~oRPJ#OtE2j2Vn2@l^bZj7&M>M>Rbk= zWGyUG7{0hyuRO|{Tg1==BxHD~4^9#HPN^N~4Ne7kxW_hvn1RoSW?O0~U5F@p|Ll8* zWTCHE?3Z6+w?4%F18eUA^P&F-PqT14RobA4#~e{Y8w`uhI_Yf|>ZX$f8$ zbs(Brmy~z=9uy|O#}3^>fOPIIHa;Q0B+Hs7HotX~?KyN$6AHdRtz*~Gw-r8}C^gdC zv9)>BUGnZbIRRzn875o+ShIS}^rXAY8)&eMt+uZ0Rgglf z?Nu;-02s#1BYM!MM!e*AtaA>E`5n)aL*t#~^X) z>5APA-|K?S#3{QViyRx?Ecw2ym}GDI?6lN0q@g5_|w}4k;#idhxp5V)l%mAt^FUGWB5km)(iMK z{Dn{X8m)G6nVg6j#nSh}pHRQ&X5cn=xQUa2>&TCK(V22P#Y;Bz;YUAUCMq8 zt$u}$4;6_=kCNq#>VenZ((VCIj-eZOXh5wXpa-~KQ&Idcc+x<(dGU`6y?A6*Rk|ul4kdUT zXKz34yDAV>gK2Fu>_FWSOwM5$oxfzwAe?>71{jm*y_~^Cge|sEZ2n z%j4d^Y6jxQJq3}saXEz6AaneeT^)J#q8BpNrq%5pMp7+f-+a@J{Po0Pv!`4lCL5t! zsIfm-Phn}E!NyR^u_n}N=wW@(3!L4f9gwWZ5}f9 zN3V{Yeo2@4agoT~$7Z2vFF`0vq9hTCm?*L_dkV)POf<=wZW^IXcGfiTgjZ8A{CPHD zXg_}sk&%BxY$b#tV1O_XE3sA@j_ZyjP9jw(nR(K1Tu3?Q$m7NggGmw#q|<{`?n^pF z&zkXld;As#`TnD+&&CWnu1Ssjjbx#EHS9iZazhv|4A1Enrq3nDN68J+%nBE2fL*)L zX{RiRinE?HoLQz64x-H=Bq9CbS7#5_MuSc_wU(5|OX?~81&ePSgB{Kxg9x3yO}DHd zWcyu~U^b!c7s4kbiQW9|gS%9{MrP$h!OPUvj(@4mC7<^W`##j^T?VBkK8IL$xISIn z(4-^Bg>5#@QHy@{U*S=mw767GgWK?FBd*DonF8`re3`eZng|bNd&)g;kBDUvWBD7R z(?F@5&h9_}QtJXN?4DlKLz9G-d-`Vdem4#2Zq9K9$ZHayFR@43zNTirJk3 z>xSSJwRk@gU7^Gpftjt{@@%FjY@9AZx&;hlbOGeme$ft0%x-x+B*UKRha(ccwrby; z2bMJ%)+_AvK7vk_w__c;lBR>(ytrO!t_7;_?)oMA*CH#s-FEY~PVc1m=odhORYFES z?)@mM^^62y(M{BQQ9zU5qwWJKtG;S5HxA;<_lh_CT}3lJgW*=r5T~ALo;N<5!$ho0 z-uyPcY&E=>fV9djg~rmxZh2`Jxv?2imF!8{9OseKr;W>@9!~8zYPRXwC52JreN9i! z7vZW!C&=-vvcrzhUYYOQlY-BYh5ny2WOc#ifNjGHwEec-y*4M>UzFC%e@xCQ^sNY{ z7xbT#A{IE&y_Sfy#|S}7L*8O0AW1)BlBIg$|5CG+h<(J4N78BTsPYU_r}{yS$R_V7jS2culfdX7 zO6w5V!_k$E$tBc5w{d~9en)BOT9ek}lsx}X+U;E0Gq;cj$Ju49z5TjRSJe8as}qYQ zvu(Mj3^z!AGP%+QNdDF~^6MBTbpeS*xer{<{56xV$3l0nagXfa)x+LWs6%0tj?EIO z>v4Qv;5onPATM6StQX`cb@PENo$S{|zo#%iS$Auj-(r|a<`FPHt#FscQP6Vm7~vhI zo$79I{fr=1T9*WD4(eJq2W<7Uos-4YBKipaaqWTMK80c-nSwSGhS`#s%xXu)5V`!I zc(!ll8T@+uD+irUt6|eW4p;1pJ6Llz-x#4Ky+46eU>C~4a?1bo&DTliuk%QEZhb*q zAen1i?SobLu&2^RLk(5uhT>nYpsh3PHCmgh7jX83XNi+?7|pnh%$ul{vzTrXU|Gnk#ME2srMd{E#KI+@ut ze+kBBbM*ULNHK|q0i0zOT@gO5gF%0BIDX$P4dyqET@%6KnOrSWWG4L0jCvN&MVwr_ zP$J2^Ko?Yu8X*4_jp-joyXb0UC%}(com3fu&WIN82{izPE#=NB5MMq zOP_kiMNVN#o79B)d62WTgJD`O!8=@%!|=PIpm}B{IwNskFT^|OJU8gPyFl|!*oSUG zW#6Cd$7dG37?9q&en3)7Iq;Q}V~?3(j%;QE|K?O@kAPJ&GZ$PLiLTNCHj1#zc;K=Qu&c&cb6C=Y-jT&*JzDS z807fxM5A5xiH6y`&v^Bbpg*H;qs_v&>F>oTgdH$tqj^MZzX>z8Kw+N@kNlG|cE1Y+ z-$i|T3gc)$zhVF>9*^mDXcF7o>m@+rbAz~yF zDo`YKj3K*Y*Ap*cMF6WJ7SG1PSl_4@?%%Vm1vfS_bp`&04|Y68EphW|xh{s5bWCOhX*LrYbw}b|!J5`fTAmsaCBmtHCfqDf=bF52x!PD=&6P~S{u`|7L(FFSr_7&r!o)nQZ1wD04Q9Mqf#E)=ct_KqVTdCDL(}zrW6xaB@ zx^Xeerfr7eQt~ zO3BognAExhyu5f&^k(sAz2v;=*ypHPz3TyA?k6M*F5_%+Y!=ncs4mn$dp zPz%&Nrx{iqQv$QUsBTf!+-{eVTD(OOyL`C`VsIaYGGBy;<8RecKacZQTw=u)R6WPBT-)6@1 zz!3Ef<)nW1XTj6wn*VrGxhiREfJxU&GnU7t@**k2XEEVThSIp{pp*r+F2oNaD%W*j#u26Z*}ukz_uiPo>GYb z3+ocAKU?Z-?s90}50-uc?uR%i;`we27dvnOxr=k$P5Rqo040d-4zl^yz?N5G@;co{ z%75#h=*Dz+P45@n6Fx4`toFd#VL{M*@WKZ$8gkq-1~hW|Ecp?18lA->}c)A za#u&*3fb~N%p?9fOZ0w{+f(hvakHA@8*(*(<(E}RU#4S!>S>D6LU3CVgd1=(%S|v1 z21t0_eO(jTj*=tB76#>}w1JysEv>pl1iNp0{@aB7k6EcF&yV@PJtgoTkcXwkT634^ z(Lg~#tNhm@q!#giSxf$>i|>oj(ympoAx@|=yb~t869&E$#=k;cXAp8r3B_9^A|OaC zOA&G=Z#$)uNG<*U_>j*!kpQ|c6#=~CO&;K$c15s*-m(kHuuEpi@HCL%g%P~a<%Tz2 zFQ7mC6(yiM%=NO~B*m}6$h~S3BG?qL$ldcAb79bY=A+JgmUrl#;|Cd9?P=Gae;Ie_ zzBG7S26*|e2`>ZR{LI$9FP1OYn_r$Lz<{2Yo|-4JWpD*pq{B(DA2$;?b z@ZIAB{{if|6jwr-J%Ib(lusTbU)g=%USAI9OBMg4n$7p|=5TwOx!VtN&wp9VZT8_7 zA}O%|Y0OQ@RlMtg;hKG|zBjm2esWJKNm@SNe$3HRy{SC-phwiDUp!uIao*`8cm?|$GtIp`TdSdhQ-b&;L0 ze}B!Txe4!V!#AtYm%?AZ^E&-)Ma7~hNqX!395emrZFsxJpy$>90*MdeB5yW(LnWU) z&90S4B?xANbf75bt|Md(Z_i|uL|jJe=(-4s6Xk$-8vVqDiX`zz%1=};9)2UQ)sK-b ztCIh*V9LApTYi0-z^!}^P&Z$CI|<0?44Qa7btqF&_W+W3tNYEqZ!2J#5i0W!5>R(` zZx<07qYwt;s^z>q#!ruL6TV%t;nkZS~ivn&TsQ2 z?v(4oY4e4;o2o(Bdxk6Zn{c#CJ=|;;CgPq$>Bh;=Cr9(kdLw2>**?P-jY*# zTz~mg^>OQ--6ciEP;-UFm#IHD+SB}v z!|wbSLCiwr-iCe<1!(Mb;9M0irD0yH7`92++5E=h^=*tS6C0wDo#wJM)}>CeYX7)! z_a#q#mHa~Uk?Igf@NGh3WaA~^5A1YBVn7;$PCik^j>N71pw~yK3SGH0|NjVhN^vf% zFxnFRmNR#=sV9~&_g)pg^u7o8)M1Ax*`vl+#T>sHve7r6mmI*5w{$|^&@#nOh~EgD zkbpkKYiQ)>^F)Q5t&9$X_vl%|6;-B?z3R`@o|67W&$cyX20KQtZpKdQQJoA(u#mLK zh!wn)d9Bv}Kj$XWKzI0K_D{D@HtA}Ne`K*;)=6IhWGe}rf%artN7amAIDoOHhYw1? z$361O9*-rO&8NEz2qAm5@^W&}gF@w%vYGobIbxh1d|AySNy$-!4VRTqoP z0O>*@_#B3`!fTO3U^2R6#x05RVBRihMAGC{JMGVN&W-NSpNZ3_*vS z2fc~8N0tY^^S9%%X?9Zp|7ZoD#W&uOA2~52x0k+>8vZG17t0=m6>Jq}{5R&_0;0ol z3EPntK%l`%0KgXW@u_qi-)rV2c6#nLcW|%aMzAKQ;g?#*;vK0MyI}7B(cXJU!}a}r z-&&C9L`l?;1krmpI*Cq1C!+V>%jhC{4}xeR(TUzmj244n^v>v=QKme;zwfVH*S(%~ zJ$LT4?zNsja@H)4Gw=P`XTSFQoV`CYvke0^D$Vd*(DdN8c@D*Atb;HeKHNW|Isb;T zUou8jZ2^r@klMdvFWKFFh?PS!ay8E*VCRZ0!&U%Uw%~*c&Rs1V&9iPX_^BTte!-*W z`=dNSUI=M_^LI;N)qso2X_OzAef9!Gazi`|jFN~OO$t=Y`?=Xl6*3xeos0emF1hKs zsq0%|Q9e{&Sv6tdNAs_X=f(Dd5kObCOR+F{7(!2v4qn61Z@r}(nGy{}On~Lct;;UW zJFLZH@J23q*=n1D4`-(kDCRxgdh!~<_FPw|nLPho9Jg&xD5H0i_{3}b^HI)Bx^tt? zZbfMwPMg%~E4N2ek~;edAIXBuqnKU;3QyQ7_i}wNkNn#-uY1@N*iCX=6==Eie%yKq zw{T8>wI*AI@C6;Hm2aAqmA)^RzAKb zM2_ihMnXCwv5vdTEdD>nb6j#VJG?9xHZi=%b_{RJZ+xou2o+0@>PK!m zZI`Wk>GY2xjZIo@zpJ$nEp0aG(n?>pGJS{n#P6k+?O-Hr*)0!w^j+-J;JM<()rsO1 zc7o+4#t8hLO-C%dUbD)YpG@ha*USGHKPYm|{9ZZatEGtG$Y=A!XCYEHBD%FH*Z4)k zT)gnYWG271)1+#@>cn+U!jV+MH$eI9^vdf;nI$}W-U#v0ZQw%=KYD#0h+ZN-`@~;& zx9Mh)XX5r2D@ROXv2pX%hh}b%%;i?hSxWLIJ9XgW4)$xK$#?`Coor1Cw#190%)zpN zkDZFguV~eqWQR5}b&apn$$jE^IO{Tx>OT{Sn9Apk)qGteXh*z3xPp-A7r>!)R<8*b zXzBXrp`<|Yey5@0Cf3O{t#|3CyhBh62JQU$xM4XJ2I(MGE0uj9Cn>@V3REbg`(Ju`?i z3^E|nDjQ86wf zJsO=3JwkVuHc5b1ABssRYUS4fKB4V+?N`-MOpA%bD9(LD8yTD_5}v9Z@=!y+zn2hQ zF4j1Fvrdkl>zP+5{vE_1{=5v{xyz?q=1V5~wTX(0@|r)rkj4$fYAaEXe8Ckk8gG(l zJgnKQHkQNV8n4)l8&~Wt+1u>DnYM~2uJG;R>@04y`wcSBt(LdlX?DrM88s6(QvwR8 zacpqTZopt(bA7j8aZvCpX86!8=dC4hf7jBg21TB*E%<;Nr_{kOInP~s$+WhujH>#O zXu?ORW_rJ|@Wr7{VBBGaR^_v^M{Mm)owAi=51x<*snV4++A?{T$c@V z{h87+QfDkFi5j*T52Rvizk-7|9|x$kMO>_{TyS5aT6y5ezow{%5e|sP50=4==atv- z)}j%Wkd~8%4>`GSbs;czzG3xsKv{bdx^YIwJtL7@jgTwIVbD**>Oy;U6z;9=we7y5 zIeAb&>pCuNABT7@q4$?IPDBEq>quZ4(RwbB+3TCzAHOb{pk5k6IR!>=K-D+EU zP)(Hr@khL0+uv)8={Cg-q3mN#!OG*{)Uyg<87`c~?i`!zZF%t2XZj507?E9X08m+M z!bkMfhx)kXo_P9xfK&s~ym?(8xV@4*s^t33&5G|@KRHgT`Q1%SYCb()o6h^EunZ1O z+No=0?;*P(EyT1kc8$cpP`O4}torHea zAt_yMb33PTA{U->PUbO*Aut%bMlpMX&mf+pG4Je+d z0sDSen==hmuR64ZT&Hd&wa+J9t{{#*R8~G|3+B1Ll|>zl*wI)azVoFs4eu;e-z5Q4 zJb0*`1Eqs1q%kZj1saXGFk(E=9UfUS-aIQGLc-O>I(V6-I`-G4f;<$dN8zF^W$*Lj4=gz z;4c{jpP8O|g*-$#0B_EBAj{6n9SHd8<}mQ4;F7Yw>Xh{b*XSk{G)WC%R5=H(nRC8Q z@yao@H87p3F$2FE%|UXBUIUTvYlz^5I*Ow?6+cmg_Zh-T?D#$N=l{licgcVfq^&ffdOP(MU5x$<$CsxxvO3?L6UWh_av1}VIRAEuk@2aUM)}Nqc37N zO&$Ae@ljfyYe@I+^u|B+J~`5tm|EYm>gzAD65Tj%8AE*8Giu8n=NSAVc?Ng0{>jou zo(i;_qF4*Ft`R zT=ycq_6?N*hSGt>01kxr<-unCq~rKh5+YDsalm|2IXtbCC-8k+iRb2t&z6ec(ib{9 z9b_*z{$CFbbHn{?xVU7ewUNYS@FVk1`i8)hI@OLCymoS6FTB^<+WOZnd}aFnHX$e+ zy3lpbA!D+4W^ZZ@7&-l1r2zO;SXah?N?U|@aR&s<#E((W03|>rN}U@0hx67@_x;9o zE|3lVOw!3q0+0t{A&3&zu!SY^#*~( zC|$4P^WqY9T58q<#@iZm?opayFa4F2nICxgD5$~dQ9#g2v*|M~@ICg?bD)b+@bF-> z?`ZYiGhAbXJ7Qcuk(AS`qwW`Q(;e(a5dey|Ok-rBN?@_o=)kaj-8W!q7K5r6deIjr zoHGetyvnmi+qmr<9;#9C-vIoB3pYNL%5=q^ucHeZDfvBl{R$(GdVZmw^2%@HaoOM% zhG|$197K5qH_}F~;{}LUvZCGvge3eJf(mtX{max&ob_oQdyzC|KvIB1AIwB{J#Cr9 z%f6y~rk$yBy->N}q}p9utKp1PsA$Nsq7!r|H+*!{fGPMIzH)21_!(em_0 zoO69B_ic9ft_cgD-^eNWa@+GkUiTM=c{ah;n`N)>huPwpkr3kEswjdEdm&>Km%}e} zYQwh(^|{OIF{i+G2=p{7yzB@sNpWa-FTMsl3)1K3kx0^H;i=%(S4$54M83FvrQymHYNihbPl)P;^+v8K*h!O{W*pH(nOORR{D#a zkcNG~m$WV$ik)e2ysCBOeYEoFPow@n{bvW4EeDS9ZnG5AfJr>OJD~ZBDzIx+Nv5r* zqZMUFiex8e=M-`=u)Ol;-sz{xpj@;4fAv^(mZ9hO&TO`0p(|}K*Ye(@{jKSWOW)B5 z=mXkzz*1-uFd>ktA%FAJW4&vr_rZ^bq&cqZ#vc zzQ|MFI1-`XK7>zy?i_4N0ZI~y<~eoq?T|wsm>Qx?UjX+UJ*v$e_j_d}H(ZNQ+Q{#5 zDk)dQAYAcU0F+eRsUTsz%IOKJM^XX?T@*iU69fUpuGc|j=k9RWHge(L!MT0}Vr9cu5cXtDAqzDQUWD##x2K@*fd17zq>6&CQ^Q`i+3^lBF8BeMIQ z0CIk?bHEq5cy*-n?@Rul_r$;NjNEOUeHs)QK}1;e$QRS2JW`5AYk8d;3(7;sOT^1= z%6h1e_3pgDwHlV?;!|i#{HwkFMv4~U)c9Ct$+cuXskQVr!coogTTR5{cZDl+uIKSN zr`|r%c>C{QtSOy)hfStK$^mH!NnWFr3`+|<(D*6UHbG*0T+2L54qj09(T%`$o=CkAGQD_!U-vg2msR1^F#6%@tiDw+mFC+6g_C3%}TKbZG z)uflGK|9v1NLgh3eWTS|HN=|Ukn(PZJ1g^!i89LCC}<7J8<;J45I9-a*|>Vd+Dy0L zWUStL>$XH|LOlYjvx^FfWNbY2r+3+EUc2TM@eUSDrJ3RyO;$@*}O!5`C5vdUkMKfehJz^Ee1q1 z*0S{`Ek&pyMSz7Xi(P?f{xbc!Odi-(J0BrFhl%S`748XogPrzOvD)SIZw|8ITvO0i z&sP%8yZDNT&SUYIsa6$cRAKFzO8KcM(T1FHt>A)Pxm8Z)skO?-JuJT*t}3>fc0>R8 z%w^gZx8p_GbJa?Hi0hZ2)osI88vg{}n6|>o)1SVN@0;Hn@RRN=Svqe$Pg)ZDb?AK* zURDzf63Hkh^BZ*c)9p;XRjT}Swtw~}%FKrkh4wl0hM@vd*mE}}-T%)7c7)@9Z;JXq ztL`SSzoZ`oGdz?Z_kw(wdt>-LIy_C2a3d@i$9iqM_ebhn19$4Q{IW6#Ip5JS6w^V8 z*qQA7gw!q_MdkII!?tdS4r+&h5TFCp?qC?!w(Y;OfHEJ4O?*Xx<(Fgr`WMOnXPZce>ae=sw0IrKc2+?tU{R z={+TV6de~E8ym--3Dms(beNmFb3KWgd~e{sBdOyLxnIqB)XMpK3mPbxi#Au6#L*8? zcpFvNi{WDYTh;XXENu3`hg?vs9Ac+Fm98i!dW6w>5wlrz5s{%9iOz{3ic zB{@r*AR=O$w4Y}=RPa?}6uwBe(2yN56`>fIkW|O!e(q4l-<0sukqvpc=alGuIIl>V z;P#{XDlT&cU0m~9nCpF_@rU=>sxoRLlu`omZ}KaJjPDn_5mpTNr zsKqX}7^J~-PeDNXfMU4i*0#NP@GJmZx4qBi&ekIG(@>b`xpT34H6h{y~P9E$Ox z#4|+aM*weW@wOWV}(^SNHQxJ@0*tVGbLSfZdGf{e#zD=RxS@)n-r^$ z7gP7goAe?jhlXfMNr&Z!f1IwflBZ9K6S40IUb^%DSnUE%3uODPygLRI6}+N9Ub!@) z7JsBpqxwvpiA88ba7DC)LgIeTw_U`q7#w}+LRe3j55ZlcO(cfssYOw};G-GOTv zbG@ABppUQG$vm(uTRDd=N#Uj7`+S^Kc9txuV8Em}Acuoz=c!AMI=TcJ0_gMbF=;Fw zY7TLq-dOyVM^Ap^8|&<>w*fEN#W$ML0#_8y2sQ1D$DE%TYM6~9(BBIpsPstnJAaC= zQhoyvm+Cv)pam=BQo^|fg;ql<=mlRXoMb2(9!K2s_F~Nf3jx?^Hl)1cAH-ohsjh&& zERs2n+#9l&1YB$ns?6CP5!I1P1TPZJJ@XDTcyH^c@Y)AEg!nxCDM?6`y~d?*wtQov z5r(i%MVT@Up=__$ zce{6cL@IdOn^4&{jH6)Rs(bl(P`Ws=B1cL)JPpptdkh&@>qm0-C*(c5-pG6%lzdN5 zFyHw?X?JQ;TC%Xuo=#W9t08!^J8428X>_hpcpWa`_F!H-n;3Q=4wicbl>+fPttJbd z^2>@t*cZLU?C}252hBWq!#7Aa<%FBkZ413vdSkIyeTDHy=D6>Dp5~OujYArjh=_9w z$n@UYLg*OwOZUc!r5r{QZrz-!9iN7j_M1RNM#GQ%WE8=(>f$v+eqi?4!74@(f*AF4mrQ(xSCQfj%eAUyisS`0<^F9}T;{ zP1Wm9xxRnn1+Kr`rkdsSxlnS7y^V8r%X`%k3>GLq>0Uu8tz7**`@2wgfvA)k)T9#U!^+NG<9vf@)MrF>kpygA*~=Zx6ON+PFuJu;)&F zfQe_7USQW{HG={?NhYj*g0S$|6&d-AyF~`9X`wC8eP^TtJvIR{x4U@y`;IIra^;kseP~;_CS& zehrCcQ>ddFX`u^&>;fl$W;QI93+4@@sjx3Akq^mC^8lLra4O!_Yi+7qNhs`v; zH5JS$T^<^FBu%p%kW5}h4{u51rfp_2gldpA*Kl7>}u{EcC8AT5;FB4 z;BWCt4?^nFWJ^vjv25dYl3CHUb`le$RDLXDPgI7-prUCp8bKwF@5Fh@6qHi5T&rto zdYcv6={DD|V0ttyws9NrwHNA+<%-gXMdHTui9peY7mquJ$vpAw_N40?%M`^B%vZeyJ=oS<-d6kfPGW^#z75WGB%dx$1P0Ki(RU-5 zwXg&|01ql)4^a|qX5OE;881eqyZx9^N++ft?l#*8f#&nKizTW0iP6~e)0(RIP%+eU z`v$l%&GIKh{gvnwuCB-XGeR!ZA%Lc^f!HPGa_mIdk7tAfB~L@dh}PNwbO_CIH>xjnUPI9CKBN|;fO&kXoD$b}GTXDW$dmw7OU0yOTSfXI#;9V2hCKWs3*Y7XbqG6f|z(;Q&kl&-8Sfm=W zsVlf#ZY~V#^(xp>F2m=#mDyoboj}&wh;>0uPHrfnSYtK$&YgR#)>;^j482dw1v=Ro zQsu*Z;4FY|qGS!$T{?U95tIsT{JELCT@3fPS154L>X(~)<@sYnu%D#YxdMnCHa_Ac zUPxD75Wdf&(7$^H#9h=;i|!kXA`YtB;BIk^qH8#tH#Z5Zn&0gubk*~{{yE2w=V>Jg z+g*$W`o#Aom|sRBMrp%@j~lnC{97{}-&3n_1%)>!JPPZ1f=mG2qBz%Ojw)AX#z&+j zN^`HEZ8iFt!}tMySm(#0R?*Z@`Wn`T};yO1kT+sgo+=^0x-GHI58>k=`A_B5(we_LP{Ndk*e=~_;z@*ha?o?V-qMto6Ge;eeRN50S@;DL#V_%cC)2XT}S3-QZkgMXtvQl+lxh>9hw) z#JIWP^T%Oc@9&ntA97hEh_d9n+(?mKK^l=%Uz}u?4L?^JSsRl3=a)q#TR$#b*PqAq z(#q3irjCqy;ICj=?Z|VqgdXdUhq370frF`nni5N-6)JuHGzp6IxiO!+>K)_G!wZSe zby~cPK0A0$ax>@oLrTD1cKf01RE^`O6MA7Ks<3rStCOSVeh>WQQE`n|2B`D+YN@b< zqr~fh1=Kceek%okj&eX{0@GVU%0No9JbMx?wKddd=8T}1I!}7+Pj%6QLsVk34ImeC zAF*0_h26nAFI+I;+2XEMd7Q*G>Q%!3>m^41w9YE zF5?$LVtnyi^%4W{LvPxh67N_iy6xL4)YVNw23AoKpNlebRJEX}p*XCx%>RrN%>%EJ zF(32H$s_AAfNW(i&cgPj`rU}EVBMKS^^pAix<{YsD(I#NBiMtBsmCkT2OiXZy5MfM zL3%|E-(?udVssKMM;EGZo)wc_!m@|Hy?29`pmlBZ@aHH|5zq>|ZOl$$EAPhz5Bjtm zNYk8)4)GGqkyv(del16bEaq{miCgFFZG>HAGQa;abof)Sa3|_ncdz0I&-8SoW8h)F ziCv}B!9@EnZ3H*ItRH#|=s-m;k`M7|Kqu@nTvg2E-Wt+`JV?*Hx;;J^-3~)aZ~e-O-=_ ziLnT3wY37W@QUAQ=iv;Qz^h;G;ohMOCivgv@?bWlM4@r#v3{4Ktqq0C2w_y(3XR5I zs&R&24(0J#3r_>JPw`q1B^tc`l`xZe$FmS{2U%sKxq`pNSqAmuGA3sNVi&Wl35pkp8-*EwXU(dkhfI9lyn*nIVP;F~ug7}lOI78yxCN=Nb z^9HlNg{y`FgW&ispJ*d353elr2@``?2a9G#Ea*dY0|uEI^63eCs6z&x4_Qlv_wsGx zS715&zS!I_ZL~y{Cj-8OKQ%Emh(>aW516#1e$_nZuQJOMA;w_l9YoLVi&<%SNnS1w z64o2Mdg(UR_kh2YEd7OVF5(?M7#K6$_UkbhQ#653_2T$~SU<1U9nWtu=of2`rdQR4 zzy}33M=4Vub>h!Va7*m5&Iwwxiq}h6Hab4D7r)QrrHX<>Si!P5Fj1D-M6nDSO+LwX zB>yVw&9nE{lkWr%DP@Gw5k{XM($}H6)L&!`?w47L@3tIh?=%x9hR*EIvHh}hKkjph z4R69-ekT6>k%vDYAhr;sZ60c$y~J8F8KmcF-^1IiyR*F6>Gy8XL5E`4%^@BCGJK*bIJ@?1spH) zuL$v5IyKQG7(D|olloo2A7A*yy}O)>ZaG}fSZA_TWvjcEYBhM0cpupat_-qUnb1#N zEGMT*%Ktv`lnx;9A?>pxw#TmLdt-*EXYo?;u*C>bLVg?J`LL#s`K=zF`;>fLVmA*) zlhliNq`BN;I(UICjo1{5a_xa(uVhK7oOWOVd>NHincs8z-2M3u-KAXmSpyO zkoyoj9HK&8UR75(TVOE};yb-&;uBgST|9y-smX)uxBJ!WEpLj{hn zu-5T}TR`=Vo(aY&p0p@{2e$x6Y-YrUOPMP7jSTYz4nEvV-HDX`5g1EB`!uv|5dQ+Z zzi7AmXkRuCzp_sdUjMx(ir!HX&_1-X7O<>!0y#q;N1w%E$SRElKGGk!k_y$&?M< zUt?a1`5q>m0q8M>Jq)qK40oO+;oTJ1KV_#MtyHOKv`lAAxaap}^V!R#NafWXpR1GSgh$A3N==VbbqpCoXm_)UTho`E`by6%+|**Zg#v&M2&V zPr}smP#nR}=bNw~$oP%?^Mn>+cl>-gOg1D`6Kk{cxnz@JLL1Wq88oGzp!Q{duYAju zdk}l|UdZb~2UnH^9VN`;pY=8gMEI?Xslvo9>{1@p^_K&^Q=uyJ{w}!RAEm+Rqq$~Y z46884J+v_O#iu_4=Gn9JAL1#Fq$9@P$w{(zgE^h;Nf{AxVvzwt>4u!-H1%@RvImsX zpYljHn4)b#TRRRYcvUnwFaPCq`5471?%LTBy z=BmxV(qz|dLxWAOI*V1#Nk6*Q@C1?U5z8hn%ch`GuX1HmMDpWtt<~a4HqH>J+s7#v zN&{HJG8FbUyU?;%-SJEYMI3K$-h?=pWU3CEF^ITPkx)KGBRiaGd5CGi(PndIZ*xlj zfF2;5^0e{(tx5WcM_&T0Q^bNLNti-oF~WGRA*&GLZAe;x?(IOe0~V`~wMd(E%78?k zJC7=tZO2($<10P>vJ}oDcT*Knb=M{*_{$Ln)uVN|DGSG-!iN{rp&N@@)l&yDf=1i+UGf(;^| zCloIac*GbJ2kEX3^?jtl5M_=G-wU8)fDMp73*Ul0SY!pt}j~WP6V*@txIBwNl(pxGn4_7;vOu>P-rg4sY5%7RNr8cTu1mT+g#+Ch>s`$$)j}%XvH_`Rk|WU2vP5+ z0oBg>!JjxZjm61^%6`s0S$(pZ+kAVh0H$-5A`axU%GbJjM%(%^&Y8ULE?9iw7`9uL z+{Nh$l89|sEnr{&r#?J0UJzkNo#BSbGtNV9&wq7e%d9u}2yPW-B)VW(xzq+@SO{v? z5Xst{;5k^1OQ?HrNgw%KC|+1I-^|7G0(5c|xqbOwfI-CB{fp|HZ^r!#Wh{>IdCw0; zo)jWm3pg?sK0-=SZ!$ZkXP$pCB`U4Tc_MpS=zvaTtwP9v;^vR80XF(-!!U{i1CXw> zbxZbR$NT8BHzV&V-9^!@T9~=U;GtcFwCinkQcsY^&zi#){FopTeXok#L2vmofVvEp ze&TT&FBMOTWK%*bZ@EjQw)qc0x1D&HQ%iKW0!qpJPNF8F?Y=0*&v`EsczEjZX20vllk}eax0soSS1be*qmdyp@IG_IK_A z9TrEUnV7Lp(VHS2-my$}@k9YmI`_h`56%d|d?~cyi?Jp`1@o7p$HWoCOJTjeCM}-s z<=`w=nP%Y^-ErGC!HPby^ws*vyVf}hV1%g#9r$b0TX%^#Z6|5zrPIm=8eW&hQ0Cd- zsE>NcW@qp)>GEykyvVv06>EQPN)@H}aDG1Y`}0pq0nv+NE8W`yp(;tyC~^M5u%lC> zclW;B-jRwV$&dpWTdDfL5quGeA1@M<>9-^- z1CtG8Xvb{&0@8hI8z=$VtD_I{ zWh&rMr&`3DO8R!$nE$dsFAbLHI6X}A5ZH#qIVm0S1)qeBU*rWG!C!DYOBIAr8_%ai zo3OmqAR-xZJt*r5^J=KDv}#1(0ec-XXQ@j|$OPZg#fB}0x@;WDro3W$&{j%}Kb@PK zP=azz+Y+cD&>HVOq-+V^3-NyQ{2+oAfAVYCtdo?B^HChM)_8HmpRe4jK@{(XkP38D zAGy@4pS1nc>V=u^(S&K#bLI!H?75waqYJ9!ntZksZh?5IMqElM3nPPa_^Y0nqpm~- z=|*$0ifo%{^?G=~eS_lHl77r2Lf4v6A+99Z;mz?K&4aNA7);7*TAZg`vMH@NZ>ATl zL7I?(^3u(n^)q@Syfxzew@r-zi-mbg9^bmuO;6Q%!Tx$-13hEm-YXNAh;QDSdld2= zP=e>UN3l^AJQP-LWLjC6-O9GNC(yB{#EL}}qh!C1Cl^2EB+P@*$I__iVyljA_?Sbw zDtoR{8&j}B{%tf5(QC5k=)}aPgA_hrDj)I*joD{COds(S$91`^w-}1w+Che}N;;B+dKtHL zknBufBeO3qZ4@7yWh9tjalDOC__E?kzXHx5jL?iWT&w31w=X?hRO^*oLS<+_3)l-C z9ZNfMM}O_v?_k+|k^C-8I#9Z4Z|i^}_vd#c&pLvdyGz=ieo*;3W#}XI!(T0J9(Ln6 zr=T$l3YC`rg=hKd4d zHy{BPw{U~yOfnzMBw_;!N!;Qf#m~}~bZQ(I>(?kd{qqH(jEN2>u^T7AuVzM##wwqQ zK#Hiww8s?0v|KA{8<$jQOS+k|MQ{snI znr~!BjAvfdoGg$d;0Q{22S>%85;KVeJW3nfQ;MEa8Aa1A&xksRzLUXzS%reWJHxro zPCX;JpDOk9VbS45MW-fou;&5ig`8gW-4|X8=s7*4$?DF(#K;y~3T&7xd#0xjXb<9j ze!VzDbJ&EV;AUr6KtfeO8zKBY8_!pIsDFd3Uqb7y2z3YLfL)~`4o~kcJ}e5c%psI0bx%A z!TZ^wb&~>Zh)Dnsv)^BljG7ne031ZZ$$%mD><^m(XF zs?_pSs~n;F`V4@w>G)%foN;D$26qD%=hp-QNxQu%MjX#}w^NgEZNiiHeZ#u1ew+;% z-8Wa}qP#y`qOUmFI+uuyj3XWQdv4B%{{qCqzB~?GKsEXv$mhATWclKJG`wi5rEz_` zY4%x2udi)!C5RZ+jV$WWsw^Jk+8Xq?Nw$eN8DaclebxJzM8X^Q<6TDc`F1Mf{fBVC z&95EQNJEk*sT!?~|AI9o(b)~a!}VM4d&dLz%>vH?LzsTg*_^Wn3Ok?eJow?0G8?No zC?~J+{$evA>Ur8HZ|PO7_uo4ddiy%|8ahaHEGt6GaGoJ@EWpDK7}RyPS0OQTNLOTr zs{3=OV5VNSHwDM@Q926!gN_J3mg0&`MUkX(e{)F4$aFdAZammp6e}#K*rD-SI=%^Z z3SrC`#YI1OS5Mo_iq$S22I=^@a1v!{dd$;6P7D9!vb_z12ExjCc+M9Un39(D^}<42 z$ctPbJ~qx+aF4&6-?1C^JbUq+CLg;-DvVaH&FZXoqFFj>Hq**I6~BF$y)AtCT}>4AHgJEnJ#N>@)8j9#Hf%*SjL)8N$*=%es1V<_3LhVauXZ1o|C5lJ;%5*DIH=%ZotHIy24& zDk%v-o$~EO+vMrX*(X}duCrhcH52!QeVa^+JBMfwqBlmCPksv6CLrO}?1qc*e`Pso z2dFDPOw;7!k07wxGdHhm&~SFad>yQB7M8BdQYc9eLP=G4tn2Z=e|xN=_+>WNB@H)b zFnrzYXg%vkwF8||k)cSa`7N*D*_sX^5MNc$ioNB-Y1=Rwb2eoWNd$JT?AY`P|COz{ z9Lx!;_9&m}$_Jh?R!5-ZCjjjrGW_ja{S|dR-QDSRdFmv5*%Gei9Mi?Kb0hy=-NT*krs5h#9+teP!mXS}}Nn9o=# zS@G7CL<#=`-##TO^(66)T<(CZ1SpV(jPJa7gcx_k5OpbYUleG;lf-B+tNxTt*#~Aj zk}PrL{&DkF6Eb+x`pf$P{Ch#mwuV}M%#l=WSvdWQW?^h|V^sG#U#h(Sxp^*uj?q^23kZPRqL`JM1 zhU+4`92}R!KBj!I0`TV|+FC{1Pe($CQcMdcQ@t2&6KHQ$SH$ddMO}VQ18eCC*J$EQ zr>|Gt?PlU#y^WtLL=^_opbE%aeai?SkX!b5RLoP`)oM|rNQp`3=F92xNpAKB7o{Ln zOY2%tdcSH6U0C1k1N}6u@6pBlYl3V~5>f-Df;^+_s?9xeWG8P{E;KlQ=(8YvP>}e9 z&+QPudVmlqcfYQl!a`w(Gc{%`b$eq~44)riOvr~|Zd_nBMI~{!xp1jg;jUs$fi-U7n`+Z(rEq8KdYs>?|CEP720kgZXD?PQ}$?MmK zsan~F-hF64SzpFvh+GNy6vr><+9Bo$m{OlOsj>NKB=^mwlC9nERwlMytLyN_Dek-!jvRN9%%suI-narHiXn4zPhj{y^*owV3+6J^!j*oHGR=TP@MLN zORf7eL!8lV(ZyMrRBvvX=+~TCy3Th?zfUl;d0OPXOLm+c3TC=#Z`Lk93L|3f099PlVzlbv{i8$U3c3 zSRK_xh;m9fx<0Gy-i}JGxtrbm(!!?n1mJL{Cx}*Uo5}38O}C7U5Xmzs(u7$v`|6d+ zZK6D*v~^oHGC?2YSYto(@<7JxA4R{Ze{W{3TfU+ZUsvlI*A6WM4A6o7Rl1-wwV(zq%Vuzdl_%_g_NaEwkdYhDAGLj3dFcCdA&NCVOp+XlaZ7%~ank znCi%>o`54gRsz4WJN5hODkyv5CiH~srIPZehXsh=#>uc@ecrC@5q@tgk-#DL9k)*J zz5tDb1ecG)?peHdTKXo8)~U{TpW(ry6*lepUv2FEQ@LnWTw|$gZ_x5@TiL|L31&uc ziz>UE8R+uXmY~~{QI={h*Cy&HBt_fob-cP4o~u>^Lm`>B61oE4?PAEXgfk*R4E{FA zK3NNl=`FhqKB!Ig?D?|($Ufgr{v%nyZL}-+Yy9LxtWf1Q>|neV@Qb?(73pKYx)7+D z=+mv!yhDcliA!}JzJ%G=vl=3igI6?F?SkkS+LC~NNW`TZHSxKTp%_kpQ7+9X`;?XZ zk~%g_JRN%@dW=-UJoe<2cO;?w(DQ&c!qHpwR*;fKodaP&%>loPqT}&19s2)l^UW@gZ3~dPa z!juDcz{3drM%ij-M`Q^5T8tX=%HeIjQ{@q`**(GGdHYO36=c)UmpQFvQ#XWDjzfTs zG`Naboa8}4^KihI+9#n+VlAZI!kMN#3)VaCOL5ozvUyRc&J6}U$=x?H(Lr164b7F0 zJ`aC1MLoC5+?cX+IpNZsos1juHbc8sXK2f+R>CLc8=SvIcA&p}`*GmZbLN`7^`ePq z_h-@IZ6odg7={9FvYB2F>2{o^RR#S2f0sNMg|nFTDASwu3k(g7m(2FHo`;^Qim17> zBd3{#^E*pUA4iveeBx6a;NxOuZg1(q@XpfO)=7f#sI`-k!PY{8QCC2fTh&F@(#BTF z&&^WXPwln2pS`(=1tUQ6fw+(8T>wW*4>JZIM+YZ&Q6CA$f5a8N+yCn@7bC+zBp&t> zjM9Hq$e^dH!657GX34%)(sM%Gu4)%tO-F(ahSC%f-oBoa;Xa|Ht$D`>gM5ac4`efBW)Z zr~dD*{J*mEAMXEG!v7ugPbI$v_YbZ=xPFVkZ;Ai7>kqEqBJf+{KkoX2>$eE}miUjm z{^0s80>35xa5(;QB2Bza{?Tu0Obb zi@h1#kGuZh`Yi&#CH~{CKe&F2z;B8Fxa$wD-y-l^ z;y>>CgX^~l{FeBSyZ+$%EdswK{^PDcxPFVkZ;Ai7>kqEqBJf+{KkoX2>$eE}miT{k z*MtA8^sscgTi)S)w~pgxqxP>=Aj&W0q+hcnnZr>i6cC#fjg0lfBPuE?y+n~`cyHEU z&!iB)x<~!?%Ss(V8Nt=3$b58tp4vD)0b;G#f)J`7`1m%t{a>hZz)EKyvC$Taso%`D TVebF6xa6h0np~yK+tB|9OTxo9 literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/feed.png b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/feed.png new file mode 100755 index 0000000000000000000000000000000000000000..315c4f4fa62cb720326ba3f54259666ba3999e42 GIT binary patch literal 691 zcmV;k0!;mhP)bpQb1=l6TxbDZwj&S={?7%qx-u`rsG(Zp`-rh=e^=%((1yvsuf5d=&62Zj)Y zH&JviNS_F4_Hj|T(1j4$p-!}kixP9&dB4uv^MveG?dGf%sUCoc2!IFxD6wHRA2^dX zXRVk!-qSfk(jcaUKn#RP48(whfPlJUpApdrA!TQi_4D+fVoM;3I0gZ8{=Xv~Po;geVA+Em9@0Wq2 zr>OTZEGR05L=gf1T;ucCxq6Q6EgJiH@@-lVaAlQyw`jIF^c=&IVnj|95hHbE_cnt| zTzZQ?F4Ne@(bH(~&3nM%m)I@ID{@jJ2qZPjr)jhpe9hViOwH5k&|T#EmmL3(vHeUQ zq^!t^Al6JD;=mHq^Bg?J-8-zG2Od7gZbknG;K9czYjPqG*xjPo0k(c4%lPXTpw(qq z@aGMnxtFS(np+2kC} z7P02O874ZkJH$v#nCUVx$({yDN`IX@o2wyvTD#e`qN`_w5<}$3F+_z1iyEv%?$mbQ(# zwJpuiQJP8?X_`#S8b+U_G6=ziYB!xPAcq{)ZJ0bECH@ zYx#`n8^Wzn^J!4>=q^bltNO15ry?0ecSLkjpT@vlid!jk)Fjf7&)q_V5zGs#3N%6* zbW~7Hg=&P0&~Y(|g>$hC9FL?;ttzPDZbpZu9OLb33^e2;FNTGJxScp1&q4M+y2ntQ z?C(=hpU$3~`Thx0eHwi0x`q+!d5k@|0_WHe%sG3e-s^MM`xM-ig!VcIA7H}X1ot~L zg=MLB4w-Q;Bi!!u2|I+Qb;0{{4Q53YX6+4_aXena{nmt*!YG7ua~`qc>o=?@U?rOU znS7%>klzi*muXnbM6i@4FR@s^8vTjDgy&%J?w?`u>NYMDFa_2%0SQ(qJE<3=<8Bzo zfdU60e*y(^$RF%r$kl)p7=7tlCDa$+J7w>}DU(O#~fk>pYuRvHi1E9^msg{tLeV XM&GIRvfA7%00000NkvXXu0mjf&%8>| literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/pdf.png b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/pdf.png new file mode 100755 index 0000000000000000000000000000000000000000..8f8095e46fa4965700afe1f9d065d8a37b101676 GIT binary patch literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/visited.png b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/visited.png new file mode 100755 index 0000000000000000000000000000000000000000..ebf206def2729dae1fa9e8c5c9e5a95b7176c45b GIT binary patch literal 46990 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 literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/xls.png b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/icons/xls.png new file mode 100755 index 0000000000000000000000000000000000000000..b977d7e52e2446ea01201c5c7209ac3a05f12c9f GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt new file mode 100755 index 0000000..3cb1b2c --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt @@ -0,0 +1,18 @@ +Link Icons +* Icons for links based on protocol or file type. + +This is not supported in IE versions < 7. + + +Credits +---------------------------------------------------------------- + +* Marc Morgan +* Olav Bjorkoy [bjorkoy.com] + + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css new file mode 100755 index 0000000..6d3d47f --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css @@ -0,0 +1,40 @@ +/* -------------------------------------------------------------- + + link-icons.css + * Icons for links based on protocol or file type. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Use this class if a link gets an icon when it shouldn't. */ +body a.noicon { + background:transparent none !important; + padding:0 !important; + margin:0 !important; +} + +/* Make sure the icons are not cut */ +a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited, +a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"], +a[href$=".rdf"], a[href^="aim:"] { + padding:2px 22px 2px 0; + margin:-2px 0; + background-repeat: no-repeat; + background-position: right center; +} + +/* External links */ +a[href^="http:"] { background-image: url(icons/external.png); } +a[href^="mailto:"] { background-image: url(icons/email.png); } +a[href^="http:"]:visited { background-image: url(icons/visited.png); } + +/* Files */ +a[href$=".pdf"] { background-image: url(icons/pdf.png); } +a[href$=".doc"] { background-image: url(icons/doc.png); } +a[href$=".xls"] { background-image: url(icons/xls.png); } + +/* Misc */ +a[href$=".rss"], +a[href$=".rdf"] { background-image: url(icons/feed.png); } +a[href^="aim:"] { background-image: url(icons/im.png); } \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt b/booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt new file mode 100755 index 0000000..4c46535 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt @@ -0,0 +1,10 @@ +RTL +* Mirrors Blueprint, so it can be used with Right-to-Left languages. + +By Ran Yaniv Hartstein, ranh.co.il + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/screen.css b/booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/screen.css new file mode 100755 index 0000000..7e7ccdb --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/plugins/rtl/screen.css @@ -0,0 +1,110 @@ +/* -------------------------------------------------------------- + + rtl.css + * Mirrors Blueprint for left-to-right languages + + By Ran Yaniv Hartstein [ranh.co.il] + +-------------------------------------------------------------- */ + +body .container { direction: rtl; } +body .column, body div.span-1, body div.span-2, body div.span-3, body div.span-4, body div.span-5, body div.span-6, body div.span-7, body div.span-8, body div.span-9, body div.span-10, body div.span-11, body div.span-12, body div.span-13, body div.span-14, body div.span-15, body div.span-16, body div.span-17, body div.span-18, body div.span-19, body div.span-20, body div.span-21, body div.span-22, body div.span-23, body div.span-24 { + float: right; + margin-right: 0; + margin-left: 10px; + text-align:right; +} + +body div.last { margin-left: 0; } +body table .last { padding-left: 0; } + +body .append-1 { padding-right: 0; padding-left: 40px; } +body .append-2 { padding-right: 0; padding-left: 80px; } +body .append-3 { padding-right: 0; padding-left: 120px; } +body .append-4 { padding-right: 0; padding-left: 160px; } +body .append-5 { padding-right: 0; padding-left: 200px; } +body .append-6 { padding-right: 0; padding-left: 240px; } +body .append-7 { padding-right: 0; padding-left: 280px; } +body .append-8 { padding-right: 0; padding-left: 320px; } +body .append-9 { padding-right: 0; padding-left: 360px; } +body .append-10 { padding-right: 0; padding-left: 400px; } +body .append-11 { padding-right: 0; padding-left: 440px; } +body .append-12 { padding-right: 0; padding-left: 480px; } +body .append-13 { padding-right: 0; padding-left: 520px; } +body .append-14 { padding-right: 0; padding-left: 560px; } +body .append-15 { padding-right: 0; padding-left: 600px; } +body .append-16 { padding-right: 0; padding-left: 640px; } +body .append-17 { padding-right: 0; padding-left: 680px; } +body .append-18 { padding-right: 0; padding-left: 720px; } +body .append-19 { padding-right: 0; padding-left: 760px; } +body .append-20 { padding-right: 0; padding-left: 800px; } +body .append-21 { padding-right: 0; padding-left: 840px; } +body .append-22 { padding-right: 0; padding-left: 880px; } +body .append-23 { padding-right: 0; padding-left: 920px; } + +body .prepend-1 { padding-left: 0; padding-right: 40px; } +body .prepend-2 { padding-left: 0; padding-right: 80px; } +body .prepend-3 { padding-left: 0; padding-right: 120px; } +body .prepend-4 { padding-left: 0; padding-right: 160px; } +body .prepend-5 { padding-left: 0; padding-right: 200px; } +body .prepend-6 { padding-left: 0; padding-right: 240px; } +body .prepend-7 { padding-left: 0; padding-right: 280px; } +body .prepend-8 { padding-left: 0; padding-right: 320px; } +body .prepend-9 { padding-left: 0; padding-right: 360px; } +body .prepend-10 { padding-left: 0; padding-right: 400px; } +body .prepend-11 { padding-left: 0; padding-right: 440px; } +body .prepend-12 { padding-left: 0; padding-right: 480px; } +body .prepend-13 { padding-left: 0; padding-right: 520px; } +body .prepend-14 { padding-left: 0; padding-right: 560px; } +body .prepend-15 { padding-left: 0; padding-right: 600px; } +body .prepend-16 { padding-left: 0; padding-right: 640px; } +body .prepend-17 { padding-left: 0; padding-right: 680px; } +body .prepend-18 { padding-left: 0; padding-right: 720px; } +body .prepend-19 { padding-left: 0; padding-right: 760px; } +body .prepend-20 { padding-left: 0; padding-right: 800px; } +body .prepend-21 { padding-left: 0; padding-right: 840px; } +body .prepend-22 { padding-left: 0; padding-right: 880px; } +body .prepend-23 { padding-left: 0; padding-right: 920px; } + +body .border { + padding-right: 0; + padding-left: 4px; + margin-right: 0; + margin-left: 5px; + border-right: none; + border-left: 1px solid #eee; +} + +body .colborder { + padding-right: 0; + padding-left: 24px; + margin-right: 0; + margin-left: 25px; + border-right: none; + border-left: 1px solid #eee; +} + +body .pull-1 { margin-left: 0; margin-right: -40px; } +body .pull-2 { margin-left: 0; margin-right: -80px; } +body .pull-3 { margin-left: 0; margin-right: -120px; } +body .pull-4 { margin-left: 0; margin-right: -160px; } + +body .push-0 { margin: 0 18px 0 0; } +body .push-1 { margin: 0 18px 0 -40px; } +body .push-2 { margin: 0 18px 0 -80px; } +body .push-3 { margin: 0 18px 0 -120px; } +body .push-4 { margin: 0 18px 0 -160px; } +body .push-0, body .push-1, body .push-2, +body .push-3, body .push-4 { float: left; } + + +/* Typography with RTL support */ +body h1,body h2,body h3, +body h4,body h5,body h6 { font-family: Arial, sans-serif; } +html body { font-family: Arial, sans-serif; } +body pre,body code,body tt { font-family: monospace; } + +/* Mirror floats and margins on typographic elements */ +body p img { float: right; margin: 1.5em 0 1.5em 1.5em; } +body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;} +body td, body th { text-align:right; } \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/print.css b/booking-faces/src/main/webapp/styles/blueprint/print.css new file mode 100755 index 0000000..fdb8220 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/print.css @@ -0,0 +1,29 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* print.css */ +body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;} +.container {background:none;} +hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} +code {font:.9em "Courier New", Monaco, Courier, monospace;} +a img {border:none;} +p img.top {margin-top:0;} +blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} +.small {font-size:.9em;} +.large {font-size:1.1em;} +.quiet {color:#999;} +.hide {display:none;} +a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} +a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/screen.css b/booking-faces/src/main/webapp/styles/blueprint/screen.css new file mode 100755 index 0000000..c18b9a5 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/screen.css @@ -0,0 +1,280 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} +body {line-height:1.5;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;} +table, td, th {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:"";} +blockquote, q {quotes:"" "";} +a img {border:none;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:2em;margin-bottom:0.75em;} +h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} +p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} +a:focus, a:hover {color:#000;} +a {color:#009;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong {font-weight:bold;} +em, dfn {font-style:italic;} +dfn {font-weight:bold;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0 1.5em;} +ul, ol {margin:0 1.5em 1.5em 1.5em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tr.even td {background:#e5ecf9;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* forms.css */ +label {font-weight:bold;} +fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} +legend {font-weight:bold;font-size:1.2em;} +input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;} +input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;} +input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} +input.text, input.title {width:300px;padding:5px;} +input.title {font-size:1.5em;} +textarea {width:390px;height:250px;padding:5px;} +input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;} +form.inline {line-height:3;} +form.inline p {margin-bottom:0;} +.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} +.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} +.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} +.success {background:#E6EFC2;color:#264409;border-color:#C6D880;} +.error a {color:#8a1f11;} +.notice a {color:#514721;} +.success a {color:#264409;} + +/* grid.css */ +.container {width:950px;margin:0 auto;} +.showgrid {background:url(src/grid.png);} +.column, div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23, div.span-24 {float:left;margin-right:10px;} +.last, div.last {margin-right:0;} +.span-1 {width:30px;} +.span-2 {width:70px;} +.span-3 {width:110px;} +.span-4 {width:150px;} +.span-5 {width:190px;} +.span-6 {width:230px;} +.span-7 {width:270px;} +.span-8 {width:310px;} +.span-9 {width:350px;} +.span-10 {width:390px;} +.span-11 {width:430px;} +.span-12 {width:470px;} +.span-13 {width:510px;} +.span-14 {width:550px;} +.span-15 {width:590px;} +.span-16 {width:630px;} +.span-17 {width:670px;} +.span-18 {width:710px;} +.span-19 {width:750px;} +.span-20 {width:790px;} +.span-21 {width:830px;} +.span-22 {width:870px;} +.span-23 {width:910px;} +.span-24, div.span-24 {width:950px;margin-right:0;} +input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px!important;border-right-width:1px!important;padding-left:5px!important;padding-right:5px!important;} +input.span-1, textarea.span-1 {width:18px!important;} +input.span-2, textarea.span-2 {width:58px!important;} +input.span-3, textarea.span-3 {width:98px!important;} +input.span-4, textarea.span-4 {width:138px!important;} +input.span-5, textarea.span-5 {width:178px!important;} +input.span-6, textarea.span-6 {width:218px!important;} +input.span-7, textarea.span-7 {width:258px!important;} +input.span-8, textarea.span-8 {width:298px!important;} +input.span-9, textarea.span-9 {width:338px!important;} +input.span-10, textarea.span-10 {width:378px!important;} +input.span-11, textarea.span-11 {width:418px!important;} +input.span-12, textarea.span-12 {width:458px!important;} +input.span-13, textarea.span-13 {width:498px!important;} +input.span-14, textarea.span-14 {width:538px!important;} +input.span-15, textarea.span-15 {width:578px!important;} +input.span-16, textarea.span-16 {width:618px!important;} +input.span-17, textarea.span-17 {width:658px!important;} +input.span-18, textarea.span-18 {width:698px!important;} +input.span-19, textarea.span-19 {width:738px!important;} +input.span-20, textarea.span-20 {width:778px!important;} +input.span-21, textarea.span-21 {width:818px!important;} +input.span-22, textarea.span-22 {width:858px!important;} +input.span-23, textarea.span-23 {width:898px!important;} +input.span-24, textarea.span-24 {width:938px!important;} +.append-1 {padding-right:40px;} +.append-2 {padding-right:80px;} +.append-3 {padding-right:120px;} +.append-4 {padding-right:160px;} +.append-5 {padding-right:200px;} +.append-6 {padding-right:240px;} +.append-7 {padding-right:280px;} +.append-8 {padding-right:320px;} +.append-9 {padding-right:360px;} +.append-10 {padding-right:400px;} +.append-11 {padding-right:440px;} +.append-12 {padding-right:480px;} +.append-13 {padding-right:520px;} +.append-14 {padding-right:560px;} +.append-15 {padding-right:600px;} +.append-16 {padding-right:640px;} +.append-17 {padding-right:680px;} +.append-18 {padding-right:720px;} +.append-19 {padding-right:760px;} +.append-20 {padding-right:800px;} +.append-21 {padding-right:840px;} +.append-22 {padding-right:880px;} +.append-23 {padding-right:920px;} +.prepend-1 {padding-left:40px;} +.prepend-2 {padding-left:80px;} +.prepend-3 {padding-left:120px;} +.prepend-4 {padding-left:160px;} +.prepend-5 {padding-left:200px;} +.prepend-6 {padding-left:240px;} +.prepend-7 {padding-left:280px;} +.prepend-8 {padding-left:320px;} +.prepend-9 {padding-left:360px;} +.prepend-10 {padding-left:400px;} +.prepend-11 {padding-left:440px;} +.prepend-12 {padding-left:480px;} +.prepend-13 {padding-left:520px;} +.prepend-14 {padding-left:560px;} +.prepend-15 {padding-left:600px;} +.prepend-16 {padding-left:640px;} +.prepend-17 {padding-left:680px;} +.prepend-18 {padding-left:720px;} +.prepend-19 {padding-left:760px;} +.prepend-20 {padding-left:800px;} +.prepend-21 {padding-left:840px;} +.prepend-22 {padding-left:880px;} +.prepend-23 {padding-left:920px;} +div.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;} +div.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;} +.pull-1 {margin-left:-40px;} +.pull-2 {margin-left:-80px;} +.pull-3 {margin-left:-120px;} +.pull-4 {margin-left:-160px;} +.pull-5 {margin-left:-200px;} +.pull-6 {margin-left:-240px;} +.pull-7 {margin-left:-280px;} +.pull-8 {margin-left:-320px;} +.pull-9 {margin-left:-360px;} +.pull-10 {margin-left:-400px;} +.pull-11 {margin-left:-440px;} +.pull-12 {margin-left:-480px;} +.pull-13 {margin-left:-520px;} +.pull-14 {margin-left:-560px;} +.pull-15 {margin-left:-600px;} +.pull-16 {margin-left:-640px;} +.pull-17 {margin-left:-680px;} +.pull-18 {margin-left:-720px;} +.pull-19 {margin-left:-760px;} +.pull-20 {margin-left:-800px;} +.pull-21 {margin-left:-840px;} +.pull-22 {margin-left:-880px;} +.pull-23 {margin-left:-920px;} +.pull-24 {margin-left:-960px;} +.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} +.push-1 {margin:0 -40px 1.5em 40px;} +.push-2 {margin:0 -80px 1.5em 80px;} +.push-3 {margin:0 -120px 1.5em 120px;} +.push-4 {margin:0 -160px 1.5em 160px;} +.push-5 {margin:0 -200px 1.5em 200px;} +.push-6 {margin:0 -240px 1.5em 240px;} +.push-7 {margin:0 -280px 1.5em 280px;} +.push-8 {margin:0 -320px 1.5em 320px;} +.push-9 {margin:0 -360px 1.5em 360px;} +.push-10 {margin:0 -400px 1.5em 400px;} +.push-11 {margin:0 -440px 1.5em 440px;} +.push-12 {margin:0 -480px 1.5em 480px;} +.push-13 {margin:0 -520px 1.5em 520px;} +.push-14 {margin:0 -560px 1.5em 560px;} +.push-15 {margin:0 -600px 1.5em 600px;} +.push-16 {margin:0 -640px 1.5em 640px;} +.push-17 {margin:0 -680px 1.5em 680px;} +.push-18 {margin:0 -720px 1.5em 720px;} +.push-19 {margin:0 -760px 1.5em 760px;} +.push-20 {margin:0 -800px 1.5em 800px;} +.push-21 {margin:0 -840px 1.5em 840px;} +.push-22 {margin:0 -880px 1.5em 880px;} +.push-23 {margin:0 -920px 1.5em 920px;} +.push-24 {margin:0 -960px 1.5em 960px;} +.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;} +.prepend-top {margin-top:1.5em;} +.append-bottom {margin-bottom:1.5em;} +.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} + +/* fancy-type */ +p + p {text-indent:2em;margin-top:-1.5em;} +form p + p {text-indent:0;} +.alt {color:#666;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif;font-style:italic;font-weight:normal;} +.dquo {margin-left:-.5em;} +p.incr, .incr p {font-size:10px;line-height:1.44em;margin-bottom:1.5em;} +.caps {font-variant:small-caps;letter-spacing:1px;text-transform:lowercase;font-size:1.2em;line-height:1%;font-weight:bold;padding:0 2px;} + +/* buttons */ +a.button, button {display:block;float:left;margin:0.7em 0.5em 0.7em 0;padding:5px 10px 5px 7px;border:1px solid #dedede;border-top:1px solid #eee;border-left:1px solid #eee;background-color:#f5f5f5;font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;font-size:100%;line-height:130%;text-decoration:none;font-weight:bold;color:#565656;cursor:pointer;} +button {width:auto;overflow:visible;padding:4px 10px 3px 7px;} +button[type] {padding:4px 10px 4px 7px;line-height:17px;} +*:first-child+html button[type] {padding:4px 10px 3px 7px;} +button img, a.button img {margin:0 3px -3px 0 !important;padding:0;border:none;width:16px;height:16px;float:none;} +button:hover, a.button:hover {background-color:#dff4ff;border:1px solid #c2e1ef;color:#336699;} +a.button:active {background-color:#6299c5;border:1px solid #6299c5;color:#fff;} +body .positive {color:#529214;} +a.positive:hover, button.positive:hover {background-color:#E6EFC2;border:1px solid #C6D880;color:#529214;} +a.positive:active {background-color:#529214;border:1px solid #529214;color:#fff;} +body .negative {color:#d12f19;} +a.negative:hover, button.negative:hover {background-color:#fbe3e4;border:1px solid #fbc2c4;color:#d12f19;} +a.negative:active {background-color:#d12f19;border:1px solid #d12f19;color:#fff;} \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/src/forms.css b/booking-faces/src/main/webapp/styles/blueprint/src/forms.css new file mode 100755 index 0000000..b491134 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/src/forms.css @@ -0,0 +1,65 @@ +/* -------------------------------------------------------------- + + forms.css + * Sets up some default styling for forms + * Gives you classes to enhance your forms + + Usage: + * For text fields, use class .title or .text + * For inline forms, use .inline (even when using columns) + +-------------------------------------------------------------- */ + +label { font-weight: bold; } +fieldset { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; } +legend { font-weight: bold; font-size:1.2em; } + + +/* Form fields +-------------------------------------------------------------- */ + +input[type=text], input[type=password], +input.text, input.title, +textarea, select { + background-color:#fff; + border:1px solid #bbb; +} +input[type=text]:focus, input[type=password]:focus, +input.text:focus, input.title:focus, +textarea:focus, select:focus { + border-color:#666; +} + +input[type=text], input[type=password], +input.text, input.title, +textarea, select { + margin:0.5em 0; +} + +input.text, +input.title { width: 300px; padding:5px; } +input.title { font-size:1.5em; } +textarea { width: 390px; height: 250px; padding:5px; } + +input[type=checkbox], input[type=radio], +input.checkbox, input.radio { + position:relative; top:.25em; +} + +form.inline { line-height:3; } +form.inline p { margin-bottom:0; } + + +/* Success, notice and error boxes +-------------------------------------------------------------- */ + +.error, +.notice, +.success { padding: .8em; margin-bottom: 1em; border: 2px solid #ddd; } + +.error { background: #FBE3E4; color: #8a1f11; border-color: #FBC2C4; } +.notice { background: #FFF6BF; color: #514721; border-color: #FFD324; } +.success { background: #E6EFC2; color: #264409; border-color: #C6D880; } +.error a { color: #8a1f11; } +.notice a { color: #514721; } +.success a { color: #264409; } diff --git a/booking-faces/src/main/webapp/styles/blueprint/src/grid.css b/booking-faces/src/main/webapp/styles/blueprint/src/grid.css new file mode 100755 index 0000000..352e0e2 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/src/grid.css @@ -0,0 +1,281 @@ +/* -------------------------------------------------------------- + grid.css + * Sets up an easy-to-use grid of 24 columns. + + By default, the grid is 950px wide, with 24 columns + spanning 30px, and a 10px margin between columns. + + If you need fewer or more columns, namespaces or semantic + element names, use the compressor script (lib/compress.rb) + + Note: Changes made in this file will not be applied when + using the compressor: make changes in lib/blueprint/grid.css.rb +-------------------------------------------------------------- */ + +/* A container should group all your columns. */ +.container { + width: 950px; + margin: 0 auto; +} + +/* Use this class on any div.span / container to see the grid. */ +.showgrid { + background: url(src/grid.png); +} + + +/* Columns +-------------------------------------------------------------- */ + +/* Sets up basic grid floating and margin. */ +.column, div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23, div.span-24 { + float: left; + margin-right: 10px; +} + +/* The last column in a row needs this class. */ +.last, div.last { margin-right: 0; } + +/* Use these classes to set the width of a column. */ +.span-1 {width: 30px;} + +.span-2 {width: 70px;} +.span-3 {width: 110px;} +.span-4 {width: 150px;} +.span-5 {width: 190px;} +.span-6 {width: 230px;} +.span-7 {width: 270px;} +.span-8 {width: 310px;} +.span-9 {width: 350px;} +.span-10 {width: 390px;} +.span-11 {width: 430px;} +.span-12 {width: 470px;} +.span-13 {width: 510px;} +.span-14 {width: 550px;} +.span-15 {width: 590px;} +.span-16 {width: 630px;} +.span-17 {width: 670px;} +.span-18 {width: 710px;} +.span-19 {width: 750px;} +.span-20 {width: 790px;} +.span-21 {width: 830px;} +.span-22 {width: 870px;} +.span-23 {width: 910px;} +.span-24, div.span-24 { width:950px; margin-right:0; } + +/* Use these classes to set the width of an input. */ +input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 { + border-left-width: 1px!important; + border-right-width: 1px!important; + padding-left: 5px!important; + padding-right: 5px!important; +} + +input.span-1, textarea.span-1 { width: 18px!important; } +input.span-2, textarea.span-2 { width: 58px!important; } +input.span-3, textarea.span-3 { width: 98px!important; } +input.span-4, textarea.span-4 { width: 138px!important; } +input.span-5, textarea.span-5 { width: 178px!important; } +input.span-6, textarea.span-6 { width: 218px!important; } +input.span-7, textarea.span-7 { width: 258px!important; } +input.span-8, textarea.span-8 { width: 298px!important; } +input.span-9, textarea.span-9 { width: 338px!important; } +input.span-10, textarea.span-10 { width: 378px!important; } +input.span-11, textarea.span-11 { width: 418px!important; } +input.span-12, textarea.span-12 { width: 458px!important; } +input.span-13, textarea.span-13 { width: 498px!important; } +input.span-14, textarea.span-14 { width: 538px!important; } +input.span-15, textarea.span-15 { width: 578px!important; } +input.span-16, textarea.span-16 { width: 618px!important; } +input.span-17, textarea.span-17 { width: 658px!important; } +input.span-18, textarea.span-18 { width: 698px!important; } +input.span-19, textarea.span-19 { width: 738px!important; } +input.span-20, textarea.span-20 { width: 778px!important; } +input.span-21, textarea.span-21 { width: 818px!important; } +input.span-22, textarea.span-22 { width: 858px!important; } +input.span-23, textarea.span-23 { width: 898px!important; } +input.span-24, textarea.span-24 { width: 938px!important; } + +/* Add these to a column to append empty cols. */ + +.append-1 { padding-right: 40px;} +.append-2 { padding-right: 80px;} +.append-3 { padding-right: 120px;} +.append-4 { padding-right: 160px;} +.append-5 { padding-right: 200px;} +.append-6 { padding-right: 240px;} +.append-7 { padding-right: 280px;} +.append-8 { padding-right: 320px;} +.append-9 { padding-right: 360px;} +.append-10 { padding-right: 400px;} +.append-11 { padding-right: 440px;} +.append-12 { padding-right: 480px;} +.append-13 { padding-right: 520px;} +.append-14 { padding-right: 560px;} +.append-15 { padding-right: 600px;} +.append-16 { padding-right: 640px;} +.append-17 { padding-right: 680px;} +.append-18 { padding-right: 720px;} +.append-19 { padding-right: 760px;} +.append-20 { padding-right: 800px;} +.append-21 { padding-right: 840px;} +.append-22 { padding-right: 880px;} +.append-23 { padding-right: 920px;} + +/* Add these to a column to prepend empty cols. */ + +.prepend-1 { padding-left: 40px;} +.prepend-2 { padding-left: 80px;} +.prepend-3 { padding-left: 120px;} +.prepend-4 { padding-left: 160px;} +.prepend-5 { padding-left: 200px;} +.prepend-6 { padding-left: 240px;} +.prepend-7 { padding-left: 280px;} +.prepend-8 { padding-left: 320px;} +.prepend-9 { padding-left: 360px;} +.prepend-10 { padding-left: 400px;} +.prepend-11 { padding-left: 440px;} +.prepend-12 { padding-left: 480px;} +.prepend-13 { padding-left: 520px;} +.prepend-14 { padding-left: 560px;} +.prepend-15 { padding-left: 600px;} +.prepend-16 { padding-left: 640px;} +.prepend-17 { padding-left: 680px;} +.prepend-18 { padding-left: 720px;} +.prepend-19 { padding-left: 760px;} +.prepend-20 { padding-left: 800px;} +.prepend-21 { padding-left: 840px;} +.prepend-22 { padding-left: 880px;} +.prepend-23 { padding-left: 920px;} + + +/* Border on right hand side of a column. */ +div.border { + padding-right: 4px; + margin-right: 5px; + border-right: 1px solid #eee; +} + +/* Border with more whitespace, spans one column. */ +div.colborder { + padding-right: 24px; + margin-right: 25px; + border-right: 1px solid #eee; +} + + +/* Use these classes on an element to push it into the +next column, or to pull it into the previous column. */ + + +.pull-1 { margin-left: -40px; } +.pull-2 { margin-left: -80px; } +.pull-3 { margin-left: -120px; } +.pull-4 { margin-left: -160px; } +.pull-5 { margin-left: -200px; } +.pull-6 { margin-left: -240px; } +.pull-7 { margin-left: -280px; } +.pull-8 { margin-left: -320px; } +.pull-9 { margin-left: -360px; } +.pull-10 { margin-left: -400px; } +.pull-11 { margin-left: -440px; } +.pull-12 { margin-left: -480px; } +.pull-13 { margin-left: -520px; } +.pull-14 { margin-left: -560px; } +.pull-15 { margin-left: -600px; } +.pull-16 { margin-left: -640px; } +.pull-17 { margin-left: -680px; } +.pull-18 { margin-left: -720px; } +.pull-19 { margin-left: -760px; } +.pull-20 { margin-left: -800px; } +.pull-21 { margin-left: -840px; } +.pull-22 { margin-left: -880px; } +.pull-23 { margin-left: -920px; } +.pull-24 { margin-left: -960px; } + +.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float: left; position:relative;} + + +.push-1 { margin: 0 -40px 1.5em 40px; } +.push-2 { margin: 0 -80px 1.5em 80px; } +.push-3 { margin: 0 -120px 1.5em 120px; } +.push-4 { margin: 0 -160px 1.5em 160px; } +.push-5 { margin: 0 -200px 1.5em 200px; } +.push-6 { margin: 0 -240px 1.5em 240px; } +.push-7 { margin: 0 -280px 1.5em 280px; } +.push-8 { margin: 0 -320px 1.5em 320px; } +.push-9 { margin: 0 -360px 1.5em 360px; } +.push-10 { margin: 0 -400px 1.5em 400px; } +.push-11 { margin: 0 -440px 1.5em 440px; } +.push-12 { margin: 0 -480px 1.5em 480px; } +.push-13 { margin: 0 -520px 1.5em 520px; } +.push-14 { margin: 0 -560px 1.5em 560px; } +.push-15 { margin: 0 -600px 1.5em 600px; } +.push-16 { margin: 0 -640px 1.5em 640px; } +.push-17 { margin: 0 -680px 1.5em 680px; } +.push-18 { margin: 0 -720px 1.5em 720px; } +.push-19 { margin: 0 -760px 1.5em 760px; } +.push-20 { margin: 0 -800px 1.5em 800px; } +.push-21 { margin: 0 -840px 1.5em 840px; } +.push-22 { margin: 0 -880px 1.5em 880px; } +.push-23 { margin: 0 -920px 1.5em 920px; } +.push-24 { margin: 0 -960px 1.5em 960px; } + +.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float: right; position:relative;} + + +/* Misc classes and elements +-------------------------------------------------------------- */ + +/* In case you need to add a gutter above/below an element */ +.prepend-top { + margin-top:1.5em; +} +.append-bottom { + margin-bottom:1.5em; +} + +/* Use a .box to create a padded box inside a column. */ +.box { + padding: 1.5em; + margin-bottom: 1.5em; + background: #E5ECF9; +} + +/* Use this to create a horizontal ruler across a column. */ +hr { + background: #ddd; + color: #ddd; + clear: both; + float: none; + width: 100%; + height: .1em; + margin: 0 0 1.45em; + border: none; +} + +hr.space { + background: #fff; + color: #fff; + visibility: hidden; +} + + +/* Clearing floats without extra markup + Based on How To Clear Floats Without Structural Markup by PiE + [http://www.positioniseverything.net/easyclearing.html] */ + +.clearfix:after, .container:after { + content: "\0020"; + display: block; + height: 0; + clear: both; + visibility: hidden; + overflow:hidden; +} +.clearfix, .container {display: block;} + +/* Regular clearing + apply to column that should drop below previous ones. */ + +.clear { clear:both; } diff --git a/booking-faces/src/main/webapp/styles/blueprint/src/grid.png b/booking-faces/src/main/webapp/styles/blueprint/src/grid.png new file mode 100755 index 0000000000000000000000000000000000000000..b7539f672bd43f6812a54df5dd42ba33b20b9b78 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<>!3HEX<>xE|Qfx`y?k)`fL2$v|<&%LToCO|{ z#X#BvjNMLV+W{Glo-U3d9>YC#XH~G^;0osUz08pk^?RiSy5sjM`N=Z)ZDzmUBEZ4{G>pO1)z4*}Q$iB}{R}RN literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/blueprint/src/ie.css b/booking-faces/src/main/webapp/styles/blueprint/src/ie.css new file mode 100755 index 0000000..214b879 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/src/ie.css @@ -0,0 +1,76 @@ +/* -------------------------------------------------------------- + + ie.css + + Contains every hack for Internet Explorer, + so that our core files stay sweet and nimble. + +-------------------------------------------------------------- */ + +/* Make sure the layout is centered in IE5 */ +body { text-align: center; } +.container { text-align: left; } + +/* Fixes IE margin bugs */ +* html .column, * html div.span-1, * html div.span-2, +* html div.span-3, * html div.span-4, * html div.span-5, +* html div.span-6, * html div.span-7, * html div.span-8, +* html div.span-9, * html div.span-10, * html div.span-11, +* html div.span-12, * html div.span-13, * html div.span-14, +* html div.span-15, * html div.span-16, * html div.span-17, +* html div.span-18, * html div.span-19, * html div.span-20, +* html div.span-21, * html div.span-22, * html div.span-23, +* html div.span-24 { display:inline; overflow-x: hidden; } + + +/* Elements +-------------------------------------------------------------- */ + +/* Fixes incorrect styling of legend in IE6. */ +* html legend { margin:0px -8px 16px 0; padding:0; } + +/* Fixes wrong line-height on sup/sub in IE. */ +sup { vertical-align:text-top; } +sub { vertical-align:text-bottom; } + +/* Fixes IE7 missing wrapping of code elements. */ +html>body p code { *white-space: normal; } + +/* IE 6&7 has problems with setting proper


margins. */ +hr { margin:-8px auto 11px; } + +/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */ +img { -ms-interpolation-mode:bicubic; } + +/* Clearing +-------------------------------------------------------------- */ + +/* Makes clearfix actually work in IE */ +.clearfix, .container { display:inline-block; } +* html .clearfix, +* html .container { height:1%; } + + +/* Forms +-------------------------------------------------------------- */ + +/* Fixes padding on fieldset */ +fieldset { padding-top:0; } + +/* Makes classic textareas in IE 6 resemble other browsers */ +textarea { overflow:auto; } + +/* Fixes rule that IE 6 ignores */ +input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; } +input.text:focus, input.title:focus { border-color:#666; } +input.text, input.title, textarea, select { margin:0.5em 0; } +input.checkbox, input.radio { position:relative; top:.25em; } + +/* Fixes alignment of inline form elements */ +form.inline div, form.inline p { vertical-align:middle; } +form.inline label { position:relative;top:-0.25em; } +form.inline input.checkbox, form.inline input.radio, +form.inline input.button, form.inline button { + margin:0.5em 0; +} +button, input.button { position:relative;top:0.25em; } \ No newline at end of file diff --git a/booking-faces/src/main/webapp/styles/blueprint/src/print.css b/booking-faces/src/main/webapp/styles/blueprint/src/print.css new file mode 100755 index 0000000..d303029 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/src/print.css @@ -0,0 +1,85 @@ +/* -------------------------------------------------------------- + + print.css + * Gives you some sensible styles for printing pages. + * See Readme file in this directory for further instructions. + + Some additions you'll want to make, customized to your markup: + #header, #footer, #navigation { display:none; } + +-------------------------------------------------------------- */ + +body { + line-height: 1.5; + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + color:#000; + background: none; + font-size: 10pt; +} + + +/* Layout +-------------------------------------------------------------- */ + +.container { + background: none; +} + +hr { + background:#ccc; + color:#ccc; + width:100%; + height:2px; + margin:2em 0; + padding:0; + border:none; +} +hr.space { + background: #fff; + color: #fff; + visibility: hidden; +} + + +/* Text +-------------------------------------------------------------- */ + +h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; } +code { font:.9em "Courier New", Monaco, Courier, monospace; } + +a img { border:none; } +p img.top { margin-top: 0; } + +blockquote { + margin:1.5em; + padding:1em; + font-style:italic; + font-size:.9em; +} + +.small { font-size: .9em; } +.large { font-size: 1.1em; } +.quiet { color: #999; } +.hide { display:none; } + + +/* Links +-------------------------------------------------------------- */ + +a:link, a:visited { + background: transparent; + font-weight:700; + text-decoration: underline; +} + +a:link:after, a:visited:after { + content: " (" attr(href) ")"; + font-size: 90%; +} + +/* If you're having trouble printing relative links, uncomment and customize this: + (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */ + +/* a[href^="/"]:after { + content: " (http://www.yourdomain.com" attr(href) ") "; +} */ diff --git a/booking-faces/src/main/webapp/styles/blueprint/src/reset.css b/booking-faces/src/main/webapp/styles/blueprint/src/reset.css new file mode 100755 index 0000000..fc0788c --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/src/reset.css @@ -0,0 +1,38 @@ +/* -------------------------------------------------------------- + + reset.css + * Resets default browser CSS. + +-------------------------------------------------------------- */ + +html, body, div, span, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, code, +del, dfn, em, img, q, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + font-weight: inherit; + font-style: inherit; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; +} + +body { + line-height: 1.5; +} + +/* Tables still need 'cellspacing="0"' in the markup. */ +table { border-collapse: separate; border-spacing: 0; } +caption, th, td { text-align: left; font-weight: normal; } +table, td, th { vertical-align: middle; } + +/* Remove possible quote marks (") from ,
. */ +blockquote:before, blockquote:after, q:before, q:after { content: ""; } +blockquote, q { quotes: "" ""; } + +/* Remove annoying border on linked images. */ +a img { border: none; } diff --git a/booking-faces/src/main/webapp/styles/blueprint/src/typography.css b/booking-faces/src/main/webapp/styles/blueprint/src/typography.css new file mode 100755 index 0000000..6cc099c --- /dev/null +++ b/booking-faces/src/main/webapp/styles/blueprint/src/typography.css @@ -0,0 +1,106 @@ +/* -------------------------------------------------------------- + + typography.css + * Sets up some sensible default typography. + +-------------------------------------------------------------- */ + +/* Default font settings. + The font-size percentage is of 16px. (0.75 * 16px = 12px) */ +html { font-size:100.01%; } +body { + font-size: 75%; + color: #222; + background: #fff; + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; +} + + +/* Headings +-------------------------------------------------------------- */ + +h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; } + +h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; } +h2 { font-size: 2em; margin-bottom: 0.75em; } +h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; } +h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; } +h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; } +h6 { font-size: 1em; font-weight: bold; } + +h1 img, h2 img, h3 img, +h4 img, h5 img, h6 img { + margin: 0; +} + + +/* Text elements +-------------------------------------------------------------- */ + +p { margin: 0 0 1.5em; } +p img.left { float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; } +p img.right { float: right; margin: 1.5em 0 1.5em 1.5em; } + +a:focus, +a:hover { color: #000; } +a { color: #009; text-decoration: underline; } + +blockquote { margin: 1.5em; color: #666; font-style: italic; } +strong { font-weight: bold; } +em,dfn { font-style: italic; } +dfn { font-weight: bold; } +sup, sub { line-height: 0; } + +abbr, +acronym { border-bottom: 1px dotted #666; } +address { margin: 0 0 1.5em; font-style: italic; } +del { color:#666; } + +pre { margin: 1.5em 0; white-space: pre; } +pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; } + + +/* Lists +-------------------------------------------------------------- */ + +li ul, +li ol { margin: 0; } +ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; } + +ul { list-style-type: disc; } +ol { list-style-type: decimal; } + +dl { margin: 0 0 1.5em 0; } +dl dt { font-weight: bold; } +dd { margin-left: 1.5em;} + + +/* Tables +-------------------------------------------------------------- */ + +table { margin-bottom: 1.4em; width:100%; } +th { font-weight: bold; } +thead th { background: #c3d9ff; } +th,td,caption { padding: 4px 10px 4px 5px; } +tr.even td { background: #e5ecf9; } +tfoot { font-style: italic; } +caption { background: #eee; } + + +/* Misc classes +-------------------------------------------------------------- */ + +.small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; } +.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; } +.hide { display: none; } + +.quiet { color: #666; } +.loud { color: #000; } +.highlight { background:#ff0; } +.added { background:#060; color: #fff; } +.removed { background:#900; color: #fff; } + +.first { margin-left:0; padding-left:0; } +.last { margin-right:0; padding-right:0; } +.top { margin-top:0; padding-top:0; } +.bottom { margin-bottom:0; padding-bottom:0; } diff --git a/booking-faces/src/main/webapp/styles/booking.css b/booking-faces/src/main/webapp/styles/booking.css new file mode 100644 index 0000000..0f30e21 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/booking.css @@ -0,0 +1,59 @@ + +a,a:visited,a:link,a:active { + color: #59924B; + background-color: transparent; + text-decoration: none; + font-weight: bold; +} + +a:hover { + color: white; + background-color: #65a242; + text-decoration: none; + font-weight: bold; +} + +input[type=submit] { + color: #fff; + background: #fff url(../images/btn.bg.gif) 0 0 repeat-x; + border-style: none; + margin:0.4em 0.4em 0.4em 0; + height: 1.8em; +} + +input[type=submit]:hover { + color: yellow; + background: #fff url(../images/btn.bg.gif) 0 0 repeat-x; + border-style: none; +} + +label { + margin-right: 0.5em; +} + +.summary { + width: 100%; + border: 1px solid #414f23; + border-collapse: collapse; +} + +.summary thead th { + border-left: 1px solid #414f23; + background: #fff url(../images/th.bg.gif) 0 100% repeat-x; + border-bottom: 1px solid #414f23; + padding: 6px; + text-align: left; + font-size: small; +} + +.summary tbody td { + border-left: 1px solid #9cac7c; + padding: 4px; + border-bottom: 1px solid #9cac7c; + font-size: 8pt; +} + +.label { + font-weight: bold; +} + diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-anim_basic_16x16.gif b/booking-faces/src/main/webapp/styles/le-frog/images/ui-anim_basic_16x16.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..d5359734addf88aba5336a6307154af075a08488 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dE?w&4=ArY-_&lxfvP!M1+Jg|R~ zd8A6oi3@z&eNCr<=KbLh*2~7Yc C+ah}a literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_diagonals-thick_15_444444_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..88e46a6d36db2bd625919728b0466cb906555a43 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEM?75|Ln2z=UXSH!Hjr?+cw0xI z`}Du?iM&_Dxie?QFHX_8Z_~x&?s#~Q6G#50BNCsz?LXctf4_6_`MZ%}r?T#g2k^3U z1_-jN2Z*vim{J(DlUAp0^9(y31>^>W zb>&W)xyfXk=ejA4xs$eTx_Cov<Cii(d_W8cNkG$L-`R@$q zn@5%f)7iHLis4`l6vV*-6vY8d?tS+UNn;r>{9^q>(ouHAok#;u#zE>A6u?0YD1w6! zPzVQmpcoF;KtUWVKv5jPtc-(_2X#f+5f@tqJn_Fe4?OurA`KLH%ZUR8a1aBE;J`MC zZIZgOe{7R9mf0rhElb8WNkLgKwn-|=HnC08PzKm0=_)IZZIVb?HdovvKVy)l#X#Lp Q?f?J)07*qoM6N<$f-iMwdH?_b literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_glass_55_fbf5d0_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..0f45be78cb36f5b4a79de87a64dcead52eafbab9 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq?|lm978O6-<~(*Y6uWuzBu#F z{}wqH>B6;jiWLkKP5O0Ijuy$?W?3-hQ}nZ2;Z90I6Be*+@>7}Retyl{AFb(Ln)!FK X<9Xj-UL!IUXc~j3tDnm{r-UW|cB?6| literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-hard_30_285c00_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..c341f5ef3f12b9479459364fbdf73c77b0346e51 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l!K>>V~E7myZr|_8yEx*JAE${ zeO_3;e(n5dM*;hVjdh1AWknC{pTMT-))$y%BA3EnlvY~v{^-ou+<@EqC3_m#EiUVL U9h~-#31}9Br>mdKI;Vst0M0HZ(EtDd literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_33_3a8104_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..3b32c4f380cd2d762e69c29361f03416398c75aa GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#{26V~E7mtNn(24F&>-*Zdad ze-!=aYm(S4y&j&D&ZLuFBIjOjU@+^F@LFmj?7Y=B>Q`Wrzl>L0!P+%y{~o?SUdXKb W(79D_>8~1~X$+pOelF{r5}E)}#wl3< literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_50_4eb305_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..65518690918eec58cd2bdeb98d6110f5c7ca217a GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l&hzUV~E7mtLF{54jAw_U+njv zVg0qlHaK~uGq2}2p0l4O2y&b$HD^EI*rAdlSafd5?^#t#`FlUFYz(~eqDlAA4}Smm ak6ATBT+VowIC%gKWbkzLb6Mw<&;$V1ODdcI literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-bg_highlight-soft_60_4ca20b_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c83c01ed0ca77974d2749ed991d5141eae2efc GIT binary patch literal 134 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 W{n<*kA)EjA%Y34)uU4z#5c5B&;wmrz literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/images/ui-icons_cd0a0a_256x240.png b/booking-faces/src/main/webapp/styles/le-frog/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab019b73ec11a485fa09378f3a0e155194f6a5d GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/booking-faces/src/main/webapp/styles/le-frog/jquery-ui-1.8.2.custom.css b/booking-faces/src/main/webapp/styles/le-frog/jquery-ui-1.8.2.custom.css new file mode 100644 index 0000000..ef94882 --- /dev/null +++ b/booking-faces/src/main/webapp/styles/le-frog/jquery-ui-1.8.2.custom.css @@ -0,0 +1,489 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=10px&bgColorHeader=3a8104&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=33&borderColorHeader=3f7506&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=285c00&bgTextureContent=05_inset_soft.png&bgImgOpacityContent=10&borderColorContent=72b42d&fcContent=ffffff&iconColorContent=72b42d&bgColorDefault=4ca20b&bgTextureDefault=03_highlight_soft.png&bgImgOpacityDefault=60&borderColorDefault=45930b&fcDefault=ffffff&iconColorDefault=ffffff&bgColorHover=4eb305&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=50&borderColorHover=8bd83b&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=285c00&bgTextureActive=04_highlight_hard.png&bgImgOpacityActive=30&borderColorActive=72b42d&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fbf5d0&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=4eb305&bgColorError=ffdc2e&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=95&borderColorError=fad000&fcError=2b2b2b&iconColorError=cd0a0a&bgColorOverlay=444444&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=15&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=07_diagonals_small.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=0px&offsetTopShadow=4px&offsetLeftShadow=4px&cornerRadiusShadow=4px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #72b42d; background: #285c00 url(images/ui-bg_inset-soft_10_285c00_1x100.png) 50% bottom repeat-x; color: #ffffff; } +.ui-widget-content a { color: #ffffff; } +.ui-widget-header { border: 1px solid #3f7506; background: #3a8104 url(images/ui-bg_highlight-soft_33_3a8104_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #45930b; background: #4ca20b url(images/ui-bg_highlight-soft_60_4ca20b_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #ffffff; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #8bd83b; background: #4eb305 url(images/ui-bg_highlight-soft_50_4eb305_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; } +.ui-state-hover a, .ui-state-hover a:hover { color: #ffffff; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #72b42d; background: #285c00 url(images/ui-bg_highlight-hard_30_285c00_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #f9dd34; background: #fbf5d0 url(images/ui-bg_glass_55_fbf5d0_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #fad000; background: #ffdc2e url(images/ui-bg_diagonals-thick_95_ffdc2e_40x40.png) 50% 50% repeat; color: #2b2b2b; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #2b2b2b; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #2b2b2b; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_72b42d_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_72b42d_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_4eb305_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 10px; -webkit-border-top-left-radius: 10px; border-top-left-radius: 10px; } +.ui-corner-tr { -moz-border-radius-topright: 10px; -webkit-border-top-right-radius: 10px; border-top-right-radius: 10px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 10px; -webkit-border-bottom-left-radius: 10px; border-bottom-left-radius: 10px; } +.ui-corner-br { -moz-border-radius-bottomright: 10px; -webkit-border-bottom-right-radius: 10px; border-bottom-right-radius: 10px; } +.ui-corner-top { -moz-border-radius-topleft: 10px; -webkit-border-top-left-radius: 10px; border-top-left-radius: 10px; -moz-border-radius-topright: 10px; -webkit-border-top-right-radius: 10px; border-top-right-radius: 10px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 10px; -webkit-border-bottom-left-radius: 10px; border-bottom-left-radius: 10px; -moz-border-radius-bottomright: 10px; -webkit-border-bottom-right-radius: 10px; border-bottom-right-radius: 10px; } +.ui-corner-right { -moz-border-radius-topright: 10px; -webkit-border-top-right-radius: 10px; border-top-right-radius: 10px; -moz-border-radius-bottomright: 10px; -webkit-border-bottom-right-radius: 10px; border-bottom-right-radius: 10px; } +.ui-corner-left { -moz-border-radius-topleft: 10px; -webkit-border-top-left-radius: 10px; border-top-left-radius: 10px; -moz-border-radius-bottomleft: 10px; -webkit-border-bottom-left-radius: 10px; border-bottom-left-radius: 10px; } +.ui-corner-all { -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; } + +/* Overlays */ +.ui-widget-overlay { background: #444444 url(images/ui-bg_diagonals-thick_15_444444_40x40.png) 50% 50% repeat; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: 4px 0 0 4px; padding: 0px; background: #aaaaaa url(images/ui-bg_diagonals-small_0_aaaaaa_40x40.png) 50% 50% repeat; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Selectable +----------------------------------*/ +.ui-selectable-helper { border:1px dotted black } +/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +/* IE7-/Win - Fix extra vertical space in lists */ +.ui-accordion a { zoom: 1; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete +----------------------------------*/ +.ui-autocomplete { position: absolute; cursor: default; } +.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* Menu +----------------------------------*/ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* Button +----------------------------------*/ + +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ + + + + + +/* Dialog +----------------------------------*/ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs +----------------------------------*/ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/booking-faces/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java b/booking-faces/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java new file mode 100644 index 0000000..4276dae --- /dev/null +++ b/booking-faces/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java @@ -0,0 +1,83 @@ +package org.springframework.webflow.samples.booking; + +import org.easymock.EasyMock; +import org.springframework.faces.model.converter.FacesConversionService; +import org.springframework.webflow.config.FlowDefinitionResource; +import org.springframework.webflow.config.FlowDefinitionResourceFactory; +import org.springframework.webflow.core.collection.LocalAttributeMap; +import org.springframework.webflow.core.collection.MutableAttributeMap; +import org.springframework.webflow.test.MockExternalContext; +import org.springframework.webflow.test.MockFlowBuilderContext; +import org.springframework.webflow.test.execution.AbstractXmlFlowExecutionTests; + +public class BookingFlowExecutionTests extends AbstractXmlFlowExecutionTests { + + private BookingService bookingService; + + protected void setUp() { + bookingService = EasyMock.createMock(BookingService.class); + } + + @Override + protected FlowDefinitionResource getResource(FlowDefinitionResourceFactory resourceFactory) { + return resourceFactory.createFileResource("src/main/webapp/WEB-INF/flows/booking/booking-flow.xml"); + } + + @Override + protected void configureFlowBuilderContext(MockFlowBuilderContext builderContext) { + builderContext.registerBean("bookingService", bookingService); + builderContext.getFlowBuilderServices().setConversionService(new FacesConversionService()); + } + + public void testStartBookingFlow() { + Booking booking = createTestBooking(); + + EasyMock.expect(bookingService.createBooking(1L, "keith")).andReturn(booking); + + EasyMock.replay(bookingService); + + MutableAttributeMap input = new LocalAttributeMap(); + input.put("hotelId", "1"); + MockExternalContext context = new MockExternalContext(); + context.setCurrentUser("keith"); + startFlow(input, context); + + assertCurrentStateEquals("enterBookingDetails"); + assertResponseWrittenEquals("enterBookingDetails", context); + assertTrue(getRequiredFlowAttribute("booking") instanceof Booking); + + EasyMock.verify(bookingService); + } + + public void testEnterBookingDetails_Proceed() { + setCurrentState("enterBookingDetails"); + getFlowScope().put("booking", createTestBooking()); + + MockExternalContext context = new MockExternalContext(); + context.setEventId("proceed"); + resumeFlow(context); + + assertCurrentStateEquals("reviewBooking"); + assertResponseWrittenEquals("reviewBooking", context); + } + + public void testReviewBooking_Confirm() { + setCurrentState("reviewBooking"); + getFlowScope().put("booking", createTestBooking()); + MockExternalContext context = new MockExternalContext(); + context.setEventId("confirm"); + resumeFlow(context); + assertFlowExecutionEnded(); + assertFlowExecutionOutcomeEquals("bookingConfirmed"); + } + + private Booking createTestBooking() { + Hotel hotel = new Hotel(); + hotel.setId(1L); + hotel.setName("Jameson Inn"); + User user = new User("keith", "pass", "Keith Donald"); + Booking booking = new Booking(hotel, user); + return booking; + } + +} diff --git a/booking-faces/src/test/java/org/springframework/webflow/samples/booking/MainFlowExecutionTests.java b/booking-faces/src/test/java/org/springframework/webflow/samples/booking/MainFlowExecutionTests.java new file mode 100644 index 0000000..9feca43 --- /dev/null +++ b/booking-faces/src/test/java/org/springframework/webflow/samples/booking/MainFlowExecutionTests.java @@ -0,0 +1,119 @@ +package org.springframework.webflow.samples.booking; + +import java.util.ArrayList; +import java.util.List; + +import javax.faces.model.DataModel; + +import org.easymock.EasyMock; +import org.springframework.binding.mapping.Mapper; +import org.springframework.binding.mapping.MappingResults; +import org.springframework.faces.model.converter.FacesConversionService; +import org.springframework.webflow.config.FlowDefinitionResource; +import org.springframework.webflow.config.FlowDefinitionResourceFactory; +import org.springframework.webflow.core.collection.AttributeMap; +import org.springframework.webflow.engine.EndState; +import org.springframework.webflow.engine.Flow; +import org.springframework.webflow.test.MockExternalContext; +import org.springframework.webflow.test.MockFlowBuilderContext; +import org.springframework.webflow.test.execution.AbstractXmlFlowExecutionTests; + +public class MainFlowExecutionTests extends AbstractXmlFlowExecutionTests { + + private BookingService bookingService; + + protected void setUp() { + bookingService = EasyMock.createMock(BookingService.class); + } + + @Override + protected FlowDefinitionResource getResource(FlowDefinitionResourceFactory resourceFactory) { + return resourceFactory.createFileResource("src/main/webapp/WEB-INF/flows/main/main-flow.xml"); + } + + @Override + protected void configureFlowBuilderContext(MockFlowBuilderContext builderContext) { + builderContext.registerBean("bookingService", bookingService); + builderContext.getFlowBuilderServices().setConversionService(new FacesConversionService()); + } + + public void testStartMainFlow() { + List bookings = new ArrayList(); + bookings.add(new Booking(new Hotel(), new User("keith", "password", "Keith Donald"))); + EasyMock.expect(bookingService.findBookings("keith")).andReturn(bookings); + EasyMock.replay(bookingService); + + MockExternalContext context = new MockExternalContext(); + context.setCurrentUser("keith"); + startFlow(context); + assertCurrentStateEquals("enterSearchCriteria"); + assertResponseWrittenEquals("enterSearchCriteria", context); + assertTrue(getRequiredFlowAttribute("searchCriteria") instanceof SearchCriteria); + assertTrue(getRequiredViewAttribute("bookings") instanceof DataModel); + + EasyMock.verify(bookingService); + } + + public void testSearchHotels() { + setCurrentState("enterSearchCriteria"); + + SearchCriteria criteria = new SearchCriteria(); + criteria.setSearchString("Jameson"); + getFlowScope().put("searchCriteria", criteria); + + MockExternalContext context = new MockExternalContext(); + context.setEventId("search"); + resumeFlow(context); + + assertCurrentStateEquals("reviewHotels"); + assertResponseWrittenEquals("reviewHotels", context); + assertTrue(getRequiredViewAttribute("hotels") instanceof HotelLazyDataModel); + } + + public void testSelectHotel() { + setCurrentState("reviewHotels"); + + List hotels = new ArrayList(); + Hotel hotel = new Hotel(); + hotel.setId(1L); + hotel.setName("Jameson Inn"); + hotels.add(hotel); + HotelLazyDataModel dataModel = new HotelLazyDataModel(null, null); + dataModel.setSelected(hotel); + getViewScope().put("hotels", dataModel); + + MockExternalContext context = new MockExternalContext(); + context.setEventId("select"); + resumeFlow(context); + + assertCurrentStateEquals("reviewHotel"); + assertNull(getFlowAttribute("hotels")); + assertSame(hotel, getFlowAttribute("hotel")); + } + + public void testBookHotel() { + setCurrentState("reviewHotel"); + + Hotel hotel = new Hotel(); + hotel.setId(1L); + hotel.setName("Jameson Inn"); + getFlowScope().put("hotel", hotel); + + Flow mockBookingFlow = new Flow("booking"); + mockBookingFlow.setInputMapper(new Mapper() { + public MappingResults map(Object source, Object target) { + assertEquals(new Long(1), ((AttributeMap) source).get("hotelId")); + return null; + } + }); + new EndState(mockBookingFlow, "bookingConfirmed"); + getFlowDefinitionRegistry().registerFlowDefinition(mockBookingFlow); + + MockExternalContext context = new MockExternalContext(); + context.setEventId("book"); + resumeFlow(context); + + assertFlowExecutionEnded(); + assertFlowExecutionOutcomeEquals("finish"); + } +} diff --git a/booking-faces/src/test/resources/.gitignore b/booking-faces/src/test/resources/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/booking-mvc/build.xml b/booking-mvc/build.xml new file mode 100755 index 0000000..914de0d --- /dev/null +++ b/booking-mvc/build.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/booking-mvc/pom.xml b/booking-mvc/pom.xml new file mode 100644 index 0000000..5732145 --- /dev/null +++ b/booking-mvc/pom.xml @@ -0,0 +1,262 @@ + + + 4.0.0 + org.springframework.webflow.samples + booking-mvc + war + Hotel Booking : Spring MVC + Web Flow + JSP + 1.0.0.BUILD-SNAPSHOT + + + 3.1.1.RELEASE + 3.0.2.RELEASE + 2.3.1.RELEASE + 1.5.10 + + + + + spring-repository + Spring project snapshots, milestones, and releases + http://repo.springsource.org/snapshot + + + + + + + org.springframework + spring-webmvc + ${springframework-version} + + + + commons-logging + commons-logging + + + + + org.springframework + spring-jdbc + ${springframework-version} + + + org.springframework + spring-orm + ${springframework-version} + + + org.springframework.webflow + spring-webflow + ${webflow-version} + + + org.springframework.webflow + spring-js + ${webflow-version} + + + org.springframework.security + spring-security-web + ${springsecurity-version} + + + + commons-logging + commons-logging + + + + + org.springframework.security + spring-security-taglibs + ${springsecurity-version} + + + org.springframework.security + spring-security-config + ${springsecurity-version} + + + + commons-logging + commons-logging + + + + + + org.slf4j + slf4j-api + ${slf4j-version} + + + org.slf4j + jcl-over-slf4j + ${slf4j-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + runtime + + + log4j + log4j + 1.2.15 + + + javax.mail + mail + + + javax.jms + jms + + + com.sun.jdmk + jmxtools + + + com.sun.jmx + jmxri + + + runtime + + + + org.hsqldb + hsqldb + 1.8.0.10 + runtime + + + org.hibernate + hibernate-entitymanager + 3.5.0-Final + + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.servlet.jsp + jsp-api + 2.1 + provided + + + javax.servlet + jstl + 1.2 + + + + org.apache.tiles + tiles-jsp + 2.1.3 + + + + commons-logging + commons-logging-api + + + + + + org.hibernate + hibernate-validator + 4.1.0.Beta1 + + + + javax.xml.bind + jaxb-api + 2.1 + + + + joda-time + joda-time + 1.6 + + + joda-time + joda-time-jsptags + 1.0.2 + runtime + + + + org.easymock + easymock + 2.5.2 + test + + + junit + junit + 3.8.2 + test + + + org.springframework + spring-test + ${springframework-version} + test + + + + + booking-mvc + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.1.12 + + junit:junit + + **/*Tests.java + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.0-SNAPSHOT + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + true + false + 2.0 + + + + + diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Amenity.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Amenity.java new file mode 100644 index 0000000..9b1c225 --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Amenity.java @@ -0,0 +1,5 @@ +package org.springframework.webflow.samples.booking; + +public enum Amenity { + OCEAN_VIEW, LATE_CHECKOUT, MINIBAR; +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java new file mode 100755 index 0000000..b25931c --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java @@ -0,0 +1,215 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Set; + +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.Future; +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.NotEmpty; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * A Hotel Booking made by a User. + */ +@Entity +@BookingDateRange +public class Booking implements Serializable { + + private Long id; + + private User user; + + private Hotel hotel; + + @DateTimeFormat(pattern = "MM-dd-yyyy") + private Date checkinDate; + + @DateTimeFormat(pattern = "MM-dd-yyyy") + private Date checkoutDate; + + private String creditCard; + + private String creditCardName; + + private int creditCardExpiryMonth; + + private int creditCardExpiryYear; + + private boolean smoking; + + private int beds; + + private Set amenities; + + public Booking() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckinDate(calendar.getTime()); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckoutDate(calendar.getTime()); + } + + public Booking(Hotel hotel, User user) { + this(); + this.hotel = hotel; + this.user = user; + } + + @Transient + public BigDecimal getTotal() { + return hotel.getPrice().multiply(new BigDecimal(getNights())); + } + + @Transient + public int getNights() { + if (checkinDate == null || checkoutDate == null) { + return 0; + } else { + return (int) ((checkoutDate.getTime() - checkinDate.getTime()) / 1000 / 60 / 60 / 24); + } + } + + @Id + @GeneratedValue(strategy = GenerationType.TABLE) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Basic + @Temporal(TemporalType.DATE) + @NotNull + @Future + public Date getCheckinDate() { + return checkinDate; + } + + public void setCheckinDate(Date datetime) { + this.checkinDate = datetime; + } + + @ManyToOne + public Hotel getHotel() { + return hotel; + } + + public void setHotel(Hotel hotel) { + this.hotel = hotel; + } + + @ManyToOne + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Basic + @Temporal(TemporalType.DATE) + @NotNull + @Future + public Date getCheckoutDate() { + return checkoutDate; + } + + public void setCheckoutDate(Date checkoutDate) { + this.checkoutDate = checkoutDate; + } + + @NotEmpty + public String getCreditCard() { + return creditCard; + } + + public void setCreditCard(String creditCard) { + this.creditCard = creditCard; + } + + @Transient + public String getDescription() { + DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); + return hotel == null ? null : hotel.getName() + ", " + df.format(getCheckinDate()) + " to " + + df.format(getCheckoutDate()); + } + + public boolean isSmoking() { + return smoking; + } + + public void setSmoking(boolean smoking) { + this.smoking = smoking; + } + + public int getBeds() { + return beds; + } + + public void setBeds(int beds) { + this.beds = beds; + } + + @NotEmpty + public String getCreditCardName() { + return creditCardName; + } + + public void setCreditCardName(String creditCardName) { + this.creditCardName = creditCardName; + } + + public int getCreditCardExpiryMonth() { + return creditCardExpiryMonth; + } + + public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { + this.creditCardExpiryMonth = creditCardExpiryMonth; + } + + public int getCreditCardExpiryYear() { + return creditCardExpiryYear; + } + + public void setCreditCardExpiryYear(int creditCardExpiryYear) { + this.creditCardExpiryYear = creditCardExpiryYear; + } + + @Transient + public Set getAmenities() { + return amenities; + } + + public void setAmenities(Set amenities) { + this.amenities = amenities; + } + + private Date today() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + return calendar.getTime(); + } + + @Override + public String toString() { + return "Booking(" + user + "," + hotel + ")"; + } + +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java new file mode 100644 index 0000000..a5cad18 --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java @@ -0,0 +1,22 @@ +package org.springframework.webflow.samples.booking; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +@Constraint(validatedBy = BookingDateRangeValidator.class) +@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface BookingDateRange { + + String message() default "Invalid check-in and check-out date range"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java new file mode 100644 index 0000000..716a40b --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java @@ -0,0 +1,19 @@ +package org.springframework.webflow.samples.booking; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class BookingDateRangeValidator implements ConstraintValidator { + + public void initialize(BookingDateRange bookingDateRange) { + } + + public boolean isValid(Booking booking, ConstraintValidatorContext context) { + if ((booking.getCheckinDate() != null) && (booking.getCheckoutDate() != null) + && booking.getCheckoutDate().before(booking.getCheckinDate())) { + return false; + } + return true; + } + +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingFlowHandler.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingFlowHandler.java new file mode 100644 index 0000000..726f2bd --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingFlowHandler.java @@ -0,0 +1,30 @@ +package org.springframework.webflow.samples.booking; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.webflow.core.FlowException; +import org.springframework.webflow.execution.FlowExecutionOutcome; +import org.springframework.webflow.execution.repository.NoSuchFlowExecutionException; +import org.springframework.webflow.mvc.servlet.AbstractFlowHandler; + +public class BookingFlowHandler extends AbstractFlowHandler { + + private static final String DEFAULT_URL = "/hotels/search"; + + @Override + public String handleExecutionOutcome(FlowExecutionOutcome outcome, HttpServletRequest request, + HttpServletResponse response) { + return DEFAULT_URL; + } + + @Override + public String handleException(FlowException e, HttpServletRequest request, HttpServletResponse response) { + if (e instanceof NoSuchFlowExecutionException) { + return DEFAULT_URL; + } else { + throw e; + } + } + +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java new file mode 100755 index 0000000..f6b6f9d --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java @@ -0,0 +1,52 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +/** + * A service interface for retrieving hotels and bookings from a backing repository. Also supports the ability to cancel + * a booking. + */ +public interface BookingService { + + /** + * Find bookings made by the given user + * @param username the user's name + * @return their bookings + */ + public List findBookings(String username); + + /** + * Find hotels available for booking by some criteria. + * @param criteria the search criteria + * @return a list of hotels meeting the criteria + */ + public List findHotels(SearchCriteria criteria); + + /** + * Find hotels by their identifier. + * @param id the hotel id + * @return the hotel + */ + public Hotel findHotelById(Long id); + + /** + * Create a new, transient hotel booking instance for the given user. + * @param hotelId the hotelId + * @param userName the user name + * @return the new transient booking instance + */ + public Booking createBooking(Long hotelId, String userName); + + /** + * Persist the booking to the database + * @param booking the booking + */ + public void persistBooking(Booking booking); + + /** + * Cancel an existing booking. + * @param id the booking id + */ + public void cancelBooking(Long id); + +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java new file mode 100755 index 0000000..99719e5 --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java @@ -0,0 +1,107 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * A hotel where users may book stays. + */ +@Entity +public class Hotel implements Serializable { + private Long id; + + private String name; + + private String address; + + private String city; + + private String state; + + private String zip; + + private String country; + + private BigDecimal price; + + @Id + @GeneratedValue + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + @Column(precision = 6, scale = 2) + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public Booking createBooking(User user) { + return new Booking(this, user); + } + + @Override + public String toString() { + return "Hotel(" + name + "," + address + "," + city + "," + zip + ")"; + } +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/HotelsController.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/HotelsController.java new file mode 100644 index 0000000..fb49728 --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/HotelsController.java @@ -0,0 +1,50 @@ +package org.springframework.webflow.samples.booking; + +import java.security.Principal; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class HotelsController { + + private BookingService bookingService; + + @Autowired + public HotelsController(BookingService bookingService) { + this.bookingService = bookingService; + } + + @RequestMapping(value = "/hotels/search", method = RequestMethod.GET) + public void search(SearchCriteria searchCriteria, Principal currentUser, Model model) { + if (currentUser != null) { + List booking = bookingService.findBookings(currentUser.getName()); + model.addAttribute(booking); + } + } + + @RequestMapping(value = "/hotels", method = RequestMethod.GET) + public String list(SearchCriteria criteria, Model model) { + List hotels = bookingService.findHotels(criteria); + model.addAttribute(hotels); + return "hotels/list"; + } + + @RequestMapping(value = "/hotels/{id}", method = RequestMethod.GET) + public String show(@PathVariable Long id, Model model) { + model.addAttribute(bookingService.findHotelById(id)); + return "hotels/show"; + } + + @RequestMapping(value = "/bookings/{id}", method = RequestMethod.DELETE) + public String deleteBooking(@PathVariable Long id) { + bookingService.cancelBooking(id); + return "redirect:../hotels/search"; + } + +} diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java new file mode 100755 index 0000000..e88436e --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java @@ -0,0 +1,94 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +/** + * A JPA-based implementation of the Booking Service. Delegates to a JPA entity manager to issue data access calls + * against the backing repository. The EntityManager reference is provided by the managing container (Spring) + * automatically. + */ +@Service("bookingService") +@Repository +public class JpaBookingService implements BookingService { + + private EntityManager em; + + @PersistenceContext + public void setEntityManager(EntityManager em) { + this.em = em; + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findBookings(String username) { + if (username != null) { + return em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate") + .setParameter("username", username).getResultList(); + } else { + return null; + } + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findHotels(SearchCriteria criteria) { + String pattern = getSearchPattern(criteria); + int startIndex = criteria.getPage() * criteria.getPageSize(); + return em + .createQuery( + "select h from Hotel h where lower(h.name) like :pattern or lower(h.city) like :pattern " + + " or lower(h.zip) like :pattern or lower(h.address) like :pattern") + .setParameter("pattern", pattern).setFirstResult(startIndex).setMaxResults(criteria.getPageSize()) + .getResultList(); + } + + @Transactional(readOnly = true) + public Hotel findHotelById(Long id) { + return em.find(Hotel.class, id); + } + + @Transactional(readOnly = true) + public Booking createBooking(Long hotelId, String username) { + Hotel hotel = em.find(Hotel.class, hotelId); + User user = findUser(username); + Booking booking = new Booking(hotel, user); + return booking; + } + + @Transactional + public void persistBooking(Booking booking) { + em.persist(booking); + } + + @Transactional + public void cancelBooking(Long id) { + Booking booking = em.find(Booking.class, id); + if (booking != null) { + em.remove(booking); + } + } + + // helpers + + private String getSearchPattern(SearchCriteria criteria) { + if (StringUtils.hasText(criteria.getSearchString())) { + return "%" + criteria.getSearchString().toLowerCase().replace('*', '%') + "%"; + } else { + return "%"; + } + } + + private User findUser(String username) { + return (User) em.createQuery("select u from User u where u.username = :username") + .setParameter("username", username).getSingleResult(); + } + +} \ No newline at end of file diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java new file mode 100755 index 0000000..0db814b --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java @@ -0,0 +1,56 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + + +/** + * A backing bean for the main hotel search form. Encapsulates the criteria needed to perform a hotel search. + * + * It is expected a future milestone of Spring Web Flow 2.0 will allow flow-scoped beans like this one to hold + * references to transient services that are restored automatically when the flow is resumed on subsequent requests. + * This would allow this SearchCriteria object to delegate to the {@link BookingService} directly, for example, + * eliminating the need for the actions in {@link MainActions}. + */ +public class SearchCriteria implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * The user-provided search criteria for finding Hotels. + */ + private String searchString; + + /** + * The maximum page size of the Hotel result list + */ + private int pageSize; + + /** + * The current page of the Hotel result list. + */ + private int page; + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } +} \ No newline at end of file diff --git a/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java new file mode 100755 index 0000000..55213ad --- /dev/null +++ b/booking-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java @@ -0,0 +1,59 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * A user who can book hotels. + */ +@Entity +@Table(name = "Customer") +public class User implements Serializable { + private String username; + + private String password; + + private String name; + + public User() { + } + + public User(String username, String password, String name) { + this.username = username; + this.password = password; + this.name = name; + } + + @Id + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User(" + username + ")"; + } +} diff --git a/booking-mvc/src/main/resources/META-INF/persistence.xml b/booking-mvc/src/main/resources/META-INF/persistence.xml new file mode 100755 index 0000000..f4e3d6a --- /dev/null +++ b/booking-mvc/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + org.hibernate.ejb.HibernatePersistence + org.springframework.webflow.samples.booking.User + org.springframework.webflow.samples.booking.Booking + org.springframework.webflow.samples.booking.Hotel + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/resources/import.sql b/booking-mvc/src/main/resources/import.sql new file mode 100755 index 0000000..e3211aa --- /dev/null +++ b/booking-mvc/src/main/resources/import.sql @@ -0,0 +1,27 @@ +insert into Customer (username, name) values ('keith', 'Keith') +insert into Customer (username, name) values ('erwin', 'Erwin') +insert into Customer (username, name) values ('jeremy', 'Jeremy') +insert into Customer (username, name) values ('scott', 'Scott') +insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 199, 'Westin Diplomat', '3555 S. Ocean Drive', 'Hollywood', 'FL', '33019', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 60, 'Jameson Inn', '890 Palm Bay Rd NE', 'Palm Bay', 'FL', '32905', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 199, 'Chilworth Manor', 'The Cottage, Southampton Business Park', 'Southampton', 'Hants', 'SO16 7JF', 'UK') +insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (7, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (8, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (9, 300, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (10, 300, 'Conrad Miami', '1395 Brickell Ave', 'Miami', 'FL', '33131', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (11, 80, 'Sea Horse Inn', '2106 N Clairemont Ave', 'Eau Claire', 'WI', '54703', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (12, 90, 'Super 8 Eau Claire Campus Area', '1151 W Macarthur Ave', 'Eau Claire', 'WI', '54701', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (13, 160, 'Marriot Downtown', '55 Fourth Street', 'San Francisco', 'CA', '94103', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (14, 200, 'Hilton Diagonal Mar', 'Passeig del Taulat 262-264', 'Barcelona', 'Catalunya', '08019', 'Spain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (15, 210, 'Hilton Tel Aviv', 'Independence Park', 'Tel Aviv', '', '63405', 'Israel') +insert into Hotel (id, price, name, address, city, state, zip, country) values (16, 240, 'InterContinental Tokyo Bay', 'Takeshiba Pier', 'Tokyo', '', '105', 'Japan') +insert into Hotel (id, price, name, address, city, state, zip, country) values (17, 130, 'Hotel Beaulac', ' Esplanade Léopold-Robert 2', 'Neuchatel', '', '2000', 'Switzerland') +insert into Hotel (id, price, name, address, city, state, zip, country) values (18, 140, 'Conrad Treasury Place', 'William & George Streets', 'Brisbane', 'QLD', '4001', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (19, 230, 'Ritz Carlton', '1228 Sherbrooke St', 'West Montreal', 'Quebec', 'H3G1H6', 'Canada') +insert into Hotel (id, price, name, address, city, state, zip, country) values (20, 460, 'Ritz Carlton', 'Peachtree Rd, Buckhead', 'Atlanta', 'GA', '30326', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (21, 220, 'Swissotel', '68 Market Street', 'Sydney', 'NSW', '2000', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (22, 250, 'Meliá White House', 'Albany Street', 'Regents Park London', '', 'NW13UP', 'Great Britain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (23, 210, 'Hotel Allegro', '171 West Randolph Street', 'Chicago', 'IL', '60601', 'USA') \ No newline at end of file diff --git a/booking-mvc/src/main/resources/log4j.xml b/booking-mvc/src/main/resources/log4j.xml new file mode 100644 index 0000000..b4e9ad1 --- /dev/null +++ b/booking-mvc/src/main/resources/log4j.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/META-INF/MANIFEST.MF b/booking-mvc/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..58630c0 --- /dev/null +++ b/booking-mvc/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties b/booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties new file mode 100755 index 0000000..992d816 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/classes/log4j.properties @@ -0,0 +1,11 @@ +log4j.rootCategory=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +# Enable web flow logging +log4j.category.org.springframework.webflow=DEBUG +log4j.category.org.springframework.faces=DEBUG +log4j.category.org.springframework.binding=DEBUG +log4j.category.org.springframework.transaction=DEBUG \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/config/data-access-config.xml b/booking-mvc/src/main/webapp/WEB-INF/config/data-access-config.xml new file mode 100644 index 0000000..94e2bae --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/config/data-access-config.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + hibernate.session_factory_name=mySessionFactory + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/config/security-config.xml b/booking-mvc/src/main/webapp/WEB-INF/config/security-config.xml new file mode 100644 index 0000000..9a5df65 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/config/security-config.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml b/booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml new file mode 100644 index 0000000..5791b17 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/config/web-application-config.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/config/webflow-config.xml b/booking-mvc/src/main/webapp/WEB-INF/config/webflow-config.xml new file mode 100644 index 0000000..7dcaeed --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/config/webflow-config.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/config/webmvc-config.xml b/booking-mvc/src/main/webapp/WEB-INF/config/webmvc-config.xml new file mode 100644 index 0000000..56e56fd --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/config/webmvc-config.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /WEB-INF/**/views.xml + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/booking-flow.xml b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/booking-flow.xml new file mode 100644 index 0000000..ff62d70 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/booking-flow.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/enterBookingDetails.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/enterBookingDetails.jsp new file mode 100644 index 0000000..1f95919 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/enterBookingDetails.jsp @@ -0,0 +1,196 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +
+
+

${booking.hotel.name}

+ +
+ ${booking.hotel.address} +
+ ${booking.hotel.city}, ${booking.hotel.state}, ${booking.hotel.zip} +
+ ${booking.hotel.country} +
+

+ Nightly rate: ${status.value} +

+
+
+ +
+ + +
+
+
+
+
+ +
+ Book Hotel +
+
+ +
+
+

+ + +
+
+
+
+ +
+
+

+ +
+
+
+
+ +
+
+

+ + + + + +

+
+
+
+
+ Smoking Preference: +
+
+

+ + +

+ +
+
+
+
+ Amenities: +
+
+

+ +
+ +
+ +

+ +
+
+
+
+ +
+
+

+ +
+
+
+
+ +
+
+

+ +
+
+
+
+ +
+
+

+ + + + + + + + + + + + + + + + + + + + + +

+
+
+
+

+ + +

+ +
+
+
+
+
diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.jsp new file mode 100644 index 0000000..42054c9 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.jsp @@ -0,0 +1,5 @@ +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +
+ +
\ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.properties b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.properties new file mode 100644 index 0000000..3d15709 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/messages.properties @@ -0,0 +1,16 @@ +booking.checkinDate.NotNull=The check in date is required +booking.checkinDate.Future=The check in date must be in the future +booking.checkinDate.beforeToday=The check in date must be a future date +booking.checkinDate.typeMismatch=The check in date must be in the format mm-dd-yyyy + +booking.checkoutDate.Future=The check out date must be in the future +booking.checkoutDate.NotNull=The check out date is required +booking.checkoutDate.typeMismatch=The check out date must be in the format mm-dd-yyyy +booking.BookingDateRange=The check out date must be later than the check in date + +booking.creditCard.NotEmpty=The credit card must be a valid 16 digit number +booking.creditCardName.NotEmpty=The name on the credit card is required + +NotEmpty=The {0} field is required +NotNull=The {0} field is required +Future=The {0} date must be in the future \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/reviewBooking.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/reviewBooking.jsp new file mode 100644 index 0000000..9efe4fa --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/reviewBooking.jsp @@ -0,0 +1,65 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +
+
+

${booking.hotel.name}

+ +
+ ${booking.hotel.address} +
+ ${booking.hotel.city}, ${booking.hotel.state}, ${booking.hotel.zip} +
+ ${booking.hotel.country} +
+
+
+ +
+ Confirm Booking Details +
+
Check In:
+
+

${status.value}

+
+
+
+
Checkout:
+
+

${status.value}

+
+
+
+
Number of Nights:
+
+

${status.value}

+
+
+
+
Total Payment:
+
+

${status.value}

+
+
+
+
Credit Card #:
+
+

${booking.creditCard}

+
+
+
+

+ + + +

+ +
+
+
+
+ +
diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/views.xml b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/views.xml new file mode 100644 index 0000000..3e1ee8b --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/booking/views.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/bookingsTable.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/bookingsTable.jsp new file mode 100644 index 0000000..6d66283 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/bookingsTable.jsp @@ -0,0 +1,53 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +
+ +

Current Hotel Bookings

+ + + + No bookings found + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressCity, StateCheck in DateCheck out DateConfirmation NumberAction
${booking.hotel.name}${booking.hotel.address}${booking.hotel.city}, ${booking.hotel.state}${booking.checkinDate}${booking.checkoutDate}${booking.id} + + + + + + +
+
+
+ +
\ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/list.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/list.jsp new file mode 100644 index 0000000..fdd0880 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/list.jsp @@ -0,0 +1,74 @@ +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> + +

Hotel Results

+

+ Change Search + +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressCity, StateZipAction
${hotel.name}${hotel.address}${hotel.city}, ${hotel.state}, ${hotel.country}${hotel.zip}View Hotel
No hotels found
+
+
+ + Previous Results + + +
+
+ + More Results + + +
+
+
+
+ diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/search.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/search.jsp new file mode 100644 index 0000000..50d79b9 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/search.jsp @@ -0,0 +1,5 @@ +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> + + + + diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/searchForm.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/searchForm.jsp new file mode 100644 index 0000000..0940b44 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/searchForm.jsp @@ -0,0 +1,36 @@ +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> + +

Search Hotels

+ + + + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ +
+
+
\ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/show.jsp b/booking-mvc/src/main/webapp/WEB-INF/hotels/show.jsp new file mode 100644 index 0000000..82e2e70 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/show.jsp @@ -0,0 +1,22 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +

${hotel.name}

+
+ ${hotel.address} +
+ ${hotel.city}, ${hotel.state}, ${hotel.zip} +
+ ${hotel.country} +
+
+

+ Nightly Rate: + ${status.value} +

+ +
+ +
+
diff --git a/booking-mvc/src/main/webapp/WEB-INF/hotels/views.xml b/booking-mvc/src/main/webapp/WEB-INF/hotels/views.xml new file mode 100644 index 0000000..42e7bc0 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/hotels/views.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/booking-mvc/src/main/webapp/WEB-INF/intro.jsp b/booking-mvc/src/main/webapp/WEB-INF/intro.jsp new file mode 100755 index 0000000..4525d2f --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/intro.jsp @@ -0,0 +1,29 @@ +
+

Welcome to Spring Travel

+

+ This sample demonstrates how to use Spring MVC and Spring Web Flow together with JavaServerPages (JSP) and Tiles. +

+
+

+ The key features illustrated in this sample include: +

+
    +
  • A declarative navigation model enabling full browser button support and dynamic navigation rules
  • +
  • A fine-grained state management model, including support for ConversationScope and ViewScope
  • +
  • Modularization of web application functionality by domain use case, illustrating project structure best-practices
  • +
  • Spring Expression Language (SpEL) integration
  • +
  • Spring 3 formatting annotations @DateTimeFormat, @NumberFormat
  • +
  • Spring MVC custom namespace
  • +
  • Spring Security integration
  • +
  • Annotated POJO @Controllers for implementing RESTful user interactions.
  • +
  • Declarative page authoring with JSP, JSTL, and Spring MVC's form tag library
  • +
  • Page layout and composition with Apache Tiles
  • +
  • A JavaScript API for decorating HTML elements with behaviors such as Ajax, validation, and effects.
  • +
  • A grid layout with Blueprint CSS
  • +
  • Exception handling support across all layers of the application
  • +
  • SpringSource Tool Suite integration, with support for graphical flow modeling and visualization
  • +
+

+ Start your Spring Travel experience +

+
diff --git a/booking-mvc/src/main/webapp/WEB-INF/layouts/standard.jsp b/booking-mvc/src/main/webapp/WEB-INF/layouts/standard.jsp new file mode 100644 index 0000000..5e7bfbb --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/layouts/standard.jsp @@ -0,0 +1,69 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + + Spring Travel: Spring MVC and Web Flow Reference Application + " /> + " type="text/css" media="screen, projection" /> + " type="text/css" media="print" /> + + " type="text/css" media="screen" /> + + + + + +
+ + +
+ +
+ + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/WEB-INF/layouts/views.xml b/booking-mvc/src/main/webapp/WEB-INF/layouts/views.xml new file mode 100644 index 0000000..0f94b92 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/layouts/views.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/booking-mvc/src/main/webapp/WEB-INF/login.jsp b/booking-mvc/src/main/webapp/WEB-INF/login.jsp new file mode 100755 index 0000000..04d9c59 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/login.jsp @@ -0,0 +1,66 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +<%@ page import="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" %> +<%@ page import="org.springframework.security.core.AuthenticationException" %> + +
+

Valid username/passwords are:

+
    +
  • keith/melbourne
  • +
  • erwin/leuven
  • +
  • jeremy/atlanta
  • +
  • scott/rochester
  • +
+
+ +
+ +
+ Your login attempt was not successful, try again.

+ Reason: <%= ((AuthenticationException) session.getAttribute(UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %> +
+
+
" method="post"> +
+ Login Information +

+ +
+ value="<%= session.getAttribute(UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY) %>" /> +

+ +

+ +
+ +

+ +

+ + +

+ +

+ + +

+
+
+
diff --git a/booking-mvc/src/main/webapp/WEB-INF/logoutSuccess.jsp b/booking-mvc/src/main/webapp/WEB-INF/logoutSuccess.jsp new file mode 100755 index 0000000..8f7418c --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/logoutSuccess.jsp @@ -0,0 +1,8 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + +
+

Logout

+

You have successfully logged out.

+
+

">Continue

+
diff --git a/booking-mvc/src/main/webapp/WEB-INF/views.xml b/booking-mvc/src/main/webapp/WEB-INF/views.xml new file mode 100644 index 0000000..96200a1 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/views.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/booking-mvc/src/main/webapp/WEB-INF/web.xml b/booking-mvc/src/main/webapp/WEB-INF/web.xml new file mode 100755 index 0000000..99c4593 --- /dev/null +++ b/booking-mvc/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,59 @@ + + + + + + contextConfigLocation + + /WEB-INF/config/web-application-config.xml + + + + + + org.springframework.web.context.ContextLoaderListener + + + + + httpMethodFilter + org.springframework.web.filter.HiddenHttpMethodFilter + + + + httpMethodFilter + Spring MVC Dispatcher Servlet + + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + + springSecurityFilterChain + Spring MVC Dispatcher Servlet + + + + + Spring MVC Dispatcher Servlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + + + 1 + + + + + Spring MVC Dispatcher Servlet + / + + + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/images/bg.gif b/booking-mvc/src/main/webapp/images/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea9200df6e3a4793cfc2574316bb7f9fd524a28c GIT binary patch literal 163 zcmV;U09^k^Nk%w1VfX?H0Du4h|NsBPyS6L<0002^0tx^C0)h;VsmtvTqnxzbi?PYP z`wxcVNS5Y_rs~S3!Pds|Ofzte=lag~{tpaVUc#agcRMPV%%<}RWfG&*>LY2*YPa03 zS2z8Njo7jIj83bg;k7$fe#__dy1mlA>pSti{|^|*)+bnqKxmk#xX3t?*I0-MIZ0VL R`DnQ(naSDdDHl)x06R9!R8If^ literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/images/btn.bg.gif b/booking-mvc/src/main/webapp/images/btn.bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..b77cc95436986ef6d571c37d6407984d283da78a GIT binary patch literal 70 zcmZ?wbhEHbWMxohXkcVWUF7ut|9{1QqRvIBi6yBi3gww4844j8sS56%z5xt63_t)< X%D}|a(!cWbTmHp!wnT+6FjxZs5JDBN literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/images/diplomat.jpg b/booking-mvc/src/main/webapp/images/diplomat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1d0c9cd21b819bc8b90d43d849aa1b2e84e0bbe GIT binary patch literal 17957 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%0D||y-s?!IaYc77pjuz%bRgfG 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 L|Gxsu@5TQC+YR2f literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/images/input.bg.gif b/booking-mvc/src/main/webapp/images/input.bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ebf87e3108dbbec8565935bb1fa42ebac04d0a3 GIT binary patch literal 122 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 literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/images/spring-logo.jpg b/booking-mvc/src/main/webapp/images/spring-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62be39835f2d980befae3ec961b6b10e7d1fca6f GIT binary patch literal 31339 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%0Dgs02_0)mtC0O8J0`s=@(mN;yyuh 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 HzQ6z3m$6-^ literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/images/springone2gx.jpeg b/booking-mvc/src/main/webapp/images/springone2gx.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b43bcb2868a599695283608392169f713bcc1097 GIT binary patch literal 1643 zcmb7=dpOg39LIm#uvrtEOS0I-<~lUDt?A}|8DSemBr4^W9H}Jb7P;Ss3S~*pndX$m zNU1!fWw}d6qL7t3qN{|R)p>e)&Y$P~`RDU}UeD+Ce7+y4So#7`adUEY0ze=D0LcoF zJ_GClMFl7fs-Osi!r*YlRZ1GlN(h7!T1{O=1FMb4W3@3Df`KK8phwonU`#fdkgX^* z8co-Di^CSGz2ycP<%a|Whr^W+N?OXwS`;FNNcrE9-UE;@KnIA1fbakq34$O&(g%PR z06;*p0KX#-Rgi;$Wz13q071YIIYl`z81j>YWG{Inpny`vk-ecBYit?8#q2&cd`xl( zN8OxRI47IZ1pP4n*2y}VMNUSHkv}^*dHG)y1b`t(lpKy+sA}u|k`c_Q?=!cHNp6#l z00@W-A|Xg%3s5%{k<;(*MU?N&y_B8ZpI$iOH;c~AP~9`Ch+52WM`{&ZZZt}Gf%%fV z_A+I0Brs@9{qTKeVi%jmOLI#c3S6;;_a-j@kb?>+mrB^SImo{ zecNOA8eW2T@f2-N=e>&w_!i)C0P0C%(?3@E?;2h^Ke%i#u4%J(zi|7f$rF1vR@B(W zvs!jWv&wla!!Eb5L5)Gofd=&h__nQRWI}mBjL?Td>YWHRa)1rg>Qx)j2!^%-L8Sb8 zU*=cBjDBL%4luQ1^V)gs{^l#oe2dAei{5wEA9>W1ckPYS!o#q5|0IEb%KZ{cA0HQw zt<*;AD{4n<7}+}v4mK-DzUHMCfB4P_XC2+eHLU}Kr);o>4Z;y3&JkyAgbhc}n(awV zKjD0M7jx|A;?!S@SD)B}^RMf!eo7eNa{ipdHT$`Th*%lmqo`Z?%~vz^FVG^?;E3(1 z{pgC`664VHNkfg0zXg1l*UkDvd7H#jsz`cfkNexDZ;s0vPNy!O zQ$pkhP3bW6sUv}B?lGf?#s=`fuC8|;8KAT$0nO)bW{Ox%k6riC>Df_42X^@mWs6+C z?`Fa6sq9KGS}im(XJKZA9i5~7>mscyIoy|UB^KfI9Gt;mD8I$fUyIJBtIbG6cBmA7 z&1;BDYfmNbP}+Q@PU1=RPK#XUYjL%Y0}UOyB8S6ne(|9lA+ceR*E)=ypPj-}Cd$AO z7L!o1-Vnctvkzx~M)%?hx?VE*+^osdoPiz0{>M5@6-h;w|dwzB_=ewKtBL zR+R$A5wz06rJ}!PeI=QnEy%YV5H(qw$SrAJj8UPc@37o>ycUmT_8{lD|6Xgo8~h@% zzgf)fl;Te0Z45choS(LTi0eu04)WG+f-Q?r9UD$}qMm(iyUcvpuz32rnb@PN-t*5)+X@L;JT6I)38!Z{lysOHEwUTKT9@wh z<=e&S=~FMXYto8UD?CGTT!N<*IH@Nez1aBCD{Mn@2d8f{!jLu^6IF()@_XuvBN(6q z#vU%1kL^B^M2N&+|8Q}DyG=a+l=v)PNec9~OSt3>555?*Jvm!3k)XC)Gaf>ZR9pJu zQSUMYg@&qyjeaC{KH`h&h+to=v;9hS4YWg4DL!VItN%|G>) zErVri&0;lJtZQ2~(=WTl2HSyc+IOvXhjqtcb?j|B_Uz8RZ6{pUw#)5sxt*?khil(? zaNs^TbRT(+Jf1@j+~Xs!*ZbRd;Qfv7@_+yI1u))-jEbVds-mapS7lYD=={-tSsEb&6cY3wQxdWEmJ%1}~&(u`9A&pLXVOyy4FF6^VRB7UrtwZyl zNoA_Oe2@^@(H5_0##BOg<`bSwzC~Rx?rrOOI9`qTL<@Ulydt zocM4iq4>&c#YA98~p`Vy6{+Rb9~<808}_8?Ohn6#~F00FSXOgO7|y*Mkf^r z9$_*FAyKgwa&GPIK$IW`i$hat{ewbDsRcNk@J&E)WLSJ!H?Gz{06+p^fB*mx2q5_n DQ1KmG literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/images/tse.gif b/booking-mvc/src/main/webapp/images/tse.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1fa98cf57617b6c613572f4db3e70518f5ed0c9 GIT binary patch literal 2814 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 Pr%*S>8-PL?@;Cnig|{u< literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/styles/blueprint/icons/cross.png b/booking-mvc/src/main/webapp/styles/blueprint/icons/cross.png new file mode 100755 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 zcmV;A0&x9_P)uEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#4^nI0$7`a(T+P4hBKZ7hk58-_j0w;$<(*=f7ic$nT z*Wgd55in08>183j3?S=MAoDDTLoLSL$!_UDxXqSf-?qdd@H%8(We~hQu&uVIo$6NV z(zMY7wn6r5i617ZGZ)-J($xXssTcN*&WujcIDRIp6J4_PqOvJ}9!p6+yo8LmAGS3~ xN#Qq?aIt$6X#&>gHs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1pbody p code {*white-space:normal;} +hr {margin:-8px auto 11px;} +img {-ms-interpolation-mode:bicubic;} +.clearfix, .container {display:inline-block;} +* html .clearfix, * html .container {height:1%;} +fieldset {padding-top:0;} +textarea {overflow:auto;} +input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;} +input.text:focus, input.title:focus {border-color:#666;} +input.text, input.title, textarea, select {margin:0.5em 0;} +input.checkbox, input.radio {position:relative;top:.25em;} +form.inline div, form.inline p {vertical-align:middle;} +form.inline label {position:relative;top:-0.25em;} +form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;} +button, input.button {position:relative;top:0.25em;} \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/icons/cross.png b/booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/icons/cross.png new file mode 100755 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 zcmV;A0&x9_P)uEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#4^nI0$7`a(T+P4hBKZ7hk58-_j0w;$<(*=f7ic$nT z*Wgd55in08>183j3?S=MAoDDTLoLSL$!_UDxXqSf-?qdd@H%8(We~hQu&uVIo$6NV z(zMY7wn6r5i617ZGZ)-J($xXssTcN*&WujcIDRIp6J4_PqOvJ}9!p6+yo8LmAGS3~ xN#Qq?aIt$6X#&>gHs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1p and + + + Change Password + + + + Cancel + diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/screen.css b/booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/screen.css new file mode 100755 index 0000000..bb66b21 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/plugins/buttons/screen.css @@ -0,0 +1,97 @@ +/* -------------------------------------------------------------- + + buttons.css + * Gives you some great CSS-only buttons. + + Created by Kevin Hale [particletree.com] + * particletree.com/features/rediscovering-the-button-element + + See Readme.txt in this folder for instructions. + +-------------------------------------------------------------- */ + +a.button, button { + display:block; + float:left; + margin: 0.7em 0.5em 0.7em 0; + padding:5px 10px 5px 7px; /* Links */ + + border:1px solid #dedede; + border-top:1px solid #eee; + border-left:1px solid #eee; + + background-color:#f5f5f5; + font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif; + font-size:100%; + line-height:130%; + text-decoration:none; + font-weight:bold; + color:#565656; + cursor:pointer; +} +button { + width:auto; + overflow:visible; + padding:4px 10px 3px 7px; /* IE6 */ +} +button[type] { + padding:4px 10px 4px 7px; /* Firefox */ + line-height:17px; /* Safari */ +} +*:first-child+html button[type] { + padding:4px 10px 3px 7px; /* IE7 */ +} +button img, a.button img{ + margin:0 3px -3px 0 !important; + padding:0; + border:none; + width:16px; + height:16px; + float:none; +} + + +/* Button colors +-------------------------------------------------------------- */ + +/* Standard */ +button:hover, a.button:hover{ + background-color:#dff4ff; + border:1px solid #c2e1ef; + color:#336699; +} +a.button:active{ + background-color:#6299c5; + border:1px solid #6299c5; + color:#fff; +} + +/* Positive */ +body .positive { + color:#529214; +} +a.positive:hover, button.positive:hover { + background-color:#E6EFC2; + border:1px solid #C6D880; + color:#529214; +} +a.positive:active { + background-color:#529214; + border:1px solid #529214; + color:#fff; +} + +/* Negative */ +body .negative { + color:#d12f19; +} +a.negative:hover, button.negative:hover { + background-color:#fbe3e4; + border:1px solid #fbc2c4; + color:#d12f19; +} +a.negative:active { + background-color:#d12f19; + border:1px solid #d12f19; + color:#fff; +} diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt b/booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt new file mode 100755 index 0000000..85f2491 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/readme.txt @@ -0,0 +1,14 @@ +Fancy Type + +* Gives you classes to use if you'd like some + extra fancy typography. + +Credits and instructions are specified above each class +in the fancy-type.css file in this directory. + + +Usage +---------------------------------------------------------------- + +1) Add this plugin to lib/settings.yml. + See compress.rb for instructions. diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css b/booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css new file mode 100755 index 0000000..028e05b --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/plugins/fancy-type/screen.css @@ -0,0 +1,71 @@ +/* -------------------------------------------------------------- + + fancy-type.css + * Lots of pretty advanced classes for manipulating text. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Indentation instead of line shifts for sibling paragraphs. */ + p + p { text-indent:2em; margin-top:-1.5em; } + form p + p { text-indent: 0; } /* Don't want this in forms. */ + + +/* For great looking type, use this code instead of asdf: + asdf + Best used on prepositions and ampersands. */ + +.alt { + color: #666; + font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif; + font-style: italic; + font-weight: normal; +} + + +/* For great looking quote marks in titles, replace "asdf" with: + asdf” + (That is, when the title starts with a quote mark). + (You may have to change this value depending on your font size). */ + +.dquo { margin-left: -.5em; } + + +/* Reduced size type with incremental leading + (http://www.markboulton.co.uk/journal/comments/incremental_leading/) + + This could be used for side notes. For smaller type, you don't necessarily want to + follow the 1.5x vertical rhythm -- the line-height is too much. + + Using this class, it reduces your font size and line-height so that for + every four lines of normal sized type, there is five lines of the sidenote. eg: + + New type size in em's: + 10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems) + + New line-height value: + 12px x 1.5 = 18px (old line-height) + 18px x 4 = 72px + 72px / 5 = 14.4px (new line height) + 14.4px / 10px = 1.44 (new line height in em's) */ + +p.incr, .incr p { + font-size: 10px; + line-height: 1.44em; + margin-bottom: 1.5em; +} + + +/* Surround uppercase words and abbreviations with this class. + Based on work by Jørgen Arnor GĂĽrdsø Lom [http://twistedintellect.com/] */ + +.caps { + font-variant: small-caps; + letter-spacing: 1px; + text-transform: lowercase; + font-size:1.2em; + line-height:1%; + font-weight:bold; + padding:0 2px; +} diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/doc.png b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/doc.png new file mode 100755 index 0000000000000000000000000000000000000000..834cdfaf48a509ca51d93250fb28dd12e5ea0a13 GIT binary patch literal 777 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 TVebF6xa6h0np~yK+tB|9OTxo9 literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/feed.png b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/feed.png new file mode 100755 index 0000000000000000000000000000000000000000..315c4f4fa62cb720326ba3f54259666ba3999e42 GIT binary patch literal 691 zcmV;k0!;mhP)bpQb1=l6TxbDZwj&S={?7%qx-u`rsG(Zp`-rh=e^=%((1yvsuf5d=&62Zj)Y zH&JviNS_F4_Hj|T(1j4$p-!}kixP9&dB4uv^MveG?dGf%sUCoc2!IFxD6wHRA2^dX zXRVk!-qSfk(jcaUKn#RP48(whfPlJUpApdrA!TQi_4D+fVoM;3I0gZ8{=Xv~Po;geVA+Em9@0Wq2 zr>OTZEGR05L=gf1T;ucCxq6Q6EgJiH@@-lVaAlQyw`jIF^c=&IVnj|95hHbE_cnt| zTzZQ?F4Ne@(bH(~&3nM%m)I@ID{@jJ2qZPjr)jhpe9hViOwH5k&|T#EmmL3(vHeUQ zq^!t^Al6JD;=mHq^Bg?J-8-zG2Od7gZbknG;K9czYjPqG*xjPo0k(c4%lPXTpw(qq z@aGMnxtFS(np+2kC} z7P02O874ZkJH$v#nCUVx$({yDN`IX@o2wyvTD#e`qN`_w5<}$3F+_z1iyEv%?$mbQ(# zwJpuiQJP8?X_`#S8b+U_G6=ziYB!xPAcq{)ZJ0bECH@ zYx#`n8^Wzn^J!4>=q^bltNO15ry?0ecSLkjpT@vlid!jk)Fjf7&)q_V5zGs#3N%6* zbW~7Hg=&P0&~Y(|g>$hC9FL?;ttzPDZbpZu9OLb33^e2;FNTGJxScp1&q4M+y2ntQ z?C(=hpU$3~`Thx0eHwi0x`q+!d5k@|0_WHe%sG3e-s^MM`xM-ig!VcIA7H}X1ot~L zg=MLB4w-Q;Bi!!u2|I+Qb;0{{4Q53YX6+4_aXena{nmt*!YG7ua~`qc>o=?@U?rOU znS7%>klzi*muXnbM6i@4FR@s^8vTjDgy&%J?w?`u>NYMDFa_2%0SQ(qJE<3=<8Bzo zfdU60e*y(^$RF%r$kl)p7=7tlCDa$+J7w>}DU(O#~fk>pYuRvHi1E9^msg{tLeV XM&GIRvfA7%00000NkvXXu0mjf&%8>| literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/pdf.png b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/pdf.png new file mode 100755 index 0000000000000000000000000000000000000000..8f8095e46fa4965700afe1f9d065d8a37b101676 GIT binary patch literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/visited.png b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/visited.png new file mode 100755 index 0000000000000000000000000000000000000000..ebf206def2729dae1fa9e8c5c9e5a95b7176c45b GIT binary patch literal 46990 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 literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/xls.png b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/icons/xls.png new file mode 100755 index 0000000000000000000000000000000000000000..b977d7e52e2446ea01201c5c7209ac3a05f12c9f GIT binary patch literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt new file mode 100755 index 0000000..3cb1b2c --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/readme.txt @@ -0,0 +1,18 @@ +Link Icons +* Icons for links based on protocol or file type. + +This is not supported in IE versions < 7. + + +Credits +---------------------------------------------------------------- + +* Marc Morgan +* Olav Bjorkoy [bjorkoy.com] + + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css new file mode 100755 index 0000000..6d3d47f --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/plugins/link-icons/screen.css @@ -0,0 +1,40 @@ +/* -------------------------------------------------------------- + + link-icons.css + * Icons for links based on protocol or file type. + + See the Readme file in this folder for additional instructions. + +-------------------------------------------------------------- */ + +/* Use this class if a link gets an icon when it shouldn't. */ +body a.noicon { + background:transparent none !important; + padding:0 !important; + margin:0 !important; +} + +/* Make sure the icons are not cut */ +a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited, +a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"], +a[href$=".rdf"], a[href^="aim:"] { + padding:2px 22px 2px 0; + margin:-2px 0; + background-repeat: no-repeat; + background-position: right center; +} + +/* External links */ +a[href^="http:"] { background-image: url(icons/external.png); } +a[href^="mailto:"] { background-image: url(icons/email.png); } +a[href^="http:"]:visited { background-image: url(icons/visited.png); } + +/* Files */ +a[href$=".pdf"] { background-image: url(icons/pdf.png); } +a[href$=".doc"] { background-image: url(icons/doc.png); } +a[href$=".xls"] { background-image: url(icons/xls.png); } + +/* Misc */ +a[href$=".rss"], +a[href$=".rdf"] { background-image: url(icons/feed.png); } +a[href^="aim:"] { background-image: url(icons/im.png); } \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt b/booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt new file mode 100755 index 0000000..4c46535 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/readme.txt @@ -0,0 +1,10 @@ +RTL +* Mirrors Blueprint, so it can be used with Right-to-Left languages. + +By Ran Yaniv Hartstein, ranh.co.il + +Usage +---------------------------------------------------------------- + +1) Add this line to your HTML: + \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/screen.css b/booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/screen.css new file mode 100755 index 0000000..7e7ccdb --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/plugins/rtl/screen.css @@ -0,0 +1,110 @@ +/* -------------------------------------------------------------- + + rtl.css + * Mirrors Blueprint for left-to-right languages + + By Ran Yaniv Hartstein [ranh.co.il] + +-------------------------------------------------------------- */ + +body .container { direction: rtl; } +body .column, body div.span-1, body div.span-2, body div.span-3, body div.span-4, body div.span-5, body div.span-6, body div.span-7, body div.span-8, body div.span-9, body div.span-10, body div.span-11, body div.span-12, body div.span-13, body div.span-14, body div.span-15, body div.span-16, body div.span-17, body div.span-18, body div.span-19, body div.span-20, body div.span-21, body div.span-22, body div.span-23, body div.span-24 { + float: right; + margin-right: 0; + margin-left: 10px; + text-align:right; +} + +body div.last { margin-left: 0; } +body table .last { padding-left: 0; } + +body .append-1 { padding-right: 0; padding-left: 40px; } +body .append-2 { padding-right: 0; padding-left: 80px; } +body .append-3 { padding-right: 0; padding-left: 120px; } +body .append-4 { padding-right: 0; padding-left: 160px; } +body .append-5 { padding-right: 0; padding-left: 200px; } +body .append-6 { padding-right: 0; padding-left: 240px; } +body .append-7 { padding-right: 0; padding-left: 280px; } +body .append-8 { padding-right: 0; padding-left: 320px; } +body .append-9 { padding-right: 0; padding-left: 360px; } +body .append-10 { padding-right: 0; padding-left: 400px; } +body .append-11 { padding-right: 0; padding-left: 440px; } +body .append-12 { padding-right: 0; padding-left: 480px; } +body .append-13 { padding-right: 0; padding-left: 520px; } +body .append-14 { padding-right: 0; padding-left: 560px; } +body .append-15 { padding-right: 0; padding-left: 600px; } +body .append-16 { padding-right: 0; padding-left: 640px; } +body .append-17 { padding-right: 0; padding-left: 680px; } +body .append-18 { padding-right: 0; padding-left: 720px; } +body .append-19 { padding-right: 0; padding-left: 760px; } +body .append-20 { padding-right: 0; padding-left: 800px; } +body .append-21 { padding-right: 0; padding-left: 840px; } +body .append-22 { padding-right: 0; padding-left: 880px; } +body .append-23 { padding-right: 0; padding-left: 920px; } + +body .prepend-1 { padding-left: 0; padding-right: 40px; } +body .prepend-2 { padding-left: 0; padding-right: 80px; } +body .prepend-3 { padding-left: 0; padding-right: 120px; } +body .prepend-4 { padding-left: 0; padding-right: 160px; } +body .prepend-5 { padding-left: 0; padding-right: 200px; } +body .prepend-6 { padding-left: 0; padding-right: 240px; } +body .prepend-7 { padding-left: 0; padding-right: 280px; } +body .prepend-8 { padding-left: 0; padding-right: 320px; } +body .prepend-9 { padding-left: 0; padding-right: 360px; } +body .prepend-10 { padding-left: 0; padding-right: 400px; } +body .prepend-11 { padding-left: 0; padding-right: 440px; } +body .prepend-12 { padding-left: 0; padding-right: 480px; } +body .prepend-13 { padding-left: 0; padding-right: 520px; } +body .prepend-14 { padding-left: 0; padding-right: 560px; } +body .prepend-15 { padding-left: 0; padding-right: 600px; } +body .prepend-16 { padding-left: 0; padding-right: 640px; } +body .prepend-17 { padding-left: 0; padding-right: 680px; } +body .prepend-18 { padding-left: 0; padding-right: 720px; } +body .prepend-19 { padding-left: 0; padding-right: 760px; } +body .prepend-20 { padding-left: 0; padding-right: 800px; } +body .prepend-21 { padding-left: 0; padding-right: 840px; } +body .prepend-22 { padding-left: 0; padding-right: 880px; } +body .prepend-23 { padding-left: 0; padding-right: 920px; } + +body .border { + padding-right: 0; + padding-left: 4px; + margin-right: 0; + margin-left: 5px; + border-right: none; + border-left: 1px solid #eee; +} + +body .colborder { + padding-right: 0; + padding-left: 24px; + margin-right: 0; + margin-left: 25px; + border-right: none; + border-left: 1px solid #eee; +} + +body .pull-1 { margin-left: 0; margin-right: -40px; } +body .pull-2 { margin-left: 0; margin-right: -80px; } +body .pull-3 { margin-left: 0; margin-right: -120px; } +body .pull-4 { margin-left: 0; margin-right: -160px; } + +body .push-0 { margin: 0 18px 0 0; } +body .push-1 { margin: 0 18px 0 -40px; } +body .push-2 { margin: 0 18px 0 -80px; } +body .push-3 { margin: 0 18px 0 -120px; } +body .push-4 { margin: 0 18px 0 -160px; } +body .push-0, body .push-1, body .push-2, +body .push-3, body .push-4 { float: left; } + + +/* Typography with RTL support */ +body h1,body h2,body h3, +body h4,body h5,body h6 { font-family: Arial, sans-serif; } +html body { font-family: Arial, sans-serif; } +body pre,body code,body tt { font-family: monospace; } + +/* Mirror floats and margins on typographic elements */ +body p img { float: right; margin: 1.5em 0 1.5em 1.5em; } +body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;} +body td, body th { text-align:right; } \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/print.css b/booking-mvc/src/main/webapp/styles/blueprint/print.css new file mode 100755 index 0000000..fdb8220 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/print.css @@ -0,0 +1,29 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* print.css */ +body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;} +.container {background:none;} +hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;} +code {font:.9em "Courier New", Monaco, Courier, monospace;} +a img {border:none;} +p img.top {margin-top:0;} +blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;} +.small {font-size:.9em;} +.large {font-size:1.1em;} +.quiet {color:#999;} +.hide {display:none;} +a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;} +a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/screen.css b/booking-mvc/src/main/webapp/styles/blueprint/screen.css new file mode 100755 index 0000000..c18b9a5 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/screen.css @@ -0,0 +1,280 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} +body {line-height:1.5;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;} +table, td, th {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:"";} +blockquote, q {quotes:"" "";} +a img {border:none;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:2em;margin-bottom:0.75em;} +h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} +p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} +a:focus, a:hover {color:#000;} +a {color:#009;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong {font-weight:bold;} +em, dfn {font-style:italic;} +dfn {font-weight:bold;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0 1.5em;} +ul, ol {margin:0 1.5em 1.5em 1.5em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tr.even td {background:#e5ecf9;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* forms.css */ +label {font-weight:bold;} +fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} +legend {font-weight:bold;font-size:1.2em;} +input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;} +input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;} +input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} +input.text, input.title {width:300px;padding:5px;} +input.title {font-size:1.5em;} +textarea {width:390px;height:250px;padding:5px;} +input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;} +form.inline {line-height:3;} +form.inline p {margin-bottom:0;} +.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} +.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} +.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} +.success {background:#E6EFC2;color:#264409;border-color:#C6D880;} +.error a {color:#8a1f11;} +.notice a {color:#514721;} +.success a {color:#264409;} + +/* grid.css */ +.container {width:950px;margin:0 auto;} +.showgrid {background:url(src/grid.png);} +.column, div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23, div.span-24 {float:left;margin-right:10px;} +.last, div.last {margin-right:0;} +.span-1 {width:30px;} +.span-2 {width:70px;} +.span-3 {width:110px;} +.span-4 {width:150px;} +.span-5 {width:190px;} +.span-6 {width:230px;} +.span-7 {width:270px;} +.span-8 {width:310px;} +.span-9 {width:350px;} +.span-10 {width:390px;} +.span-11 {width:430px;} +.span-12 {width:470px;} +.span-13 {width:510px;} +.span-14 {width:550px;} +.span-15 {width:590px;} +.span-16 {width:630px;} +.span-17 {width:670px;} +.span-18 {width:710px;} +.span-19 {width:750px;} +.span-20 {width:790px;} +.span-21 {width:830px;} +.span-22 {width:870px;} +.span-23 {width:910px;} +.span-24, div.span-24 {width:950px;margin-right:0;} +input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px!important;border-right-width:1px!important;padding-left:5px!important;padding-right:5px!important;} +input.span-1, textarea.span-1 {width:18px!important;} +input.span-2, textarea.span-2 {width:58px!important;} +input.span-3, textarea.span-3 {width:98px!important;} +input.span-4, textarea.span-4 {width:138px!important;} +input.span-5, textarea.span-5 {width:178px!important;} +input.span-6, textarea.span-6 {width:218px!important;} +input.span-7, textarea.span-7 {width:258px!important;} +input.span-8, textarea.span-8 {width:298px!important;} +input.span-9, textarea.span-9 {width:338px!important;} +input.span-10, textarea.span-10 {width:378px!important;} +input.span-11, textarea.span-11 {width:418px!important;} +input.span-12, textarea.span-12 {width:458px!important;} +input.span-13, textarea.span-13 {width:498px!important;} +input.span-14, textarea.span-14 {width:538px!important;} +input.span-15, textarea.span-15 {width:578px!important;} +input.span-16, textarea.span-16 {width:618px!important;} +input.span-17, textarea.span-17 {width:658px!important;} +input.span-18, textarea.span-18 {width:698px!important;} +input.span-19, textarea.span-19 {width:738px!important;} +input.span-20, textarea.span-20 {width:778px!important;} +input.span-21, textarea.span-21 {width:818px!important;} +input.span-22, textarea.span-22 {width:858px!important;} +input.span-23, textarea.span-23 {width:898px!important;} +input.span-24, textarea.span-24 {width:938px!important;} +.append-1 {padding-right:40px;} +.append-2 {padding-right:80px;} +.append-3 {padding-right:120px;} +.append-4 {padding-right:160px;} +.append-5 {padding-right:200px;} +.append-6 {padding-right:240px;} +.append-7 {padding-right:280px;} +.append-8 {padding-right:320px;} +.append-9 {padding-right:360px;} +.append-10 {padding-right:400px;} +.append-11 {padding-right:440px;} +.append-12 {padding-right:480px;} +.append-13 {padding-right:520px;} +.append-14 {padding-right:560px;} +.append-15 {padding-right:600px;} +.append-16 {padding-right:640px;} +.append-17 {padding-right:680px;} +.append-18 {padding-right:720px;} +.append-19 {padding-right:760px;} +.append-20 {padding-right:800px;} +.append-21 {padding-right:840px;} +.append-22 {padding-right:880px;} +.append-23 {padding-right:920px;} +.prepend-1 {padding-left:40px;} +.prepend-2 {padding-left:80px;} +.prepend-3 {padding-left:120px;} +.prepend-4 {padding-left:160px;} +.prepend-5 {padding-left:200px;} +.prepend-6 {padding-left:240px;} +.prepend-7 {padding-left:280px;} +.prepend-8 {padding-left:320px;} +.prepend-9 {padding-left:360px;} +.prepend-10 {padding-left:400px;} +.prepend-11 {padding-left:440px;} +.prepend-12 {padding-left:480px;} +.prepend-13 {padding-left:520px;} +.prepend-14 {padding-left:560px;} +.prepend-15 {padding-left:600px;} +.prepend-16 {padding-left:640px;} +.prepend-17 {padding-left:680px;} +.prepend-18 {padding-left:720px;} +.prepend-19 {padding-left:760px;} +.prepend-20 {padding-left:800px;} +.prepend-21 {padding-left:840px;} +.prepend-22 {padding-left:880px;} +.prepend-23 {padding-left:920px;} +div.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;} +div.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;} +.pull-1 {margin-left:-40px;} +.pull-2 {margin-left:-80px;} +.pull-3 {margin-left:-120px;} +.pull-4 {margin-left:-160px;} +.pull-5 {margin-left:-200px;} +.pull-6 {margin-left:-240px;} +.pull-7 {margin-left:-280px;} +.pull-8 {margin-left:-320px;} +.pull-9 {margin-left:-360px;} +.pull-10 {margin-left:-400px;} +.pull-11 {margin-left:-440px;} +.pull-12 {margin-left:-480px;} +.pull-13 {margin-left:-520px;} +.pull-14 {margin-left:-560px;} +.pull-15 {margin-left:-600px;} +.pull-16 {margin-left:-640px;} +.pull-17 {margin-left:-680px;} +.pull-18 {margin-left:-720px;} +.pull-19 {margin-left:-760px;} +.pull-20 {margin-left:-800px;} +.pull-21 {margin-left:-840px;} +.pull-22 {margin-left:-880px;} +.pull-23 {margin-left:-920px;} +.pull-24 {margin-left:-960px;} +.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;} +.push-1 {margin:0 -40px 1.5em 40px;} +.push-2 {margin:0 -80px 1.5em 80px;} +.push-3 {margin:0 -120px 1.5em 120px;} +.push-4 {margin:0 -160px 1.5em 160px;} +.push-5 {margin:0 -200px 1.5em 200px;} +.push-6 {margin:0 -240px 1.5em 240px;} +.push-7 {margin:0 -280px 1.5em 280px;} +.push-8 {margin:0 -320px 1.5em 320px;} +.push-9 {margin:0 -360px 1.5em 360px;} +.push-10 {margin:0 -400px 1.5em 400px;} +.push-11 {margin:0 -440px 1.5em 440px;} +.push-12 {margin:0 -480px 1.5em 480px;} +.push-13 {margin:0 -520px 1.5em 520px;} +.push-14 {margin:0 -560px 1.5em 560px;} +.push-15 {margin:0 -600px 1.5em 600px;} +.push-16 {margin:0 -640px 1.5em 640px;} +.push-17 {margin:0 -680px 1.5em 680px;} +.push-18 {margin:0 -720px 1.5em 720px;} +.push-19 {margin:0 -760px 1.5em 760px;} +.push-20 {margin:0 -800px 1.5em 800px;} +.push-21 {margin:0 -840px 1.5em 840px;} +.push-22 {margin:0 -880px 1.5em 880px;} +.push-23 {margin:0 -920px 1.5em 920px;} +.push-24 {margin:0 -960px 1.5em 960px;} +.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;} +.prepend-top {margin-top:1.5em;} +.append-bottom {margin-bottom:1.5em;} +.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} + +/* fancy-type */ +p + p {text-indent:2em;margin-top:-1.5em;} +form p + p {text-indent:0;} +.alt {color:#666;font-family:"Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif;font-style:italic;font-weight:normal;} +.dquo {margin-left:-.5em;} +p.incr, .incr p {font-size:10px;line-height:1.44em;margin-bottom:1.5em;} +.caps {font-variant:small-caps;letter-spacing:1px;text-transform:lowercase;font-size:1.2em;line-height:1%;font-weight:bold;padding:0 2px;} + +/* buttons */ +a.button, button {display:block;float:left;margin:0.7em 0.5em 0.7em 0;padding:5px 10px 5px 7px;border:1px solid #dedede;border-top:1px solid #eee;border-left:1px solid #eee;background-color:#f5f5f5;font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;font-size:100%;line-height:130%;text-decoration:none;font-weight:bold;color:#565656;cursor:pointer;} +button {width:auto;overflow:visible;padding:4px 10px 3px 7px;} +button[type] {padding:4px 10px 4px 7px;line-height:17px;} +*:first-child+html button[type] {padding:4px 10px 3px 7px;} +button img, a.button img {margin:0 3px -3px 0 !important;padding:0;border:none;width:16px;height:16px;float:none;} +button:hover, a.button:hover {background-color:#dff4ff;border:1px solid #c2e1ef;color:#336699;} +a.button:active {background-color:#6299c5;border:1px solid #6299c5;color:#fff;} +body .positive {color:#529214;} +a.positive:hover, button.positive:hover {background-color:#E6EFC2;border:1px solid #C6D880;color:#529214;} +a.positive:active {background-color:#529214;border:1px solid #529214;color:#fff;} +body .negative {color:#d12f19;} +a.negative:hover, button.negative:hover {background-color:#fbe3e4;border:1px solid #fbc2c4;color:#d12f19;} +a.negative:active {background-color:#d12f19;border:1px solid #d12f19;color:#fff;} \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/src/forms.css b/booking-mvc/src/main/webapp/styles/blueprint/src/forms.css new file mode 100755 index 0000000..b491134 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/src/forms.css @@ -0,0 +1,65 @@ +/* -------------------------------------------------------------- + + forms.css + * Sets up some default styling for forms + * Gives you classes to enhance your forms + + Usage: + * For text fields, use class .title or .text + * For inline forms, use .inline (even when using columns) + +-------------------------------------------------------------- */ + +label { font-weight: bold; } +fieldset { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; } +legend { font-weight: bold; font-size:1.2em; } + + +/* Form fields +-------------------------------------------------------------- */ + +input[type=text], input[type=password], +input.text, input.title, +textarea, select { + background-color:#fff; + border:1px solid #bbb; +} +input[type=text]:focus, input[type=password]:focus, +input.text:focus, input.title:focus, +textarea:focus, select:focus { + border-color:#666; +} + +input[type=text], input[type=password], +input.text, input.title, +textarea, select { + margin:0.5em 0; +} + +input.text, +input.title { width: 300px; padding:5px; } +input.title { font-size:1.5em; } +textarea { width: 390px; height: 250px; padding:5px; } + +input[type=checkbox], input[type=radio], +input.checkbox, input.radio { + position:relative; top:.25em; +} + +form.inline { line-height:3; } +form.inline p { margin-bottom:0; } + + +/* Success, notice and error boxes +-------------------------------------------------------------- */ + +.error, +.notice, +.success { padding: .8em; margin-bottom: 1em; border: 2px solid #ddd; } + +.error { background: #FBE3E4; color: #8a1f11; border-color: #FBC2C4; } +.notice { background: #FFF6BF; color: #514721; border-color: #FFD324; } +.success { background: #E6EFC2; color: #264409; border-color: #C6D880; } +.error a { color: #8a1f11; } +.notice a { color: #514721; } +.success a { color: #264409; } diff --git a/booking-mvc/src/main/webapp/styles/blueprint/src/grid.css b/booking-mvc/src/main/webapp/styles/blueprint/src/grid.css new file mode 100755 index 0000000..352e0e2 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/src/grid.css @@ -0,0 +1,281 @@ +/* -------------------------------------------------------------- + grid.css + * Sets up an easy-to-use grid of 24 columns. + + By default, the grid is 950px wide, with 24 columns + spanning 30px, and a 10px margin between columns. + + If you need fewer or more columns, namespaces or semantic + element names, use the compressor script (lib/compress.rb) + + Note: Changes made in this file will not be applied when + using the compressor: make changes in lib/blueprint/grid.css.rb +-------------------------------------------------------------- */ + +/* A container should group all your columns. */ +.container { + width: 950px; + margin: 0 auto; +} + +/* Use this class on any div.span / container to see the grid. */ +.showgrid { + background: url(src/grid.png); +} + + +/* Columns +-------------------------------------------------------------- */ + +/* Sets up basic grid floating and margin. */ +.column, div.span-1, div.span-2, div.span-3, div.span-4, div.span-5, div.span-6, div.span-7, div.span-8, div.span-9, div.span-10, div.span-11, div.span-12, div.span-13, div.span-14, div.span-15, div.span-16, div.span-17, div.span-18, div.span-19, div.span-20, div.span-21, div.span-22, div.span-23, div.span-24 { + float: left; + margin-right: 10px; +} + +/* The last column in a row needs this class. */ +.last, div.last { margin-right: 0; } + +/* Use these classes to set the width of a column. */ +.span-1 {width: 30px;} + +.span-2 {width: 70px;} +.span-3 {width: 110px;} +.span-4 {width: 150px;} +.span-5 {width: 190px;} +.span-6 {width: 230px;} +.span-7 {width: 270px;} +.span-8 {width: 310px;} +.span-9 {width: 350px;} +.span-10 {width: 390px;} +.span-11 {width: 430px;} +.span-12 {width: 470px;} +.span-13 {width: 510px;} +.span-14 {width: 550px;} +.span-15 {width: 590px;} +.span-16 {width: 630px;} +.span-17 {width: 670px;} +.span-18 {width: 710px;} +.span-19 {width: 750px;} +.span-20 {width: 790px;} +.span-21 {width: 830px;} +.span-22 {width: 870px;} +.span-23 {width: 910px;} +.span-24, div.span-24 { width:950px; margin-right:0; } + +/* Use these classes to set the width of an input. */ +input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 { + border-left-width: 1px!important; + border-right-width: 1px!important; + padding-left: 5px!important; + padding-right: 5px!important; +} + +input.span-1, textarea.span-1 { width: 18px!important; } +input.span-2, textarea.span-2 { width: 58px!important; } +input.span-3, textarea.span-3 { width: 98px!important; } +input.span-4, textarea.span-4 { width: 138px!important; } +input.span-5, textarea.span-5 { width: 178px!important; } +input.span-6, textarea.span-6 { width: 218px!important; } +input.span-7, textarea.span-7 { width: 258px!important; } +input.span-8, textarea.span-8 { width: 298px!important; } +input.span-9, textarea.span-9 { width: 338px!important; } +input.span-10, textarea.span-10 { width: 378px!important; } +input.span-11, textarea.span-11 { width: 418px!important; } +input.span-12, textarea.span-12 { width: 458px!important; } +input.span-13, textarea.span-13 { width: 498px!important; } +input.span-14, textarea.span-14 { width: 538px!important; } +input.span-15, textarea.span-15 { width: 578px!important; } +input.span-16, textarea.span-16 { width: 618px!important; } +input.span-17, textarea.span-17 { width: 658px!important; } +input.span-18, textarea.span-18 { width: 698px!important; } +input.span-19, textarea.span-19 { width: 738px!important; } +input.span-20, textarea.span-20 { width: 778px!important; } +input.span-21, textarea.span-21 { width: 818px!important; } +input.span-22, textarea.span-22 { width: 858px!important; } +input.span-23, textarea.span-23 { width: 898px!important; } +input.span-24, textarea.span-24 { width: 938px!important; } + +/* Add these to a column to append empty cols. */ + +.append-1 { padding-right: 40px;} +.append-2 { padding-right: 80px;} +.append-3 { padding-right: 120px;} +.append-4 { padding-right: 160px;} +.append-5 { padding-right: 200px;} +.append-6 { padding-right: 240px;} +.append-7 { padding-right: 280px;} +.append-8 { padding-right: 320px;} +.append-9 { padding-right: 360px;} +.append-10 { padding-right: 400px;} +.append-11 { padding-right: 440px;} +.append-12 { padding-right: 480px;} +.append-13 { padding-right: 520px;} +.append-14 { padding-right: 560px;} +.append-15 { padding-right: 600px;} +.append-16 { padding-right: 640px;} +.append-17 { padding-right: 680px;} +.append-18 { padding-right: 720px;} +.append-19 { padding-right: 760px;} +.append-20 { padding-right: 800px;} +.append-21 { padding-right: 840px;} +.append-22 { padding-right: 880px;} +.append-23 { padding-right: 920px;} + +/* Add these to a column to prepend empty cols. */ + +.prepend-1 { padding-left: 40px;} +.prepend-2 { padding-left: 80px;} +.prepend-3 { padding-left: 120px;} +.prepend-4 { padding-left: 160px;} +.prepend-5 { padding-left: 200px;} +.prepend-6 { padding-left: 240px;} +.prepend-7 { padding-left: 280px;} +.prepend-8 { padding-left: 320px;} +.prepend-9 { padding-left: 360px;} +.prepend-10 { padding-left: 400px;} +.prepend-11 { padding-left: 440px;} +.prepend-12 { padding-left: 480px;} +.prepend-13 { padding-left: 520px;} +.prepend-14 { padding-left: 560px;} +.prepend-15 { padding-left: 600px;} +.prepend-16 { padding-left: 640px;} +.prepend-17 { padding-left: 680px;} +.prepend-18 { padding-left: 720px;} +.prepend-19 { padding-left: 760px;} +.prepend-20 { padding-left: 800px;} +.prepend-21 { padding-left: 840px;} +.prepend-22 { padding-left: 880px;} +.prepend-23 { padding-left: 920px;} + + +/* Border on right hand side of a column. */ +div.border { + padding-right: 4px; + margin-right: 5px; + border-right: 1px solid #eee; +} + +/* Border with more whitespace, spans one column. */ +div.colborder { + padding-right: 24px; + margin-right: 25px; + border-right: 1px solid #eee; +} + + +/* Use these classes on an element to push it into the +next column, or to pull it into the previous column. */ + + +.pull-1 { margin-left: -40px; } +.pull-2 { margin-left: -80px; } +.pull-3 { margin-left: -120px; } +.pull-4 { margin-left: -160px; } +.pull-5 { margin-left: -200px; } +.pull-6 { margin-left: -240px; } +.pull-7 { margin-left: -280px; } +.pull-8 { margin-left: -320px; } +.pull-9 { margin-left: -360px; } +.pull-10 { margin-left: -400px; } +.pull-11 { margin-left: -440px; } +.pull-12 { margin-left: -480px; } +.pull-13 { margin-left: -520px; } +.pull-14 { margin-left: -560px; } +.pull-15 { margin-left: -600px; } +.pull-16 { margin-left: -640px; } +.pull-17 { margin-left: -680px; } +.pull-18 { margin-left: -720px; } +.pull-19 { margin-left: -760px; } +.pull-20 { margin-left: -800px; } +.pull-21 { margin-left: -840px; } +.pull-22 { margin-left: -880px; } +.pull-23 { margin-left: -920px; } +.pull-24 { margin-left: -960px; } + +.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float: left; position:relative;} + + +.push-1 { margin: 0 -40px 1.5em 40px; } +.push-2 { margin: 0 -80px 1.5em 80px; } +.push-3 { margin: 0 -120px 1.5em 120px; } +.push-4 { margin: 0 -160px 1.5em 160px; } +.push-5 { margin: 0 -200px 1.5em 200px; } +.push-6 { margin: 0 -240px 1.5em 240px; } +.push-7 { margin: 0 -280px 1.5em 280px; } +.push-8 { margin: 0 -320px 1.5em 320px; } +.push-9 { margin: 0 -360px 1.5em 360px; } +.push-10 { margin: 0 -400px 1.5em 400px; } +.push-11 { margin: 0 -440px 1.5em 440px; } +.push-12 { margin: 0 -480px 1.5em 480px; } +.push-13 { margin: 0 -520px 1.5em 520px; } +.push-14 { margin: 0 -560px 1.5em 560px; } +.push-15 { margin: 0 -600px 1.5em 600px; } +.push-16 { margin: 0 -640px 1.5em 640px; } +.push-17 { margin: 0 -680px 1.5em 680px; } +.push-18 { margin: 0 -720px 1.5em 720px; } +.push-19 { margin: 0 -760px 1.5em 760px; } +.push-20 { margin: 0 -800px 1.5em 800px; } +.push-21 { margin: 0 -840px 1.5em 840px; } +.push-22 { margin: 0 -880px 1.5em 880px; } +.push-23 { margin: 0 -920px 1.5em 920px; } +.push-24 { margin: 0 -960px 1.5em 960px; } + +.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float: right; position:relative;} + + +/* Misc classes and elements +-------------------------------------------------------------- */ + +/* In case you need to add a gutter above/below an element */ +.prepend-top { + margin-top:1.5em; +} +.append-bottom { + margin-bottom:1.5em; +} + +/* Use a .box to create a padded box inside a column. */ +.box { + padding: 1.5em; + margin-bottom: 1.5em; + background: #E5ECF9; +} + +/* Use this to create a horizontal ruler across a column. */ +hr { + background: #ddd; + color: #ddd; + clear: both; + float: none; + width: 100%; + height: .1em; + margin: 0 0 1.45em; + border: none; +} + +hr.space { + background: #fff; + color: #fff; + visibility: hidden; +} + + +/* Clearing floats without extra markup + Based on How To Clear Floats Without Structural Markup by PiE + [http://www.positioniseverything.net/easyclearing.html] */ + +.clearfix:after, .container:after { + content: "\0020"; + display: block; + height: 0; + clear: both; + visibility: hidden; + overflow:hidden; +} +.clearfix, .container {display: block;} + +/* Regular clearing + apply to column that should drop below previous ones. */ + +.clear { clear:both; } diff --git a/booking-mvc/src/main/webapp/styles/blueprint/src/grid.png b/booking-mvc/src/main/webapp/styles/blueprint/src/grid.png new file mode 100755 index 0000000000000000000000000000000000000000..b7539f672bd43f6812a54df5dd42ba33b20b9b78 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<>!3HEX<>xE|Qfx`y?k)`fL2$v|<&%LToCO|{ z#X#BvjNMLV+W{Glo-U3d9>YC#XH~G^;0osUz08pk^?RiSy5sjM`N=Z)ZDzmUBEZ4{G>pO1)z4*}Q$iB}{R}RN literal 0 HcmV?d00001 diff --git a/booking-mvc/src/main/webapp/styles/blueprint/src/ie.css b/booking-mvc/src/main/webapp/styles/blueprint/src/ie.css new file mode 100755 index 0000000..214b879 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/src/ie.css @@ -0,0 +1,76 @@ +/* -------------------------------------------------------------- + + ie.css + + Contains every hack for Internet Explorer, + so that our core files stay sweet and nimble. + +-------------------------------------------------------------- */ + +/* Make sure the layout is centered in IE5 */ +body { text-align: center; } +.container { text-align: left; } + +/* Fixes IE margin bugs */ +* html .column, * html div.span-1, * html div.span-2, +* html div.span-3, * html div.span-4, * html div.span-5, +* html div.span-6, * html div.span-7, * html div.span-8, +* html div.span-9, * html div.span-10, * html div.span-11, +* html div.span-12, * html div.span-13, * html div.span-14, +* html div.span-15, * html div.span-16, * html div.span-17, +* html div.span-18, * html div.span-19, * html div.span-20, +* html div.span-21, * html div.span-22, * html div.span-23, +* html div.span-24 { display:inline; overflow-x: hidden; } + + +/* Elements +-------------------------------------------------------------- */ + +/* Fixes incorrect styling of legend in IE6. */ +* html legend { margin:0px -8px 16px 0; padding:0; } + +/* Fixes wrong line-height on sup/sub in IE. */ +sup { vertical-align:text-top; } +sub { vertical-align:text-bottom; } + +/* Fixes IE7 missing wrapping of code elements. */ +html>body p code { *white-space: normal; } + +/* IE 6&7 has problems with setting proper


margins. */ +hr { margin:-8px auto 11px; } + +/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */ +img { -ms-interpolation-mode:bicubic; } + +/* Clearing +-------------------------------------------------------------- */ + +/* Makes clearfix actually work in IE */ +.clearfix, .container { display:inline-block; } +* html .clearfix, +* html .container { height:1%; } + + +/* Forms +-------------------------------------------------------------- */ + +/* Fixes padding on fieldset */ +fieldset { padding-top:0; } + +/* Makes classic textareas in IE 6 resemble other browsers */ +textarea { overflow:auto; } + +/* Fixes rule that IE 6 ignores */ +input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; } +input.text:focus, input.title:focus { border-color:#666; } +input.text, input.title, textarea, select { margin:0.5em 0; } +input.checkbox, input.radio { position:relative; top:.25em; } + +/* Fixes alignment of inline form elements */ +form.inline div, form.inline p { vertical-align:middle; } +form.inline label { position:relative;top:-0.25em; } +form.inline input.checkbox, form.inline input.radio, +form.inline input.button, form.inline button { + margin:0.5em 0; +} +button, input.button { position:relative;top:0.25em; } \ No newline at end of file diff --git a/booking-mvc/src/main/webapp/styles/blueprint/src/print.css b/booking-mvc/src/main/webapp/styles/blueprint/src/print.css new file mode 100755 index 0000000..d303029 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/src/print.css @@ -0,0 +1,85 @@ +/* -------------------------------------------------------------- + + print.css + * Gives you some sensible styles for printing pages. + * See Readme file in this directory for further instructions. + + Some additions you'll want to make, customized to your markup: + #header, #footer, #navigation { display:none; } + +-------------------------------------------------------------- */ + +body { + line-height: 1.5; + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; + color:#000; + background: none; + font-size: 10pt; +} + + +/* Layout +-------------------------------------------------------------- */ + +.container { + background: none; +} + +hr { + background:#ccc; + color:#ccc; + width:100%; + height:2px; + margin:2em 0; + padding:0; + border:none; +} +hr.space { + background: #fff; + color: #fff; + visibility: hidden; +} + + +/* Text +-------------------------------------------------------------- */ + +h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; } +code { font:.9em "Courier New", Monaco, Courier, monospace; } + +a img { border:none; } +p img.top { margin-top: 0; } + +blockquote { + margin:1.5em; + padding:1em; + font-style:italic; + font-size:.9em; +} + +.small { font-size: .9em; } +.large { font-size: 1.1em; } +.quiet { color: #999; } +.hide { display:none; } + + +/* Links +-------------------------------------------------------------- */ + +a:link, a:visited { + background: transparent; + font-weight:700; + text-decoration: underline; +} + +a:link:after, a:visited:after { + content: " (" attr(href) ")"; + font-size: 90%; +} + +/* If you're having trouble printing relative links, uncomment and customize this: + (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */ + +/* a[href^="/"]:after { + content: " (http://www.yourdomain.com" attr(href) ") "; +} */ diff --git a/booking-mvc/src/main/webapp/styles/blueprint/src/reset.css b/booking-mvc/src/main/webapp/styles/blueprint/src/reset.css new file mode 100755 index 0000000..fc0788c --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/src/reset.css @@ -0,0 +1,38 @@ +/* -------------------------------------------------------------- + + reset.css + * Resets default browser CSS. + +-------------------------------------------------------------- */ + +html, body, div, span, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, code, +del, dfn, em, img, q, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + font-weight: inherit; + font-style: inherit; + font-size: 100%; + font-family: inherit; + vertical-align: baseline; +} + +body { + line-height: 1.5; +} + +/* Tables still need 'cellspacing="0"' in the markup. */ +table { border-collapse: separate; border-spacing: 0; } +caption, th, td { text-align: left; font-weight: normal; } +table, td, th { vertical-align: middle; } + +/* Remove possible quote marks (") from ,
. */ +blockquote:before, blockquote:after, q:before, q:after { content: ""; } +blockquote, q { quotes: "" ""; } + +/* Remove annoying border on linked images. */ +a img { border: none; } diff --git a/booking-mvc/src/main/webapp/styles/blueprint/src/typography.css b/booking-mvc/src/main/webapp/styles/blueprint/src/typography.css new file mode 100755 index 0000000..6cc099c --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/blueprint/src/typography.css @@ -0,0 +1,106 @@ +/* -------------------------------------------------------------- + + typography.css + * Sets up some sensible default typography. + +-------------------------------------------------------------- */ + +/* Default font settings. + The font-size percentage is of 16px. (0.75 * 16px = 12px) */ +html { font-size:100.01%; } +body { + font-size: 75%; + color: #222; + background: #fff; + font-family: "Helvetica Neue", Arial, Helvetica, sans-serif; +} + + +/* Headings +-------------------------------------------------------------- */ + +h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; } + +h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; } +h2 { font-size: 2em; margin-bottom: 0.75em; } +h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; } +h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; } +h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; } +h6 { font-size: 1em; font-weight: bold; } + +h1 img, h2 img, h3 img, +h4 img, h5 img, h6 img { + margin: 0; +} + + +/* Text elements +-------------------------------------------------------------- */ + +p { margin: 0 0 1.5em; } +p img.left { float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; } +p img.right { float: right; margin: 1.5em 0 1.5em 1.5em; } + +a:focus, +a:hover { color: #000; } +a { color: #009; text-decoration: underline; } + +blockquote { margin: 1.5em; color: #666; font-style: italic; } +strong { font-weight: bold; } +em,dfn { font-style: italic; } +dfn { font-weight: bold; } +sup, sub { line-height: 0; } + +abbr, +acronym { border-bottom: 1px dotted #666; } +address { margin: 0 0 1.5em; font-style: italic; } +del { color:#666; } + +pre { margin: 1.5em 0; white-space: pre; } +pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; } + + +/* Lists +-------------------------------------------------------------- */ + +li ul, +li ol { margin: 0; } +ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; } + +ul { list-style-type: disc; } +ol { list-style-type: decimal; } + +dl { margin: 0 0 1.5em 0; } +dl dt { font-weight: bold; } +dd { margin-left: 1.5em;} + + +/* Tables +-------------------------------------------------------------- */ + +table { margin-bottom: 1.4em; width:100%; } +th { font-weight: bold; } +thead th { background: #c3d9ff; } +th,td,caption { padding: 4px 10px 4px 5px; } +tr.even td { background: #e5ecf9; } +tfoot { font-style: italic; } +caption { background: #eee; } + + +/* Misc classes +-------------------------------------------------------------- */ + +.small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; } +.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; } +.hide { display: none; } + +.quiet { color: #666; } +.loud { color: #000; } +.highlight { background:#ff0; } +.added { background:#060; color: #fff; } +.removed { background:#900; color: #fff; } + +.first { margin-left:0; padding-left:0; } +.last { margin-right:0; padding-right:0; } +.top { margin-top:0; padding-top:0; } +.bottom { margin-bottom:0; padding-bottom:0; } diff --git a/booking-mvc/src/main/webapp/styles/booking.css b/booking-mvc/src/main/webapp/styles/booking.css new file mode 100644 index 0000000..b8d17e4 --- /dev/null +++ b/booking-mvc/src/main/webapp/styles/booking.css @@ -0,0 +1,53 @@ + +a,a:visited,a:link,a:active { + color: #59924B; + background-color: transparent; + text-decoration: none; + font-weight: bold; +} + +a:hover { + color: white; + background-color: #65a242; + text-decoration: none; + font-weight: bold; +} + +button { + color: #fff; + background: #fff url(../images/btn.bg.gif) 0 0 repeat-x; + border-style: none; +} + +button:hover { + color: yellow; + background: #fff url(../images/btn.bg.gif) 0 0 repeat-x; + border-style: none; +} + +.summary { + width: 100%; + border: 1px solid #414f23; + border-collapse: collapse; +} + +.summary thead th { + border-left: 1px solid #414f23; + background: #fff url(../images/th.bg.gif) 0 100% repeat-x; + border-bottom: 1px solid #414f23; + padding: 6px; + text-align: left; + font-size: small; +} + +.summary tbody td { + border-left: 1px solid #9cac7c; + padding: 4px; + border-bottom: 1px solid #9cac7c; + font-size: 8pt; +} + +.label { + font-weight: bold; +} + diff --git a/booking-mvc/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java b/booking-mvc/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java new file mode 100644 index 0000000..63d78e9 --- /dev/null +++ b/booking-mvc/src/test/java/org/springframework/webflow/samples/booking/BookingFlowExecutionTests.java @@ -0,0 +1,81 @@ +package org.springframework.webflow.samples.booking; + +import org.easymock.EasyMock; +import org.springframework.webflow.config.FlowDefinitionResource; +import org.springframework.webflow.config.FlowDefinitionResourceFactory; +import org.springframework.webflow.core.collection.LocalAttributeMap; +import org.springframework.webflow.core.collection.MutableAttributeMap; +import org.springframework.webflow.test.MockExternalContext; +import org.springframework.webflow.test.MockFlowBuilderContext; +import org.springframework.webflow.test.execution.AbstractXmlFlowExecutionTests; + +public class BookingFlowExecutionTests extends AbstractXmlFlowExecutionTests { + + private BookingService bookingService; + + protected void setUp() { + bookingService = EasyMock.createMock(BookingService.class); + } + + @Override + protected FlowDefinitionResource getResource(FlowDefinitionResourceFactory resourceFactory) { + return resourceFactory.createFileResource("src/main/webapp/WEB-INF/hotels/booking/booking-flow.xml"); + } + + @Override + protected void configureFlowBuilderContext(MockFlowBuilderContext builderContext) { + builderContext.registerBean("bookingService", bookingService); + } + + public void testStartBookingFlow() { + Booking booking = createTestBooking(); + + EasyMock.expect(bookingService.createBooking(1L, "keith")).andReturn(booking); + + EasyMock.replay(bookingService); + + MutableAttributeMap input = new LocalAttributeMap(); + input.put("hotelId", "1"); + MockExternalContext context = new MockExternalContext(); + context.setCurrentUser("keith"); + startFlow(input, context); + + assertCurrentStateEquals("enterBookingDetails"); + assertResponseWrittenEquals("enterBookingDetails", context); + assertTrue(getRequiredFlowAttribute("booking") instanceof Booking); + + EasyMock.verify(bookingService); + } + + public void testEnterBookingDetails_Proceed() { + setCurrentState("enterBookingDetails"); + getFlowScope().put("booking", createTestBooking()); + + MockExternalContext context = new MockExternalContext(); + context.setEventId("proceed"); + resumeFlow(context); + + assertCurrentStateEquals("reviewBooking"); + assertResponseWrittenEquals("reviewBooking", context); + } + + public void testReviewBooking_Confirm() { + setCurrentState("reviewBooking"); + getFlowScope().put("booking", createTestBooking()); + MockExternalContext context = new MockExternalContext(); + context.setEventId("confirm"); + resumeFlow(context); + assertFlowExecutionEnded(); + assertFlowExecutionOutcomeEquals("bookingConfirmed"); + } + + private Booking createTestBooking() { + Hotel hotel = new Hotel(); + hotel.setId(1L); + hotel.setName("Jameson Inn"); + User user = new User("keith", "pass", "Keith Donald"); + Booking booking = new Booking(hotel, user); + return booking; + } + +} diff --git a/booking-mvc/src/test/resources/.gitignore b/booking-mvc/src/test/resources/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/booking-portlet-faces/.metadata/src/main/webapp/WEB-INF/faces-config.pageflow b/booking-portlet-faces/.metadata/src/main/webapp/WEB-INF/faces-config.pageflow new file mode 100644 index 0000000..60c2b79 --- /dev/null +++ b/booking-portlet-faces/.metadata/src/main/webapp/WEB-INF/faces-config.pageflow @@ -0,0 +1,2 @@ + + diff --git a/booking-portlet-faces/build.xml b/booking-portlet-faces/build.xml new file mode 100644 index 0000000..e27197c --- /dev/null +++ b/booking-portlet-faces/build.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/booking-portlet-faces/pom.xml b/booking-portlet-faces/pom.xml new file mode 100644 index 0000000..86d3fc4 --- /dev/null +++ b/booking-portlet-faces/pom.xml @@ -0,0 +1,219 @@ + + + 4.0.0 + org.springframework.webflow.samples + booking-portlet-faces + war + Hotel Booking : Spring Portlet MVC + Web Flow + JSF + 1.0.0.BUILD-SNAPSHOT + + + 3.1.1.RELEASE + 2.3.1.RELEASE + 1.5.10 + 1.2.9 + + + + + spring-repository + Spring project snapshots, milestones, and releases + http://repo.springsource.org/snapshot + + + + + + + org.springframework + spring-context + ${springframework-version} + + + + commons-logging + commons-logging + + + + + org.springframework + spring-jdbc + ${springframework-version} + + + org.springframework + spring-orm + ${springframework-version} + + + org.springframework + spring-webmvc + ${springframework-version} + + + org.springframework + spring-webmvc-portlet + ${springframework-version} + + + org.springframework.webflow + spring-faces + ${webflow-version} + + + + org.hsqldb + hsqldb + 1.8.0.10 + runtime + + + org.hibernate + hibernate-entitymanager + 3.5.0-Final + + + + org.apache.myfaces.core + myfaces-api + ${myfaces-version} + + + org.apache.myfaces.core + myfaces-impl + ${myfaces-version} + + + com.sun.facelets + jsf-facelets + 1.1.14 + + + + org.slf4j + slf4j-api + ${slf4j-version} + + + org.slf4j + jcl-over-slf4j + ${slf4j-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + runtime + + + log4j + log4j + 1.2.15 + + + javax.mail + mail + + + javax.jms + jms + + + com.sun.jdmk + jmxtools + + + com.sun.jmx + jmxri + + + runtime + + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.portlet + portlet-api + 2.0 + provided + + + + org.hibernate + hibernate-validator + 4.0.2.GA + + + + javax.xml.bind + jaxb-api + 2.1 + + + + org.easymock + easymock + 2.5.2 + test + + + junit + junit + 3.8.2 + test + + + org.springframework + spring-test + ${springframework-version} + test + + + + + booking-portlet-faces + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.1.12 + + junit:junit + + **/*Tests.java + + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + true + false + 2.0 + + + + + diff --git a/booking-portlet-faces/readme.txt b/booking-portlet-faces/readme.txt new file mode 100644 index 0000000..323a081 --- /dev/null +++ b/booking-portlet-faces/readme.txt @@ -0,0 +1,8 @@ + +Starting with version 2.2, Spring Web Flow provides support for JSF Portlets using its own internal +Portlet integration rather than a Portlet Bridge for JSF. + +This sample demonstrates that support. It has been tested on Apache Pluto 2.0.1 with Portlet +API 2.0 and JSF 1.2 (both Mojarra and MyFaces). + +See the reference documentation for more information. diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java new file mode 100644 index 0000000..07db3df --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Booking.java @@ -0,0 +1,198 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; + +import org.springframework.binding.message.MessageBuilder; +import org.springframework.binding.message.MessageContext; + +/** + * A Hotel Booking made by a User. + */ +@Entity +public class Booking implements Serializable { + + private static final long serialVersionUID = 1171567558348174963L; + + private Long id; + + private User user; + + private Hotel hotel; + + private Date checkinDate; + + private Date checkoutDate; + + private String creditCard; + + private String creditCardName; + + private int creditCardExpiryMonth; + + private int creditCardExpiryYear; + + private boolean smoking; + + private int beds; + + public Booking() { + } + + public Booking(Hotel hotel, User user) { + this.hotel = hotel; + this.user = user; + Calendar calendar = Calendar.getInstance(); + setCheckinDate(calendar.getTime()); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckoutDate(calendar.getTime()); + } + + @Transient + public BigDecimal getTotal() { + return hotel.getPrice().multiply(new BigDecimal(getNights())); + } + + @Transient + public int getNights() { + return (int) (checkoutDate.getTime() - checkinDate.getTime()) / 1000 / 60 / 60 / 24; + } + + @Id + @GeneratedValue(strategy = GenerationType.TABLE) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Basic + @Temporal(TemporalType.DATE) + public Date getCheckinDate() { + return checkinDate; + } + + public void setCheckinDate(Date datetime) { + this.checkinDate = datetime; + } + + @ManyToOne + public Hotel getHotel() { + return hotel; + } + + public void setHotel(Hotel hotel) { + this.hotel = hotel; + } + + @ManyToOne + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Basic + @Temporal(TemporalType.DATE) + public Date getCheckoutDate() { + return checkoutDate; + } + + public void setCheckoutDate(Date checkoutDate) { + this.checkoutDate = checkoutDate; + } + + public String getCreditCard() { + return creditCard; + } + + public void setCreditCard(String creditCard) { + this.creditCard = creditCard; + } + + @Transient + public String getDescription() { + DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); + return hotel == null ? null : hotel.getName() + ", " + df.format(getCheckinDate()) + " to " + + df.format(getCheckoutDate()); + } + + public boolean isSmoking() { + return smoking; + } + + public void setSmoking(boolean smoking) { + this.smoking = smoking; + } + + public int getBeds() { + return beds; + } + + public void setBeds(int beds) { + this.beds = beds; + } + + public String getCreditCardName() { + return creditCardName; + } + + public void setCreditCardName(String creditCardName) { + this.creditCardName = creditCardName; + } + + public int getCreditCardExpiryMonth() { + return creditCardExpiryMonth; + } + + public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { + this.creditCardExpiryMonth = creditCardExpiryMonth; + } + + public int getCreditCardExpiryYear() { + return creditCardExpiryYear; + } + + public void setCreditCardExpiryYear(int creditCardExpiryYear) { + this.creditCardExpiryYear = creditCardExpiryYear; + } + + public boolean validate(MessageContext context) { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + boolean valid = true; + if (checkinDate.before(calendar.getTime())) { + context.addMessage(new MessageBuilder().error().source("checkinDate").defaultText( + "Check in date must be a future date").build()); + valid = false; + } else if (!checkinDate.before(checkoutDate)) { + context.addMessage(new MessageBuilder().error().source("checkoutDate").defaultText( + "Check out date must be later than check in date").build()); + valid = false; + } + return valid; + } + + @Override + public String toString() { + return "Booking(" + user + "," + hotel + ")"; + } + +} diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java new file mode 100644 index 0000000..59a333f --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/BookingService.java @@ -0,0 +1,59 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +/** + * A service interface for retrieving hotels and bookings from a backing repository. Also supports the ability to cancel + * a booking. + */ +public interface BookingService { + + /** + * Find bookings made by the given user + * @param username the user's name + * @return their bookings + */ + public List findBookings(String username); + + /** + * Find hotels available for booking by some criteria. + * @param criteria the search criteria + * @return a list of hotels meeting the criteria + */ + public List findHotels(SearchCriteria criteria); + + /** + * Find hotels by their identifier. + * @param id the hotel id + * @return the hotel + */ + public Hotel findHotelById(Long id); + + /** + * Find user by their username. + * @param username the user's username + * @return the user + */ + public User findUser(String username); + + /** + * Create a new, transient hotel booking instance for the given user. + * @param hotelId the hotelId + * @param userName the user name + * @return the new transient booking instance + */ + public Booking createBooking(Long hotelId, String userName); + + /** + * Persist the booking to the database + * @param booking the booking + */ + public void persistBooking(Booking booking); + + /** + * Cancel an existing booking. + * @param id the booking id + */ + public void cancelBooking(Booking booking); + +} diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java new file mode 100644 index 0000000..3715a98 --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/Hotel.java @@ -0,0 +1,110 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * A hotel where users may book stays. + */ +@Entity +public class Hotel implements Serializable { + + private static final long serialVersionUID = 4011346719502656269L; + + private Long id; + + private String name; + + private String address; + + private String city; + + private String state; + + private String zip; + + private String country; + + private BigDecimal price; + + @Id + @GeneratedValue + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + @Column(precision = 6, scale = 2) + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public Booking createBooking(User user) { + return new Booking(this, user); + } + + @Override + public String toString() { + return "Hotel(" + name + "," + address + "," + city + "," + zip + ")"; + } +} diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java new file mode 100644 index 0000000..b530411 --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java @@ -0,0 +1,93 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +/** + * A JPA-based implementation of the Booking Service. Delegates to a JPA entity manager to issue data access calls + * against the backing repository. The EntityManager reference is provided by the managing container (Spring) + * automatically. + */ +@Service("bookingService") +@Repository +public class JpaBookingService implements BookingService { + + private EntityManager em; + + @PersistenceContext + public void setEntityManager(EntityManager em) { + this.em = em; + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findBookings(String username) { + if (username != null) { + return em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate") + .setParameter("username", username).getResultList(); + } else { + return null; + } + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findHotels(SearchCriteria criteria) { + String pattern = getSearchPattern(criteria); + return em + .createQuery( + "select h from Hotel h where lower(h.name) like :pattern or lower(h.city) like :pattern " + + " or lower(h.zip) like :pattern or lower(h.address) like :pattern") + .setParameter("pattern", pattern).setMaxResults(criteria.getPageSize()) + .setFirstResult(criteria.getPage() * criteria.getPageSize()).getResultList(); + } + + @Transactional(readOnly = true) + public Hotel findHotelById(Long id) { + return em.find(Hotel.class, id); + } + + @Transactional(readOnly = true) + public User findUser(String username) { + return (User) em.createQuery("select u from User u where u.username = :username") + .setParameter("username", username).getSingleResult(); + } + + @Transactional(readOnly = true) + public Booking createBooking(Long hotelId, String username) { + Hotel hotel = em.find(Hotel.class, hotelId); + User user = findUser(username); + return new Booking(hotel, user); + } + + @Transactional + public void persistBooking(Booking booking) { + em.persist(booking); + } + + @Transactional + public void cancelBooking(Booking booking) { + booking = em.find(Booking.class, booking.getId()); + if (booking != null) { + em.remove(booking); + } + } + + // helpers + + private String getSearchPattern(SearchCriteria criteria) { + if (StringUtils.hasText(criteria.getSearchString())) { + return "%" + criteria.getSearchString().toLowerCase().replace('*', '%') + "%"; + } else { + return "%"; + } + } + +} \ No newline at end of file diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java new file mode 100644 index 0000000..4c499aa --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ReferenceData.java @@ -0,0 +1,83 @@ +package org.springframework.webflow.samples.booking; + +import java.util.ArrayList; +import java.util.List; + +import javax.faces.model.SelectItem; + +import org.springframework.stereotype.Service; + +@Service +public class ReferenceData { + + private List bedOptions; + + private List smokingOptions; + + private List creditCardExpMonths; + + private List creditCardExpYears; + + private List pageSizeOptions; + + public List getBedOptions() { + if (bedOptions == null) { + bedOptions = new ArrayList(); + bedOptions.add(new SelectItem(new Integer(1), "One king-size bed")); + bedOptions.add(new SelectItem(new Integer(2), "Two double beds")); + bedOptions.add(new SelectItem(new Integer(3), "Three beds")); + } + return bedOptions; + } + + public List getSmokingOptions() { + if (smokingOptions == null) { + smokingOptions = new ArrayList(); + smokingOptions.add(new SelectItem(Boolean.TRUE, "Smoking")); + smokingOptions.add(new SelectItem(Boolean.FALSE, "Non-Smoking")); + } + return smokingOptions; + } + + public List getCreditCardExpMonths() { + if (creditCardExpMonths == null) { + creditCardExpMonths = new ArrayList(); + creditCardExpMonths.add(new SelectItem(new Integer(1), "Jan")); + creditCardExpMonths.add(new SelectItem(new Integer(2), "Feb")); + creditCardExpMonths.add(new SelectItem(new Integer(3), "Mar")); + creditCardExpMonths.add(new SelectItem(new Integer(4), "Apr")); + creditCardExpMonths.add(new SelectItem(new Integer(5), "May")); + creditCardExpMonths.add(new SelectItem(new Integer(6), "Jun")); + creditCardExpMonths.add(new SelectItem(new Integer(7), "Jul")); + creditCardExpMonths.add(new SelectItem(new Integer(8), "Aug")); + creditCardExpMonths.add(new SelectItem(new Integer(9), "Sep")); + creditCardExpMonths.add(new SelectItem(new Integer(10), "Oct")); + creditCardExpMonths.add(new SelectItem(new Integer(11), "Nov")); + creditCardExpMonths.add(new SelectItem(new Integer(12), "Dec")); + } + return creditCardExpMonths; + } + + public List getCreditCardExpYears() { + if (creditCardExpYears == null) { + creditCardExpYears = new ArrayList(); + creditCardExpYears.add(new SelectItem(new Integer(2008), "2008")); + creditCardExpYears.add(new SelectItem(new Integer(2009), "2009")); + creditCardExpYears.add(new SelectItem(new Integer(2010), "2010")); + creditCardExpYears.add(new SelectItem(new Integer(2010), "2011")); + creditCardExpYears.add(new SelectItem(new Integer(2010), "2012")); + } + return creditCardExpYears; + } + + public List getPageSizeOptions() { + if (pageSizeOptions == null) { + pageSizeOptions = new ArrayList(); + pageSizeOptions.add(new SelectItem(new Integer(5), "5")); + pageSizeOptions.add(new SelectItem(new Integer(10), "10")); + pageSizeOptions.add(new SelectItem(new Integer(20), "20")); + } + return pageSizeOptions; + } + +} diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java new file mode 100644 index 0000000..0a1b92d --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java @@ -0,0 +1,66 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +/** + * A backing bean for the main hotel search form. Encapsulates the criteria needed to perform a hotel search. + */ +public class SearchCriteria implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * The user-provided search criteria for finding Hotels. + */ + private String searchString = ""; + + /** + * The maximum page size of the Hotel result list + */ + private int pageSize = 5; + + /** + * The current page of the Hotel result list. + */ + private int page; + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public void nextPage() { + page++; + } + + public void previousPage() { + page--; + } + + public void resetPage() { + page = 0; + } + + public String toString() { + return "[Search Criteria searchString = '" + searchString + "'"; + } +} \ No newline at end of file diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/User.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/User.java new file mode 100644 index 0000000..2a5d0a5 --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/User.java @@ -0,0 +1,62 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * A user who can book hotels. + */ +@Entity +@Table(name = "Customer") +public class User implements Serializable { + + private static final long serialVersionUID = -3652559447682574722L; + + private String username; + + private String password; + + private String name; + + public User() { + } + + public User(String username, String password, String name) { + this.username = username; + this.password = password; + this.name = name; + } + + @Id + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User(" + username + ")"; + } +} diff --git a/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java new file mode 100644 index 0000000..27a4280 --- /dev/null +++ b/booking-portlet-faces/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java @@ -0,0 +1,11 @@ +package org.springframework.webflow.samples.booking; + +import org.springframework.webflow.mvc.portlet.AbstractFlowHandler; + +public class ViewFlowHandler extends AbstractFlowHandler { + + public String getFlowId() { + return "view"; + } + +} diff --git a/booking-portlet-faces/src/main/resources/META-INF/persistence.xml b/booking-portlet-faces/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..f4e3d6a --- /dev/null +++ b/booking-portlet-faces/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + org.hibernate.ejb.HibernatePersistence + org.springframework.webflow.samples.booking.User + org.springframework.webflow.samples.booking.Booking + org.springframework.webflow.samples.booking.Hotel + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/resources/import.sql b/booking-portlet-faces/src/main/resources/import.sql new file mode 100644 index 0000000..9c156ed --- /dev/null +++ b/booking-portlet-faces/src/main/resources/import.sql @@ -0,0 +1,28 @@ +insert into Customer (username, name) values ('keith', 'Keith') +insert into Customer (username, name) values ('erwin', 'Erwin') +insert into Customer (username, name) values ('jeremy', 'Jeremy') +insert into Customer (username, name) values ('scott', 'Scott') +insert into Customer (username, name) values ('pluto', 'Pluto') +insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 199, 'Westin Diplomat', '3555 S. Ocean Drive', 'Hollywood', 'FL', '33019', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 60, 'Jameson Inn', '890 Palm Bay Rd NE', 'Palm Bay', 'FL', '32905', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 199, 'Chilworth Manor', 'The Cottage, Southampton Business Park', 'Southampton', 'Hants', 'SO16 7JF', 'UK') +insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (7, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (8, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (9, 300, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (10, 300, 'Conrad Miami', '1395 Brickell Ave', 'Miami', 'FL', '33131', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (11, 80, 'Sea Horse Inn', '2106 N Clairemont Ave', 'Eau Claire', 'WI', '54703', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (12, 90, 'Super 8 Eau Claire Campus Area', '1151 W Macarthur Ave', 'Eau Claire', 'WI', '54701', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (13, 160, 'Marriot Downtown', '55 Fourth Street', 'San Francisco', 'CA', '94103', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (14, 200, 'Hilton Diagonal Mar', 'Passeig del Taulat 262-264', 'Barcelona', 'Catalunya', '08019', 'Spain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (15, 210, 'Hilton Tel Aviv', 'Independence Park', 'Tel Aviv', '', '63405', 'Israel') +insert into Hotel (id, price, name, address, city, state, zip, country) values (16, 240, 'InterContinental Tokyo Bay', 'Takeshiba Pier', 'Tokyo', '', '105', 'Japan') +insert into Hotel (id, price, name, address, city, state, zip, country) values (17, 130, 'Hotel Beaulac', ' Esplanade Léopold-Robert 2', 'Neuchatel', '', '2000', 'Switzerland') +insert into Hotel (id, price, name, address, city, state, zip, country) values (18, 140, 'Conrad Treasury Place', 'William & George Streets', 'Brisbane', 'QLD', '4001', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (19, 230, 'Ritz Carlton', '1228 Sherbrooke St', 'West Montreal', 'Quebec', 'H3G1H6', 'Canada') +insert into Hotel (id, price, name, address, city, state, zip, country) values (20, 460, 'Ritz Carlton', 'Peachtree Rd, Buckhead', 'Atlanta', 'GA', '30326', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (21, 220, 'Swissotel', '68 Market Street', 'Sydney', 'NSW', '2000', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (22, 250, 'Meliá White House', 'Albany Street', 'Regents Park London', '', 'NW13UP', 'Great Britain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (23, 210, 'Hotel Allegro', '171 West Randolph Street', 'Chicago', 'IL', '60601', 'USA') \ No newline at end of file diff --git a/booking-portlet-faces/src/main/resources/log4j.xml b/booking-portlet-faces/src/main/resources/log4j.xml new file mode 100644 index 0000000..4c3ff1c --- /dev/null +++ b/booking-portlet-faces/src/main/resources/log4j.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/classes/log4j.properties b/booking-portlet-faces/src/main/webapp/WEB-INF/classes/log4j.properties new file mode 100644 index 0000000..992d816 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/classes/log4j.properties @@ -0,0 +1,11 @@ +log4j.rootCategory=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +# Enable web flow logging +log4j.category.org.springframework.webflow=DEBUG +log4j.category.org.springframework.faces=DEBUG +log4j.category.org.springframework.binding=DEBUG +log4j.category.org.springframework.transaction=DEBUG \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/config/application-config.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/config/application-config.xml new file mode 100644 index 0000000..295df2e --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/config/application-config.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml new file mode 100644 index 0000000..6526dc0 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/faces-config.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/faces-config.xml new file mode 100644 index 0000000..67a0dac --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,10 @@ + + + + + + org.springframework.faces.webflow.application.portlet.PortletFaceletViewHandler + + diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/booking.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/booking.xml new file mode 100644 index 0000000..a3abd47 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/booking.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml new file mode 100644 index 0000000..982cda9 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.xhtml @@ -0,0 +1,122 @@ + + + + + +

Book Hotel

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:#{booking.hotel.name}
Address:#{booking.hotel.address}
City, State:#{booking.hotel.city}, #{booking.hotel.state}
Zip:#{booking.hotel.zip}
Country:#{booking.hotel.country}
Nightly rate: + + + +
+ Check In Date: + + + + +
+ Check Out Date: + + + + +
+ Room Preference: + + + + +
+ Smoking Preference: + + + + +
+ Credit Card #: + + +
+ Credit Card Name: + + +
+ Expiration Date: + + + + + + + +
+   + +
+
+
+ +
+
\ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml new file mode 100644 index 0000000..57c610b --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/booking/reviewBooking.xhtml @@ -0,0 +1,74 @@ + + + + + +

Confirm Hotel Booking

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:#{booking.hotel.name}
Address:#{booking.hotel.address}
City, State:#{booking.hotel.city}, #{booking.hotel.state}
Zip:#{booking.hotel.zip}
Country:#{booking.hotel.country}
Total payment: + + + +
Check In Date: + + + +
Check Out Date: + + + +
Credit Card #:#{booking.creditCard}
+   +   + +
+
+
+ +
+
\ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml new file mode 100644 index 0000000..9b559b5 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.xhtml @@ -0,0 +1,77 @@ + + + + + +
+

Search Hotels

+ + + + +
+
+
+ Search String: + +
+
+ Maximum results: + + + +
+
+ +
+
+
+
+
+ +
+ +

Current Hotel Bookings

+ + + + Name + #{booking.hotel.name} + + + Address + #{booking.hotel.address} + + + City, State + #{booking.hotel.city}, #{booking.hotel.state} + + + Check in date + + + + + + Check out date + + + + + + Confirmation number + #{booking.id} + + + Action + + + +
+
+ +
+
\ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/main.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/main.xml new file mode 100644 index 0000000..2c79820 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/main.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml new file mode 100644 index 0000000..9517b4a --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotel.xhtml @@ -0,0 +1,52 @@ + + + + + +

View Hotel

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:#{hotel.name}
Address:#{hotel.address}
City:#{hotel.city}
State:#{hotel.state}
Zip:#{hotel.zip}
Country:#{hotel.country}
Nightly rate: + + + +
+ + + +   + + + +
+
\ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml new file mode 100644 index 0000000..ad9d944 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/main/reviewHotels.xhtml @@ -0,0 +1,48 @@ + + + + + + +

Hotel Results

+

+ +

+
+ + + + Name + #{hotel.name} + + + Address + #{hotel.address} + + + City, State + #{hotel.city}, #{hotel.state}, #{hotel.country} + + + Zip + #{hotel.zip} + + + Action + + + + + +
+
+ +
+
\ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/intro.xhtml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/intro.xhtml new file mode 100644 index 0000000..b9b064e --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/intro.xhtml @@ -0,0 +1,35 @@ + + + + + +

Welcome to Spring Travel

+

+ This reference application illustrates Spring Faces, + a software library that integrates Spring and JavaServerFaces technology in a portlet environment. +

+

+ The key features illustrated in this sample include: +

+
    +
  • A declarative navigation model enabling full browser button support and dynamic navigation rules
  • +
  • A fine-grained state management model, including support for ConversationScope and ViewScope
  • +
  • Modularization of web application functionality by domain use case, illustrating project structure best-practices
  • +
  • Managed persistence contexts with the Java Persistence API (JPA)
  • +
  • Unified Expression Language (EL) integration
  • +
  • Declarative page authoring with Facelets, including applying reusable page layouts
  • +
  • Exception handling support across all layers of the application
  • +
  • Spring IDE tooling integration, with support for graphical flow modeling and visualization
  • +
+

+ + Start your Spring Travel experience + +

+ +
+
\ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/view.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/view.xml new file mode 100644 index 0000000..71d0044 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/flows/view/view.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/portlet.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..2294d94 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,40 @@ + + + + + swf-booking-faces + Spring Webflow Booking Faces + + + org.springframework.web.portlet.DispatcherPortlet + + + + contextConfigLocation + + /WEB-INF/config/hotelbooking-portlet-config.xml + + + + + viewRendererUrl + /WEB-INF/servlet/view + + + 0 + + + text/html + view + + + + Spring Webflow Booking Faces + + + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/main/webapp/WEB-INF/web.xml b/booking-portlet-faces/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..1ad5682 --- /dev/null +++ b/booking-portlet-faces/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,65 @@ + + + + + contextConfigLocation + + /WEB-INF/config/application-config.xml + + + + + + javax.faces.DEFAULT_SUFFIX + .xhtml + + + + + facelets.DEVELOPMENT + true + + + + + facelets.REFRESH_PERIOD + 1 + + + + org.springframework.web.context.ContextLoaderListener + + + + + swf-booking-faces + org.apache.pluto.container.driver.PortletServlet + + portlet-name + swf-booking-faces + + 1 + + + + swf-booking-faces + /PlutoInvoker/swf-booking-faces + + + + + Faces Servlet + javax.faces.webapp.FacesServlet + 1 + + + + + Faces Servlet + *.faces + + + \ No newline at end of file diff --git a/booking-portlet-faces/src/test/java/.gitignore b/booking-portlet-faces/src/test/java/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/booking-portlet-faces/src/test/resources/.gitignore b/booking-portlet-faces/src/test/resources/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/booking-portlet-mvc/build.xml b/booking-portlet-mvc/build.xml new file mode 100644 index 0000000..e28d39c --- /dev/null +++ b/booking-portlet-mvc/build.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/booking-portlet-mvc/pom.xml b/booking-portlet-mvc/pom.xml new file mode 100644 index 0000000..3ca2aa8 --- /dev/null +++ b/booking-portlet-mvc/pom.xml @@ -0,0 +1,224 @@ + + + 4.0.0 + org.springframework.webflow.samples + booking-portlet-mvc + war + Hotel Booking : Spring Portlet MVC + Web Flow + JSP + 1.0.0.BUILD-SNAPSHOT + + + 3.1.1.RELEASE + 2.3.1.RELEASE + 1.5.10 + + + + + spring-repository + Spring project snapshots, milestones, and releases + http://repo.springsource.org/snapshot + + + + + + + org.springframework + spring-context + ${springframework-version} + + + + commons-logging + commons-logging + + + + + org.springframework + spring-jdbc + ${springframework-version} + + + org.springframework + spring-orm + ${springframework-version} + + + org.springframework + spring-webmvc + ${springframework-version} + + + org.springframework + spring-webmvc-portlet + ${springframework-version} + + + org.springframework.webflow + spring-webflow + ${webflow-version} + + + org.springframework.webflow + spring-js + ${webflow-version} + + + + org.slf4j + slf4j-api + ${slf4j-version} + + + org.slf4j + jcl-over-slf4j + ${slf4j-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + runtime + + + log4j + log4j + 1.2.15 + + + javax.mail + mail + + + javax.jms + jms + + + com.sun.jdmk + jmxtools + + + com.sun.jmx + jmxri + + + runtime + + + + org.hsqldb + hsqldb + 1.8.0.10 + runtime + + + org.hibernate + hibernate-entitymanager + 3.5.0-Final + + + + javax.servlet + servlet-api + 2.5 + provided + + + javax.portlet + portlet-api + 2.0 + provided + + + javax.servlet + jstl + 1.2 + + + + org.hibernate + hibernate-validator + 4.1.0.Beta1 + + + + javax.xml.bind + jaxb-api + 2.1 + + + + joda-time + joda-time + 1.6 + + + joda-time + joda-time-jsptags + 1.0.2 + runtime + + + + org.easymock + easymock + 2.5.2 + test + + + junit + junit + 3.8.2 + test + + + org.springframework + spring-test + ${springframework-version} + test + + + + + booking-portlet-mvc + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.1.12 + + junit:junit + + **/*Tests.java + + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + true + false + 2.0 + + + + + diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java new file mode 100644 index 0000000..2cf8b8c --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Booking.java @@ -0,0 +1,192 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DateFormat; +import java.util.Calendar; +import java.util.Date; + +import javax.persistence.Basic; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.Future; +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.NotEmpty; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * A Hotel Booking made by a User. + */ +@Entity +@BookingDateRange +public class Booking implements Serializable { + private Long id; + + private User user; + + private Hotel hotel; + + @DateTimeFormat(pattern = "MM-dd-yyyy") + private Date checkinDate; + + @DateTimeFormat(pattern = "MM-dd-yyyy") + private Date checkoutDate; + + private String creditCard; + + private String creditCardName; + + private int creditCardExpiryMonth; + + private int creditCardExpiryYear; + + private boolean smoking; + + private int beds; + + public Booking() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckinDate(calendar.getTime()); + calendar.add(Calendar.DAY_OF_MONTH, 1); + setCheckoutDate(calendar.getTime()); + } + + public Booking(Hotel hotel, User user) { + this(); + this.hotel = hotel; + this.user = user; + } + + @Transient + public BigDecimal getTotal() { + return hotel.getPrice().multiply(new BigDecimal(getNights())); + } + + @Transient + public int getNights() { + return (int) (checkoutDate.getTime() - checkinDate.getTime()) / 1000 / 60 / 60 / 24; + } + + @Id + @GeneratedValue(strategy = GenerationType.TABLE) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Basic + @Temporal(TemporalType.DATE) + @NotNull + @Future + public Date getCheckinDate() { + return checkinDate; + } + + public void setCheckinDate(Date datetime) { + this.checkinDate = datetime; + } + + @ManyToOne + public Hotel getHotel() { + return hotel; + } + + public void setHotel(Hotel hotel) { + this.hotel = hotel; + } + + @ManyToOne + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Basic + @Temporal(TemporalType.DATE) + @NotNull + @Future + public Date getCheckoutDate() { + return checkoutDate; + } + + public void setCheckoutDate(Date checkoutDate) { + this.checkoutDate = checkoutDate; + } + + @NotEmpty + public String getCreditCard() { + return creditCard; + } + + public void setCreditCard(String creditCard) { + this.creditCard = creditCard; + } + + @Transient + public String getDescription() { + DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); + return hotel == null ? null : hotel.getName() + ", " + df.format(getCheckinDate()) + " to " + + df.format(getCheckoutDate()); + } + + public boolean isSmoking() { + return smoking; + } + + public void setSmoking(boolean smoking) { + this.smoking = smoking; + } + + public int getBeds() { + return beds; + } + + public void setBeds(int beds) { + this.beds = beds; + } + + @NotEmpty + public String getCreditCardName() { + return creditCardName; + } + + public void setCreditCardName(String creditCardName) { + this.creditCardName = creditCardName; + } + + public int getCreditCardExpiryMonth() { + return creditCardExpiryMonth; + } + + public void setCreditCardExpiryMonth(int creditCardExpiryMonth) { + this.creditCardExpiryMonth = creditCardExpiryMonth; + } + + public int getCreditCardExpiryYear() { + return creditCardExpiryYear; + } + + public void setCreditCardExpiryYear(int creditCardExpiryYear) { + this.creditCardExpiryYear = creditCardExpiryYear; + } + + @Override + public String toString() { + return "Booking(" + user + "," + hotel + ")"; + } + +} diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java new file mode 100644 index 0000000..a5cad18 --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRange.java @@ -0,0 +1,22 @@ +package org.springframework.webflow.samples.booking; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +@Constraint(validatedBy = BookingDateRangeValidator.class) +@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface BookingDateRange { + + String message() default "Invalid check-in and check-out date range"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java new file mode 100644 index 0000000..716a40b --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingDateRangeValidator.java @@ -0,0 +1,19 @@ +package org.springframework.webflow.samples.booking; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public class BookingDateRangeValidator implements ConstraintValidator { + + public void initialize(BookingDateRange bookingDateRange) { + } + + public boolean isValid(Booking booking, ConstraintValidatorContext context) { + if ((booking.getCheckinDate() != null) && (booking.getCheckoutDate() != null) + && booking.getCheckoutDate().before(booking.getCheckinDate())) { + return false; + } + return true; + } + +} diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java new file mode 100644 index 0000000..5a1978f --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingService.java @@ -0,0 +1,59 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +/** + * A service interface for retrieving hotels and bookings from a backing repository. Also supports the ability to cancel + * a booking. + */ +public interface BookingService { + + /** + * Find user by their username. + * @param username the user's username + * @return the user + */ + public User findUser(String username); + + /** + * Find bookings made by the given user + * @param username the user's name + * @return their bookings + */ + public List findBookings(String username); + + /** + * Find hotels available for booking by some criteria. + * @param criteria the search criteria + * @return a list of hotels meeting the criteria + */ + public List findHotels(SearchCriteria criteria); + + /** + * Find hotels by their identifier. + * @param id the hotel id + * @return the hotel + */ + public Hotel findHotelById(Long id); + + /** + * Create a new, transient hotel booking instance for the given user. + * @param hotelId the hotelId + * @param userName the user name + * @return the new transient booking instance + */ + public Booking createBooking(Long hotelId, String userName); + + /** + * Persist the booking to the database + * @param booking the booking + */ + public void persistBooking(Booking booking); + + /** + * Cancel an existing booking. + * @param id the booking id + */ + public void cancelBooking(Long id); + +} diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingValidator.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingValidator.java new file mode 100644 index 0000000..f0977e1 --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/BookingValidator.java @@ -0,0 +1,31 @@ +package org.springframework.webflow.samples.booking; + +import java.util.Calendar; + +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +public class BookingValidator implements Validator { + + public boolean supports(Class clazz) { + return Booking.class.equals(clazz); + } + + public void validate(Object obj, Errors errors) { + Booking booking = (Booking) obj; + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -1); + if (booking.getCreditCard() == null || "".equals(booking.getCreditCard())) { + errors.rejectValue("creditCard", null, "Credit card number must be provided"); + } + if (booking.getCreditCardName() == null || "".equals(booking.getCreditCardName())) { + errors.rejectValue("creditCardName", null, "Credit card name must be provided"); + } + if (booking.getCheckinDate() == null || booking.getCheckinDate().before(calendar.getTime())) { + errors.rejectValue("checkinDate", null, "Check in date must be a future date"); + } else if (booking.getCheckoutDate() == null || !booking.getCheckinDate().before(booking.getCheckoutDate())) { + errors.rejectValue("checkoutDate", null, "Check out date must be later than check in date"); + } + } + +} diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java new file mode 100644 index 0000000..99719e5 --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/Hotel.java @@ -0,0 +1,107 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; +import java.math.BigDecimal; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +/** + * A hotel where users may book stays. + */ +@Entity +public class Hotel implements Serializable { + private Long id; + + private String name; + + private String address; + + private String city; + + private String state; + + private String zip; + + private String country; + + private BigDecimal price; + + @Id + @GeneratedValue + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + @Column(precision = 6, scale = 2) + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public Booking createBooking(User user) { + return new Booking(this, user); + } + + @Override + public String toString() { + return "Hotel(" + name + "," + address + "," + city + "," + zip + ")"; + } +} diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java new file mode 100644 index 0000000..6a36525 --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/JpaBookingService.java @@ -0,0 +1,93 @@ +package org.springframework.webflow.samples.booking; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Repository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +/** + * A JPA-based implementation of the Booking Service. Delegates to a JPA entity manager to issue data access calls + * against the backing repository. The EntityManager reference is provided by the managing container (Spring) + * automatically. + */ +@Service("bookingService") +@Repository +public class JpaBookingService implements BookingService { + + private EntityManager em; + + @PersistenceContext + public void setEntityManager(EntityManager em) { + this.em = em; + } + + @Transactional(readOnly = true) + public User findUser(String username) { + return (User) em.createQuery("select u from User u where u.username = :username") + .setParameter("username", username).getSingleResult(); + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findBookings(String username) { + if (username != null) { + return em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate") + .setParameter("username", username).getResultList(); + } else { + return null; + } + } + + @Transactional(readOnly = true) + @SuppressWarnings("unchecked") + public List findHotels(SearchCriteria criteria) { + String pattern = getSearchPattern(criteria); + return em + .createQuery( + "select h from Hotel h where lower(h.name) like :pattern or lower(h.city) like :pattern " + + " or lower(h.zip) like :pattern or lower(h.address) like :pattern") + .setParameter("pattern", pattern).setMaxResults(criteria.getPageSize()) + .setFirstResult(criteria.getPage() * criteria.getPageSize()).getResultList(); + } + + @Transactional(readOnly = true) + public Hotel findHotelById(Long id) { + return em.find(Hotel.class, id); + } + + @Transactional(readOnly = true) + public Booking createBooking(Long hotelId, String username) { + Hotel hotel = em.find(Hotel.class, hotelId); + User user = findUser(username); + return new Booking(hotel, user); + } + + @Transactional + public void persistBooking(Booking booking) { + em.persist(booking); + } + + @Transactional + public void cancelBooking(Long id) { + Booking booking = em.find(Booking.class, id); + if (booking != null) { + em.remove(booking); + } + } + + // helpers + + private String getSearchPattern(SearchCriteria criteria) { + if (StringUtils.hasText(criteria.getSearchString())) { + return "%" + criteria.getSearchString().toLowerCase().replace('*', '%') + "%"; + } else { + return "%"; + } + } + +} \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java new file mode 100644 index 0000000..ba0b2f0 --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/SearchCriteria.java @@ -0,0 +1,68 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +/** + * A backing bean for the main hotel search form. Encapsulates the criteria needed to perform a hotel search. + * + * It is expected a future milestone of Spring Web Flow 2.0 will allow flow-scoped beans like this one to hold + * references to transient services that are restored automatically when the flow is resumed on subsequent requests. + * This would allow this SearchCriteria object to delegate to the {@link BookingService} directly, for example, + * eliminating the need for the actions in {@link MainActions}. + */ +public class SearchCriteria implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * The user-provided search criteria for finding Hotels. + */ + private String searchString; + + /** + * The maximum page size of the Hotel result list + */ + private int pageSize; + + /** + * The current page of the Hotel result list. + */ + private int page; + + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public void nextPage() { + page++; + } + + public void previousPage() { + page--; + } + + public void resetPage() { + page = 0; + } + +} \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java new file mode 100644 index 0000000..55213ad --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/User.java @@ -0,0 +1,59 @@ +package org.springframework.webflow.samples.booking; + +import java.io.Serializable; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +/** + * A user who can book hotels. + */ +@Entity +@Table(name = "Customer") +public class User implements Serializable { + private String username; + + private String password; + + private String name; + + public User() { + } + + public User(String username, String password, String name) { + this.username = username; + this.password = password; + this.name = name; + } + + @Id + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User(" + username + ")"; + } +} diff --git a/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java new file mode 100644 index 0000000..27a4280 --- /dev/null +++ b/booking-portlet-mvc/src/main/java/org/springframework/webflow/samples/booking/ViewFlowHandler.java @@ -0,0 +1,11 @@ +package org.springframework.webflow.samples.booking; + +import org.springframework.webflow.mvc.portlet.AbstractFlowHandler; + +public class ViewFlowHandler extends AbstractFlowHandler { + + public String getFlowId() { + return "view"; + } + +} diff --git a/booking-portlet-mvc/src/main/resources/META-INF/persistence.xml b/booking-portlet-mvc/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..f4e3d6a --- /dev/null +++ b/booking-portlet-mvc/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,18 @@ + + + + org.hibernate.ejb.HibernatePersistence + org.springframework.webflow.samples.booking.User + org.springframework.webflow.samples.booking.Booking + org.springframework.webflow.samples.booking.Hotel + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/resources/import.sql b/booking-portlet-mvc/src/main/resources/import.sql new file mode 100644 index 0000000..9c156ed --- /dev/null +++ b/booking-portlet-mvc/src/main/resources/import.sql @@ -0,0 +1,28 @@ +insert into Customer (username, name) values ('keith', 'Keith') +insert into Customer (username, name) values ('erwin', 'Erwin') +insert into Customer (username, name) values ('jeremy', 'Jeremy') +insert into Customer (username, name) values ('scott', 'Scott') +insert into Customer (username, name) values ('pluto', 'Pluto') +insert into Hotel (id, price, name, address, city, state, zip, country) values (1, 199, 'Westin Diplomat', '3555 S. Ocean Drive', 'Hollywood', 'FL', '33019', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (2, 60, 'Jameson Inn', '890 Palm Bay Rd NE', 'Palm Bay', 'FL', '32905', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (3, 199, 'Chilworth Manor', 'The Cottage, Southampton Business Park', 'Southampton', 'Hants', 'SO16 7JF', 'UK') +insert into Hotel (id, price, name, address, city, state, zip, country) values (4, 120, 'Marriott Courtyard', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (5, 180, 'Doubletree', 'Tower Place, Buckhead', 'Atlanta', 'GA', '30305', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (6, 450, 'W Hotel', 'Union Square, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (7, 450, 'W Hotel', 'Lexington Ave, Manhattan', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (8, 250, 'Hotel Rouge', '1315 16th Street NW', 'Washington', 'DC', '20036', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (9, 300, '70 Park Avenue Hotel', '70 Park Avenue', 'NY', 'NY', '10011', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (10, 300, 'Conrad Miami', '1395 Brickell Ave', 'Miami', 'FL', '33131', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (11, 80, 'Sea Horse Inn', '2106 N Clairemont Ave', 'Eau Claire', 'WI', '54703', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (12, 90, 'Super 8 Eau Claire Campus Area', '1151 W Macarthur Ave', 'Eau Claire', 'WI', '54701', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (13, 160, 'Marriot Downtown', '55 Fourth Street', 'San Francisco', 'CA', '94103', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (14, 200, 'Hilton Diagonal Mar', 'Passeig del Taulat 262-264', 'Barcelona', 'Catalunya', '08019', 'Spain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (15, 210, 'Hilton Tel Aviv', 'Independence Park', 'Tel Aviv', '', '63405', 'Israel') +insert into Hotel (id, price, name, address, city, state, zip, country) values (16, 240, 'InterContinental Tokyo Bay', 'Takeshiba Pier', 'Tokyo', '', '105', 'Japan') +insert into Hotel (id, price, name, address, city, state, zip, country) values (17, 130, 'Hotel Beaulac', ' Esplanade Léopold-Robert 2', 'Neuchatel', '', '2000', 'Switzerland') +insert into Hotel (id, price, name, address, city, state, zip, country) values (18, 140, 'Conrad Treasury Place', 'William & George Streets', 'Brisbane', 'QLD', '4001', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (19, 230, 'Ritz Carlton', '1228 Sherbrooke St', 'West Montreal', 'Quebec', 'H3G1H6', 'Canada') +insert into Hotel (id, price, name, address, city, state, zip, country) values (20, 460, 'Ritz Carlton', 'Peachtree Rd, Buckhead', 'Atlanta', 'GA', '30326', 'USA') +insert into Hotel (id, price, name, address, city, state, zip, country) values (21, 220, 'Swissotel', '68 Market Street', 'Sydney', 'NSW', '2000', 'Australia') +insert into Hotel (id, price, name, address, city, state, zip, country) values (22, 250, 'Meliá White House', 'Albany Street', 'Regents Park London', '', 'NW13UP', 'Great Britain') +insert into Hotel (id, price, name, address, city, state, zip, country) values (23, 210, 'Hotel Allegro', '171 West Randolph Street', 'Chicago', 'IL', '60601', 'USA') \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/resources/log4j.xml b/booking-portlet-mvc/src/main/resources/log4j.xml new file mode 100644 index 0000000..b4e9ad1 --- /dev/null +++ b/booking-portlet-mvc/src/main/resources/log4j.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/META-INF/MANIFEST.MF b/booking-portlet-mvc/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..58630c0 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/classes/log4j.properties b/booking-portlet-mvc/src/main/webapp/WEB-INF/classes/log4j.properties new file mode 100644 index 0000000..0b9061f --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/classes/log4j.properties @@ -0,0 +1,11 @@ +log4j.rootCategory=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +# Enable web flow logging +log4j.category.org.springframework.webflow=DEBUG +log4j.category.org.springframework.js=DEBUG +log4j.category.org.springframework.binding=DEBUG +log4j.category.org.springframework.transaction=DEBUG \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/config/application-config.xml b/booking-portlet-mvc/src/main/webapp/WEB-INF/config/application-config.xml new file mode 100644 index 0000000..02faf83 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/config/application-config.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml b/booking-portlet-mvc/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml new file mode 100644 index 0000000..f3cc03a --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/config/hotelbooking-portlet-config.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/booking.xml b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/booking.xml new file mode 100644 index 0000000..f7cd26f --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/booking.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.jsp b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.jsp new file mode 100644 index 0000000..51508a9 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/enterBookingDetails.jsp @@ -0,0 +1,142 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +

Book Hotel

+ + + + + + +
+ + +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:${booking.hotel.name}
Address:${booking.hotel.address}
City, State:${booking.hotel.city}, ${booking.hotel.state}
Zip:${booking.hotel.zip}
Country:${booking.hotel.country}
Nightly rate: + ${status.value} +
+ + + + +
+ + + + +
+ + + + + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
+   +   +
+
+
diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/messages.properties b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/messages.properties new file mode 100644 index 0000000..3d15709 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/messages.properties @@ -0,0 +1,16 @@ +booking.checkinDate.NotNull=The check in date is required +booking.checkinDate.Future=The check in date must be in the future +booking.checkinDate.beforeToday=The check in date must be a future date +booking.checkinDate.typeMismatch=The check in date must be in the format mm-dd-yyyy + +booking.checkoutDate.Future=The check out date must be in the future +booking.checkoutDate.NotNull=The check out date is required +booking.checkoutDate.typeMismatch=The check out date must be in the format mm-dd-yyyy +booking.BookingDateRange=The check out date must be later than the check in date + +booking.creditCard.NotEmpty=The credit card must be a valid 16 digit number +booking.creditCardName.NotEmpty=The name on the credit card is required + +NotEmpty=The {0} field is required +NotNull=The {0} field is required +Future=The {0} date must be in the future \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/reviewBooking.jsp b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/reviewBooking.jsp new file mode 100644 index 0000000..d95fbaa --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/booking/reviewBooking.jsp @@ -0,0 +1,65 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +

Confirm Hotel Booking

+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:${booking.hotel.name}
Address:${booking.hotel.address}
City, State:${booking.hotel.city}, ${booking.hotel.state}
Zip:${booking.hotel.zip}
Country:${booking.hotel.country}
Total payment: + ${status.value} +
Check In Date: + ${status.value} +
Check Out Date: + ${status.value} +
Credit Card #:${booking.creditCard}
+   +   +   +
+
+
diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.jsp b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.jsp new file mode 100644 index 0000000..84bc87a --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/enterSearchCriteria.jsp @@ -0,0 +1,64 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + + + + + +

Search Hotels

+ + + +
+ + + + + + + + + +
+
+ +

Current Hotel Bookings

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressCity, StateCheck in DateCheck out DateConfirmation NumberAction
${booking.hotel.name}${booking.hotel.address}${booking.hotel.city}, ${booking.hotel.state}${booking.checkinDate}${booking.checkoutDate}${booking.id} + + + + + + Cancel +
No booking history
diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/main.xml b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/main.xml new file mode 100644 index 0000000..fbd0607 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/main.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotel.jsp b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotel.jsp new file mode 100644 index 0000000..a617049 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotel.jsp @@ -0,0 +1,53 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +

View Hotel

+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:${hotel.name}
Address:${hotel.address}
City:${hotel.city}
State:${hotel.state}
Zip:${hotel.zip}
Country:${hotel.country}
Nightly rate: + ${status.value} +
+   +   +
+
+
diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotels.jsp b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotels.jsp new file mode 100644 index 0000000..b760e99 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/main/reviewHotels.jsp @@ -0,0 +1,63 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0"%> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> + +

Hotel Results

+ + + + + +Change Search + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressCity, StateZipAction
${hotel.name}${hotel.address}${hotel.city}, ${hotel.state}, ${hotel.country}${hotel.zip} + + + + + + View Hotel +
No hotels found
+ + + + + + + Previous Results + + + + + + + More Results + + diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/intro.jsp b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/intro.jsp new file mode 100644 index 0000000..1fe0053 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/intro.jsp @@ -0,0 +1,28 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0"%> + +

Welcome to Spring Travel

+

+ This reference application shows how to use Spring MVC and Web Flow together with JavaServerPages (JSP) in a portlet. +

+

+ The key features illustrated in this sample include: +

+
    +
  • A declarative navigation model enabling full browser button support and dynamic navigation rules
  • +
  • A fine-grained state management model, including support for ConversationScope and ViewScope
  • +
  • Managed persistence contexts with the Java Persistence API (JPA)
  • +
  • Unified Expression Language (EL) integration
  • +
  • Declarative page authoring with JSP, JSTL, and Spring MVC's form tag library +
  • Exception handling support across all layers of the application
  • +
  • Spring IDE tooling integration, with support for graphical flow modeling and visualization
  • +
+

+ + + + + + Start your Spring Travel experience + +

diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/view.xml b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/view.xml new file mode 100644 index 0000000..71d0044 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/flows/view/view.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/portlet.xml b/booking-portlet-mvc/src/main/webapp/WEB-INF/portlet.xml new file mode 100644 index 0000000..c3fcc9f --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/portlet.xml @@ -0,0 +1,40 @@ + + + + + swf-booking-mvc + Spring Webflow Booking MVC + + + org.springframework.web.portlet.DispatcherPortlet + + + + contextConfigLocation + + /WEB-INF/config/hotelbooking-portlet-config.xml + + + + + viewRendererUrl + /WEB-INF/servlet/view + + + 0 + + + text/html + view + + + + Spring Webflow Booking MVC + + + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/main/webapp/WEB-INF/web.xml b/booking-portlet-mvc/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..2c90854 --- /dev/null +++ b/booking-portlet-mvc/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,54 @@ + + + + + + contextConfigLocation + + /WEB-INF/config/application-config.xml + + + + + + org.springframework.web.context.ContextLoaderListener + + + + + ViewRendererServlet + org.springframework.web.servlet.ViewRendererServlet + + + + ViewRendererServlet + /WEB-INF/servlet/view + + + + + swf-booking-mvc + org.apache.pluto.container.driver.PortletServlet + + portlet-name + swf-booking-mvc + + 1 + + + + swf-booking-mvc + /PlutoInvoker/swf-booking-mvc + + + \ No newline at end of file diff --git a/booking-portlet-mvc/src/test/java/.gitignore b/booking-portlet-mvc/src/test/java/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/booking-portlet-mvc/src/test/resources/log4j.properties b/booking-portlet-mvc/src/test/resources/log4j.properties new file mode 100644 index 0000000..5ba9222 --- /dev/null +++ b/booking-portlet-mvc/src/test/resources/log4j.properties @@ -0,0 +1,9 @@ +log4j.rootCategory=WARN, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +# Enable web flow logging +log4j.category.org.springframework.webflow=DEBUG +log4j.category.org.springframework.binding=DEBUG \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6efbe04 --- /dev/null +++ b/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + org.springframework.webflow + spring-webflow-samples + pom + Spring Web Flow Samples + 1.0.0.BUILD-SNAPSHOT + + booking-mvc + booking-faces + booking-portlet-mvc + booking-portlet-faces + jsf-booking + +