Initial commit of the common code for the Modello UI 84/18984/1
authorbrianjjones <brian.j.jones@intel.com>
Thu, 3 Apr 2014 23:36:03 +0000 (16:36 -0700)
committerbrianjjones <brian.j.jones@intel.com>
Thu, 3 Apr 2014 23:36:35 +0000 (16:36 -0700)
Change-Id: Iab0fd21490352733104624cb0a8bff208a9b9157
Signed-off-by: brianjjones <brian.j.jones@intel.com>
433 files changed:
Makefile [new file with mode: 0644]
css/car/car.css [new file with mode: 0644]
css/car/car.js [new file with mode: 0644]
css/car/components/alphabetBookmark/alphabetBookmark.css [new file with mode: 0644]
css/car/components/alphabetBookmark/alphabetBookmark.js [new file with mode: 0644]
css/car/components/alphabetBookmark/templates/alphabetBookmarkDelegate.html [new file with mode: 0644]
css/car/components/async/async.js [new file with mode: 0644]
css/car/components/audioPlayer/audioPlayer.js [new file with mode: 0644]
css/car/components/bottomPanel/bottomPanel.js [new file with mode: 0644]
css/car/components/boxCaption/boxCaption.css [new file with mode: 0644]
css/car/components/boxCaption/boxCaption.js [new file with mode: 0644]
css/car/components/buttonControls/buttonControls.js [new file with mode: 0644]
css/car/components/carousel/jquery.carouFredSel-6.2.1-packed.js [new file with mode: 0644]
css/car/components/carousel/jquery.touchSwipe.min.js [new file with mode: 0644]
css/car/components/configuration/configuration.js [new file with mode: 0644]
css/car/components/dateTime/dateTime.css [new file with mode: 0644]
css/car/components/dateTime/dateTime.js [new file with mode: 0644]
css/car/components/dateTime/moment.min.js [new file with mode: 0644]
css/car/components/incomingCall/incomingCall.css [new file with mode: 0644]
css/car/components/incomingCall/incomingCall.js [new file with mode: 0644]
css/car/components/jQuery/jquery-1.8.2.js [new file with mode: 0644]
css/car/components/jQuery/jquery.nouisliderix.js [new file with mode: 0644]
css/car/components/jsViews/jsrender.js [new file with mode: 0644]
css/car/components/jsViews/template.js [new file with mode: 0644]
css/car/components/knockout/knockout.js [new file with mode: 0644]
css/car/components/library/library.css [new file with mode: 0644]
css/car/components/library/library.js [new file with mode: 0644]
css/car/components/library/templates/subpanelDelegate.html [new file with mode: 0644]
css/car/components/library/templates/tabMenuItemDelegate.html [new file with mode: 0644]
css/car/components/progressBar/progressBar.css [new file with mode: 0644]
css/car/components/progressBar/progressBar.js [new file with mode: 0644]
css/car/components/progressBar/volumeSlider.css [new file with mode: 0644]
css/car/components/settings/config.xml [new file with mode: 0644]
css/car/components/settings/css/settings.css [new file with mode: 0644]
css/car/components/settings/icon.png [new file with mode: 0644]
css/car/components/settings/js/.bluetooth.js.swp [new file with mode: 0644]
css/car/components/settings/js/api-connman.js [new file with mode: 0644]
css/car/components/settings/js/bluetooth.js [new file with mode: 0644]
css/car/components/settings/js/settings.js [new file with mode: 0644]
css/car/components/settings/js/themes.js [new file with mode: 0644]
css/car/components/settings/js/websocket.js [new file with mode: 0644]
css/car/components/settings/js/wifi.js [new file with mode: 0644]
css/car/components/settings/templates/template-bluetooth.html [new file with mode: 0644]
css/car/components/settings/templates/template-settings.html [new file with mode: 0644]
css/car/components/settings/templates/template-themes.html [new file with mode: 0644]
css/car/components/settings/templates/template-wifi.html [new file with mode: 0644]
css/car/components/tabs/tabs.css [new file with mode: 0644]
css/car/components/tabs/tabs.js [new file with mode: 0644]
css/car/components/tabs/templates/subPanelDelegate.html [new file with mode: 0644]
css/car/components/tabs/templates/tabMenuItemDelegate.html [new file with mode: 0644]
css/car/components/topBarIcons/images/icon_diagnostic_blue.png [new file with mode: 0644]
css/car/components/topBarIcons/images/icon_settings_blue.png [new file with mode: 0644]
css/car/components/topBarIcons/images/icon_social_blue.png [new file with mode: 0644]
css/car/components/topBarIcons/images/icon_video_blue.png [new file with mode: 0644]
css/car/components/topBarIcons/templates/topBarIconsDelegate.html [new file with mode: 0644]
css/car/components/topBarIcons/topBarIcons.css [new file with mode: 0644]
css/car/components/topBarIcons/topBarIcons.js [new file with mode: 0644]
css/car/components/tween/tween.js [new file with mode: 0644]
css/car/components/tween/tween.min.js [new file with mode: 0644]
css/car/fonts/HelveticaNeue-CondensedBold.ttf [new file with mode: 0644]
css/car/fonts/HelveticaNeue-Light.ttf [new file with mode: 0644]
css/car/fonts/HelveticaNeue-Regular.ttf [new file with mode: 0644]
css/car/images/bt_close.png [new file with mode: 0644]
css/car/images/bt_next.png [new file with mode: 0644]
css/car/images/bt_pause.png [new file with mode: 0644]
css/car/images/bt_play.png [new file with mode: 0644]
css/car/images/bt_previous.png [new file with mode: 0644]
css/car/images/default_icon.png [new file with mode: 0644]
css/car/spinner.css [new file with mode: 0644]
css/car/theme.json [new file with mode: 0644]
css/user/blue/bottombaricons.css [new file with mode: 0644]
css/user/blue/common.css [new file with mode: 0644]
css/user/blue/dashboard.css [new file with mode: 0644]
css/user/blue/homescreen.css [new file with mode: 0644]
css/user/blue/hvac.css [new file with mode: 0644]
css/user/blue/icon.png [new file with mode: 0644]
css/user/blue/images/bottombaricons/icon_back.png [new file with mode: 0644]
css/user/blue/images/bottombaricons/logo_icon_blue.png [new file with mode: 0644]
css/user/blue/images/bottombaricons/panel_bottom_blue.png [new file with mode: 0644]
css/user/blue/images/common/bt_back_blue.png [new file with mode: 0644]
css/user/blue/images/common/bt_library_blue.png [new file with mode: 0644]
css/user/blue/images/common/bt_next_blue.png [new file with mode: 0644]
css/user/blue/images/common/bt_previous_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/bg_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/car_with__inactive_lights_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/circle_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/corner_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/icon_battery_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/icon_cloudy.png [new file with mode: 0644]
css/user/blue/images/dashboard/icon_padlock_active_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/icon_padlock_inactive_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/icon_sun.png [new file with mode: 0644]
css/user/blue/images/dashboard/icon_thunder.png [new file with mode: 0644]
css/user/blue/images/dashboard/lights_break_active.png [new file with mode: 0644]
css/user/blue/images/dashboard/lights_front_active_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/lights_rear_active_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/line_with_pointer_long_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/line_with_pointer_short_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/moon_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/sun_blue.png [new file with mode: 0644]
css/user/blue/images/dashboard/wheel_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_01.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_02.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_03.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_04.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_05.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_06.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_07.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_08.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_09.png [new file with mode: 0644]
css/user/blue/images/homescreen/bg_blue_10.png [new file with mode: 0644]
css/user/blue/images/homescreen/bottom_panel_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/center_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/center_ico_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/center_inner_move_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/center_outer_move_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/dashboard_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/music_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/navigation_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/phone_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/radio_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/smart_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/social_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/store_bg_blue.png [new file with mode: 0644]
css/user/blue/images/homescreen/video_bg_blue.png [new file with mode: 0644]
css/user/blue/images/hvac/defrost_front_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/defrost_front_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/defrost_max_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/defrost_max_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/defrost_rear_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/defrost_rear_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/drag_knob.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_bar_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_control_ac_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_control_ac_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_control_auto_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_control_auto_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_control_circ_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_control_circ_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_dir_down_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_dir_down_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_dir_right_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_dir_right_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_dir_up_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/fan_dir_up_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/hazard_blink.svg [new file with mode: 0644]
css/user/blue/images/hvac/hazard_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/hazard_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/left_heat_seat_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/left_heat_seat_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/left_number_bg.svg [new file with mode: 0644]
css/user/blue/images/hvac/left_number_cover.svg [new file with mode: 0644]
css/user/blue/images/hvac/right_heat_seat_off.svg [new file with mode: 0644]
css/user/blue/images/hvac/right_heat_seat_on.svg [new file with mode: 0644]
css/user/blue/images/hvac/right_number_bg.svg [new file with mode: 0644]
css/user/blue/images/hvac/right_number_cover.svg [new file with mode: 0644]
css/user/blue/images/hvac/static_parts_bg.svg [new file with mode: 0644]
css/user/blue/images/hvac/temp_bar_on_left.svg [new file with mode: 0644]
css/user/blue/images/hvac/temp_bar_on_right.svg [new file with mode: 0644]
css/user/blue/images/library/bg_left_panel_blue.png [new file with mode: 0644]
css/user/blue/images/library/bg_top_navi_blue.png [new file with mode: 0644]
css/user/blue/images/library/bg_top_navi_select_blue.png [new file with mode: 0644]
css/user/blue/images/library/bg_top_navi_unselect1px_blue.png [new file with mode: 0644]
css/user/blue/images/library/bg_top_navi_unselect_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_back_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_close_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_grid_act_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_grid_act_blue_test.png [new file with mode: 0644]
css/user/blue/images/library/bt_grid_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_grid_blue_disabled.png [new file with mode: 0644]
css/user/blue/images/library/bt_list_act_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_list_act_blue_test.png [new file with mode: 0644]
css/user/blue/images/library/bt_list_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_list_blue_disabled.png [new file with mode: 0644]
css/user/blue/images/library/bt_search_act_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_search_act_blue_test.png [new file with mode: 0644]
css/user/blue/images/library/bt_search_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_search_blue_disabled.png [new file with mode: 0644]
css/user/blue/images/library/bt_shad_bottom_blue.png [new file with mode: 0644]
css/user/blue/images/library/bt_shad_top_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/bg_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/cover_album_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/grey_rectangle_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_next_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_next_enabled_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_pause_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_play_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_previous_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_previous_enabled_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_repeat_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_repeat_enabled_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_shuffle_blue.png [new file with mode: 0644]
css/user/blue/images/musicplayer/icon_shuffle_enabled_blue.png [new file with mode: 0644]
css/user/blue/images/navigation/icon_map_blue.png [new file with mode: 0644]
css/user/blue/images/navigation/icon_satellite_blue.png [new file with mode: 0644]
css/user/blue/images/phone/bg_with_glow_blue.png [new file with mode: 0644]
css/user/blue/images/phone/bt_delete_blue.png [new file with mode: 0644]
css/user/blue/images/phone/contact_picture_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_addcall_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_address_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_call_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_contact_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_dialed_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_email_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_endcall_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_favorite_false_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_favorite_true_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_hold_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_missed_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_missed_new_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_mobile_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_mobile_blue_hover.png [new file with mode: 0644]
css/user/blue/images/phone/icon_mute_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_number_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_received_blue.png [new file with mode: 0644]
css/user/blue/images/phone/icon_speaker_blue.png [new file with mode: 0644]
css/user/blue/images/progressBar/VCcircle_blue.png [new file with mode: 0644]
css/user/blue/images/progressBar/handle_blue.png [new file with mode: 0644]
css/user/blue/images/progressBar/icon_volume_blue.png [new file with mode: 0644]
css/user/blue/images/progressBar/progresbarbg.png [new file with mode: 0644]
css/user/blue/images/progressBar/progresbarbgstart.png [new file with mode: 0644]
css/user/blue/images/settings/screenshot_theme_blue.png [new file with mode: 0644]
css/user/blue/images/settings/screenshot_theme_green.png [new file with mode: 0644]
css/user/blue/images/store/bg_all.png [new file with mode: 0644]
css/user/blue/images/store/bg_grid.png [new file with mode: 0644]
css/user/blue/images/store/rectangle.png [new file with mode: 0644]
css/user/blue/images/store/square_03.png [new file with mode: 0644]
css/user/blue/images/store/star_grey.png [new file with mode: 0644]
css/user/blue/images/store/star_white.png [new file with mode: 0644]
css/user/blue/images/tabs/bg_top_navi_blue.png [new file with mode: 0644]
css/user/blue/images/tabs/bg_top_navi_select_blue.png [new file with mode: 0644]
css/user/blue/images/tabs/bg_top_navi_unselect1px_blue.png [new file with mode: 0644]
css/user/blue/images/tabs/bt_back_blue.png [new file with mode: 0644]
css/user/blue/images/tabs/bt_close_blue.png [new file with mode: 0644]
css/user/blue/images/topbaricons/top_bar_icons_bg_blue.png [new file with mode: 0644]
css/user/blue/library.css [new file with mode: 0644]
css/user/blue/musicplayer.css [new file with mode: 0644]
css/user/blue/navigation.css [new file with mode: 0644]
css/user/blue/nouislider.fox.css [new file with mode: 0644]
css/user/blue/phone.css [new file with mode: 0644]
css/user/blue/progressBarImg.css [new file with mode: 0644]
css/user/blue/settings.css [new file with mode: 0644]
css/user/blue/store.css [new file with mode: 0644]
css/user/blue/tabs.css [new file with mode: 0644]
css/user/blue/theme.json [new file with mode: 0644]
css/user/blue/topbariconsimages.css [new file with mode: 0644]
css/user/blue/user.css [new file with mode: 0644]
css/user/blue/user.js [new file with mode: 0644]
css/user/green/bottombaricons.css [new file with mode: 0644]
css/user/green/common.css [new file with mode: 0644]
css/user/green/dashboard.css [new file with mode: 0644]
css/user/green/homescreen.css [new file with mode: 0644]
css/user/green/hvac.css [new file with mode: 0644]
css/user/green/icon.png [new file with mode: 0644]
css/user/green/images/bottombaricons/icon_back.png [new file with mode: 0644]
css/user/green/images/bottombaricons/logo_icon_green.png [new file with mode: 0644]
css/user/green/images/bottombaricons/panel_bottom_green.png [new file with mode: 0644]
css/user/green/images/common/bt_back_green.png [new file with mode: 0644]
css/user/green/images/common/bt_library_green.png [new file with mode: 0644]
css/user/green/images/common/bt_next_green.png [new file with mode: 0644]
css/user/green/images/common/bt_previous_green.png [new file with mode: 0644]
css/user/green/images/dashboard/bg_green.png [new file with mode: 0644]
css/user/green/images/dashboard/car_with__inactive_lights_green.png [new file with mode: 0644]
css/user/green/images/dashboard/circle_green.png [new file with mode: 0644]
css/user/green/images/dashboard/corner_green.png [new file with mode: 0644]
css/user/green/images/dashboard/icon_battery_green.png [new file with mode: 0644]
css/user/green/images/dashboard/icon_cloudy.png [new file with mode: 0644]
css/user/green/images/dashboard/icon_padlock_active_green.png [new file with mode: 0644]
css/user/green/images/dashboard/icon_padlock_inactive_green.png [new file with mode: 0644]
css/user/green/images/dashboard/icon_sun.png [new file with mode: 0644]
css/user/green/images/dashboard/icon_thunder.png [new file with mode: 0644]
css/user/green/images/dashboard/lights_break_active.png [new file with mode: 0644]
css/user/green/images/dashboard/lights_front_active_green.png [new file with mode: 0644]
css/user/green/images/dashboard/lights_rear_active_green.png [new file with mode: 0644]
css/user/green/images/dashboard/line_with_pointer_long_green.png [new file with mode: 0644]
css/user/green/images/dashboard/line_with_pointer_short_green.png [new file with mode: 0644]
css/user/green/images/dashboard/moon_green.png [new file with mode: 0644]
css/user/green/images/dashboard/sun_green.png [new file with mode: 0644]
css/user/green/images/dashboard/wheel_green.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_01.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_02.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_03.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_04.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_05.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_06.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_07.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_08.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_09.png [new file with mode: 0644]
css/user/green/images/homescreen/bg_green_10.png [new file with mode: 0644]
css/user/green/images/homescreen/bottom_panel_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/center_green.png [new file with mode: 0644]
css/user/green/images/homescreen/center_ico_green.png [new file with mode: 0644]
css/user/green/images/homescreen/center_inner_move_green.png [new file with mode: 0644]
css/user/green/images/homescreen/center_outer_move_green.png [new file with mode: 0644]
css/user/green/images/homescreen/dashboard_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/music_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/navigation_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/phone_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/radio_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/smart_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/social_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/store_bg_green.png [new file with mode: 0644]
css/user/green/images/homescreen/video_bg_green.png [new file with mode: 0644]
css/user/green/images/hvac/defrost_front_off.svg [new file with mode: 0644]
css/user/green/images/hvac/defrost_front_on.svg [new file with mode: 0644]
css/user/green/images/hvac/defrost_max_off.svg [new file with mode: 0644]
css/user/green/images/hvac/defrost_max_on.svg [new file with mode: 0644]
css/user/green/images/hvac/defrost_rear_off.svg [new file with mode: 0644]
css/user/green/images/hvac/defrost_rear_on.svg [new file with mode: 0644]
css/user/green/images/hvac/drag_knob.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_bar_on.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_control_ac_off.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_control_ac_on.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_control_auto_off.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_control_auto_on.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_control_circ_off.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_control_circ_on.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_dir_down_off.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_dir_down_on.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_dir_right_off.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_dir_right_on.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_dir_up_off.svg [new file with mode: 0644]
css/user/green/images/hvac/fan_dir_up_on.svg [new file with mode: 0644]
css/user/green/images/hvac/hazard_blink.svg [new file with mode: 0644]
css/user/green/images/hvac/hazard_off.svg [new file with mode: 0644]
css/user/green/images/hvac/hazard_on.svg [new file with mode: 0644]
css/user/green/images/hvac/left_heat_seat_off.svg [new file with mode: 0644]
css/user/green/images/hvac/left_heat_seat_on.svg [new file with mode: 0644]
css/user/green/images/hvac/left_number_bg.svg [new file with mode: 0644]
css/user/green/images/hvac/left_number_cover.svg [new file with mode: 0644]
css/user/green/images/hvac/right_heat_seat_off.svg [new file with mode: 0644]
css/user/green/images/hvac/right_heat_seat_on.svg [new file with mode: 0644]
css/user/green/images/hvac/right_number_bg.svg [new file with mode: 0644]
css/user/green/images/hvac/right_number_cover.svg [new file with mode: 0644]
css/user/green/images/hvac/static_parts_bg.svg [new file with mode: 0644]
css/user/green/images/hvac/temp_bar_on_left.svg [new file with mode: 0644]
css/user/green/images/hvac/temp_bar_on_right.svg [new file with mode: 0644]
css/user/green/images/library/bg_left_panel_green.png [new file with mode: 0644]
css/user/green/images/library/bg_top_navi_green.png [new file with mode: 0644]
css/user/green/images/library/bg_top_navi_select_green.png [new file with mode: 0644]
css/user/green/images/library/bg_top_navi_unselect1px_green.png [new file with mode: 0644]
css/user/green/images/library/bg_top_navi_unselect_green.png [new file with mode: 0644]
css/user/green/images/library/bt_back_green.png [new file with mode: 0644]
css/user/green/images/library/bt_close_green.png [new file with mode: 0644]
css/user/green/images/library/bt_grid_act_green.png [new file with mode: 0644]
css/user/green/images/library/bt_grid_act_green_test.png [new file with mode: 0644]
css/user/green/images/library/bt_grid_green.png [new file with mode: 0644]
css/user/green/images/library/bt_grid_green_disabled.png [new file with mode: 0644]
css/user/green/images/library/bt_list_act_green.png [new file with mode: 0644]
css/user/green/images/library/bt_list_act_green_test.png [new file with mode: 0644]
css/user/green/images/library/bt_list_green.png [new file with mode: 0644]
css/user/green/images/library/bt_list_green_disabled.png [new file with mode: 0644]
css/user/green/images/library/bt_search_act_green.png [new file with mode: 0644]
css/user/green/images/library/bt_search_act_green_test.png [new file with mode: 0644]
css/user/green/images/library/bt_search_green.png [new file with mode: 0644]
css/user/green/images/library/bt_search_green_disabled.png [new file with mode: 0644]
css/user/green/images/library/bt_shad_bottom_green.png [new file with mode: 0644]
css/user/green/images/library/bt_shad_top_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/bg_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/cover_album_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/grey_rectangle_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_next_enabled_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_next_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_pause_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_play_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_previous_enabled_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_previous_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_repeat_enabled_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_repeat_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_shuffle_enabled_green.png [new file with mode: 0644]
css/user/green/images/musicplayer/icon_shuffle_green.png [new file with mode: 0644]
css/user/green/images/navigation/icon_map_green.png [new file with mode: 0644]
css/user/green/images/navigation/icon_satellite_green.png [new file with mode: 0644]
css/user/green/images/phone/bg_with_glow_green.png [new file with mode: 0644]
css/user/green/images/phone/bt_delete_green.png [new file with mode: 0644]
css/user/green/images/phone/contact_picture_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_addcall_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_address_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_call_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_contact_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_dialed_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_email_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_endcall_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_favorite_false_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_favorite_true_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_hold_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_missed_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_missed_new_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_mobile_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_mobile_green_hover.png [new file with mode: 0644]
css/user/green/images/phone/icon_mute_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_number_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_received_green.png [new file with mode: 0644]
css/user/green/images/phone/icon_speaker_green.png [new file with mode: 0644]
css/user/green/images/progressBar/VCcircle_green.png [new file with mode: 0644]
css/user/green/images/progressBar/handle_green.png [new file with mode: 0644]
css/user/green/images/progressBar/icon_volume_green.png [new file with mode: 0644]
css/user/green/images/progressBar/progresbarbg.png [new file with mode: 0644]
css/user/green/images/progressBar/progresbarbgstart.png [new file with mode: 0644]
css/user/green/images/settings/screenshot_theme_blue.png [new file with mode: 0644]
css/user/green/images/settings/screenshot_theme_green.png [new file with mode: 0644]
css/user/green/images/store/bg_all_green.png [new file with mode: 0644]
css/user/green/images/store/bg_grid_green.png [new file with mode: 0644]
css/user/green/images/store/rectangle.png [new file with mode: 0644]
css/user/green/images/store/square_03.png [new file with mode: 0644]
css/user/green/images/store/star_grey.png [new file with mode: 0644]
css/user/green/images/store/star_white.png [new file with mode: 0644]
css/user/green/images/tabs/bg_top_navi_green.png [new file with mode: 0644]
css/user/green/images/tabs/bg_top_navi_select_green.png [new file with mode: 0644]
css/user/green/images/tabs/bg_top_navi_unselect1px_green.png [new file with mode: 0644]
css/user/green/images/tabs/bt_back_green.png [new file with mode: 0644]
css/user/green/images/tabs/bt_close_green.png [new file with mode: 0644]
css/user/green/images/topbaricons/top_bar_icons_bg_green.png [new file with mode: 0644]
css/user/green/library.css [new file with mode: 0644]
css/user/green/musicplayer.css [new file with mode: 0644]
css/user/green/navigation.css [new file with mode: 0644]
css/user/green/nouislider.fox.css [new file with mode: 0644]
css/user/green/phone.css [new file with mode: 0644]
css/user/green/progressBarImg.css [new file with mode: 0644]
css/user/green/settings.css [new file with mode: 0644]
css/user/green/store.css [new file with mode: 0644]
css/user/green/tabs.css [new file with mode: 0644]
css/user/green/theme.json [new file with mode: 0644]
css/user/green/topbariconsimages.css [new file with mode: 0644]
css/user/green/user.css [new file with mode: 0644]
css/user/green/user.js [new file with mode: 0644]
js/services/bootstrap.js [new file with mode: 0644]
js/services/carIndicator.js [new file with mode: 0644]
js/services/extends.js [new file with mode: 0644]
js/services/speech.js [new file with mode: 0644]
js/services/themeengine.js [new file with mode: 0644]
packaging/html5-ui-common.changes [new file with mode: 0644]
packaging/html5-ui-common.spec [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..75d452f
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,20 @@
+PROJECT = html5_UI_Common
+
+VERSION := 0.0.1
+PACKAGE = $(PROJECT)-$(VERSION)
+
+#INSTALL_FILES = $(PROJECT).wgt
+INSTALL_DIR = ${DESTDIR}/opt/usr/apps/_common
+
+all:
+       #zip -r $(PROJECT).wgt config.xml index.html icon.png js css
+
+install:
+       @echo "Installing Common UI files package, stand by..."
+       mkdir -p $(INSTALL_DIR)/
+       cp -r css $(INSTALL_DIR)/
+       cp -r js $(INSTALL_DIR)/
+
+dist:
+       tar czf ../$(PACKAGE).tar.bz2 .
+
diff --git a/css/car/car.css b/css/car/car.css
new file mode 100644 (file)
index 0000000..a8f94a4
--- /dev/null
@@ -0,0 +1,257 @@
+@import url("./spinner.css");
+
+/* This is theme aimed for Intel Coulomb 2012 */
+@font-face {
+       font-family: HelveticaNeue;
+
+       src: url('./fonts/HelveticaNeue-Regular.eot?#iefix') format('embedded-opentype'),
+            url('./fonts/HelveticaNeue-Regular.woff') format('woff'),
+            url('./fonts/HelveticaNeue-Regular.ttf')  format('truetype'),
+            url('./fonts/HelveticaNeue-Regular.svg#svgFontName') format('svg'),
+            local("HelveticaNeue");
+}
+
+@font-face {
+       font-family: HelveticaNeue;
+       src: url('./fonts/HelveticaNeue-CondensedBold.eot?#iefix') format('embedded-opentype'),
+            url('./fonts/HelveticaNeue-CondensedBold.woff') format('woff'),
+            url('./fonts/HelveticaNeue-CondensedBold.ttf')  format('truetype'),
+            url('./fonts/HelveticaNeue-CondensedBold.svg#svgFontName') format('svg'),
+            local("HelveticaNeue");
+
+       font-weight: bold;
+}
+
+@font-face {
+       font-family: HelveticaNeue;
+       src: url('./fonts/HelveticaNeue-Light.eot?#iefix') format('embedded-opentype'),
+            url('./fonts/HelveticaNeue-Light.woff') format('woff'),
+            url('./fonts/HelveticaNeue-Light.ttf')  format('truetype'),
+            url('./fonts/HelveticaNeue-Light.svg#svgFontName') format('svg'),
+            local("HelveticaNeue");
+
+       font-weight: 100;
+}
+
+html {
+       height: 1280px !important;
+       width: 720px !important;
+       overflow: hidden;
+       position: absolute !important;
+       background-color: #000;
+}
+
+body {
+       font-family: HelveticaNeue;
+       -webkit-font-smoothing: antialiased;
+       position: absolute !important;
+       height: 1280px !important;
+       width: 720px !important;
+       overflow: hidden;
+       z-index: 1;
+       background-color: #000;
+       /*-webkit-transform: scale(0.5, 0.5) !important;
+       -webkit-transform: rotate(-90deg) !important;
+       -webkit-transform-origin: left top !important;
+        top: 720px !important;*/
+}
+
+* {
+       margin: 0;
+       padding: 0;
+       -webkit-user-select: none;
+}
+
+div {
+       position: relative;
+}
+
+ul {
+       list-style: none;
+       padding: 0;
+       margin: 0;
+}
+
+li {
+       overflow: hidden;
+       position: relative;
+}
+
+.border {
+       border: 1px solid;
+}
+
+.exitButton {
+       background-image: url('images/bt_close.png');
+}
+
+.button {
+       display: block;
+       margin: 0;
+       padding: 0;
+       cursor: pointer;
+       text-align: center;
+       text-decoration: none;
+       z-index: 10;
+}
+
+.button:hover {
+       text-decoration: none;
+}
+
+.libraryButton {
+       position: absolute;
+       height: 60px;
+       line-height: 47px !important;
+       top: 152px;
+       right: 0;
+       background-repeat: no-repeat;
+       background-position: left center;
+       text-align: right;
+       padding: 0 33px 0 40px;
+       text-transform: uppercase;
+}
+
+.libraryButton:active {
+       position: absolute;
+       top: 153px;
+}
+
+.backButton {
+       height: 43px;
+       line-height: 43px !important;
+       background-repeat: no-repeat;
+       background-position: left center;
+       text-align: right;
+       padding: 0 15px 0 35px;
+       display: inline-block;
+       margin-left: 20px;
+       vertical-align: top;
+       cursor: pointer;
+}
+
+.settingsHeaderText {
+       text-transform: uppercase;
+}
+
+.albumCarouselDescriptionText {
+       text-transform: uppercase;
+}
+
+.oneLineEllipsis {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       word-wrap: break-word;
+       display: -webkit-box;
+       -webkit-box-orient: vertical;
+       -webkit-line-clamp: 1;
+}
+
+.twoLinesEllipsis {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       word-wrap: break-word;
+       display: -webkit-box;
+       -webkit-box-orient: vertical;
+       -webkit-line-clamp: 2;
+}
+
+.threeLinesEllipsis {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       word-wrap: break-word;
+       display: -webkit-box;
+       -webkit-box-orient: vertical;
+       -webkit-line-clamp: 3;
+}
+
+input {
+       font-family: inherit;
+       font-weight: bold;
+}
+
+.inputBox .input {
+       width: 280px;
+       height: 75px;
+       padding-right: 75px;
+       padding-left: 25px;
+       border: none;
+       background-color: black;
+       background-color: rgba(0, 0, 0, 0.2);
+       -webkit-user-select: text;
+}
+
+.inputBox .input:focus {
+       border: 0;
+       outline: none;
+}
+
+.inputBox .deleteButton {
+       position: absolute;
+       top: 0;
+       right: 0;
+       margin: 0;
+       padding: 0;
+       width: 70px;
+       height: 75px;
+       background-position: center center;
+       background-repeat: no-repeat;
+       cursor: pointer;
+}
+
+.inputBox .deleteButton:active {
+       top: 1px;
+       right: 1px;
+}
+
+.inputBox .inputSelection {
+       width: 230px;
+       height: 75px;
+       padding-right: 75px;
+       padding-left: 75px;
+       border: none;
+       background-color: black;
+       background-color: rgba(0, 0, 0, 0.2);
+       -webkit-user-select: text;
+}
+
+.inputBox .inputSelection:focus {
+       border: 0;
+       outline: none;
+}
+
+.inputBox .previousButton {
+       position: absolute;
+       top: 0;
+       left: 0;
+       margin: 0;
+       padding: 0;
+       width: 70px;
+       height: 75px;
+       background-position: center center;
+       background-repeat: no-repeat;
+       cursor: pointer;
+}
+
+.inputBox .previousButton:active {
+       top: 1px;
+       left: 1px;
+}
+
+.inputBox .nextButton {
+       position: absolute;
+       top: 0;
+       right: 0;
+       margin: 0;
+       padding: 0;
+       width: 70px;
+       height: 75px;
+       background-position: center center;
+       background-repeat: no-repeat;
+       cursor: pointer;
+}
+
+.inputBox .nextButton:active {
+       top: 1px;
+       right: 1px;
+}
\ No newline at end of file
diff --git a/css/car/car.js b/css/car/car.js
new file mode 100644 (file)
index 0000000..fde1150
--- /dev/null
@@ -0,0 +1,234 @@
+/*global ThemeKeyColor */
+
+/**
+ * @module CarTheme
+ */
+
+/**
+* This function dowloads javascript file, saves it to local cache and injects it to HTML document.
+* @method loadScript
+* @for window
+* @param {string} scriptPath DOM object which to save the downloaded Javascript as Base64.
+* @param {function(status)} callback - callback function.
+*/
+function loadScript(path, callback) {
+    "use strict";
+    var scripts = document.getElementsByTagName("script"),
+        i = 0,
+        done = false,
+        scriptElement;
+
+    var tempPath = path;
+    if (tempPath.startsWith("./")) {
+        tempPath = tempPath.substring(1);
+    }
+
+    for (i = 0; i < scripts.length; i++) {
+        if (scripts[i].src.indexOf(tempPath) !== -1) {
+            callback(path, "ok");
+            return;
+        }
+    }
+
+    scriptElement = document.createElement('script');
+
+    function handleLoad() {
+        if (!done) {
+            done = true;
+            if (callback !== null) {
+                callback(path, "ok");
+            }
+        }
+    }
+
+    scriptElement.onload = handleLoad;
+
+    scriptElement.onreadystatechange = function () {
+        var state;
+
+        if (!done) {
+            state = scriptElement.readyState;
+            if (state === "complete") {
+                handleLoad();
+            }
+        }
+    };
+
+    scriptElement.onerror = function () {
+        if (!done) {
+            done = true;
+            if (callback !== null) {
+                callback(path, "error");
+            }
+        }
+    };
+
+    scriptElement.src = path;
+    scriptElement.type = "text/javascript";
+
+    document.getElementsByTagName('head')[0].appendChild(scriptElement);
+}
+
+/**
+* Function tests if string starts with substring passed as parameter.
+* @method startsWith
+* @param {String} str Substring to verify.
+* @for String
+* @return {bool} true if string starts with substring.
+*/
+String.prototype.startsWith = function (str){
+    "use strict";
+    return this.indexOf(str) === 0;
+};
+
+/**
+* Function checks if script or CSS file is included in HTML <head>.
+* @method checkIfIncluded
+* @param {String} file Path to file name to test.
+* @for window
+* @return {bool} true if script / CSS is included in html.
+*/
+function checkIfIncluded(file) {
+    "use strict";
+    var links = document.getElementsByTagName("link"),
+        i = 0,
+        scripts = document.getElementsByTagName("script");
+
+    for (i = 0; i < links.length; i++) {
+        if (links[i].href.substr(-file.length) === file) {
+            return true;
+        }
+    }
+
+    for (i = 0; i < scripts.length; i++) {
+        if (scripts[i].src.substr(-file.length) === file) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+/**
+* Function changes image background color by replacing key color with color provided as parameter.
+* @method changeCssBgImageColor
+* @for window
+* @param {string} selector jQuery selector .
+* @param {string} bgcolor New background color in HEX code.
+*/
+
+function changeCssBgImageColor(selector, bgcolor) {
+    "use strict";
+    var imageSource = $(selector).css("background-image"),
+        patt = /\"|\'|\)|\(|url/g, //remove 'url' and '()' from background-image property
+        img, ctx, w, h;
+
+    if (imageSource !== undefined) {
+        console.log(imageSource);
+        imageSource = imageSource.replace(patt, '');
+
+        img = new Image();
+        ctx = document.createElement('canvas').getContext('2d');
+
+        img.onload = function () {
+            w = ctx.canvas.width = img.width;
+            h = ctx.canvas.height = img.height;
+            ctx.fillStyle = bgcolor || ThemeKeyColor;
+            ctx.fillRect(0, 0, w, h);
+            ctx.globalCompositeOperation = 'destination-in';
+            ctx.drawImage(img, 0, 0);
+
+            $(selector).css('background-image', 'url(' + ctx.canvas.toDataURL() + ')');
+            $(selector).css('visibility', 'visible');
+        };
+
+        img.src = imageSource;
+    }
+}
+/**
+* Function loads teplate HTML code into script element with name provided as paramater.
+* @method loadTemplate
+* @for window
+* @param {string} baseUrl HTLM URL to load.
+* @param {string} name Element name to store loaded template.
+* @param {callback} callback Callback function called when code was injected to HTML structure.
+*/
+function loadTemplate(baseUrl, name, callback) {
+    "use strict";
+    var template = document.getElementById(name);
+
+    if (!!template) {
+        callback();
+    } else {
+        jQuery.get(baseUrl + name + '.html', function (data) {
+            var scriptTag = $('<script type="text/html" id="' + name + '"></script>');
+            scriptTag.html(data);
+            $('body').append(scriptTag);
+            callback();
+        });
+    }
+}
+/**
+* Function shows loading spinner.
+* @method showLoadingSpinner
+* @for window
+* @param {string} text Text to show in loading spinner.
+*/
+function showLoadingSpinner(text) {
+    "use strict";
+    if (!$("#loadingSpinnerWrapper").length) {
+        var spinner = '';
+        spinner += '<div id="loadingSpinnerWrapper" class="loadingSpinnerWrapper">';
+        spinner += '<div id="loadingSpinner" class="loadingSpinner pageBgColorNormalTransparent">';
+        spinner += '<div id="loadingSpinnerContent" class="loading-container">';
+        spinner += '<div id="loadingSpinnerImg" class="loading"></div>';
+        spinner += '<div id="loadingSpinnerText" class="loading-text fontSizeXXSmall fontWeightBold fontColorNormal">';
+        spinner += (!!text && text !== "") ? text.toUpperCase() : "";
+        spinner += '</div>';
+        spinner += '</div>';
+        spinner += '</div>';
+        spinner += '</div>';
+        $(spinner).appendTo($("body"));
+        $("#loadingSpinnerWrapper").show();
+    } else {
+        if (!!text && text !== "") {
+            $("#loadingSpinnerText").text(text);
+        } else {
+            $("#loadingSpinnerText").text("");
+        }
+        $("#loadingSpinnerWrapper").show();
+    }
+}
+/**
+* Function hides loading spinner.
+* @method hideLoadingSpinner
+* @for window
+* @param {string} text Text to show in loading spinner.
+*/
+function hideLoadingSpinner(text) {
+    "use strict";
+    if ($("#loadingSpinnerWrapper").length) {
+        if (text === undefined || text.toString().trim().toLowerCase() === $("#loadingSpinnerText").text().toString().trim().toLowerCase()) {
+            $("#loadingSpinnerWrapper").hide();
+        }
+    }
+}
+/**
+* Function returns formatted phone number into unified format starting with + sign.
+* @method formatPhoneNumber
+* @for window
+* @param {string} phoneNumber Unformated phone number.
+*/
+function formatPhoneNumber(phoneNumber) {
+    "use strict";
+    var convPhoneNumber = phoneNumber;
+
+    if (!!convPhoneNumber) {
+        convPhoneNumber = convPhoneNumber.toString();
+        convPhoneNumber = convPhoneNumber.trim().replace(/^\+/, "00"); // replace leading '+' by '00'
+        convPhoneNumber = convPhoneNumber.trim().replace(/\D/g, "");  // remove all non-digit characters, ie. 00123-123(123) => 00123123123
+        convPhoneNumber = convPhoneNumber.trim().replace(/^00/, "+"); // replace leading '00' by '+'
+    }
+
+    return convPhoneNumber;
+}
\ No newline at end of file
diff --git a/css/car/components/alphabetBookmark/alphabetBookmark.css b/css/car/components/alphabetBookmark/alphabetBookmark.css
new file mode 100644 (file)
index 0000000..1a29fdf
--- /dev/null
@@ -0,0 +1,14 @@
+#alphabetBookmarkList {
+       position: absolute;
+       top: 115px;
+       right: 15px;
+       cursor: pointer;
+       -webkit-transition: 0.7s;
+       z-index: 10;
+       text-align: center;
+}
+
+.alphabetBookmarkItem {
+       margin-bottom: 20px;
+       margin-top: 10px;
+}
\ No newline at end of file
diff --git a/css/car/components/alphabetBookmark/alphabetBookmark.js b/css/car/components/alphabetBookmark/alphabetBookmark.js
new file mode 100644 (file)
index 0000000..0cbce3e
--- /dev/null
@@ -0,0 +1,62 @@
+/*global template */
+
+/**
+ * Represents alphabet UI control element (letters in column), that can be used to filter list of objects according to selected/tapped letter.
+ * This component is required by {{#crossLink "Library"}}{{/crossLink}} class.
+ *
+ * Use following snippet to include component in your `index.html` file:
+ *
+ *     <script type="text/javascript" src='./css/car/components/alphabetBookmark/alphabetBookmark.js'></script>
+ *     <link rel="stylesheet" href="./css/car/components/alphabetBookmark/alphabetBookmark.css" />
+ *
+ * and following code to initialize:
+ *
+ *     AlphabetBookmark.fill();
+ *
+ * @class AlphabetBookmark
+ * @module CarTheme
+ * @constructor
+ */
+var AlphabetBookmark = {
+        /**
+         * Array of letters.
+         * @property abModel
+         * @type {Array}
+         */
+        abModel: [],
+        /**
+         * String of letters that will rendered.
+         * @property abcd
+         * @type {String}
+         */
+        abcd: "*ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+        /**
+         * Highlights the selected letter.
+         *
+         * @method touch
+         * @param index {Integer} Index of the letter.
+         */
+        touch: function (index) {
+            "use strict";
+            return;
+            // $(".alphabetBookmarkItem").removeClass("fontColorSelected");
+            // var tabId = "#item_" + index;
+            // $(tabId).addClass("fontColorSelected");
+            // $("#alphabetBookmarkList").trigger("letterClick", this.abModel[index].text);
+        },
+        /**
+         * Fills the {{#crossLink "AlphabetBookmark/abModel:property"}}{{/crossLink}} from {{#crossLink "AlphabetBookmark/abcd:property"}}{{/crossLink}} and shows the rendered default template on the screen.
+         *
+         * @method fill
+         */
+        fill: function () {
+            "use strict";
+
+            this.abModel = [];
+            var i = 0;
+            for (i = 0; i < this.abcd.length; i++) {
+                this.abModel.push({ index: i, text: this.abcd.charAt(i) });
+            }
+            template.compile(this.abModel, "./css/car/components/alphabetBookmark/templates/alphabetBookmarkDelegate.html", "#alphabetBookmarkList");
+        }
+    };
\ No newline at end of file
diff --git a/css/car/components/alphabetBookmark/templates/alphabetBookmarkDelegate.html b/css/car/components/alphabetBookmark/templates/alphabetBookmarkDelegate.html
new file mode 100644 (file)
index 0000000..7193f33
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="item_{{:index}}"
+       class="alphabetBookmarkItem fontSizeSmaller fontColorNormal"
+       onclick="AlphabetBookmark.touch({{:index}})">{{:text}}</div>
\ No newline at end of file
diff --git a/css/car/components/async/async.js b/css/car/components/async/async.js
new file mode 100644 (file)
index 0000000..051079c
--- /dev/null
@@ -0,0 +1,955 @@
+/*global setImmediate: false, setTimeout: false, console: false */
+(function () {
+
+    var async = {};
+
+    // global on the server, window in the browser
+    var root, previous_async;
+
+    root = this;
+    if (root != null) {
+      previous_async = root.async;
+    }
+
+    async.noConflict = function () {
+        root.async = previous_async;
+        return async;
+    };
+
+    function only_once(fn) {
+        var called = false;
+        return function() {
+            if (called) throw new Error("Callback was already called.");
+            called = true;
+            fn.apply(root, arguments);
+        }
+    }
+
+    //// cross-browser compatiblity functions ////
+
+    var _each = function (arr, iterator) {
+        if (arr.forEach) {
+            return arr.forEach(iterator);
+        }
+        for (var i = 0; i < arr.length; i += 1) {
+            iterator(arr[i], i, arr);
+        }
+    };
+
+    var _map = function (arr, iterator) {
+        if (arr.map) {
+            return arr.map(iterator);
+        }
+        var results = [];
+        _each(arr, function (x, i, a) {
+            results.push(iterator(x, i, a));
+        });
+        return results;
+    };
+
+    var _reduce = function (arr, iterator, memo) {
+        if (arr.reduce) {
+            return arr.reduce(iterator, memo);
+        }
+        _each(arr, function (x, i, a) {
+            memo = iterator(memo, x, i, a);
+        });
+        return memo;
+    };
+
+    var _keys = function (obj) {
+        if (Object.keys) {
+            return Object.keys(obj);
+        }
+        var keys = [];
+        for (var k in obj) {
+            if (obj.hasOwnProperty(k)) {
+                keys.push(k);
+            }
+        }
+        return keys;
+    };
+
+    //// exported async module functions ////
+
+    //// nextTick implementation with browser-compatible fallback ////
+    if (typeof process === 'undefined' || !(process.nextTick)) {
+        if (typeof setImmediate === 'function') {
+            async.nextTick = function (fn) {
+                // not a direct alias for IE10 compatibility
+                setImmediate(fn);
+            };
+            async.setImmediate = async.nextTick;
+        }
+        else {
+            async.nextTick = function (fn) {
+                setTimeout(fn, 0);
+            };
+            async.setImmediate = async.nextTick;
+        }
+    }
+    else {
+        async.nextTick = process.nextTick;
+        if (typeof setImmediate !== 'undefined') {
+            async.setImmediate = setImmediate;
+        }
+        else {
+            async.setImmediate = async.nextTick;
+        }
+    }
+
+    async.each = function (arr, iterator, callback) {
+        callback = callback || function () {};
+        if (!arr.length) {
+            return callback();
+        }
+        var completed = 0;
+        _each(arr, function (x) {
+            iterator(x, only_once(function (err) {
+                if (err) {
+                    callback(err);
+                    callback = function () {};
+                }
+                else {
+                    completed += 1;
+                    if (completed >= arr.length) {
+                        callback(null);
+                    }
+                }
+            }));
+        });
+    };
+    async.forEach = async.each;
+
+    async.eachSeries = function (arr, iterator, callback) {
+        callback = callback || function () {};
+        if (!arr.length) {
+            return callback();
+        }
+        var completed = 0;
+        var iterate = function () {
+            iterator(arr[completed], function (err) {
+                if (err) {
+                    callback(err);
+                    callback = function () {};
+                }
+                else {
+                    completed += 1;
+                    if (completed >= arr.length) {
+                        callback(null);
+                    }
+                    else {
+                        iterate();
+                    }
+                }
+            });
+        };
+        iterate();
+    };
+    async.forEachSeries = async.eachSeries;
+
+    async.eachLimit = function (arr, limit, iterator, callback) {
+        var fn = _eachLimit(limit);
+        fn.apply(null, [arr, iterator, callback]);
+    };
+    async.forEachLimit = async.eachLimit;
+
+    var _eachLimit = function (limit) {
+
+        return function (arr, iterator, callback) {
+            callback = callback || function () {};
+            if (!arr.length || limit <= 0) {
+                return callback();
+            }
+            var completed = 0;
+            var started = 0;
+            var running = 0;
+
+            (function replenish () {
+                if (completed >= arr.length) {
+                    return callback();
+                }
+
+                while (running < limit && started < arr.length) {
+                    started += 1;
+                    running += 1;
+                    iterator(arr[started - 1], function (err) {
+                        if (err) {
+                            callback(err);
+                            callback = function () {};
+                        }
+                        else {
+                            completed += 1;
+                            running -= 1;
+                            if (completed >= arr.length) {
+                                callback();
+                            }
+                            else {
+                                replenish();
+                            }
+                        }
+                    });
+                }
+            })();
+        };
+    };
+
+
+    var doParallel = function (fn) {
+        return function () {
+            var args = Array.prototype.slice.call(arguments);
+            return fn.apply(null, [async.each].concat(args));
+        };
+    };
+    var doParallelLimit = function(limit, fn) {
+        return function () {
+            var args = Array.prototype.slice.call(arguments);
+            return fn.apply(null, [_eachLimit(limit)].concat(args));
+        };
+    };
+    var doSeries = function (fn) {
+        return function () {
+            var args = Array.prototype.slice.call(arguments);
+            return fn.apply(null, [async.eachSeries].concat(args));
+        };
+    };
+
+
+    var _asyncMap = function (eachfn, arr, iterator, callback) {
+        var results = [];
+        arr = _map(arr, function (x, i) {
+            return {index: i, value: x};
+        });
+        eachfn(arr, function (x, callback) {
+            iterator(x.value, function (err, v) {
+                results[x.index] = v;
+                callback(err);
+            });
+        }, function (err) {
+            callback(err, results);
+        });
+    };
+    async.map = doParallel(_asyncMap);
+    async.mapSeries = doSeries(_asyncMap);
+    async.mapLimit = function (arr, limit, iterator, callback) {
+        return _mapLimit(limit)(arr, iterator, callback);
+    };
+
+    var _mapLimit = function(limit) {
+        return doParallelLimit(limit, _asyncMap);
+    };
+
+    // reduce only has a series version, as doing reduce in parallel won't
+    // work in many situations.
+    async.reduce = function (arr, memo, iterator, callback) {
+        async.eachSeries(arr, function (x, callback) {
+            iterator(memo, x, function (err, v) {
+                memo = v;
+                callback(err);
+            });
+        }, function (err) {
+            callback(err, memo);
+        });
+    };
+    // inject alias
+    async.inject = async.reduce;
+    // foldl alias
+    async.foldl = async.reduce;
+
+    async.reduceRight = function (arr, memo, iterator, callback) {
+        var reversed = _map(arr, function (x) {
+            return x;
+        }).reverse();
+        async.reduce(reversed, memo, iterator, callback);
+    };
+    // foldr alias
+    async.foldr = async.reduceRight;
+
+    var _filter = function (eachfn, arr, iterator, callback) {
+        var results = [];
+        arr = _map(arr, function (x, i) {
+            return {index: i, value: x};
+        });
+        eachfn(arr, function (x, callback) {
+            iterator(x.value, function (v) {
+                if (v) {
+                    results.push(x);
+                }
+                callback();
+            });
+        }, function (err) {
+            callback(_map(results.sort(function (a, b) {
+                return a.index - b.index;
+            }), function (x) {
+                return x.value;
+            }));
+        });
+    };
+    async.filter = doParallel(_filter);
+    async.filterSeries = doSeries(_filter);
+    // select alias
+    async.select = async.filter;
+    async.selectSeries = async.filterSeries;
+
+    var _reject = function (eachfn, arr, iterator, callback) {
+        var results = [];
+        arr = _map(arr, function (x, i) {
+            return {index: i, value: x};
+        });
+        eachfn(arr, function (x, callback) {
+            iterator(x.value, function (v) {
+                if (!v) {
+                    results.push(x);
+                }
+                callback();
+            });
+        }, function (err) {
+            callback(_map(results.sort(function (a, b) {
+                return a.index - b.index;
+            }), function (x) {
+                return x.value;
+            }));
+        });
+    };
+    async.reject = doParallel(_reject);
+    async.rejectSeries = doSeries(_reject);
+
+    var _detect = function (eachfn, arr, iterator, main_callback) {
+        eachfn(arr, function (x, callback) {
+            iterator(x, function (result) {
+                if (result) {
+                    main_callback(x);
+                    main_callback = function () {};
+                }
+                else {
+                    callback();
+                }
+            });
+        }, function (err) {
+            main_callback();
+        });
+    };
+    async.detect = doParallel(_detect);
+    async.detectSeries = doSeries(_detect);
+
+    async.some = function (arr, iterator, main_callback) {
+        async.each(arr, function (x, callback) {
+            iterator(x, function (v) {
+                if (v) {
+                    main_callback(true);
+                    main_callback = function () {};
+                }
+                callback();
+            });
+        }, function (err) {
+            main_callback(false);
+        });
+    };
+    // any alias
+    async.any = async.some;
+
+    async.every = function (arr, iterator, main_callback) {
+        async.each(arr, function (x, callback) {
+            iterator(x, function (v) {
+                if (!v) {
+                    main_callback(false);
+                    main_callback = function () {};
+                }
+                callback();
+            });
+        }, function (err) {
+            main_callback(true);
+        });
+    };
+    // all alias
+    async.all = async.every;
+
+    async.sortBy = function (arr, iterator, callback) {
+        async.map(arr, function (x, callback) {
+            iterator(x, function (err, criteria) {
+                if (err) {
+                    callback(err);
+                }
+                else {
+                    callback(null, {value: x, criteria: criteria});
+                }
+            });
+        }, function (err, results) {
+            if (err) {
+                return callback(err);
+            }
+            else {
+                var fn = function (left, right) {
+                    var a = left.criteria, b = right.criteria;
+                    return a < b ? -1 : a > b ? 1 : 0;
+                };
+                callback(null, _map(results.sort(fn), function (x) {
+                    return x.value;
+                }));
+            }
+        });
+    };
+
+    async.auto = function (tasks, callback) {
+        callback = callback || function () {};
+        var keys = _keys(tasks);
+        if (!keys.length) {
+            return callback(null);
+        }
+
+        var results = {};
+
+        var listeners = [];
+        var addListener = function (fn) {
+            listeners.unshift(fn);
+        };
+        var removeListener = function (fn) {
+            for (var i = 0; i < listeners.length; i += 1) {
+                if (listeners[i] === fn) {
+                    listeners.splice(i, 1);
+                    return;
+                }
+            }
+        };
+        var taskComplete = function () {
+            _each(listeners.slice(0), function (fn) {
+                fn();
+            });
+        };
+
+        addListener(function () {
+            if (_keys(results).length === keys.length) {
+                callback(null, results);
+                callback = function () {};
+            }
+        });
+
+        _each(keys, function (k) {
+            var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];
+            var taskCallback = function (err) {
+                var args = Array.prototype.slice.call(arguments, 1);
+                if (args.length <= 1) {
+                    args = args[0];
+                }
+                if (err) {
+                    var safeResults = {};
+                    _each(_keys(results), function(rkey) {
+                        safeResults[rkey] = results[rkey];
+                    });
+                    safeResults[k] = args;
+                    callback(err, safeResults);
+                    // stop subsequent errors hitting callback multiple times
+                    callback = function () {};
+                }
+                else {
+                    results[k] = args;
+                    async.setImmediate(taskComplete);
+                }
+            };
+            var requires = task.slice(0, Math.abs(task.length - 1)) || [];
+            var ready = function () {
+                return _reduce(requires, function (a, x) {
+                    return (a && results.hasOwnProperty(x));
+                }, true) && !results.hasOwnProperty(k);
+            };
+            if (ready()) {
+                task[task.length - 1](taskCallback, results);
+            }
+            else {
+                var listener = function () {
+                    if (ready()) {
+                        removeListener(listener);
+                        task[task.length - 1](taskCallback, results);
+                    }
+                };
+                addListener(listener);
+            }
+        });
+    };
+
+    async.waterfall = function (tasks, callback) {
+        callback = callback || function () {};
+        if (tasks.constructor !== Array) {
+          var err = new Error('First argument to waterfall must be an array of functions');
+          return callback(err);
+        }
+        if (!tasks.length) {
+            return callback();
+        }
+        var wrapIterator = function (iterator) {
+            return function (err) {
+                if (err) {
+                    callback.apply(null, arguments);
+                    callback = function () {};
+                }
+                else {
+                    var args = Array.prototype.slice.call(arguments, 1);
+                    var next = iterator.next();
+                    if (next) {
+                        args.push(wrapIterator(next));
+                    }
+                    else {
+                        args.push(callback);
+                    }
+                    async.setImmediate(function () {
+                        iterator.apply(null, args);
+                    });
+                }
+            };
+        };
+        wrapIterator(async.iterator(tasks))();
+    };
+
+    var _parallel = function(eachfn, tasks, callback) {
+        callback = callback || function () {};
+        if (tasks.constructor === Array) {
+            eachfn.map(tasks, function (fn, callback) {
+                if (fn) {
+                    fn(function (err) {
+                        var args = Array.prototype.slice.call(arguments, 1);
+                        if (args.length <= 1) {
+                            args = args[0];
+                        }
+                        callback.call(null, err, args);
+                    });
+                }
+            }, callback);
+        }
+        else {
+            var results = {};
+            eachfn.each(_keys(tasks), function (k, callback) {
+                tasks[k](function (err) {
+                    var args = Array.prototype.slice.call(arguments, 1);
+                    if (args.length <= 1) {
+                        args = args[0];
+                    }
+                    results[k] = args;
+                    callback(err);
+                });
+            }, function (err) {
+                callback(err, results);
+            });
+        }
+    };
+
+    async.parallel = function (tasks, callback) {
+        _parallel({ map: async.map, each: async.each }, tasks, callback);
+    };
+
+    async.parallelLimit = function(tasks, limit, callback) {
+        _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
+    };
+
+    async.series = function (tasks, callback) {
+        callback = callback || function () {};
+        if (tasks.constructor === Array) {
+            async.mapSeries(tasks, function (fn, callback) {
+                if (fn) {
+                    fn(function (err) {
+                        var args = Array.prototype.slice.call(arguments, 1);
+                        if (args.length <= 1) {
+                            args = args[0];
+                        }
+                        callback.call(null, err, args);
+                    });
+                }
+            }, callback);
+        }
+        else {
+            var results = {};
+            async.eachSeries(_keys(tasks), function (k, callback) {
+                tasks[k](function (err) {
+                    var args = Array.prototype.slice.call(arguments, 1);
+                    if (args.length <= 1) {
+                        args = args[0];
+                    }
+                    results[k] = args;
+                    callback(err);
+                });
+            }, function (err) {
+                callback(err, results);
+            });
+        }
+    };
+
+    async.iterator = function (tasks) {
+        var makeCallback = function (index) {
+            var fn = function () {
+                if (tasks.length) {
+                    tasks[index].apply(null, arguments);
+                }
+                return fn.next();
+            };
+            fn.next = function () {
+                return (index < tasks.length - 1) ? makeCallback(index + 1): null;
+            };
+            return fn;
+        };
+        return makeCallback(0);
+    };
+
+    async.apply = function (fn) {
+        var args = Array.prototype.slice.call(arguments, 1);
+        return function () {
+            return fn.apply(
+                null, args.concat(Array.prototype.slice.call(arguments))
+            );
+        };
+    };
+
+    var _concat = function (eachfn, arr, fn, callback) {
+        var r = [];
+        eachfn(arr, function (x, cb) {
+            fn(x, function (err, y) {
+                r = r.concat(y || []);
+                cb(err);
+            });
+        }, function (err) {
+            callback(err, r);
+        });
+    };
+    async.concat = doParallel(_concat);
+    async.concatSeries = doSeries(_concat);
+
+    async.whilst = function (test, iterator, callback) {
+        if (test()) {
+            iterator(function (err) {
+                if (err) {
+                    return callback(err);
+                }
+                async.whilst(test, iterator, callback);
+            });
+        }
+        else {
+            callback();
+        }
+    };
+
+    async.doWhilst = function (iterator, test, callback) {
+        iterator(function (err) {
+            if (err) {
+                return callback(err);
+            }
+            if (test()) {
+                async.doWhilst(iterator, test, callback);
+            }
+            else {
+                callback();
+            }
+        });
+    };
+
+    async.until = function (test, iterator, callback) {
+        if (!test()) {
+            iterator(function (err) {
+                if (err) {
+                    return callback(err);
+                }
+                async.until(test, iterator, callback);
+            });
+        }
+        else {
+            callback();
+        }
+    };
+
+    async.doUntil = function (iterator, test, callback) {
+        iterator(function (err) {
+            if (err) {
+                return callback(err);
+            }
+            if (!test()) {
+                async.doUntil(iterator, test, callback);
+            }
+            else {
+                callback();
+            }
+        });
+    };
+
+    async.queue = function (worker, concurrency) {
+        if (concurrency === undefined) {
+            concurrency = 1;
+        }
+        function _insert(q, data, pos, callback) {
+          if(data.constructor !== Array) {
+              data = [data];
+          }
+          _each(data, function(task) {
+              var item = {
+                  data: task,
+                  callback: typeof callback === 'function' ? callback : null
+              };
+
+              if (pos) {
+                q.tasks.unshift(item);
+              } else {
+                q.tasks.push(item);
+              }
+
+              if (q.saturated && q.tasks.length === concurrency) {
+                  q.saturated();
+              }
+              async.setImmediate(q.process);
+          });
+        }
+
+        var workers = 0;
+        var q = {
+            tasks: [],
+            concurrency: concurrency,
+            saturated: null,
+            empty: null,
+            drain: null,
+            push: function (data, callback) {
+              _insert(q, data, false, callback);
+            },
+            unshift: function (data, callback) {
+              _insert(q, data, true, callback);
+            },
+            process: function () {
+                if (workers < q.concurrency && q.tasks.length) {
+                    var task = q.tasks.shift();
+                    if (q.empty && q.tasks.length === 0) {
+                        q.empty();
+                    }
+                    workers += 1;
+                    var next = function () {
+                        workers -= 1;
+                        if (task.callback) {
+                            task.callback.apply(task, arguments);
+                        }
+                        if (q.drain && q.tasks.length + workers === 0) {
+                            q.drain();
+                        }
+                        q.process();
+                    };
+                    var cb = only_once(next);
+                    worker(task.data, cb);
+                }
+            },
+            length: function () {
+                return q.tasks.length;
+            },
+            running: function () {
+                return workers;
+            }
+        };
+        return q;
+    };
+
+    async.cargo = function (worker, payload) {
+        var working     = false,
+            tasks       = [];
+
+        var cargo = {
+            tasks: tasks,
+            payload: payload,
+            saturated: null,
+            empty: null,
+            drain: null,
+            push: function (data, callback) {
+                if(data.constructor !== Array) {
+                    data = [data];
+                }
+                _each(data, function(task) {
+                    tasks.push({
+                        data: task,
+                        callback: typeof callback === 'function' ? callback : null
+                    });
+                    if (cargo.saturated && tasks.length === payload) {
+                        cargo.saturated();
+                    }
+                });
+                async.setImmediate(cargo.process);
+            },
+            process: function process() {
+                if (working) return;
+                if (tasks.length === 0) {
+                    if(cargo.drain) cargo.drain();
+                    return;
+                }
+
+                var ts = typeof payload === 'number'
+                            ? tasks.splice(0, payload)
+                            : tasks.splice(0);
+
+                var ds = _map(ts, function (task) {
+                    return task.data;
+                });
+
+                if(cargo.empty) cargo.empty();
+                working = true;
+                worker(ds, function () {
+                    working = false;
+
+                    var args = arguments;
+                    _each(ts, function (data) {
+                        if (data.callback) {
+                            data.callback.apply(null, args);
+                        }
+                    });
+
+                    process();
+                });
+            },
+            length: function () {
+                return tasks.length;
+            },
+            running: function () {
+                return working;
+            }
+        };
+        return cargo;
+    };
+
+    var _console_fn = function (name) {
+        return function (fn) {
+            var args = Array.prototype.slice.call(arguments, 1);
+            fn.apply(null, args.concat([function (err) {
+                var args = Array.prototype.slice.call(arguments, 1);
+                if (typeof console !== 'undefined') {
+                    if (err) {
+                        if (console.error) {
+                            console.error(err);
+                        }
+                    }
+                    else if (console[name]) {
+                        _each(args, function (x) {
+                            console[name](x);
+                        });
+                    }
+                }
+            }]));
+        };
+    };
+    async.log = _console_fn('log');
+    async.dir = _console_fn('dir');
+    /*async.info = _console_fn('info');
+    async.warn = _console_fn('warn');
+    async.error = _console_fn('error');*/
+
+    async.memoize = function (fn, hasher) {
+        var memo = {};
+        var queues = {};
+        hasher = hasher || function (x) {
+            return x;
+        };
+        var memoized = function () {
+            var args = Array.prototype.slice.call(arguments);
+            var callback = args.pop();
+            var key = hasher.apply(null, args);
+            if (key in memo) {
+                callback.apply(null, memo[key]);
+            }
+            else if (key in queues) {
+                queues[key].push(callback);
+            }
+            else {
+                queues[key] = [callback];
+                fn.apply(null, args.concat([function () {
+                    memo[key] = arguments;
+                    var q = queues[key];
+                    delete queues[key];
+                    for (var i = 0, l = q.length; i < l; i++) {
+                      q[i].apply(null, arguments);
+                    }
+                }]));
+            }
+        };
+        memoized.memo = memo;
+        memoized.unmemoized = fn;
+        return memoized;
+    };
+
+    async.unmemoize = function (fn) {
+      return function () {
+        return (fn.unmemoized || fn).apply(null, arguments);
+      };
+    };
+
+    async.times = function (count, iterator, callback) {
+        var counter = [];
+        for (var i = 0; i < count; i++) {
+            counter.push(i);
+        }
+        return async.map(counter, iterator, callback);
+    };
+
+    async.timesSeries = function (count, iterator, callback) {
+        var counter = [];
+        for (var i = 0; i < count; i++) {
+            counter.push(i);
+        }
+        return async.mapSeries(counter, iterator, callback);
+    };
+
+    async.compose = function (/* functions... */) {
+        var fns = Array.prototype.reverse.call(arguments);
+        return function () {
+            var that = this;
+            var args = Array.prototype.slice.call(arguments);
+            var callback = args.pop();
+            async.reduce(fns, args, function (newargs, fn, cb) {
+                fn.apply(that, newargs.concat([function () {
+                    var err = arguments[0];
+                    var nextargs = Array.prototype.slice.call(arguments, 1);
+                    cb(err, nextargs);
+                }]))
+            },
+            function (err, results) {
+                callback.apply(that, [err].concat(results));
+            });
+        };
+    };
+
+    var _applyEach = function (eachfn, fns /*args...*/) {
+        var go = function () {
+            var that = this;
+            var args = Array.prototype.slice.call(arguments);
+            var callback = args.pop();
+            return eachfn(fns, function (fn, cb) {
+                fn.apply(that, args.concat([cb]));
+            },
+            callback);
+        };
+        if (arguments.length > 2) {
+            var args = Array.prototype.slice.call(arguments, 2);
+            return go.apply(this, args);
+        }
+        else {
+            return go;
+        }
+    };
+    async.applyEach = doParallel(_applyEach);
+    async.applyEachSeries = doSeries(_applyEach);
+
+    async.forever = function (fn, callback) {
+        function next(err) {
+            if (err) {
+                if (callback) {
+                    return callback(err);
+                }
+                throw err;
+            }
+            fn(next);
+        }
+        next();
+    };
+
+    // AMD / RequireJS
+    if (typeof define !== 'undefined' && define.amd) {
+        define([], function () {
+            return async;
+        });
+    }
+    // Node.js
+    else if (typeof module !== 'undefined' && module.exports) {
+        module.exports = async;
+    }
+    // included directly via <script> tag
+    else {
+        root.async = async;
+    }
+
+}());
\ No newline at end of file
diff --git a/css/car/components/audioPlayer/audioPlayer.js b/css/car/components/audioPlayer/audioPlayer.js
new file mode 100644 (file)
index 0000000..d569749
--- /dev/null
@@ -0,0 +1,739 @@
+/*global Utils */
+
+/**
+ * @module CarTheme
+ **/
+(function ($) {
+    "use strict";
+     /**
+     * Represents HTML5 audio element which is utilizing Audio Service API to get/set status of currently playing song (tested with wav audio files).
+     * Audio resources are passed to the player as an array of songs and stored in {{#crossLink "AudioPlayer/model:property"}}{{/crossLink}} property.
+     *
+     * This class requires following components:
+     *
+     * * {{#crossLink "ButtonControlsObj"}}{{/crossLink}} component
+     *
+     * Audio player is extended by option to set buttons to control audio playback (play/pause, next, previous, shuffle, repeat), time progress bar, spectrum analyzer, info panel, volume control.
+     *
+     * Use following snippet to include component in your `index.html` file:
+     *
+     *     <script type="text/javascript" src="./css/car/components/audioPlayer/audioPlayer.js"></script>
+     *
+     * and following code to initialize:
+     *
+     *     $('#multimediaPlayer').audioAPI('init', [], "#audioPlayer", "#videoPlayer");
+     *
+     * @class AudioPlayer
+     * @constructor
+     */
+    var AudioPlayer = {
+            thisObj: null,
+            /**
+             * Array of song objects. Every song object is expected to have album, artist, name, path and image properties.
+             * @property model
+             * @type {Array}
+             * @default null
+             */
+            model: [],
+            /**
+             * HTML audio or video DOM element.
+             * @property player
+             * @type {Any}
+             * @default null
+             */
+            player: null,
+            playerType: "AUDIO",
+            /**
+             * HTML audio DOM element.
+             * @property audio
+             * @type {Audio}
+             * @default null
+             */
+            audio: null,
+            /**
+             * HTML video DOM element.
+             * @property video
+             * @type {Video}
+             * @default null
+             */
+            video: null,
+            /**
+             * Indicates if audio timeupdate event listener was registered.
+             * @property timeUpdateListenerLoaded
+             * @type {Boolean}
+             * @default false
+             */
+            timeUpdateListenerLoaded: false,
+            /**
+             * Instance of audio service API.
+             * @property audioPlayerService
+             * @type {AudioService}
+             * @default null
+             */
+            audioPlayerService: null,
+
+            /**
+             * Selector of audio control buttons (play/pause, next, previous, shuffle, repeat).
+             * @property ctrlButtonsSelector
+             * @default null
+             */
+            ctrlButtonsSelector: null,
+            /**
+             * Selector of audio time progress bar.
+             * @property timeProgressBarSelelector
+             * @default null
+             */
+            timeProgressBarSelelector: null,
+            /**
+             * Selector of audio spectrum analyzer.
+             * @property spectrumAnalyzerSelelector
+             * @default null
+             */
+            spectrumAnalyzerSelelector: null,
+            /**
+             * Selector of audio info panel.
+             * @property infoPanelSelector
+             * @default null
+             */
+            infoPanelSelector: null,
+            /**
+             * Selector of audio thumbnail image.
+             * @property thumbnailSelector
+             * @default null
+             */
+            thumbnailSelector: null,
+            /**
+             * Selector of audio volume control.
+             * @property volumeControlSelector
+             * @default null
+             */
+            volumeControlSelector: null,
+            /**
+             * Indicates if repeat option of audio/video player is turned on.
+             * @property repeatOn
+             * @type {Boolean}
+             * @default false
+             */
+            repeatOn: false,
+            /**
+             * Indicates if shuffle option of audio player is turned on.
+             * @property shuffleOn
+             * @type {Boolean}
+             * @default false
+             */
+            shuffleOn: false,
+            /**
+             * Indicates if audio/video is playing (is not paused).
+             * @property playOn
+             * @type {Boolean}
+             * @default false
+             */
+            playOn: false,
+            /**
+             * Indicates the index of the loaded audio/video.
+             * @property index
+             * @type {Number}
+             * @default 0
+             */
+            index: 0,
+            /**
+             * Indicates the current playback position in percentage (0% - 100%) in the loaded audio/video.
+             * @property position
+             * @type {Number}
+             * @default 0
+             */
+            position: 0,
+            /**
+             * Indicates the current playback position in the loaded audio/video.
+             * @property currentTime
+             * @type {Number}
+             * @default 0
+             */
+            currentTime: 0,
+            /**
+             * Indicates the length of the loaded audio/video.
+             * @property duration
+             * @type {Number}
+             * @default 0
+             */
+            duration: 0,
+            /**
+             * Indicates the volume in percentage (0% - 100%) of the loaded audio/video.
+             * @property volume
+             * @type {Number}
+             * @default 0
+             */
+            volume: 100,
+            indexChangedCallback: null,
+            /**
+             * Sets the audio spectrum analyzer selector.
+             *
+             * @method setSpectrumAnalyzerSelector
+             * @param selector {String} Audio spectrum analyzer selector.
+             */
+            setSpectrumAnalyzerSelector: function (selector) {
+                AudioPlayer.spectrumAnalyzerSelelector = selector;
+            },
+            /**
+             * Sets the audio control buttons selector.
+             *
+             * @method setControlButtonsSelector
+             * @param selector {String} Audio control buttons selector.
+             */
+            setControlButtonsSelector: function (selector) {
+                AudioPlayer.ctrlButtonsSelector = selector;
+            },
+            /**
+             * Sets the audio time progress bar selector.
+             *
+             * @method setTimeProgressBarSelector
+             * @param selector {String} Audio time progress bar selector.
+             */
+            setTimeProgressBarSelector: function (selector) {
+                AudioPlayer.timeProgressBarSelelector = selector;
+            },
+            /**
+             * Sets the audio info panel selector.
+             *
+             * @method setInfoPanelSelector
+             * @param selector {String} Audio info panel selector.
+             */
+            setInfoPanelSelector: function (selector) {
+                AudioPlayer.infoPanelSelector = selector;
+            },
+            /**
+             * Sets the audio info panel selector.
+             *
+             * @method setThumbnailSelector
+             * @param selector {String} Audio info panel selector.
+             */
+            setThumbnailSelector: function (selector) {
+                AudioPlayer.thumbnailSelector = selector;
+            },
+            /**
+             * Sets the audio volume control selector.
+             *
+             * @method setVolumeControlSelector
+             * @param selector {String} Audio volume control selector.
+             */
+            setVolumeControlSelector: function (selector) {
+                AudioPlayer.volumeControlSelector = selector;
+            },
+            addIndexChangeListener: function(indexChangeCallback) {
+                AudioPlayer.indexChangeCallback = indexChangeCallback;
+            },
+            /**
+             * Initializes the audio player user interface, binds the audio controls (control buttons, volume control, time progress bar, ...), adds audio events listeners,
+             * gets the status from audio service API, loads appropriate song from passed model/playlist and updates the UI.
+             *
+             * @method init
+             * @param modelLib {Array} Array of audio songs.
+             */
+            init: function (modelLib, audioPlayerSelector, videoPlayerSelector) {
+                AudioPlayer.thisObj = this;
+                if (!!modelLib && modelLib.length) {
+                    AudioPlayer.model = modelLib;
+                }
+                if (!!audioPlayerSelector && audioPlayerSelector !== "") {
+                    AudioPlayer.audio = $(audioPlayerSelector).get(0);
+                }
+                if (!!videoPlayerSelector && videoPlayerSelector !== "") {
+                    AudioPlayer.video = $(videoPlayerSelector).get(0);
+                }
+                if (!!AudioPlayer.audio) {
+                    AudioPlayer.player = AudioPlayer.audio;
+                    AudioPlayer.playerType = "AUDIO";
+                } else if (!!AudioPlayer.video) {
+                    AudioPlayer.player = AudioPlayer.video;
+                    AudioPlayer.playerType = "VIDEO";
+                }
+
+                if (AudioPlayer.ctrlButtonsSelector !== null) {
+                    $(AudioPlayer.ctrlButtonsSelector).buttonControls('initAudioPlayerButtons');
+                    $(AudioPlayer.ctrlButtonsSelector).unbind();
+                    $(AudioPlayer.ctrlButtonsSelector).bind('previousSong', function () {
+                        console.log("previousSong clicked");
+                        AudioPlayer.previous();
+                    });
+                    $(AudioPlayer.ctrlButtonsSelector).bind('nextSong', function () {
+                        console.log("nextSong clicked");
+                        AudioPlayer.next();
+                    });
+                    $(AudioPlayer.ctrlButtonsSelector).bind('playSong', function () {
+                        console.log("playSong clicked");
+                        AudioPlayer.playOn = !AudioPlayer.playOn;
+                        AudioPlayer.playPause(AudioPlayer.playOn);
+                    });
+                    $(AudioPlayer.ctrlButtonsSelector).bind('shuffleSong', function () {
+                        console.log("shuffleSong clicked");
+                        AudioPlayer.shuffleOn = !AudioPlayer.shuffleOn;
+                        AudioPlayer.updateUIControls();
+                    });
+                    $(AudioPlayer.ctrlButtonsSelector).bind('repeatSong', function () {
+                        console.log("repeatSong clicked");
+                        AudioPlayer.repeatOn = !AudioPlayer.repeatOn;
+                        AudioPlayer.updateUIControls();
+                    });
+                }
+
+                if (AudioPlayer.volumeControlSelector !== null) {
+                    $(AudioPlayer.volumeControlSelector).noUiSlider({
+                        range: [0, 100],
+                        step: 1,
+                        start: 50,
+                        handles: 1,
+                        connect: "lower",
+                        orientation: "horizontal",
+                        slide: function (aaa, ccc) {
+                            var volumeSlider = parseInt($(AudioPlayer.volumeControlSelector).val(), 10);
+                            console.log("new volume: " + volumeSlider);
+                            AudioPlayer.volume = volumeSlider;
+                            AudioPlayer.setAudioVolume(volumeSlider);
+                        }
+                    });
+                    AudioPlayer.setAudioVolume(50);
+                }
+
+                if (AudioPlayer.timeProgressBarSelelector !== null) {
+                    $(AudioPlayer.timeProgressBarSelelector).timeProgressBar("init");
+                    $(AudioPlayer.timeProgressBarSelelector).bind('positionChanged', function (e, data) {
+                        console.log("positionChanged " + data.position);
+                        AudioPlayer.setAudioPosition(data.position);
+                    });
+                }
+
+                AudioPlayer.registerPlayerListeners(AudioPlayer.audio, "AUDIO");
+                AudioPlayer.registerPlayerListeners(AudioPlayer.video, "VIDEO");
+
+                AudioPlayer.updateUIControls();
+            },
+            registerPlayerListeners: function(player, type) {
+                if (!!player) {
+                    player.addEventListener('canplay', function () {
+                        console.log("canplay " + type);
+                        AudioPlayer.playPause(AudioPlayer.playOn);
+                    }, false);
+
+                    player.addEventListener('canplaythrough', function () {
+                        console.log("canplaythrough " + type);
+                        AudioPlayer.playPause(AudioPlayer.playOn);
+                    }, false);
+
+                    player.addEventListener('play', function () {
+                        console.log("play " + type);
+                    }, false);
+
+                    player.addEventListener('playing', function () {
+                        console.log("playing " + type);
+                    }, false);
+
+                    player.addEventListener('error', function () {
+                        console.log("error " + type);
+                    }, false);
+
+                    player.addEventListener('waiting', function () {
+                        console.log("waiting " + type);
+                    }, false);
+
+                    player.addEventListener('timeupdate', function () {
+                        //console.log("timeupdate " + type + " " + player.currentTime + " " + player.duration);
+                        if (!!player.currentTime && !isNaN(player.currentTime) && player.currentTime !== "Infinity" && player.currentTime > 0 &&
+                            !!player.duration && !isNaN(player.duration) && player.duration !== "Infinity" && player.duration > 0) {
+                            AudioPlayer.currentTime = player.currentTime;
+                            AudioPlayer.duration = player.duration;
+                        }
+
+                        AudioPlayer.updateProgressInfoPanel();
+                        AudioPlayer.spectrumAnalyzer(AudioPlayer.playOn);
+                    }, false);
+
+                    player.addEventListener('ended', function () {
+                        AudioPlayer.next();
+                    });
+                }
+            },
+            playAudioContent: function(audioContent, indexToPlay, play, type) {
+                if (!!AudioPlayer.player) {
+                    AudioPlayer.player.pause();
+                    AudioPlayer.player.src = "";
+                }
+                AudioPlayer.model = audioContent;
+                AudioPlayer.playOn = play;
+                AudioPlayer.playerType = type;
+                if (type === "AUDIO") {
+                    AudioPlayer.player = AudioPlayer.audio;
+                } else if (type === "VIDEO") {
+                    AudioPlayer.player = AudioPlayer.video;
+                }
+                AudioPlayer.loadAudio(indexToPlay);
+            },
+            /**
+             * Updates the audio UI controls and panels according to loaded song and audio status.
+             *
+             * @method updateUIControls
+             */
+            updateUIControls: function () {
+                AudioPlayer.playPauseButtons(AudioPlayer.playOn);
+                AudioPlayer.shuffleButton(AudioPlayer.shuffleOn);
+                AudioPlayer.repeatButton(AudioPlayer.repeatOn);
+                AudioPlayer.nextButton(AudioPlayer.index, AudioPlayer.repeatOn, AudioPlayer.shuffleOn);
+                AudioPlayer.previousButton(AudioPlayer.index, AudioPlayer.repeatOn, AudioPlayer.shuffleOn);
+                AudioPlayer.spectrumAnalyzer(AudioPlayer.playOn);
+                AudioPlayer.volumeControl(AudioPlayer.volume);
+                AudioPlayer.updateAudioInfoPanel(AudioPlayer.index);
+                AudioPlayer.updateProgressInfoPanel();
+            },
+            /**
+             * Sets the audio play/pause button to active/inactive state.
+             *
+             * @method playPauseButtons
+             * @param isPaused {Boolean} State of play/pause button.
+             */
+            playPauseButtons: function (isPaused) {
+                if (AudioPlayer.ctrlButtonsSelector !== null) {
+                    if (isPaused) {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonPauseActive');
+                    } else {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonPlayActive');
+                    }
+                }
+            },
+            /**
+             * Sets the audio shuffle button to active/inactive state.
+             *
+             * @method shuffleButton
+             * @param isActive {Boolean} State of shuffle button.
+             */
+            shuffleButton: function (isActive) {
+                if (AudioPlayer.ctrlButtonsSelector !== null) {
+                    if (isActive) {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonShuffleActive');
+                    } else {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonShuffleInactive');
+                    }
+                }
+            },
+            /**
+             * Sets the audio repeat button to active/inactive state.
+             *
+             * @method repeatButton
+             * @param isActive {Boolean} State of repeat button.
+             */
+            repeatButton: function (isActive) {
+                if (AudioPlayer.ctrlButtonsSelector !== null) {
+                    if (isActive) {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonRepeatActive');
+                    } else {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonRepeatInactive');
+                    }
+                }
+            },
+            /**
+             * Sets the audio next button to active/inactive state.
+             *
+             * @method nextButton
+             * @param index {Number} Index of the song.
+             * @param repeat {Boolean} State of the repeat option.
+             * @param shuffle {Boolean} State of the shuffle option.
+             */
+            nextButton: function (index, repeat, shuffle) {
+                if (AudioPlayer.ctrlButtonsSelector !== null) {
+                    if (repeat || shuffle || index < AudioPlayer.model.length - 1) {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonNextActive');
+                    } else {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonNextInactive');
+                    }
+                }
+            },
+            /**
+             * Sets the audio previous button to active/inactive state.
+             *
+             * @method previousButton
+             * @param index {Number} Index of the song.
+             * @param repeat {Boolean} State of the repeat option.
+             * @param shuffle {Boolean} State of the shuffle option.
+             */
+            previousButton: function (index, repeat, shuffle) {
+                if (AudioPlayer.ctrlButtonsSelector !== null) {
+                    if (repeat || shuffle || index > 0) {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonPreviousActive');
+                    } else {
+                        $(AudioPlayer.ctrlButtonsSelector).buttonControls('buttonPreviousInactive');
+                    }
+                }
+            },
+            /**
+             * Sets the audio spectrum analyzer to active/inactive state.
+             *
+             * @method spectrumAnalyzer
+             * @param playOn {Boolean} State of the audio playback.
+             */
+            spectrumAnalyzer: function (playOn) {
+                if (AudioPlayer.spectrumAnalyzerSelelector !== null) {
+                    if (playOn) {
+                        $(AudioPlayer.spectrumAnalyzerSelelector).spectrumAnalyzer('spectrumAnalyzerRandomize');
+                    } else {
+                        $(AudioPlayer.spectrumAnalyzerSelelector).spectrumAnalyzer('clearSpectrumAnalyzer');
+                    }
+                }
+            },
+            /**
+             * Sets the audio volume control.
+             *
+             * @method volumeControl
+             * @param volume {Number} Volume of the audio in percentage (0% - 100%).
+             */
+            volumeControl: function (volume) {
+                if (volume > 100) {
+                    volume = 100;
+                } else if (volume < 0) {
+                    volume = 0;
+                }
+                AudioPlayer.volume = volume;
+                if (AudioPlayer.volumeControlSelector !== null) {
+                    $(AudioPlayer.volumeControlSelector).val(volume);
+                }
+                AudioPlayer.setAudioVolume(volume);
+            },
+            /**
+             * Sets the audio volume.
+             *
+             * @method setAudioVolume
+             * @param volume {Number} Volume of the audio in percentage (0% - 100%).
+             */
+            setAudioVolume: function (volume) {
+                if (volume > 100) {
+                    volume = 100;
+                } else if (volume < 0) {
+                    volume = 0;
+                }
+                AudioPlayer.volume = volume;
+                AudioPlayer.player.volume =  volume / 100;
+            },
+            /**
+             * Updates the audio info panel (artist, album, name).
+             *
+             * @method updateAudioInfoPanel
+             * @param index {Number} Index of the song.
+             */
+            updateAudioInfoPanel: function (index) {
+                if (AudioPlayer.model.length && index >= 0 && index < AudioPlayer.model.length ) {
+                    var audioContent = AudioPlayer.model[index],
+                        objInfo = {};
+
+                    if (!!audioContent) {
+                        if (AudioPlayer.infoPanelSelector !== null) {
+                            objInfo.title = 'NOW PLAYING';
+                            objInfo.artist = Utils.getArtistName(audioContent);
+                            objInfo.album = Utils.getAlbumName(audioContent);
+                            objInfo.name = Utils.getMediaItemTitle(audioContent);
+                            $(AudioPlayer.infoPanelSelector).infoPanel('show', objInfo);
+                        }
+                        if (AudioPlayer.thumbnailSelector !== null) {
+                            $(AudioPlayer.thumbnailSelector).get(0).src = Utils.getThumbnailPath(audioContent, AudioPlayer.playerType);
+                        }
+                    }
+                }
+            },
+            /**
+             * Updates the audio time progress bar.
+             *
+             * @method updateProgressInfoPanel
+             */
+            updateProgressInfoPanel: function () {
+                if (AudioPlayer.duration < 0) {
+                    AudioPlayer.duration = 0;
+                }
+
+                if (AudioPlayer.currentTime < 0) {
+                    AudioPlayer.currentTime = 0;
+                }
+
+                if (AudioPlayer.currentTime > AudioPlayer.duration) {
+                    AudioPlayer.currentTime = AudioPlayer.duration;
+                }
+
+                AudioPlayer.position = (AudioPlayer.currentTime / AudioPlayer.duration) * 100;
+
+                if (AudioPlayer.position < 0) {
+                    AudioPlayer.position = 0;
+                }
+
+                if (AudioPlayer.position > 100) {
+                    AudioPlayer.position = 100;
+                }
+
+                var remainingTime = AudioPlayer.duration - AudioPlayer.currentTime,
+                    durationMins = Math.floor(remainingTime / 60, 10),
+                    durationSecs = Math.round(remainingTime) - durationMins * 60,
+                    estimationTime = '-' + durationMins + ':' + (durationSecs > 9 ? durationSecs : '0' + durationSecs),
+                    initProgressBarObj = {
+                        count: AudioPlayer.model.length,
+                        index: AudioPlayer.model.length <= 0 ? 0 : AudioPlayer.index + 1,
+                        estimation: estimationTime,
+                        position: AudioPlayer.position
+                    };
+
+                if (AudioPlayer.timeProgressBarSelelector !== null) {
+                    $(AudioPlayer.timeProgressBarSelelector).timeProgressBar("show", initProgressBarObj);
+                }
+            },
+            /**
+             * Sets and loads the audio source.
+             *
+             * @method loadAudio
+             * @param index {Number} Index of the song.
+             */
+            loadAudio: function (index, delay) {
+                if (!AudioPlayer.model.length || index < 0 || index > AudioPlayer.model.length - 1 || !AudioPlayer.player) {
+                    return;
+                }
+
+                AudioPlayer.player.pause();
+                AudioPlayer.player.src = "";
+                AudioPlayer.index = index;
+                AudioPlayer.position = 0;
+                AudioPlayer.currentTime = 0;
+                AudioPlayer.duration = 0;
+
+                var audioContent = AudioPlayer.model[index];
+
+                if (!!audioContent) {
+                    if (!!audioContent.contentURI && audioContent.contentURI !== "") {
+                        if (typeof(delay) === 'undefined') {
+                            AudioPlayer.player.src = audioContent.contentURI;
+                            AudioPlayer.player.load();
+                        } else {
+                            setTimeout(function() {
+                                AudioPlayer.player.src = audioContent.contentURI;
+                                AudioPlayer.player.load();
+                            }, delay);
+                        }
+                    }
+                    if (!!audioContent.duration && audioContent.duration >= 0) {
+                        AudioPlayer.duration = audioContent.duration / 1000;
+                    }
+                }
+                AudioPlayer.updateUIControls();
+            },
+            play: function (index) {
+                if (index !== AudioPlayer.index) {
+                    AudioPlayer.loadAudio(index);
+                }
+            },
+            /**
+             * Sets the position/current time of loaded song.
+             *
+             * @method setAudioPosition
+             * @param position {Number} Position in percentage of song.
+             */
+            setAudioPosition: function (position) {
+                if (position > 100) {
+                    position = 100;
+                } else if (position < 0) {
+                    position = 0;
+                }
+                AudioPlayer.currentTime = position / 100 * AudioPlayer.duration;
+                if (!!AudioPlayer.player) {
+                    AudioPlayer.player.currentTime = AudioPlayer.currentTime;
+                }
+                AudioPlayer.updateProgressInfoPanel();
+            },
+            /**
+             * Starts/pauses playback of the song.
+             *
+             * @method playPause
+             * @param playing {Boolean} State of song playback.
+             */
+            playPause: function (playing) {
+                AudioPlayer.playOn = playing;
+                if (!!AudioPlayer.player && AudioPlayer.player.currentSrc !== "") {
+                    if (AudioPlayer.playOn) {
+                        AudioPlayer.player.play();
+                    } else {
+                        AudioPlayer.player.pause();
+                    }
+                } else {
+                    AudioPlayer.playOn = false;
+                }
+                AudioPlayer.updateUIControls();
+            },
+            /**
+             * Sets next, random (if shuffle is on) index of song or first index (if repeat is on) and loads it from model.
+             *
+             * @method next
+             */
+            next: function () {
+                if (AudioPlayer.model.length) {
+                    var newIndex = AudioPlayer.index, previousIndex = AudioPlayer.index;
+
+                    if (AudioPlayer.shuffleOn) {
+                        while (newIndex === AudioPlayer.index) {
+                            newIndex = Math.floor((Math.random() * AudioPlayer.model.length));
+                        }
+                    } else if (AudioPlayer.repeatOn && AudioPlayer.index >= AudioPlayer.model.length - 1) {
+                        newIndex = 0;
+                    } else if (AudioPlayer.index < AudioPlayer.model.length - 1) {
+                        newIndex = AudioPlayer.index + 1;
+                    } else {
+                        AudioPlayer.playOn = false;
+                    }
+
+                    if (newIndex !== previousIndex && !!AudioPlayer.indexChangeCallback) {
+                        AudioPlayer.indexChangeCallback(newIndex);
+                    }
+
+                    AudioPlayer.loadAudio(newIndex, 150);
+                }
+            },
+            /**
+             * Sets previous, random (if shuffle is on) index of song or last index (if repeat is on) and loads it from model.
+             *
+             * @method previous
+             */
+            previous: function () {
+                if (AudioPlayer.model.length) {
+                    var newIndex = AudioPlayer.index, previousIndex = AudioPlayer.index;
+
+                    if (AudioPlayer.shuffleOn) {
+                        while (newIndex === AudioPlayer.index) {
+                            newIndex = Math.floor((Math.random() * AudioPlayer.model.length));
+                        }
+                    } else if (AudioPlayer.repeatOn && AudioPlayer.index <= 0) {
+                        newIndex = AudioPlayer.model.length - 1;
+                    } else if (AudioPlayer.index > 0) {
+                        newIndex = AudioPlayer.index - 1;
+                    }
+
+                    if (newIndex !== previousIndex && !!AudioPlayer.indexChangeCallback) {
+                        AudioPlayer.indexChangeCallback(newIndex);
+                    }
+
+                    AudioPlayer.loadAudio(newIndex, 150);
+                }
+            },
+            getCurrentPlayerType: function () {
+                return AudioPlayer.playerType;
+            }
+        };
+
+    /**
+     * jQuery extension method for {{#crossLink "AudioPlayer"}}{{/crossLink}} plugin.
+     * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+     * @method audioAPI
+     * @for jQuery
+     * @return Result of called method.
+     */
+    $.fn.audioAPI = function (method) {
+        // Method calling logic
+        if (AudioPlayer[method]) {
+            return AudioPlayer[method].apply(this, Array.prototype.slice.call(arguments, 1));
+        }
+
+        if (typeof method === 'object' || !method) {
+            return AudioPlayer.init.apply(this, arguments);
+        }
+
+        $.error('Method ' + method + ' does not exist on jQuery.audioAPI');
+    };
+}(jQuery));
diff --git a/css/car/components/bottomPanel/bottomPanel.js b/css/car/components/bottomPanel/bottomPanel.js
new file mode 100644 (file)
index 0000000..6110fc4
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * @module CarTheme
+ **/
+
+(function ($) {
+    "use strict";
+    /**
+     * Class which provides methods to fill content of bottom panel for JQuery plugin. Use following snippet to include component in your `index.html` file:
+     *
+     *     <script type="text/javascript" src="./css/car/components/bottomPanel/bottomPanel.js"></script>
+     *
+     * and following code to initialize:
+     *
+     *     $('#bottomPanel').bottomPanel('init', true);
+     *
+     * @class BottomPanel
+     * @constructor
+     * @static
+     */
+    var BottomPanel = {
+            /**
+             * Holds current object of this JQuery plugin.
+             * @property thisObj {Object}
+             */
+            thisObj: null,
+            /**
+             * Initializes bottom panel.
+             * @method init
+             * @param backButtonDisabled {Bool} Indicates if bottom panel should contain back button.
+             */
+            init: function (backButtonDisabled) {
+                if (!backButtonDisabled) {
+                    this.append('<div class="bottomBackButton bottomBackButtonBackgroundImg" onclick="$(\'#' +
+                            this.attr('id') + '\').bottomPanel(\'onBackButtonClick\');">' +
+                            '</div>' + '<div class="bottomPanelLogo bottomPanelLogoImg">' +
+                            '</div>');
+                } else {
+                    this.append('<div class="bottomPanelLogo bottomPanelLogoImg">' + '</div>');
+                }
+                BottomPanel.thisObj = this;
+            },
+            /**
+             * Method is invoked after click on back button, fires clickOnBackButton event and causes application exit.
+             * @method onBackButtonClick
+             */
+            onBackButtonClick: function () {
+                BottomPanel.thisObj.trigger("clickOnBackButton");
+                if (typeof tizen !== "undefined") {
+                    tizen.application.getCurrentApplication().exit();
+                }
+            }
+        };
+
+    /**
+     * jQuery constructor for {{#crossLink "BottomPanel"}}{{/crossLink}} plugin.
+     * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+     * @for jQuery
+     * @method bottomPanel
+     * @return Result of called method.
+     */
+    $.fn.bottomPanel = function (method) {
+        // Method calling logic
+        if (BottomPanel[method]) {
+            return BottomPanel[method].apply(this, Array.prototype.slice.call(arguments, 1));
+        }
+
+        if (typeof method === 'object' || !method) {
+            return BottomPanel.init.apply(this, arguments);
+        }
+
+        $.error('Method ' +  method + ' does not exist on jQuery.infoPanelAPI');
+    };
+}(jQuery));
diff --git a/css/car/components/boxCaption/boxCaption.css b/css/car/components/boxCaption/boxCaption.css
new file mode 100644 (file)
index 0000000..bae921c
--- /dev/null
@@ -0,0 +1,30 @@
+.boxIconText {
+       position: relative;
+       height: 25px;
+}
+
+.boxIconRectangle {
+       display: inline-block;
+       vertical-align: middle;
+       width: 55px;
+       height: 15px;
+}
+
+.boxIconCaption {
+       margin-left: 3px;
+       display: inline-block;
+       vertical-align: middle;
+}
+
+.boxIconRectangleSmall {
+       width: 30px;
+       height: 10px;
+       display: inline-block;
+       vertical-align: middle;
+}
+
+.boxIconCaptionSmall {
+       margin-left: 3px;
+       display: inline-block;
+       vertical-align: middle;
+}
\ No newline at end of file
diff --git a/css/car/components/boxCaption/boxCaption.js b/css/car/components/boxCaption/boxCaption.js
new file mode 100644 (file)
index 0000000..a43f9a7
--- /dev/null
@@ -0,0 +1,77 @@
+/**
+ * @module CarTheme
+ **/
+(function ($) {
+    "use strict";
+    /**
+     * Represents static UI element composed of rectangle and caption that can be used as a section title.
+     * This component is required by {{#crossLink "Library"}}{{/crossLink}} class.
+     *
+     * Use following snippet to include component in your `index.html` file:
+     *
+     *     <script type='text/javascript' src='./css/car/components/boxCaption/boxCaption.js'></script>
+     *     <link rel="stylesheet" href="./css/car/components/boxCaption/boxCaption.css" />
+     *
+     * Box caption provides following options for UI representations:
+     *
+     * * {{#crossLink "BoxCaption/init:method"}}{{/crossLink}} - Standard size of rectangle and light text color
+     * (e.g. Exterior brightness in {{#crossLinkModule "DashboardApplication"}}{{/crossLinkModule}})
+     * * {{#crossLink "BoxCaption/initSmall:method"}}{{/crossLink}} - Small size of rectangle and light text color
+     * (e.g. Category title in {{#crossLink "Library"}}{{/crossLink}})
+     *
+     * Use following code to initialize:
+     *
+     *     $('#box').boxCaptionPlugin('init', "Caption");        // OR
+     *     $('#box').boxCaptionPlugin('initSmall', "Caption");
+     *
+     * @class BoxCaption
+     * @constructor
+     */
+    var BoxCaption = {
+            /**
+             * Generates and shows default box caption element on the screen.
+             *
+             * @method init
+             * @param caption {String} Caption text.
+             */
+            init: function (caption) {
+                this.empty();
+                var appendText = '<div class="boxIconRectangle bgColorTheme"></div>';
+                appendText += '<div class="boxIconCaption fontSizeXSmall fontWeightBold fontColorLight">';
+                appendText += caption.toUpperCase();
+                appendText += '</div>';
+                this.append(appendText);
+            },
+            /**
+             * Generates and shows small box caption element on the screen.
+             *
+             * @method initSmall
+             * @param caption {String} Caption text.
+             */
+            initSmall: function (caption) {
+                this.empty();
+                var appendText = '<div class="boxIconRectangleSmall bgColorTheme"></div>';
+                appendText += '<div class="boxIconCaptionSmall fontSizeXXSmall fontWeightBold fontColorLight">';
+                appendText += caption.toUpperCase();
+                appendText += '</div>';
+                this.append(appendText);
+            }
+        };
+    /**
+     * jQuery extension method for {{#crossLink "BoxCaption"}}{{/crossLink}} plugin.
+     * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+     * @method boxCaptionPlugin
+     * @for jQuery
+     * @return Result of called method.
+     */
+    $.fn.boxCaptionPlugin = function (method) {
+        // Method calling logic
+        if (BoxCaption[method]) {
+            return BoxCaption[method].apply(this, Array.prototype.slice.call(arguments, 1));
+        } else if (typeof method === 'object' || !method) {
+            return BoxCaption.init.apply(this, arguments);
+        } else {
+            $.error('Method ' + method + ' does not exist on jQuery.boxCaptionPlugin');
+        }
+    };
+}(jQuery));
diff --git a/css/car/components/buttonControls/buttonControls.js b/css/car/components/buttonControls/buttonControls.js
new file mode 100644 (file)
index 0000000..22a1d27
--- /dev/null
@@ -0,0 +1,269 @@
+/**
+ * @module CarTheme
+ **/
+(function ($) {
+    "use strict";
+    /**
+     * Represents data UI control element that is used to display audio controls to operate {{#crossLink "AudioPlayer"}}{{/crossLink}} class.
+     * UI control reacts to mouse click events and to keyboard events with following mapping:
+     *
+     * * Play/Pause button - question mark, slash character and `h`
+     * * Previous - &lt; (less than character), comma character and `g`
+     * * Next button - &gt; (greater than character), dot character and `k`
+     * * Shuffle button - `{` (opening brace), `]` (closing bracket) and `j`
+     * * Repeat button - `}` (closing brace), `[` (opening bracket) and `l`
+     *
+     * Use following snippet to include component in your `index.html` file:
+     *
+     *     <script type="text/javascript" src="./css/car/components/buttonControls/buttonControls.js"></script>
+     *
+     * and following code to initialize:
+     *
+     *      $("#buttons").buttonControls('initAudioPlayerButtons');
+     *
+     * @class ButtonControlsObj
+     * @static
+     */
+    var ButtonControlsObj = {
+            /**
+             * Holds play button element.
+             * @property playButton {Object}
+             */
+            playButton : null,
+            /**
+             * Holds shuffle button element.
+             * @property shuffleButton {Object}
+             */
+            shuffleButton : null,
+            /**
+             * Holds repeat button element.
+             * @property repeatButton {Object}
+             */
+            repeatButton : null,
+            /**
+             * Holds next button element.
+             * @property nextButton {Object}
+             */
+            nextButton : null,
+            /**
+             * Holds previous button element.
+             * @property prevButton {Object}
+             */
+            prevButton : null,
+            /**
+             * Holds this object.
+             * @property thisObj {Object}
+             */
+            thisObj : null,
+            /**
+             * Method is invoked when carousel is moving left.
+             * @method show
+             * @param what {Boolean} If what is true UI control is including shuffle and repeat buttons sontrols.
+             */
+            show: function (what) {
+                ButtonControlsObj.thisObj.empty();
+                var id = ButtonControlsObj.thisObj.attr('id');
+                ButtonControlsObj.thisObj.append('<div id="prevButton" class=\"button previousBtn controlsBtn\" onclick=\"' +
+                        '$(\'#' + id + '\').buttonControls(\'touch\',\'prev\')\"></div>' +
+                        '<div id="playButton" class=\"button pauseBtn controlsBtn\" onclick=\"' +
+                        '$(\'#' + id + '\').buttonControls(\'touch\',\'play\')\"></div>' +
+                        '<div  id="nextButton" class=\"button nextBtn controlsBtn\" onclick=\"' +
+                        '$(\'#' + id + '\').buttonControls(\'touch\',\'next\')\"></div>');
+                if (what) {
+                    ButtonControlsObj.thisObj.append('<div id="shuffleButton" class=\"button shuffleBtn\" onclick=\"' +
+                            '$(\'#' + id + '\').buttonControls(\'touch\',\'shuffle\')\"></div>' +
+                            '<div id="repeatButton"  class=\"button repeatBtn\" onclick=\"' +
+                            '$(\'#' + id + '\').buttonControls(\'touch\',\'repeat\')\"></div>');
+                }
+                ButtonControlsObj.playButton = $('#playButton');
+                ButtonControlsObj.shuffleButton = $('#shuffleButton');
+                ButtonControlsObj.repeatButton = $('#repeatButton');
+                ButtonControlsObj.nextButton = $('#nextButton');
+                ButtonControlsObj.prevButton = $('#prevButton');
+                $(document).keypress(function (event) {
+                    console.log("event.keyCode = " + event.keyCode);
+                    console.log("event.which = " + event.which);
+                    switch (event.keyCode) {
+                    case 103:
+                    case 60:
+                    case 44:
+                        if (!ButtonControlsObj.prevButton.hasClass("prevBtnInactive")) {
+                            ButtonControlsObj.thisObj.trigger('previousSong'); // <
+                        }
+                        break;
+                    case 106:
+                    case 62:
+                    case 46:
+                        if (!ButtonControlsObj.nextButton.hasClass("nextBtnInactive")) {
+                            ButtonControlsObj.thisObj.trigger('nextSong');  // >
+                        }
+                        break;
+                    case 104:
+                    case 63:
+                    case 47:
+                        ButtonControlsObj.thisObj.trigger('playSong');  // ?
+                        break;
+                    case 107:
+                    case 123:
+                    case 91:
+                        ButtonControlsObj.thisObj.trigger('shuffleSong');  // [
+                        break;
+                    case 108:
+                    case 125:
+                    case 93:
+                        ButtonControlsObj.thisObj.trigger('repeatSong');  // ]
+                        break;
+                    default:
+                        break;
+                    }
+                    //event.preventDefault();
+                });
+            },
+            /**
+             * Initializes button controls UI.
+             * @method initAudioPlayerButtons
+             */
+            initAudioPlayerButtons: function () {
+                ButtonControlsObj.thisObj = this;
+                ButtonControlsObj.show(true);
+                ButtonControlsObj.buttonRepeatInactive();
+                ButtonControlsObj.buttonShuffleInactive();
+                ButtonControlsObj.buttonPreviousActive();
+                ButtonControlsObj.buttonNextActive();
+                ButtonControlsObj.buttonPlayActive();
+            },
+            /**
+             * Method renders active button for play.
+             * @method buttonPlayActive
+             */
+            buttonPlayActive: function () {
+                if (ButtonControlsObj.playButton !== null) {
+                    ButtonControlsObj.playButton.removeClass("pauseBtn");
+                    ButtonControlsObj.playButton.addClass("playBtn");
+                }
+            },
+            /**
+             * Method renders active button for pause.
+             * @method buttonPauseActive
+             */
+            buttonPauseActive: function () {
+                ButtonControlsObj.playButton.removeClass("playBtn");
+                ButtonControlsObj.playButton.addClass("pauseBtn");
+            },
+            /**
+             * Method renders active button for shuffle.
+             * @method buttonShuffleActive
+             */
+            buttonShuffleActive: function () {
+                if (ButtonControlsObj.shuffleButton !== null) {
+                    ButtonControlsObj.shuffleButton.removeClass("shuffleBtn");
+                    ButtonControlsObj.shuffleButton.addClass("shuffleBtnActive");
+                }
+            },
+            /**
+             * Method renders inactive button for shuffle.
+             * @method buttonShuffleInactive
+             */
+            buttonShuffleInactive: function () {
+                if (ButtonControlsObj.shuffleButton !== null) {
+                    ButtonControlsObj.shuffleButton.removeClass("shuffleBtnActive");
+                    ButtonControlsObj.shuffleButton.addClass("shuffleBtn");
+                }
+            },
+            /**
+             * Method renders active button for repeat.
+             * @method buttonRepeatActive
+             */
+            buttonRepeatActive: function () {
+                if (ButtonControlsObj.repeatButton !== null) {
+                    ButtonControlsObj.repeatButton.removeClass("repeatBtn");
+                    ButtonControlsObj.repeatButton.addClass("repeatBtnActive");
+                }
+            },
+            /**
+             * Method renders inactive button for repeat.
+             * @method buttonRepeatInactive
+             */
+            buttonRepeatInactive: function () {
+                if (ButtonControlsObj.repeatButton !== null) {
+                    ButtonControlsObj.repeatButton.removeClass("repeatBtnActive");
+                    ButtonControlsObj.repeatButton.addClass("repeatBtn");
+                }
+            },
+            /**
+             * Method renders active button for next.
+             * @method buttonNextActive
+             */
+            buttonNextActive: function () {
+                ButtonControlsObj.nextButton.removeClass("nextBtnInactive");
+            },
+            /**
+             * Method renders inactive button for next.
+             * @method buttonNextInactive
+             */
+            buttonNextInactive: function () {
+                ButtonControlsObj.nextButton.addClass("nextBtnInactive");
+            },
+            /**
+             * Method renders active button for previous.
+             * @method buttonPreviousActive
+             */
+            buttonPreviousActive: function () {
+                ButtonControlsObj.prevButton.removeClass("prevBtnInactive");
+            },
+            /**
+             * Method renders inactive button for previous.
+             * @method buttonPreviousInactive
+             */
+            buttonPreviousInactive: function () {
+                ButtonControlsObj.prevButton.addClass("prevBtnInactive");
+            },
+            /**
+             * Method is invoked after touch on button controls.
+             * @method touch
+             * @param param {String} Which button was pressed: 'prev', 'play', 'next', 'shuffle', 'repeat'.
+             */
+            touch: function (param) {
+                switch (param) {
+                case 'prev':
+                    if (!ButtonControlsObj.prevButton.hasClass("prevBtnInactive")) {
+                        ButtonControlsObj.thisObj.trigger('previousSong');
+                    }
+                    break;
+                case 'play':
+                    ButtonControlsObj.thisObj.trigger('playSong');
+                    break;
+                case 'next':
+                    if (!ButtonControlsObj.nextButton.hasClass("nextBtnInactive")) {
+                        ButtonControlsObj.thisObj.trigger('nextSong');
+                    }
+                    break;
+                case 'shuffle':
+                    ButtonControlsObj.thisObj.trigger('shuffleSong');
+                    break;
+                case 'repeat':
+                    ButtonControlsObj.thisObj.trigger('repeatSong');
+                    break;
+                default:
+                    break;
+                }
+            }
+        };
+    /**
+     * jQuery extension method for {{#crossLink "ButtonControlsObj"}}{{/crossLink}} plugin.
+     * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+     * @method buttonControls
+     * @for jQuery
+     * @return Result of called method.
+     */
+    $.fn.buttonControls = function (method) {
+        // Method calling logic
+        if (ButtonControlsObj[method]) {
+            return ButtonControlsObj[method].apply(this, Array.prototype.slice.call(arguments, 1));
+        } else if (typeof method === 'object' || !method) {
+            return ButtonControlsObj.init.apply(this, arguments);
+        } else {
+            $.error('Method ' + method + ' does not exist on jQuery.buttonControls');
+        }
+    };
+}(jQuery));
\ No newline at end of file
diff --git a/css/car/components/carousel/jquery.carouFredSel-6.2.1-packed.js b/css/car/components/carousel/jquery.carouFredSel-6.2.1-packed.js
new file mode 100644 (file)
index 0000000..b7e3ec3
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ *     jQuery carouFredSel 6.2.1
+ *     Demo's and documentation:
+ *     caroufredsel.dev7studios.com
+ *
+ *     Copyright (c) 2013 Fred Heusschen
+ *     www.frebsite.nl
+ *
+ *     Dual licensed under the MIT and GPL licenses.
+ *     http://en.wikipedia.org/wiki/MIT_License
+ *     http://en.wikipedia.org/wiki/GNU_General_Public_License
+ */
+
+
+(function($){function sc_setScroll(a,b,c){return"transition"==c.transition&&"swing"==b&&(b="ease"),{anims:[],duration:a,orgDuration:a,easing:b,startTime:getTime()}}function sc_startScroll(a,b){for(var c=0,d=a.anims.length;d>c;c++){var e=a.anims[c];e&&e[0][b.transition](e[1],a.duration,a.easing,e[2])}}function sc_stopScroll(a,b){is_boolean(b)||(b=!0),is_object(a.pre)&&sc_stopScroll(a.pre,b);for(var c=0,d=a.anims.length;d>c;c++){var e=a.anims[c];e[0].stop(!0),b&&(e[0].css(e[1]),is_function(e[2])&&e[2]())}is_object(a.post)&&sc_stopScroll(a.post,b)}function sc_afterScroll(a,b,c){switch(b&&b.remove(),c.fx){case"fade":case"crossfade":case"cover-fade":case"uncover-fade":a.css("opacity",1),a.css("filter","")}}function sc_fireCallbacks(a,b,c,d,e){if(b[c]&&b[c].call(a,d),e[c].length)for(var f=0,g=e[c].length;g>f;f++)e[c][f].call(a,d);return[]}function sc_fireQueue(a,b,c){return b.length&&(a.trigger(cf_e(b[0][0],c),b[0][1]),b.shift()),b}function sc_hideHiddenItems(a){a.each(function(){var a=$(this);a.data("_cfs_isHidden",a.is(":hidden")).hide()})}function sc_showHiddenItems(a){a&&a.each(function(){var a=$(this);a.data("_cfs_isHidden")||a.show()})}function sc_clearTimers(a){return a.auto&&clearTimeout(a.auto),a.progress&&clearInterval(a.progress),a}function sc_mapCallbackArguments(a,b,c,d,e,f,g){return{width:g.width,height:g.height,items:{old:a,skipped:b,visible:c},scroll:{items:d,direction:e,duration:f}}}function sc_getDuration(a,b,c,d){var e=a.duration;return"none"==a.fx?0:("auto"==e?e=b.scroll.duration/b.scroll.items*c:10>e&&(e=d/e),1>e?0:("fade"==a.fx&&(e/=2),Math.round(e)))}function nv_showNavi(a,b,c){var d=is_number(a.items.minimum)?a.items.minimum:a.items.visible+1;if("show"==b||"hide"==b)var e=b;else if(d>b){debug(c,"Not enough items ("+b+" total, "+d+" needed): Hiding navigation.");var e="hide"}else var e="show";var f="show"==e?"removeClass":"addClass",g=cf_c("hidden",c);a.auto.button&&a.auto.button[e]()[f](g),a.prev.button&&a.prev.button[e]()[f](g),a.next.button&&a.next.button[e]()[f](g),a.pagination.container&&a.pagination.container[e]()[f](g)}function nv_enableNavi(a,b,c){if(!a.circular&&!a.infinite){var d="removeClass"==b||"addClass"==b?b:!1,e=cf_c("disabled",c);if(a.auto.button&&d&&a.auto.button[d](e),a.prev.button){var f=d||0==b?"addClass":"removeClass";a.prev.button[f](e)}if(a.next.button){var f=d||b==a.items.visible?"addClass":"removeClass";a.next.button[f](e)}}}function go_getObject(a,b){return is_function(b)?b=b.call(a):is_undefined(b)&&(b={}),b}function go_getItemsObject(a,b){return b=go_getObject(a,b),is_number(b)?b={visible:b}:"variable"==b?b={visible:b,width:b,height:b}:is_object(b)||(b={}),b}function go_getScrollObject(a,b){return b=go_getObject(a,b),is_number(b)?b=50>=b?{items:b}:{duration:b}:is_string(b)?b={easing:b}:is_object(b)||(b={}),b}function go_getNaviObject(a,b){if(b=go_getObject(a,b),is_string(b)){var c=cf_getKeyCode(b);b=-1==c?$(b):c}return b}function go_getAutoObject(a,b){return b=go_getNaviObject(a,b),is_jquery(b)?b={button:b}:is_boolean(b)?b={play:b}:is_number(b)&&(b={timeoutDuration:b}),b.progress&&(is_string(b.progress)||is_jquery(b.progress))&&(b.progress={bar:b.progress}),b}function go_complementAutoObject(a,b){return is_function(b.button)&&(b.button=b.button.call(a)),is_string(b.button)&&(b.button=$(b.button)),is_boolean(b.play)||(b.play=!0),is_number(b.delay)||(b.delay=0),is_undefined(b.pauseOnEvent)&&(b.pauseOnEvent=!0),is_boolean(b.pauseOnResize)||(b.pauseOnResize=!0),is_number(b.timeoutDuration)||(b.timeoutDuration=10>b.duration?2500:5*b.duration),b.progress&&(is_function(b.progress.bar)&&(b.progress.bar=b.progress.bar.call(a)),is_string(b.progress.bar)&&(b.progress.bar=$(b.progress.bar)),b.progress.bar?(is_function(b.progress.updater)||(b.progress.updater=$.fn.carouFredSel.progressbarUpdater),is_number(b.progress.interval)||(b.progress.interval=50)):b.progress=!1),b}function go_getPrevNextObject(a,b){return b=go_getNaviObject(a,b),is_jquery(b)?b={button:b}:is_number(b)&&(b={key:b}),b}function go_complementPrevNextObject(a,b){return is_function(b.button)&&(b.button=b.button.call(a)),is_string(b.button)&&(b.button=$(b.button)),is_string(b.key)&&(b.key=cf_getKeyCode(b.key)),b}function go_getPaginationObject(a,b){return b=go_getNaviObject(a,b),is_jquery(b)?b={container:b}:is_boolean(b)&&(b={keys:b}),b}function go_complementPaginationObject(a,b){return is_function(b.container)&&(b.container=b.container.call(a)),is_string(b.container)&&(b.container=$(b.container)),is_number(b.items)||(b.items=!1),is_boolean(b.keys)||(b.keys=!1),is_function(b.anchorBuilder)||is_false(b.anchorBuilder)||(b.anchorBuilder=$.fn.carouFredSel.pageAnchorBuilder),is_number(b.deviation)||(b.deviation=0),b}function go_getSwipeObject(a,b){return is_function(b)&&(b=b.call(a)),is_undefined(b)&&(b={onTouch:!1}),is_true(b)?b={onTouch:b}:is_number(b)&&(b={items:b}),b}function go_complementSwipeObject(a,b){return is_boolean(b.onTouch)||(b.onTouch=!0),is_boolean(b.onMouse)||(b.onMouse=!1),is_object(b.options)||(b.options={}),is_boolean(b.options.triggerOnTouchEnd)||(b.options.triggerOnTouchEnd=!1),b}function go_getMousewheelObject(a,b){return is_function(b)&&(b=b.call(a)),is_true(b)?b={}:is_number(b)?b={items:b}:is_undefined(b)&&(b=!1),b}function go_complementMousewheelObject(a,b){return b}function gn_getItemIndex(a,b,c,d,e){if(is_string(a)&&(a=$(a,e)),is_object(a)&&(a=$(a,e)),is_jquery(a)?(a=e.children().index(a),is_boolean(c)||(c=!1)):is_boolean(c)||(c=!0),is_number(a)||(a=0),is_number(b)||(b=0),c&&(a+=d.first),a+=b,d.total>0){for(;a>=d.total;)a-=d.total;for(;0>a;)a+=d.total}return a}function gn_getVisibleItemsPrev(a,b,c){for(var d=0,e=0,f=c;f>=0;f--){var g=a.eq(f);if(d+=g.is(":visible")?g[b.d.outerWidth](!0):0,d>b.maxDimension)return e;0==f&&(f=a.length),e++}}function gn_getVisibleItemsPrevFilter(a,b,c){return gn_getItemsPrevFilter(a,b.items.filter,b.items.visibleConf.org,c)}function gn_getScrollItemsPrevFilter(a,b,c,d){return gn_getItemsPrevFilter(a,b.items.filter,d,c)}function gn_getItemsPrevFilter(a,b,c,d){for(var e=0,f=0,g=d,h=a.length;g>=0;g--){if(f++,f==h)return f;var i=a.eq(g);if(i.is(b)&&(e++,e==c))return f;0==g&&(g=h)}}function gn_getVisibleOrg(a,b){return b.items.visibleConf.org||a.children().slice(0,b.items.visible).filter(b.items.filter).length}function gn_getVisibleItemsNext(a,b,c){for(var d=0,e=0,f=c,g=a.length-1;g>=f;f++){var h=a.eq(f);if(d+=h.is(":visible")?h[b.d.outerWidth](!0):0,d>b.maxDimension)return e;if(e++,e==g+1)return e;f==g&&(f=-1)}}function gn_getVisibleItemsNextTestCircular(a,b,c,d){var e=gn_getVisibleItemsNext(a,b,c);return b.circular||c+e>d&&(e=d-c),e}function gn_getVisibleItemsNextFilter(a,b,c){return gn_getItemsNextFilter(a,b.items.filter,b.items.visibleConf.org,c,b.circular)}function gn_getScrollItemsNextFilter(a,b,c,d){return gn_getItemsNextFilter(a,b.items.filter,d+1,c,b.circular)-1}function gn_getItemsNextFilter(a,b,c,d){for(var f=0,g=0,h=d,i=a.length-1;i>=h;h++){if(g++,g>=i)return g;var j=a.eq(h);if(j.is(b)&&(f++,f==c))return g;h==i&&(h=-1)}}function gi_getCurrentItems(a,b){return a.slice(0,b.items.visible)}function gi_getOldItemsPrev(a,b,c){return a.slice(c,b.items.visibleConf.old+c)}function gi_getNewItemsPrev(a,b){return a.slice(0,b.items.visible)}function gi_getOldItemsNext(a,b){return a.slice(0,b.items.visibleConf.old)}function gi_getNewItemsNext(a,b,c){return a.slice(c,b.items.visible+c)}function sz_storeMargin(a,b,c){b.usePadding&&(is_string(c)||(c="_cfs_origCssMargin"),a.each(function(){var a=$(this),d=parseInt(a.css(b.d.marginRight),10);is_number(d)||(d=0),a.data(c,d)}))}function sz_resetMargin(a,b,c){if(b.usePadding){var d=is_boolean(c)?c:!1;is_number(c)||(c=0),sz_storeMargin(a,b,"_cfs_tempCssMargin"),a.each(function(){var a=$(this);a.css(b.d.marginRight,d?a.data("_cfs_tempCssMargin"):c+a.data("_cfs_origCssMargin"))})}}function sz_storeOrigCss(a){a.each(function(){var a=$(this);a.data("_cfs_origCss",a.attr("style")||"")})}function sz_restoreOrigCss(a){a.each(function(){var a=$(this);a.attr("style",a.data("_cfs_origCss")||"")})}function sz_setResponsiveSizes(a,b){var d=(a.items.visible,a.items[a.d.width]),e=a[a.d.height],f=is_percentage(e);b.each(function(){var b=$(this),c=d-ms_getPaddingBorderMargin(b,a,"Width");b[a.d.width](c),f&&b[a.d.height](ms_getPercentage(c,e))})}function sz_setSizes(a,b){var c=a.parent(),d=a.children(),e=gi_getCurrentItems(d,b),f=cf_mapWrapperSizes(ms_getSizes(e,b,!0),b,!1);if(c.css(f),b.usePadding){var g=b.padding,h=g[b.d[1]];b.align&&0>h&&(h=0);var i=e.last();i.css(b.d.marginRight,i.data("_cfs_origCssMargin")+h),a.css(b.d.top,g[b.d[0]]),a.css(b.d.left,g[b.d[3]])}return a.css(b.d.width,f[b.d.width]+2*ms_getTotalSize(d,b,"width")),a.css(b.d.height,ms_getLargestSize(d,b,"height")),f}function ms_getSizes(a,b,c){return[ms_getTotalSize(a,b,"width",c),ms_getLargestSize(a,b,"height",c)]}function ms_getLargestSize(a,b,c,d){return is_boolean(d)||(d=!1),is_number(b[b.d[c]])&&d?b[b.d[c]]:is_number(b.items[b.d[c]])?b.items[b.d[c]]:(c=c.toLowerCase().indexOf("width")>-1?"outerWidth":"outerHeight",ms_getTrueLargestSize(a,b,c))}function ms_getTrueLargestSize(a,b,c){for(var d=0,e=0,f=a.length;f>e;e++){var g=a.eq(e),h=g.is(":visible")?g[b.d[c]](!0):0;h>d&&(d=h)}return d}function ms_getTotalSize(a,b,c,d){if(is_boolean(d)||(d=!1),is_number(b[b.d[c]])&&d)return b[b.d[c]];if(is_number(b.items[b.d[c]]))return b.items[b.d[c]]*a.length;for(var e=c.toLowerCase().indexOf("width")>-1?"outerWidth":"outerHeight",f=0,g=0,h=a.length;h>g;g++){var i=a.eq(g);f+=i.is(":visible")?i[b.d[e]](!0):0}return f}function ms_getParentSize(a,b,c){var d=a.is(":visible");d&&a.hide();var e=a.parent()[b.d[c]]();return d&&a.show(),e}function ms_getMaxDimension(a,b){return is_number(a[a.d.width])?a[a.d.width]:b}function ms_hasVariableSizes(a,b,c){for(var d=!1,e=!1,f=0,g=a.length;g>f;f++){var h=a.eq(f),i=h.is(":visible")?h[b.d[c]](!0):0;d===!1?d=i:d!=i&&(e=!0),0==d&&(e=!0)}return e}function ms_getPaddingBorderMargin(a,b,c){return a[b.d["outer"+c]](!0)-a[b.d[c.toLowerCase()]]()}function ms_getPercentage(a,b){if(is_percentage(b)){if(b=parseInt(b.slice(0,-1),10),!is_number(b))return a;a*=b/100}return a}function cf_e(a,b,c,d,e){return is_boolean(c)||(c=!0),is_boolean(d)||(d=!0),is_boolean(e)||(e=!1),c&&(a=b.events.prefix+a),d&&(a=a+"."+b.events.namespace),d&&e&&(a+=b.serialNumber),a}function cf_c(a,b){return is_string(b.classnames[a])?b.classnames[a]:a}function cf_mapWrapperSizes(a,b,c){is_boolean(c)||(c=!0);var d=b.usePadding&&c?b.padding:[0,0,0,0],e={};return e[b.d.width]=a[0]+d[1]+d[3],e[b.d.height]=a[1]+d[0]+d[2],e}function cf_sortParams(a,b){for(var c=[],d=0,e=a.length;e>d;d++)for(var f=0,g=b.length;g>f;f++)if(b[f].indexOf(typeof a[d])>-1&&is_undefined(c[f])){c[f]=a[d];break}return c}function cf_getPadding(a){if(is_undefined(a))return[0,0,0,0];if(is_number(a))return[a,a,a,a];if(is_string(a)&&(a=a.split("px").join("").split("em").join("").split(" ")),!is_array(a))return[0,0,0,0];for(var b=0;4>b;b++)a[b]=parseInt(a[b],10);switch(a.length){case 0:return[0,0,0,0];case 1:return[a[0],a[0],a[0],a[0]];case 2:return[a[0],a[1],a[0],a[1]];case 3:return[a[0],a[1],a[2],a[1]];default:return[a[0],a[1],a[2],a[3]]}}function cf_getAlignPadding(a,b){var c=is_number(b[b.d.width])?Math.ceil(b[b.d.width]-ms_getTotalSize(a,b,"width")):0;switch(b.align){case"left":return[0,c];case"right":return[c,0];case"center":default:return[Math.ceil(c/2),Math.floor(c/2)]}}function cf_getDimensions(a){for(var b=[["width","innerWidth","outerWidth","height","innerHeight","outerHeight","left","top","marginRight",0,1,2,3],["height","innerHeight","outerHeight","width","innerWidth","outerWidth","top","left","marginBottom",3,2,1,0]],c=b[0].length,d="right"==a.direction||"left"==a.direction?0:1,e={},f=0;c>f;f++)e[b[0][f]]=b[d][f];return e}function cf_getAdjust(a,b,c,d){var e=a;if(is_function(c))e=c.call(d,e);else if(is_string(c)){var f=c.split("+"),g=c.split("-");if(g.length>f.length)var h=!0,i=g[0],j=g[1];else var h=!1,i=f[0],j=f[1];switch(i){case"even":e=1==a%2?a-1:a;break;case"odd":e=0==a%2?a-1:a;break;default:e=a}j=parseInt(j,10),is_number(j)&&(h&&(j=-j),e+=j)}return(!is_number(e)||1>e)&&(e=1),e}function cf_getItemsAdjust(a,b,c,d){return cf_getItemAdjustMinMax(cf_getAdjust(a,b,c,d),b.items.visibleConf)}function cf_getItemAdjustMinMax(a,b){return is_number(b.min)&&b.min>a&&(a=b.min),is_number(b.max)&&a>b.max&&(a=b.max),1>a&&(a=1),a}function cf_getSynchArr(a){is_array(a)||(a=[[a]]),is_array(a[0])||(a=[a]);for(var b=0,c=a.length;c>b;b++)is_string(a[b][0])&&(a[b][0]=$(a[b][0])),is_boolean(a[b][1])||(a[b][1]=!0),is_boolean(a[b][2])||(a[b][2]=!0),is_number(a[b][3])||(a[b][3]=0);return a}function cf_getKeyCode(a){return"right"==a?39:"left"==a?37:"up"==a?38:"down"==a?40:-1}function cf_setCookie(a,b,c){if(a){var d=b.triggerHandler(cf_e("currentPosition",c));$.fn.carouFredSel.cookie.set(a,d)}}function cf_getCookie(a){var b=$.fn.carouFredSel.cookie.get(a);return""==b?0:b}function in_mapCss(a,b){for(var c={},d=0,e=b.length;e>d;d++)c[b[d]]=a.css(b[d]);return c}function in_complementItems(a,b,c,d){return is_object(a.visibleConf)||(a.visibleConf={}),is_object(a.sizesConf)||(a.sizesConf={}),0==a.start&&is_number(d)&&(a.start=d),is_object(a.visible)?(a.visibleConf.min=a.visible.min,a.visibleConf.max=a.visible.max,a.visible=!1):is_string(a.visible)?("variable"==a.visible?a.visibleConf.variable=!0:a.visibleConf.adjust=a.visible,a.visible=!1):is_function(a.visible)&&(a.visibleConf.adjust=a.visible,a.visible=!1),is_string(a.filter)||(a.filter=c.filter(":hidden").length>0?":visible":"*"),a[b.d.width]||(b.responsive?(debug(!0,"Set a "+b.d.width+" for the items!"),a[b.d.width]=ms_getTrueLargestSize(c,b,"outerWidth")):a[b.d.width]=ms_hasVariableSizes(c,b,"outerWidth")?"variable":c[b.d.outerWidth](!0)),a[b.d.height]||(a[b.d.height]=ms_hasVariableSizes(c,b,"outerHeight")?"variable":c[b.d.outerHeight](!0)),a.sizesConf.width=a.width,a.sizesConf.height=a.height,a}function in_complementVisibleItems(a,b){return"variable"==a.items[a.d.width]&&(a.items.visibleConf.variable=!0),a.items.visibleConf.variable||(is_number(a[a.d.width])?a.items.visible=Math.floor(a[a.d.width]/a.items[a.d.width]):(a.items.visible=Math.floor(b/a.items[a.d.width]),a[a.d.width]=a.items.visible*a.items[a.d.width],a.items.visibleConf.adjust||(a.align=!1)),("Infinity"==a.items.visible||1>a.items.visible)&&(debug(!0,'Not a valid number of visible items: Set to "variable".'),a.items.visibleConf.variable=!0)),a}function in_complementPrimarySize(a,b,c){return"auto"==a&&(a=ms_getTrueLargestSize(c,b,"outerWidth")),a}function in_complementSecondarySize(a,b,c){return"auto"==a&&(a=ms_getTrueLargestSize(c,b,"outerHeight")),a||(a=b.items[b.d.height]),a}function in_getAlignPadding(a,b){var c=cf_getAlignPadding(gi_getCurrentItems(b,a),a);return a.padding[a.d[1]]=c[1],a.padding[a.d[3]]=c[0],a}function in_getResponsiveValues(a,b){var d=cf_getItemAdjustMinMax(Math.ceil(a[a.d.width]/a.items[a.d.width]),a.items.visibleConf);d>b.length&&(d=b.length);var e=Math.floor(a[a.d.width]/d);return a.items.visible=d,a.items[a.d.width]=e,a[a.d.width]=d*e,a}function bt_pauseOnHoverConfig(a){if(is_string(a))var b=a.indexOf("immediate")>-1?!0:!1,c=a.indexOf("resume")>-1?!0:!1;else var b=c=!1;return[b,c]}function bt_mousesheelNumber(a){return is_number(a)?a:null}function is_null(a){return null===a}function is_undefined(a){return is_null(a)||a===void 0||""===a||"undefined"===a}function is_array(a){return a instanceof Array}function is_jquery(a){return a instanceof jQuery}function is_object(a){return(a instanceof Object||"object"==typeof a)&&!is_null(a)&&!is_jquery(a)&&!is_array(a)&&!is_function(a)}function is_number(a){return(a instanceof Number||"number"==typeof a)&&!isNaN(a)}function is_string(a){return(a instanceof String||"string"==typeof a)&&!is_undefined(a)&&!is_true(a)&&!is_false(a)}function is_function(a){return a instanceof Function||"function"==typeof a}function is_boolean(a){return a instanceof Boolean||"boolean"==typeof a||is_true(a)||is_false(a)}function is_true(a){return a===!0||"true"===a}function is_false(a){return a===!1||"false"===a}function is_percentage(a){return is_string(a)&&"%"==a.slice(-1)}function getTime(){return(new Date).getTime()}function deprecated(a,b){debug(!0,a+" is DEPRECATED, support for it will be removed. Use "+b+" instead.")}function debug(a,b){if(!is_undefined(window.console)&&!is_undefined(window.console.log)){if(is_object(a)){var c=" ("+a.selector+")";a=a.debug}else var c="";if(!a)return!1;b=is_string(b)?"carouFredSel"+c+": "+b:["carouFredSel"+c+":",b],window.console.log(b)}return!1}$.fn.carouFredSel||($.fn.caroufredsel=$.fn.carouFredSel=function(options,configs){if(0==this.length)return debug(!0,'No element found for "'+this.selector+'".'),this;if(this.length>1)return this.each(function(){$(this).carouFredSel(options,configs)});var $cfs=this,$tt0=this[0],starting_position=!1;$cfs.data("_cfs_isCarousel")&&(starting_position=$cfs.triggerHandler("_cfs_triggerEvent","currentPosition"),$cfs.trigger("_cfs_triggerEvent",["destroy",!0]));var FN={};FN._init=function(a,b,c){a=go_getObject($tt0,a),a.items=go_getItemsObject($tt0,a.items),a.scroll=go_getScrollObject($tt0,a.scroll),a.auto=go_getAutoObject($tt0,a.auto),a.prev=go_getPrevNextObject($tt0,a.prev),a.next=go_getPrevNextObject($tt0,a.next),a.pagination=go_getPaginationObject($tt0,a.pagination),a.swipe=go_getSwipeObject($tt0,a.swipe),a.mousewheel=go_getMousewheelObject($tt0,a.mousewheel),b&&(opts_orig=$.extend(!0,{},$.fn.carouFredSel.defaults,a)),opts=$.extend(!0,{},$.fn.carouFredSel.defaults,a),opts.d=cf_getDimensions(opts),crsl.direction="up"==opts.direction||"left"==opts.direction?"next":"prev";var d=$cfs.children(),e=ms_getParentSize($wrp,opts,"width");if(is_true(opts.cookie)&&(opts.cookie="caroufredsel_cookie_"+conf.serialNumber),opts.maxDimension=ms_getMaxDimension(opts,e),opts.items=in_complementItems(opts.items,opts,d,c),opts[opts.d.width]=in_complementPrimarySize(opts[opts.d.width],opts,d),opts[opts.d.height]=in_complementSecondarySize(opts[opts.d.height],opts,d),opts.responsive&&(is_percentage(opts[opts.d.width])||(opts[opts.d.width]="100%")),is_percentage(opts[opts.d.width])&&(crsl.upDateOnWindowResize=!0,crsl.primarySizePercentage=opts[opts.d.width],opts[opts.d.width]=ms_getPercentage(e,crsl.primarySizePercentage),opts.items.visible||(opts.items.visibleConf.variable=!0)),opts.responsive?(opts.usePadding=!1,opts.padding=[0,0,0,0],opts.align=!1,opts.items.visibleConf.variable=!1):(opts.items.visible||(opts=in_complementVisibleItems(opts,e)),opts[opts.d.width]||(!opts.items.visibleConf.variable&&is_number(opts.items[opts.d.width])&&"*"==opts.items.filter?(opts[opts.d.width]=opts.items.visible*opts.items[opts.d.width],opts.align=!1):opts[opts.d.width]="variable"),is_undefined(opts.align)&&(opts.align=is_number(opts[opts.d.width])?"center":!1),opts.items.visibleConf.variable&&(opts.items.visible=gn_getVisibleItemsNext(d,opts,0))),"*"==opts.items.filter||opts.items.visibleConf.variable||(opts.items.visibleConf.org=opts.items.visible,opts.items.visible=gn_getVisibleItemsNextFilter(d,opts,0)),opts.items.visible=cf_getItemsAdjust(opts.items.visible,opts,opts.items.visibleConf.adjust,$tt0),opts.items.visibleConf.old=opts.items.visible,opts.responsive)opts.items.visibleConf.min||(opts.items.visibleConf.min=opts.items.visible),opts.items.visibleConf.max||(opts.items.visibleConf.max=opts.items.visible),opts=in_getResponsiveValues(opts,d,e);else switch(opts.padding=cf_getPadding(opts.padding),"top"==opts.align?opts.align="left":"bottom"==opts.align&&(opts.align="right"),opts.align){case"center":case"left":case"right":"variable"!=opts[opts.d.width]&&(opts=in_getAlignPadding(opts,d),opts.usePadding=!0);break;default:opts.align=!1,opts.usePadding=0==opts.padding[0]&&0==opts.padding[1]&&0==opts.padding[2]&&0==opts.padding[3]?!1:!0}is_number(opts.scroll.duration)||(opts.scroll.duration=500),is_undefined(opts.scroll.items)&&(opts.scroll.items=opts.responsive||opts.items.visibleConf.variable||"*"!=opts.items.filter?"visible":opts.items.visible),opts.auto=$.extend(!0,{},opts.scroll,opts.auto),opts.prev=$.extend(!0,{},opts.scroll,opts.prev),opts.next=$.extend(!0,{},opts.scroll,opts.next),opts.pagination=$.extend(!0,{},opts.scroll,opts.pagination),opts.auto=go_complementAutoObject($tt0,opts.auto),opts.prev=go_complementPrevNextObject($tt0,opts.prev),opts.next=go_complementPrevNextObject($tt0,opts.next),opts.pagination=go_complementPaginationObject($tt0,opts.pagination),opts.swipe=go_complementSwipeObject($tt0,opts.swipe),opts.mousewheel=go_complementMousewheelObject($tt0,opts.mousewheel),opts.synchronise&&(opts.synchronise=cf_getSynchArr(opts.synchronise)),opts.auto.onPauseStart&&(opts.auto.onTimeoutStart=opts.auto.onPauseStart,deprecated("auto.onPauseStart","auto.onTimeoutStart")),opts.auto.onPausePause&&(opts.auto.onTimeoutPause=opts.auto.onPausePause,deprecated("auto.onPausePause","auto.onTimeoutPause")),opts.auto.onPauseEnd&&(opts.auto.onTimeoutEnd=opts.auto.onPauseEnd,deprecated("auto.onPauseEnd","auto.onTimeoutEnd")),opts.auto.pauseDuration&&(opts.auto.timeoutDuration=opts.auto.pauseDuration,deprecated("auto.pauseDuration","auto.timeoutDuration"))},FN._build=function(){$cfs.data("_cfs_isCarousel",!0);var a=$cfs.children(),b=in_mapCss($cfs,["textAlign","float","position","top","right","bottom","left","zIndex","width","height","marginTop","marginRight","marginBottom","marginLeft"]),c="relative";switch(b.position){case"absolute":case"fixed":c=b.position}"parent"==conf.wrapper?sz_storeOrigCss($wrp):$wrp.css(b),$wrp.css({overflow:"hidden",position:c}),sz_storeOrigCss($cfs),$cfs.data("_cfs_origCssZindex",b.zIndex),$cfs.css({textAlign:"left","float":"none",position:"absolute",top:0,right:"auto",bottom:"auto",left:0,marginTop:0,marginRight:0,marginBottom:0,marginLeft:0}),sz_storeMargin(a,opts),sz_storeOrigCss(a),opts.responsive&&sz_setResponsiveSizes(opts,a)},FN._bind_events=function(){FN._unbind_events(),$cfs.bind(cf_e("stop",conf),function(a,b){return a.stopPropagation(),crsl.isStopped||opts.auto.button&&opts.auto.button.addClass(cf_c("stopped",conf)),crsl.isStopped=!0,opts.auto.play&&(opts.auto.play=!1,$cfs.trigger(cf_e("pause",conf),b)),!0}),$cfs.bind(cf_e("finish",conf),function(a){return a.stopPropagation(),crsl.isScrolling&&sc_stopScroll(scrl),!0}),$cfs.bind(cf_e("pause",conf),function(a,b,c){if(a.stopPropagation(),tmrs=sc_clearTimers(tmrs),b&&crsl.isScrolling){scrl.isStopped=!0;var d=getTime()-scrl.startTime;scrl.duration-=d,scrl.pre&&(scrl.pre.duration-=d),scrl.post&&(scrl.post.duration-=d),sc_stopScroll(scrl,!1)}if(crsl.isPaused||crsl.isScrolling||c&&(tmrs.timePassed+=getTime()-tmrs.startTime),crsl.isPaused||opts.auto.button&&opts.auto.button.addClass(cf_c("paused",conf)),crsl.isPaused=!0,opts.auto.onTimeoutPause){var e=opts.auto.timeoutDuration-tmrs.timePassed,f=100-Math.ceil(100*e/opts.auto.timeoutDuration);opts.auto.onTimeoutPause.call($tt0,f,e)}return!0}),$cfs.bind(cf_e("play",conf),function(a,b,c,d){a.stopPropagation(),tmrs=sc_clearTimers(tmrs);var e=[b,c,d],f=["string","number","boolean"],g=cf_sortParams(e,f);if(b=g[0],c=g[1],d=g[2],"prev"!=b&&"next"!=b&&(b=crsl.direction),is_number(c)||(c=0),is_boolean(d)||(d=!1),d&&(crsl.isStopped=!1,opts.auto.play=!0),!opts.auto.play)return a.stopImmediatePropagation(),debug(conf,"Carousel stopped: Not scrolling.");crsl.isPaused&&opts.auto.button&&(opts.auto.button.removeClass(cf_c("stopped",conf)),opts.auto.button.removeClass(cf_c("paused",conf))),crsl.isPaused=!1,tmrs.startTime=getTime();var h=opts.auto.timeoutDuration+c;return dur2=h-tmrs.timePassed,perc=100-Math.ceil(100*dur2/h),opts.auto.progress&&(tmrs.progress=setInterval(function(){var a=getTime()-tmrs.startTime+tmrs.timePassed,b=Math.ceil(100*a/h);opts.auto.progress.updater.call(opts.auto.progress.bar[0],b)},opts.auto.progress.interval)),tmrs.auto=setTimeout(function(){opts.auto.progress&&opts.auto.progress.updater.call(opts.auto.progress.bar[0],100),opts.auto.onTimeoutEnd&&opts.auto.onTimeoutEnd.call($tt0,perc,dur2),crsl.isScrolling?$cfs.trigger(cf_e("play",conf),b):$cfs.trigger(cf_e(b,conf),opts.auto)},dur2),opts.auto.onTimeoutStart&&opts.auto.onTimeoutStart.call($tt0,perc,dur2),!0}),$cfs.bind(cf_e("resume",conf),function(a){return a.stopPropagation(),scrl.isStopped?(scrl.isStopped=!1,crsl.isPaused=!1,crsl.isScrolling=!0,scrl.startTime=getTime(),sc_startScroll(scrl,conf)):$cfs.trigger(cf_e("play",conf)),!0}),$cfs.bind(cf_e("prev",conf)+" "+cf_e("next",conf),function(a,b,c,d,e){if(a.stopPropagation(),crsl.isStopped||$cfs.is(":hidden"))return a.stopImmediatePropagation(),debug(conf,"Carousel stopped or hidden: Not scrolling.");var f=is_number(opts.items.minimum)?opts.items.minimum:opts.items.visible+1;if(f>itms.total)return a.stopImmediatePropagation(),debug(conf,"Not enough items ("+itms.total+" total, "+f+" needed): Not scrolling.");var g=[b,c,d,e],h=["object","number/string","function","boolean"],i=cf_sortParams(g,h);b=i[0],c=i[1],d=i[2],e=i[3];var j=a.type.slice(conf.events.prefix.length);if(is_object(b)||(b={}),is_function(d)&&(b.onAfter=d),is_boolean(e)&&(b.queue=e),b=$.extend(!0,{},opts[j],b),b.conditions&&!b.conditions.call($tt0,j))return a.stopImmediatePropagation(),debug(conf,'Callback "conditions" returned false.');if(!is_number(c)){if("*"!=opts.items.filter)c="visible";else for(var k=[c,b.items,opts[j].items],i=0,l=k.length;l>i;i++)if(is_number(k[i])||"page"==k[i]||"visible"==k[i]){c=k[i];break}switch(c){case"page":return a.stopImmediatePropagation(),$cfs.triggerHandler(cf_e(j+"Page",conf),[b,d]);case"visible":opts.items.visibleConf.variable||"*"!=opts.items.filter||(c=opts.items.visible)}}if(scrl.isStopped)return $cfs.trigger(cf_e("resume",conf)),$cfs.trigger(cf_e("queue",conf),[j,[b,c,d]]),a.stopImmediatePropagation(),debug(conf,"Carousel resumed scrolling.");if(b.duration>0&&crsl.isScrolling)return b.queue&&("last"==b.queue&&(queu=[]),("first"!=b.queue||0==queu.length)&&$cfs.trigger(cf_e("queue",conf),[j,[b,c,d]])),a.stopImmediatePropagation(),debug(conf,"Carousel currently scrolling.");if(tmrs.timePassed=0,$cfs.trigger(cf_e("slide_"+j,conf),[b,c]),opts.synchronise)for(var m=opts.synchronise,n=[b,c],o=0,l=m.length;l>o;o++){var p=j;m[o][2]||(p="prev"==p?"next":"prev"),m[o][1]||(n[0]=m[o][0].triggerHandler("_cfs_triggerEvent",["configuration",p])),n[1]=c+m[o][3],m[o][0].trigger("_cfs_triggerEvent",["slide_"+p,n])}return!0}),$cfs.bind(cf_e("slide_prev",conf),function(a,b,c){a.stopPropagation();var d=$cfs.children();if(!opts.circular&&0==itms.first)return opts.infinite&&$cfs.trigger(cf_e("next",conf),itms.total-1),a.stopImmediatePropagation();if(sz_resetMargin(d,opts),!is_number(c)){if(opts.items.visibleConf.variable)c=gn_getVisibleItemsPrev(d,opts,itms.total-1);else if("*"!=opts.items.filter){var e=is_number(b.items)?b.items:gn_getVisibleOrg($cfs,opts);c=gn_getScrollItemsPrevFilter(d,opts,itms.total-1,e)}else c=opts.items.visible;c=cf_getAdjust(c,opts,b.items,$tt0)}if(opts.circular||itms.total-c<itms.first&&(c=itms.total-itms.first),opts.items.visibleConf.old=opts.items.visible,opts.items.visibleConf.variable){var f=cf_getItemsAdjust(gn_getVisibleItemsNext(d,opts,itms.total-c),opts,opts.items.visibleConf.adjust,$tt0);f>=opts.items.visible+c&&itms.total>c&&(c++,f=cf_getItemsAdjust(gn_getVisibleItemsNext(d,opts,itms.total-c),opts,opts.items.visibleConf.adjust,$tt0)),opts.items.visible=f}else if("*"!=opts.items.filter){var f=gn_getVisibleItemsNextFilter(d,opts,itms.total-c);opts.items.visible=cf_getItemsAdjust(f,opts,opts.items.visibleConf.adjust,$tt0)}if(sz_resetMargin(d,opts,!0),0==c)return a.stopImmediatePropagation(),debug(conf,"0 items to scroll: Not scrolling.");for(debug(conf,"Scrolling "+c+" items backward."),itms.first+=c;itms.first>=itms.total;)itms.first-=itms.total;opts.circular||(0==itms.first&&b.onEnd&&b.onEnd.call($tt0,"prev"),opts.infinite||nv_enableNavi(opts,itms.first,conf)),$cfs.children().slice(itms.total-c,itms.total).prependTo($cfs),itms.total<opts.items.visible+c&&$cfs.children().slice(0,opts.items.visible+c-itms.total).clone(!0).appendTo($cfs);var d=$cfs.children(),g=gi_getOldItemsPrev(d,opts,c),h=gi_getNewItemsPrev(d,opts),i=d.eq(c-1),j=g.last(),k=h.last();sz_resetMargin(d,opts);var l=0,m=0;if(opts.align){var n=cf_getAlignPadding(h,opts);l=n[0],m=n[1]}var o=0>l?opts.padding[opts.d[3]]:0,p=!1,q=$();if(c>opts.items.visible&&(q=d.slice(opts.items.visibleConf.old,c),"directscroll"==b.fx)){var r=opts.items[opts.d.width];p=q,i=k,sc_hideHiddenItems(p),opts.items[opts.d.width]="variable"}var s=!1,t=ms_getTotalSize(d.slice(0,c),opts,"width"),u=cf_mapWrapperSizes(ms_getSizes(h,opts,!0),opts,!opts.usePadding),v=0,w={},x={},y={},z={},A={},B={},C={},D=sc_getDuration(b,opts,c,t);switch(b.fx){case"cover":case"cover-fade":v=ms_getTotalSize(d.slice(0,opts.items.visible),opts,"width")}p&&(opts.items[opts.d.width]=r),sz_resetMargin(d,opts,!0),m>=0&&sz_resetMargin(j,opts,opts.padding[opts.d[1]]),l>=0&&sz_resetMargin(i,opts,opts.padding[opts.d[3]]),opts.align&&(opts.padding[opts.d[1]]=m,opts.padding[opts.d[3]]=l),B[opts.d.left]=-(t-o),C[opts.d.left]=-(v-o),x[opts.d.left]=u[opts.d.width];var E=function(){},F=function(){},G=function(){},H=function(){},I=function(){},J=function(){},K=function(){},L=function(){},M=function(){},N=function(){},O=function(){};switch(b.fx){case"crossfade":case"cover":case"cover-fade":case"uncover":case"uncover-fade":s=$cfs.clone(!0).appendTo($wrp)}switch(b.fx){case"crossfade":case"uncover":case"uncover-fade":s.children().slice(0,c).remove(),s.children().slice(opts.items.visibleConf.old).remove();break;case"cover":case"cover-fade":s.children().slice(opts.items.visible).remove(),s.css(C)}if($cfs.css(B),scrl=sc_setScroll(D,b.easing,conf),w[opts.d.left]=opts.usePadding?opts.padding[opts.d[3]]:0,("variable"==opts[opts.d.width]||"variable"==opts[opts.d.height])&&(E=function(){$wrp.css(u)},F=function(){scrl.anims.push([$wrp,u])}),opts.usePadding){switch(k.not(i).length&&(y[opts.d.marginRight]=i.data("_cfs_origCssMargin"),0>l?i.css(y):(K=function(){i.css(y)},L=function(){scrl.anims.push([i,y])})),b.fx){case"cover":case"cover-fade":s.children().eq(c-1).css(y)}k.not(j).length&&(z[opts.d.marginRight]=j.data("_cfs_origCssMargin"),G=function(){j.css(z)},H=function(){scrl.anims.push([j,z])}),m>=0&&(A[opts.d.marginRight]=k.data("_cfs_origCssMargin")+opts.padding[opts.d[1]],I=function(){k.css(A)},J=function(){scrl.anims.push([k,A])})}O=function(){$cfs.css(w)};var P=opts.items.visible+c-itms.total;N=function(){if(P>0&&($cfs.children().slice(itms.total).remove(),g=$($cfs.children().slice(itms.total-(opts.items.visible-P)).get().concat($cfs.children().slice(0,P).get()))),sc_showHiddenItems(p),opts.usePadding){var a=$cfs.children().eq(opts.items.visible+c-1);a.css(opts.d.marginRight,a.data("_cfs_origCssMargin"))}};var Q=sc_mapCallbackArguments(g,q,h,c,"prev",D,u);switch(M=function(){sc_afterScroll($cfs,s,b),crsl.isScrolling=!1,clbk.onAfter=sc_fireCallbacks($tt0,b,"onAfter",Q,clbk),queu=sc_fireQueue($cfs,queu,conf),crsl.isPaused||$cfs.trigger(cf_e("play",conf))},crsl.isScrolling=!0,tmrs=sc_clearTimers(tmrs),clbk.onBefore=sc_fireCallbacks($tt0,b,"onBefore",Q,clbk),b.fx){case"none":$cfs.css(w),E(),G(),I(),K(),O(),N(),M();break;case"fade":scrl.anims.push([$cfs,{opacity:0},function(){E(),G(),I(),K(),O(),N(),scrl=sc_setScroll(D,b.easing,conf),scrl.anims.push([$cfs,{opacity:1},M]),sc_startScroll(scrl,conf)}]);break;case"crossfade":$cfs.css({opacity:0}),scrl.anims.push([s,{opacity:0}]),scrl.anims.push([$cfs,{opacity:1},M]),F(),G(),I(),K(),O(),N();break;case"cover":scrl.anims.push([s,w,function(){G(),I(),K(),O(),N(),M()}]),F();break;case"cover-fade":scrl.anims.push([$cfs,{opacity:0}]),scrl.anims.push([s,w,function(){G(),I(),K(),O(),N(),M()}]),F();break;case"uncover":scrl.anims.push([s,x,M]),F(),G(),I(),K(),O(),N();break;case"uncover-fade":$cfs.css({opacity:0}),scrl.anims.push([$cfs,{opacity:1}]),scrl.anims.push([s,x,M]),F(),G(),I(),K(),O(),N();break;default:scrl.anims.push([$cfs,w,function(){N(),M()}]),F(),H(),J(),L()}return sc_startScroll(scrl,conf),cf_setCookie(opts.cookie,$cfs,conf),$cfs.trigger(cf_e("updatePageStatus",conf),[!1,u]),!0
+}),$cfs.bind(cf_e("slide_next",conf),function(a,b,c){a.stopPropagation();var d=$cfs.children();if(!opts.circular&&itms.first==opts.items.visible)return opts.infinite&&$cfs.trigger(cf_e("prev",conf),itms.total-1),a.stopImmediatePropagation();if(sz_resetMargin(d,opts),!is_number(c)){if("*"!=opts.items.filter){var e=is_number(b.items)?b.items:gn_getVisibleOrg($cfs,opts);c=gn_getScrollItemsNextFilter(d,opts,0,e)}else c=opts.items.visible;c=cf_getAdjust(c,opts,b.items,$tt0)}var f=0==itms.first?itms.total:itms.first;if(!opts.circular){if(opts.items.visibleConf.variable)var g=gn_getVisibleItemsNext(d,opts,c),e=gn_getVisibleItemsPrev(d,opts,f-1);else var g=opts.items.visible,e=opts.items.visible;c+g>f&&(c=f-e)}if(opts.items.visibleConf.old=opts.items.visible,opts.items.visibleConf.variable){for(var g=cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(d,opts,c,f),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible-c>=g&&itms.total>c;)c++,g=cf_getItemsAdjust(gn_getVisibleItemsNextTestCircular(d,opts,c,f),opts,opts.items.visibleConf.adjust,$tt0);opts.items.visible=g}else if("*"!=opts.items.filter){var g=gn_getVisibleItemsNextFilter(d,opts,c);opts.items.visible=cf_getItemsAdjust(g,opts,opts.items.visibleConf.adjust,$tt0)}if(sz_resetMargin(d,opts,!0),0==c)return a.stopImmediatePropagation(),debug(conf,"0 items to scroll: Not scrolling.");for(debug(conf,"Scrolling "+c+" items forward."),itms.first-=c;0>itms.first;)itms.first+=itms.total;opts.circular||(itms.first==opts.items.visible&&b.onEnd&&b.onEnd.call($tt0,"next"),opts.infinite||nv_enableNavi(opts,itms.first,conf)),itms.total<opts.items.visible+c&&$cfs.children().slice(0,opts.items.visible+c-itms.total).clone(!0).appendTo($cfs);var d=$cfs.children(),h=gi_getOldItemsNext(d,opts),i=gi_getNewItemsNext(d,opts,c),j=d.eq(c-1),k=h.last(),l=i.last();sz_resetMargin(d,opts);var m=0,n=0;if(opts.align){var o=cf_getAlignPadding(i,opts);m=o[0],n=o[1]}var p=!1,q=$();if(c>opts.items.visibleConf.old&&(q=d.slice(opts.items.visibleConf.old,c),"directscroll"==b.fx)){var r=opts.items[opts.d.width];p=q,j=k,sc_hideHiddenItems(p),opts.items[opts.d.width]="variable"}var s=!1,t=ms_getTotalSize(d.slice(0,c),opts,"width"),u=cf_mapWrapperSizes(ms_getSizes(i,opts,!0),opts,!opts.usePadding),v=0,w={},x={},y={},z={},A={},B=sc_getDuration(b,opts,c,t);switch(b.fx){case"uncover":case"uncover-fade":v=ms_getTotalSize(d.slice(0,opts.items.visibleConf.old),opts,"width")}p&&(opts.items[opts.d.width]=r),opts.align&&0>opts.padding[opts.d[1]]&&(opts.padding[opts.d[1]]=0),sz_resetMargin(d,opts,!0),sz_resetMargin(k,opts,opts.padding[opts.d[1]]),opts.align&&(opts.padding[opts.d[1]]=n,opts.padding[opts.d[3]]=m),A[opts.d.left]=opts.usePadding?opts.padding[opts.d[3]]:0;var C=function(){},D=function(){},E=function(){},F=function(){},G=function(){},H=function(){},I=function(){},J=function(){},K=function(){};switch(b.fx){case"crossfade":case"cover":case"cover-fade":case"uncover":case"uncover-fade":s=$cfs.clone(!0).appendTo($wrp),s.children().slice(opts.items.visibleConf.old).remove()}switch(b.fx){case"crossfade":case"cover":case"cover-fade":$cfs.css("zIndex",1),s.css("zIndex",0)}if(scrl=sc_setScroll(B,b.easing,conf),w[opts.d.left]=-t,x[opts.d.left]=-v,0>m&&(w[opts.d.left]+=m),("variable"==opts[opts.d.width]||"variable"==opts[opts.d.height])&&(C=function(){$wrp.css(u)},D=function(){scrl.anims.push([$wrp,u])}),opts.usePadding){var L=l.data("_cfs_origCssMargin");n>=0&&(L+=opts.padding[opts.d[1]]),l.css(opts.d.marginRight,L),j.not(k).length&&(z[opts.d.marginRight]=k.data("_cfs_origCssMargin")),E=function(){k.css(z)},F=function(){scrl.anims.push([k,z])};var M=j.data("_cfs_origCssMargin");m>0&&(M+=opts.padding[opts.d[3]]),y[opts.d.marginRight]=M,G=function(){j.css(y)},H=function(){scrl.anims.push([j,y])}}K=function(){$cfs.css(A)};var N=opts.items.visible+c-itms.total;J=function(){N>0&&$cfs.children().slice(itms.total).remove();var a=$cfs.children().slice(0,c).appendTo($cfs).last();if(N>0&&(i=gi_getCurrentItems(d,opts)),sc_showHiddenItems(p),opts.usePadding){if(itms.total<opts.items.visible+c){var b=$cfs.children().eq(opts.items.visible-1);b.css(opts.d.marginRight,b.data("_cfs_origCssMargin")+opts.padding[opts.d[1]])}a.css(opts.d.marginRight,a.data("_cfs_origCssMargin"))}};var O=sc_mapCallbackArguments(h,q,i,c,"next",B,u);switch(I=function(){$cfs.css("zIndex",$cfs.data("_cfs_origCssZindex")),sc_afterScroll($cfs,s,b),crsl.isScrolling=!1,clbk.onAfter=sc_fireCallbacks($tt0,b,"onAfter",O,clbk),queu=sc_fireQueue($cfs,queu,conf),crsl.isPaused||$cfs.trigger(cf_e("play",conf))},crsl.isScrolling=!0,tmrs=sc_clearTimers(tmrs),clbk.onBefore=sc_fireCallbacks($tt0,b,"onBefore",O,clbk),b.fx){case"none":$cfs.css(w),C(),E(),G(),K(),J(),I();break;case"fade":scrl.anims.push([$cfs,{opacity:0},function(){C(),E(),G(),K(),J(),scrl=sc_setScroll(B,b.easing,conf),scrl.anims.push([$cfs,{opacity:1},I]),sc_startScroll(scrl,conf)}]);break;case"crossfade":$cfs.css({opacity:0}),scrl.anims.push([s,{opacity:0}]),scrl.anims.push([$cfs,{opacity:1},I]),D(),E(),G(),K(),J();break;case"cover":$cfs.css(opts.d.left,$wrp[opts.d.width]()),scrl.anims.push([$cfs,A,I]),D(),E(),G(),J();break;case"cover-fade":$cfs.css(opts.d.left,$wrp[opts.d.width]()),scrl.anims.push([s,{opacity:0}]),scrl.anims.push([$cfs,A,I]),D(),E(),G(),J();break;case"uncover":scrl.anims.push([s,x,I]),D(),E(),G(),K(),J();break;case"uncover-fade":$cfs.css({opacity:0}),scrl.anims.push([$cfs,{opacity:1}]),scrl.anims.push([s,x,I]),D(),E(),G(),K(),J();break;default:scrl.anims.push([$cfs,w,function(){K(),J(),I()}]),D(),F(),H()}return sc_startScroll(scrl,conf),cf_setCookie(opts.cookie,$cfs,conf),$cfs.trigger(cf_e("updatePageStatus",conf),[!1,u]),!0}),$cfs.bind(cf_e("slideTo",conf),function(a,b,c,d,e,f,g){a.stopPropagation();var h=[b,c,d,e,f,g],i=["string/number/object","number","boolean","object","string","function"],j=cf_sortParams(h,i);return e=j[3],f=j[4],g=j[5],b=gn_getItemIndex(j[0],j[1],j[2],itms,$cfs),0==b?!1:(is_object(e)||(e=!1),"prev"!=f&&"next"!=f&&(f=opts.circular?itms.total/2>=b?"next":"prev":0==itms.first||itms.first>b?"next":"prev"),"prev"==f&&(b=itms.total-b),$cfs.trigger(cf_e(f,conf),[e,b,g]),!0)}),$cfs.bind(cf_e("prevPage",conf),function(a,b,c){a.stopPropagation();var d=$cfs.triggerHandler(cf_e("currentPage",conf));return $cfs.triggerHandler(cf_e("slideToPage",conf),[d-1,b,"prev",c])}),$cfs.bind(cf_e("nextPage",conf),function(a,b,c){a.stopPropagation();var d=$cfs.triggerHandler(cf_e("currentPage",conf));return $cfs.triggerHandler(cf_e("slideToPage",conf),[d+1,b,"next",c])}),$cfs.bind(cf_e("slideToPage",conf),function(a,b,c,d,e){a.stopPropagation(),is_number(b)||(b=$cfs.triggerHandler(cf_e("currentPage",conf)));var f=opts.pagination.items||opts.items.visible,g=Math.ceil(itms.total/f)-1;return 0>b&&(b=g),b>g&&(b=0),$cfs.triggerHandler(cf_e("slideTo",conf),[b*f,0,!0,c,d,e])}),$cfs.bind(cf_e("jumpToStart",conf),function(a,b){if(a.stopPropagation(),b=b?gn_getItemIndex(b,0,!0,itms,$cfs):0,b+=itms.first,0!=b){if(itms.total>0)for(;b>itms.total;)b-=itms.total;$cfs.prepend($cfs.children().slice(b,itms.total))}return!0}),$cfs.bind(cf_e("synchronise",conf),function(a,b){if(a.stopPropagation(),b)b=cf_getSynchArr(b);else{if(!opts.synchronise)return debug(conf,"No carousel to synchronise.");b=opts.synchronise}for(var c=$cfs.triggerHandler(cf_e("currentPosition",conf)),d=!0,e=0,f=b.length;f>e;e++)b[e][0].triggerHandler(cf_e("slideTo",conf),[c,b[e][3],!0])||(d=!1);return d}),$cfs.bind(cf_e("queue",conf),function(a,b,c){return a.stopPropagation(),is_function(b)?b.call($tt0,queu):is_array(b)?queu=b:is_undefined(b)||queu.push([b,c]),queu}),$cfs.bind(cf_e("insertItem",conf),function(a,b,c,d,e){a.stopPropagation();var f=[b,c,d,e],g=["string/object","string/number/object","boolean","number"],h=cf_sortParams(f,g);if(b=h[0],c=h[1],d=h[2],e=h[3],is_object(b)&&!is_jquery(b)?b=$(b):is_string(b)&&(b=$(b)),!is_jquery(b)||0==b.length)return debug(conf,"Not a valid object.");is_undefined(c)&&(c="end"),sz_storeMargin(b,opts),sz_storeOrigCss(b);var i=c,j="before";"end"==c?d?(0==itms.first?(c=itms.total-1,j="after"):(c=itms.first,itms.first+=b.length),0>c&&(c=0)):(c=itms.total-1,j="after"):c=gn_getItemIndex(c,e,d,itms,$cfs);var k=$cfs.children().eq(c);return k.length?k[j](b):(debug(conf,"Correct insert-position not found! Appending item to the end."),$cfs.append(b)),"end"==i||d||itms.first>c&&(itms.first+=b.length),itms.total=$cfs.children().length,itms.first>=itms.total&&(itms.first-=itms.total),$cfs.trigger(cf_e("updateSizes",conf)),$cfs.trigger(cf_e("linkAnchors",conf)),!0}),$cfs.bind(cf_e("removeItem",conf),function(a,b,c,d){a.stopPropagation();var e=[b,c,d],f=["string/number/object","boolean","number"],g=cf_sortParams(e,f);if(b=g[0],c=g[1],d=g[2],b instanceof $&&b.length>1)return i=$(),b.each(function(){var e=$cfs.trigger(cf_e("removeItem",conf),[$(this),c,d]);e&&(i=i.add(e))}),i;if(is_undefined(b)||"end"==b)i=$cfs.children().last();else{b=gn_getItemIndex(b,d,c,itms,$cfs);var i=$cfs.children().eq(b);i.length&&itms.first>b&&(itms.first-=i.length)}return i&&i.length&&(i.detach(),itms.total=$cfs.children().length,$cfs.trigger(cf_e("updateSizes",conf))),i}),$cfs.bind(cf_e("onBefore",conf)+" "+cf_e("onAfter",conf),function(a,b){a.stopPropagation();var c=a.type.slice(conf.events.prefix.length);return is_array(b)&&(clbk[c]=b),is_function(b)&&clbk[c].push(b),clbk[c]}),$cfs.bind(cf_e("currentPosition",conf),function(a,b){if(a.stopPropagation(),0==itms.first)var c=0;else var c=itms.total-itms.first;return is_function(b)&&b.call($tt0,c),c}),$cfs.bind(cf_e("currentPage",conf),function(a,b){a.stopPropagation();var e,c=opts.pagination.items||opts.items.visible,d=Math.ceil(itms.total/c-1);return e=0==itms.first?0:itms.first<itms.total%c?0:itms.first!=c||opts.circular?Math.round((itms.total-itms.first)/c):d,0>e&&(e=0),e>d&&(e=d),is_function(b)&&b.call($tt0,e),e}),$cfs.bind(cf_e("currentVisible",conf),function(a,b){a.stopPropagation();var c=gi_getCurrentItems($cfs.children(),opts);return is_function(b)&&b.call($tt0,c),c}),$cfs.bind(cf_e("slice",conf),function(a,b,c,d){if(a.stopPropagation(),0==itms.total)return!1;var e=[b,c,d],f=["number","number","function"],g=cf_sortParams(e,f);if(b=is_number(g[0])?g[0]:0,c=is_number(g[1])?g[1]:itms.total,d=g[2],b+=itms.first,c+=itms.first,items.total>0){for(;b>itms.total;)b-=itms.total;for(;c>itms.total;)c-=itms.total;for(;0>b;)b+=itms.total;for(;0>c;)c+=itms.total}var i,h=$cfs.children();return i=c>b?h.slice(b,c):$(h.slice(b,itms.total).get().concat(h.slice(0,c).get())),is_function(d)&&d.call($tt0,i),i}),$cfs.bind(cf_e("isPaused",conf)+" "+cf_e("isStopped",conf)+" "+cf_e("isScrolling",conf),function(a,b){a.stopPropagation();var c=a.type.slice(conf.events.prefix.length),d=crsl[c];return is_function(b)&&b.call($tt0,d),d}),$cfs.bind(cf_e("configuration",conf),function(e,a,b,c){e.stopPropagation();var reInit=!1;if(is_function(a))a.call($tt0,opts);else if(is_object(a))opts_orig=$.extend(!0,{},opts_orig,a),b!==!1?reInit=!0:opts=$.extend(!0,{},opts,a);else if(!is_undefined(a))if(is_function(b)){var val=eval("opts."+a);is_undefined(val)&&(val=""),b.call($tt0,val)}else{if(is_undefined(b))return eval("opts."+a);"boolean"!=typeof c&&(c=!0),eval("opts_orig."+a+" = b"),c!==!1?reInit=!0:eval("opts."+a+" = b")}if(reInit){sz_resetMargin($cfs.children(),opts),FN._init(opts_orig),FN._bind_buttons();var sz=sz_setSizes($cfs,opts);$cfs.trigger(cf_e("updatePageStatus",conf),[!0,sz])}return opts}),$cfs.bind(cf_e("linkAnchors",conf),function(a,b,c){return a.stopPropagation(),is_undefined(b)?b=$("body"):is_string(b)&&(b=$(b)),is_jquery(b)&&0!=b.length?(is_string(c)||(c="a.caroufredsel"),b.find(c).each(function(){var a=this.hash||"";a.length>0&&-1!=$cfs.children().index($(a))&&$(this).unbind("click").click(function(b){b.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),a)})}),!0):debug(conf,"Not a valid object.")}),$cfs.bind(cf_e("updatePageStatus",conf),function(a,b){if(a.stopPropagation(),opts.pagination.container){var d=opts.pagination.items||opts.items.visible,e=Math.ceil(itms.total/d);b&&(opts.pagination.anchorBuilder&&(opts.pagination.container.children().remove(),opts.pagination.container.each(function(){for(var a=0;e>a;a++){var b=$cfs.children().eq(gn_getItemIndex(a*d,0,!0,itms,$cfs));$(this).append(opts.pagination.anchorBuilder.call(b[0],a+1))}})),opts.pagination.container.each(function(){$(this).children().unbind(opts.pagination.event).each(function(a){$(this).bind(opts.pagination.event,function(b){b.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),[a*d,-opts.pagination.deviation,!0,opts.pagination])})})}));var f=$cfs.triggerHandler(cf_e("currentPage",conf))+opts.pagination.deviation;return f>=e&&(f=0),0>f&&(f=e-1),opts.pagination.container.each(function(){$(this).children().removeClass(cf_c("selected",conf)).eq(f).addClass(cf_c("selected",conf))}),!0}}),$cfs.bind(cf_e("updateSizes",conf),function(){var b=opts.items.visible,c=$cfs.children(),d=ms_getParentSize($wrp,opts,"width");if(itms.total=c.length,crsl.primarySizePercentage?(opts.maxDimension=d,opts[opts.d.width]=ms_getPercentage(d,crsl.primarySizePercentage)):opts.maxDimension=ms_getMaxDimension(opts,d),opts.responsive?(opts.items.width=opts.items.sizesConf.width,opts.items.height=opts.items.sizesConf.height,opts=in_getResponsiveValues(opts,c,d),b=opts.items.visible,sz_setResponsiveSizes(opts,c)):opts.items.visibleConf.variable?b=gn_getVisibleItemsNext(c,opts,0):"*"!=opts.items.filter&&(b=gn_getVisibleItemsNextFilter(c,opts,0)),!opts.circular&&0!=itms.first&&b>itms.first){if(opts.items.visibleConf.variable)var e=gn_getVisibleItemsPrev(c,opts,itms.first)-itms.first;else if("*"!=opts.items.filter)var e=gn_getVisibleItemsPrevFilter(c,opts,itms.first)-itms.first;else var e=opts.items.visible-itms.first;debug(conf,"Preventing non-circular: sliding "+e+" items backward."),$cfs.trigger(cf_e("prev",conf),e)}opts.items.visible=cf_getItemsAdjust(b,opts,opts.items.visibleConf.adjust,$tt0),opts.items.visibleConf.old=opts.items.visible,opts=in_getAlignPadding(opts,c);var f=sz_setSizes($cfs,opts);return $cfs.trigger(cf_e("updatePageStatus",conf),[!0,f]),nv_showNavi(opts,itms.total,conf),nv_enableNavi(opts,itms.first,conf),f}),$cfs.bind(cf_e("destroy",conf),function(a,b){return a.stopPropagation(),tmrs=sc_clearTimers(tmrs),$cfs.data("_cfs_isCarousel",!1),$cfs.trigger(cf_e("finish",conf)),b&&$cfs.trigger(cf_e("jumpToStart",conf)),sz_restoreOrigCss($cfs.children()),sz_restoreOrigCss($cfs),FN._unbind_events(),FN._unbind_buttons(),"parent"==conf.wrapper?sz_restoreOrigCss($wrp):$wrp.replaceWith($cfs),!0}),$cfs.bind(cf_e("debug",conf),function(){return debug(conf,"Carousel width: "+opts.width),debug(conf,"Carousel height: "+opts.height),debug(conf,"Item widths: "+opts.items.width),debug(conf,"Item heights: "+opts.items.height),debug(conf,"Number of items visible: "+opts.items.visible),opts.auto.play&&debug(conf,"Number of items scrolled automatically: "+opts.auto.items),opts.prev.button&&debug(conf,"Number of items scrolled backward: "+opts.prev.items),opts.next.button&&debug(conf,"Number of items scrolled forward: "+opts.next.items),conf.debug}),$cfs.bind("_cfs_triggerEvent",function(a,b,c){return a.stopPropagation(),$cfs.triggerHandler(cf_e(b,conf),c)})},FN._unbind_events=function(){$cfs.unbind(cf_e("",conf)),$cfs.unbind(cf_e("",conf,!1)),$cfs.unbind("_cfs_triggerEvent")},FN._bind_buttons=function(){if(FN._unbind_buttons(),nv_showNavi(opts,itms.total,conf),nv_enableNavi(opts,itms.first,conf),opts.auto.pauseOnHover){var a=bt_pauseOnHoverConfig(opts.auto.pauseOnHover);$wrp.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),a)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.auto.button&&opts.auto.button.bind(cf_e(opts.auto.event,conf,!1),function(a){a.preventDefault();var b=!1,c=null;crsl.isPaused?b="play":opts.auto.pauseOnEvent&&(b="pause",c=bt_pauseOnHoverConfig(opts.auto.pauseOnEvent)),b&&$cfs.trigger(cf_e(b,conf),c)}),opts.prev.button&&(opts.prev.button.bind(cf_e(opts.prev.event,conf,!1),function(a){a.preventDefault(),$cfs.trigger(cf_e("prev",conf))}),opts.prev.pauseOnHover)){var a=bt_pauseOnHoverConfig(opts.prev.pauseOnHover);opts.prev.button.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),a)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.next.button&&(opts.next.button.bind(cf_e(opts.next.event,conf,!1),function(a){a.preventDefault(),$cfs.trigger(cf_e("next",conf))}),opts.next.pauseOnHover)){var a=bt_pauseOnHoverConfig(opts.next.pauseOnHover);opts.next.button.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),a)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if(opts.pagination.container&&opts.pagination.pauseOnHover){var a=bt_pauseOnHoverConfig(opts.pagination.pauseOnHover);opts.pagination.container.bind(cf_e("mouseenter",conf,!1),function(){$cfs.trigger(cf_e("pause",conf),a)}).bind(cf_e("mouseleave",conf,!1),function(){$cfs.trigger(cf_e("resume",conf))})}if((opts.prev.key||opts.next.key)&&$(document).bind(cf_e("keyup",conf,!1,!0,!0),function(a){var b=a.keyCode;b==opts.next.key&&(a.preventDefault(),$cfs.trigger(cf_e("next",conf))),b==opts.prev.key&&(a.preventDefault(),$cfs.trigger(cf_e("prev",conf)))}),opts.pagination.keys&&$(document).bind(cf_e("keyup",conf,!1,!0,!0),function(a){var b=a.keyCode;b>=49&&58>b&&(b=(b-49)*opts.items.visible,itms.total>=b&&(a.preventDefault(),$cfs.trigger(cf_e("slideTo",conf),[b,0,!0,opts.pagination])))}),$.fn.swipe){var b="ontouchstart"in window;if(b&&opts.swipe.onTouch||!b&&opts.swipe.onMouse){var c=$.extend(!0,{},opts.prev,opts.swipe),d=$.extend(!0,{},opts.next,opts.swipe),e=function(){$cfs.trigger(cf_e("prev",conf),[c])},f=function(){$cfs.trigger(cf_e("next",conf),[d])};switch(opts.direction){case"up":case"down":opts.swipe.options.swipeUp=f,opts.swipe.options.swipeDown=e;break;default:opts.swipe.options.swipeLeft=f,opts.swipe.options.swipeRight=e}crsl.swipe&&$cfs.swipe("destroy"),$wrp.swipe(opts.swipe.options),$wrp.css("cursor","move"),crsl.swipe=!0}}if($.fn.mousewheel&&opts.mousewheel){var g=$.extend(!0,{},opts.prev,opts.mousewheel),h=$.extend(!0,{},opts.next,opts.mousewheel);crsl.mousewheel&&$wrp.unbind(cf_e("mousewheel",conf,!1)),$wrp.bind(cf_e("mousewheel",conf,!1),function(a,b){a.preventDefault(),b>0?$cfs.trigger(cf_e("prev",conf),[g]):$cfs.trigger(cf_e("next",conf),[h])}),crsl.mousewheel=!0}if(opts.auto.play&&$cfs.trigger(cf_e("play",conf),opts.auto.delay),crsl.upDateOnWindowResize){var i=function(){$cfs.trigger(cf_e("finish",conf)),opts.auto.pauseOnResize&&!crsl.isPaused&&$cfs.trigger(cf_e("play",conf)),sz_resetMargin($cfs.children(),opts),$cfs.trigger(cf_e("updateSizes",conf))},j=$(window),k=null;if($.debounce&&"debounce"==conf.onWindowResize)k=$.debounce(200,i);else if($.throttle&&"throttle"==conf.onWindowResize)k=$.throttle(300,i);else{var l=0,m=0;k=function(){var a=j.width(),b=j.height();(a!=l||b!=m)&&(i(),l=a,m=b)}}j.bind(cf_e("resize",conf,!1,!0,!0),k)}},FN._unbind_buttons=function(){var b=(cf_e("",conf),cf_e("",conf,!1));ns3=cf_e("",conf,!1,!0,!0),$(document).unbind(ns3),$(window).unbind(ns3),$wrp.unbind(b),opts.auto.button&&opts.auto.button.unbind(b),opts.prev.button&&opts.prev.button.unbind(b),opts.next.button&&opts.next.button.unbind(b),opts.pagination.container&&(opts.pagination.container.unbind(b),opts.pagination.anchorBuilder&&opts.pagination.container.children().remove()),crsl.swipe&&($cfs.swipe("destroy"),$wrp.css("cursor","default"),crsl.swipe=!1),crsl.mousewheel&&(crsl.mousewheel=!1),nv_showNavi(opts,"hide",conf),nv_enableNavi(opts,"removeClass",conf)},is_boolean(configs)&&(configs={debug:configs});var crsl={direction:"next",isPaused:!0,isScrolling:!1,isStopped:!1,mousewheel:!1,swipe:!1},itms={total:$cfs.children().length,first:0},tmrs={auto:null,progress:null,startTime:getTime(),timePassed:0},scrl={isStopped:!1,duration:0,startTime:0,easing:"",anims:[]},clbk={onBefore:[],onAfter:[]},queu=[],conf=$.extend(!0,{},$.fn.carouFredSel.configs,configs),opts={},opts_orig=$.extend(!0,{},options),$wrp="parent"==conf.wrapper?$cfs.parent():$cfs.wrap("<"+conf.wrapper.element+' class="'+conf.wrapper.classname+'" />').parent();if(conf.selector=$cfs.selector,conf.serialNumber=$.fn.carouFredSel.serialNumber++,conf.transition=conf.transition&&$.fn.transition?"transition":"animate",FN._init(opts_orig,!0,starting_position),FN._build(),FN._bind_events(),FN._bind_buttons(),is_array(opts.items.start))var start_arr=opts.items.start;else{var start_arr=[];0!=opts.items.start&&start_arr.push(opts.items.start)}if(opts.cookie&&start_arr.unshift(parseInt(cf_getCookie(opts.cookie),10)),start_arr.length>0)for(var a=0,l=start_arr.length;l>a;a++){var s=start_arr[a];if(0!=s){if(s===!0){if(s=window.location.hash,1>s.length)continue}else"random"===s&&(s=Math.floor(Math.random()*itms.total));if($cfs.triggerHandler(cf_e("slideTo",conf),[s,0,!0,{fx:"none"}]))break}}var siz=sz_setSizes($cfs,opts),itm=gi_getCurrentItems($cfs.children(),opts);return opts.onCreate&&opts.onCreate.call($tt0,{width:siz.width,height:siz.height,items:itm}),$cfs.trigger(cf_e("updatePageStatus",conf),[!0,siz]),$cfs.trigger(cf_e("linkAnchors",conf)),conf.debug&&$cfs.trigger(cf_e("debug",conf)),$cfs},$.fn.carouFredSel.serialNumber=1,$.fn.carouFredSel.defaults={synchronise:!1,infinite:!0,circular:!0,responsive:!1,direction:"left",items:{start:0},scroll:{easing:"swing",duration:500,pauseOnHover:!1,event:"click",queue:!1}},$.fn.carouFredSel.configs={debug:!1,transition:!1,onWindowResize:"throttle",events:{prefix:"",namespace:"cfs"},wrapper:{element:"div",classname:"caroufredsel_wrapper"},classnames:{}},$.fn.carouFredSel.pageAnchorBuilder=function(a){return'<a href="#"><span>'+a+"</span></a>"},$.fn.carouFredSel.progressbarUpdater=function(a){$(this).css("width",a+"%")},$.fn.carouFredSel.cookie={get:function(a){a+="=";for(var b=document.cookie.split(";"),c=0,d=b.length;d>c;c++){for(var e=b[c];" "==e.charAt(0);)e=e.slice(1);if(0==e.indexOf(a))return e.slice(a.length)}return 0},set:function(a,b,c){var d="";if(c){var e=new Date;e.setTime(e.getTime()+1e3*60*60*24*c),d="; expires="+e.toGMTString()}document.cookie=a+"="+b+d+"; path=/"},remove:function(a){$.fn.carouFredSel.cookie.set(a,"",-1)}},$.extend($.easing,{quadratic:function(a){var b=a*a;return a*(-b*a+4*b-6*a+4)},cubic:function(a){return a*(4*a*a-9*a+6)},elastic:function(a){var b=a*a;return a*(33*b*b-106*b*a+126*b-67*a+15)}}))})(jQuery);
\ No newline at end of file
diff --git a/css/car/components/carousel/jquery.touchSwipe.min.js b/css/car/components/carousel/jquery.touchSwipe.min.js
new file mode 100644 (file)
index 0000000..dd18459
--- /dev/null
@@ -0,0 +1,13 @@
+/*
+* touchSwipe - jQuery Plugin
+* https://github.com/mattbryson/TouchSwipe-Jquery-Plugin
+* http://labs.skinkers.com/touchSwipe/
+* http://plugins.jquery.com/project/touchSwipe
+*
+* Copyright (c) 2010 Matt Bryson (www.skinkers.com)
+* Dual licensed under the MIT or GPL Version 2 licenses.
+*
+* $version: 1.3.3
+*/
+
+(function(g){function P(c){if(c&&void 0===c.allowPageScroll&&(void 0!==c.swipe||void 0!==c.swipeStatus))c.allowPageScroll=G;c||(c={});c=g.extend({},g.fn.swipe.defaults,c);return this.each(function(){var b=g(this),f=b.data(w);f||(f=new W(this,c),b.data(w,f))})}function W(c,b){var f,p,r,s;function H(a){var a=a.originalEvent,c,Q=n?a.touches[0]:a;d=R;n?h=a.touches.length:a.preventDefault();i=0;j=null;k=0;!n||h===b.fingers||b.fingers===x?(r=f=Q.pageX,s=p=Q.pageY,y=(new Date).getTime(),b.swipeStatus&&(c= l(a,d))):t(a);if(!1===c)return d=m,l(a,d),c;e.bind(I,J);e.bind(K,L)}function J(a){a=a.originalEvent;if(!(d===q||d===m)){var c,e=n?a.touches[0]:a;f=e.pageX;p=e.pageY;u=(new Date).getTime();j=S();n&&(h=a.touches.length);d=z;var e=a,g=j;if(b.allowPageScroll===G)e.preventDefault();else{var o=b.allowPageScroll===T;switch(g){case v:(b.swipeLeft&&o||!o&&b.allowPageScroll!=M)&&e.preventDefault();break;case A:(b.swipeRight&&o||!o&&b.allowPageScroll!=M)&&e.preventDefault();break;case B:(b.swipeUp&&o||!o&&b.allowPageScroll!= N)&&e.preventDefault();break;case C:(b.swipeDown&&o||!o&&b.allowPageScroll!=N)&&e.preventDefault()}}h===b.fingers||b.fingers===x||!n?(i=U(),k=u-y,b.swipeStatus&&(c=l(a,d,j,i,k)),b.triggerOnTouchEnd||(e=!(b.maxTimeThreshold?!(k>=b.maxTimeThreshold):1),!0===D()?(d=q,c=l(a,d)):e&&(d=m,l(a,d)))):(d=m,l(a,d));!1===c&&(d=m,l(a,d))}}function L(a){a=a.originalEvent;a.preventDefault();u=(new Date).getTime();i=U();j=S();k=u-y;if(b.triggerOnTouchEnd||!1===b.triggerOnTouchEnd&&d===z)if(d=q,(h===b.fingers||b.fingers=== x||!n)&&0!==f){var c=!(b.maxTimeThreshold?!(k>=b.maxTimeThreshold):1);if((!0===D()||null===D())&&!c)l(a,d);else if(c||!1===D())d=m,l(a,d)}else d=m,l(a,d);else d===z&&(d=m,l(a,d));e.unbind(I,J,!1);e.unbind(K,L,!1)}function t(){y=u=p=f=s=r=h=0}function l(a,c){var d=void 0;b.swipeStatus&&(d=b.swipeStatus.call(e,a,c,j||null,i||0,k||0,h));if(c===m&&b.click&&(1===h||!n)&&(isNaN(i)||0===i))d=b.click.call(e,a,a.target);if(c==q)switch(b.swipe&&(d=b.swipe.call(e,a,j,i,k,h)),j){case v:b.swipeLeft&&(d=b.swipeLeft.call(e, a,j,i,k,h));break;case A:b.swipeRight&&(d=b.swipeRight.call(e,a,j,i,k,h));break;case B:b.swipeUp&&(d=b.swipeUp.call(e,a,j,i,k,h));break;case C:b.swipeDown&&(d=b.swipeDown.call(e,a,j,i,k,h))}(c===m||c===q)&&t(a);return d}function D(){return null!==b.threshold?i>=b.threshold:null}function U(){return Math.round(Math.sqrt(Math.pow(f-r,2)+Math.pow(p-s,2)))}function S(){var a;a=Math.atan2(p-s,r-f);a=Math.round(180*a/Math.PI);0>a&&(a=360-Math.abs(a));return 45>=a&&0<=a?v:360>=a&&315<=a?v:135<=a&&225>=a? A:45<a&&135>a?C:B}function V(){e.unbind(E,H);e.unbind(F,t);e.unbind(I,J);e.unbind(K,L)}var O=n||!b.fallbackToMouseEvents,E=O?"touchstart":"mousedown",I=O?"touchmove":"mousemove",K=O?"touchend":"mouseup",F="touchcancel",i=0,j=null,k=0,e=g(c),d="start",h=0,y=p=f=s=r=0,u=0;try{e.bind(E,H),e.bind(F,t)}catch(P){g.error("events not supported "+E+","+F+" on jQuery.swipe")}this.enable=function(){e.bind(E,H);e.bind(F,t);return e};this.disable=function(){V();return e};this.destroy=function(){V();e.data(w,null); return e}}var v="left",A="right",B="up",C="down",G="none",T="auto",M="horizontal",N="vertical",x="all",R="start",z="move",q="end",m="cancel",n="ontouchstart"in window,w="TouchSwipe";g.fn.swipe=function(c){var b=g(this),f=b.data(w);if(f&&"string"===typeof c){if(f[c])return f[c].apply(this,Array.prototype.slice.call(arguments,1));g.error("Method "+c+" does not exist on jQuery.swipe")}else if(!f&&("object"===typeof c||!c))return P.apply(this,arguments);return b};g.fn.swipe.defaults={fingers:1,threshold:75, maxTimeThreshold:null,swipe:null,swipeLeft:null,swipeRight:null,swipeUp:null,swipeDown:null,swipeStatus:null,click:null,triggerOnTouchEnd:!0,allowPageScroll:"auto",fallbackToMouseEvents:!0};g.fn.swipe.phases={PHASE_START:R,PHASE_MOVE:z,PHASE_END:q,PHASE_CANCEL:m};g.fn.swipe.directions={LEFT:v,RIGHT:A,UP:B,DOWN:C};g.fn.swipe.pageScroll={NONE:G,HORIZONTAL:M,VERTICAL:N,AUTO:T};g.fn.swipe.fingers={ONE:1,TWO:2,THREE:3,ALL:x}})(jQuery);
\ No newline at end of file
diff --git a/css/car/components/configuration/configuration.js b/css/car/components/configuration/configuration.js
new file mode 100644 (file)
index 0000000..685988d
--- /dev/null
@@ -0,0 +1,234 @@
+/**
+ * @module Services
+ */
+
+/**
+ * Class provides unified access to shared configuration settings between applications using [Tizen FileSystem API](https://developer.tizen.org/dev-guide/2.2.1/org.tizen.web.device.apireference/tizen/filesystem.html).
+ * Internally uses `JSON.stringify()` and  `JSON.parse()` so its possible to store even complex structures as values. This component is usually initialized by {{#crossLink "Bootstrap"}}{{/crossLink}} class
+ * and can be later accessed using global {{#crossLink "Configuration"}}{{/crossLink}} object.
+ *
+ * To attach and detach listener to detect changes in configuration register new callback function using {{#crossLink "Configuration/addUpdateListener:method"}}{{/crossLink}} method, e.g.:
+ *
+ *     var listenerId = Configuration.addUpdateListener(function() {
+ *        // Process configuration
+ *     });
+ *
+ *     // Unregister listener
+ *     Configuration.removeUpdateListener(listenerId);
+ *
+ * Changes are detected on global configuration level so each listener is responsible for detecting changes in interested properties. Use {{#crossLink "Configuration/get:method"}}{{/crossLink}}
+ * method to get new value or {{#crossLink "Configuration/set:method"}}{{/crossLink}} method to set and save new value.
+ *
+ * In special cases it's possible to force update in configuration file by calling {{#crossLink "Configuration/save:method"}}{{/crossLink}} method or force update of configuration object by calling
+ * {{#crossLink "Configuration/reload:method"}}{{/crossLink}} method.
+ *
+ * @class Configuration
+ * @constructor
+ */
+var Configuration = (function() {
+       "use strict";
+       function Configuration() {
+               console.info("Starting up service Configuration");
+       }
+       Configuration.prototype = function() { };
+
+    /**
+     * Contains array of attached callbacks.
+     * @property _updateCallbacks
+     * @private
+     * @type Array
+     */
+       Configuration.prototype._updateCallbacks = {};
+
+    /**
+     * Defines file name used for storing configuration object.
+     * @property _settingsFileName
+     * @private
+     * @type String
+     */
+       Configuration.prototype._settingsFileName = "__intel_ivi.settings";
+
+    /**
+     * Defines Tizen filesystem storage name used for storing configuration object.
+     * @property _settingsStorageName
+     * @private
+     * @type String
+     */
+    Configuration.prototype._settingsStorageName = "downloads";
+
+    /**
+     * Defines default values used when no valid configuration file is available.
+     * @property _values
+     * @private
+     * @type Object
+     */
+       Configuration.prototype._values = {
+        version: 0.4,
+               selectedTheme: "http://com.intel.tizen/blue",
+        bluetooth: {
+            devices: null,
+            lastSync: null
+        }
+       };
+
+    /**
+     * Method adds update listener which is fired after any property is changed.
+     * @method addUpdateListener
+     * @param aCallback {function()} Callback to be invoked after property is changed.
+     * @return {Integer} ID that can be used for removal of update listener.
+     */
+       Configuration.prototype.addUpdateListener = function(aCallback) {
+               var id = Math.floor(Math.random() * 1000000);
+               this._updateCallbacks[id] = aCallback;
+
+               return id;
+       };
+
+    /**
+     * Method removes update listener from list of listeners.
+     * @method removeUpdateListener
+     * @param aId {Integer} ID returned from addUpdateListener method.
+     */
+       Configuration.prototype.removeUpdateListener = function(aId) {
+               this._updateCallbacks[aId] = undefined;
+       };
+
+    /**
+     * Gets configuration property from storage.
+     * @method get
+     * @param aKey {String} Property key for value to be retieved.
+     * @return {Object} Property value.
+     */
+       Configuration.prototype.get = function(aKey) {
+        if (typeof(this._values[aKey]) === 'object') {
+            return JSON.parse(JSON.stringify(this._values[aKey]));
+        }
+        return this._values[aKey];
+       };
+
+    /**
+     * Sets configuration property to storage and invokes update listeners.
+     * @method set
+     * @param aKey {String} Property key for value to be retieved.
+     * @param aValue {String} New value for property.
+     * @param callListeners {Boolean} Indicates if listeners should be fired.
+     */
+       Configuration.prototype.set = function(aKey, aValue, callListeners) {
+               this._values[aKey] = aValue;
+        this.save();
+        if (callListeners === undefined || callListeners) {
+            this._callListeners();
+        }
+       };
+
+       Configuration.prototype._callListeners = function () {
+        for (var i in this._updateCallbacks) {
+            if (this._updateCallbacks.hasOwnProperty(i)) {
+                try {
+                    this._updateCallbacks[i]();
+                } catch (ex) {
+                    console.log("Error occured during callback invocation", ex);
+                }
+            }
+        }
+       };
+
+    /**
+     * Method reloads all property values from storage and fires update listeners once done.
+     * @method reload
+     * @param aCallback {function()} Callback to be invoked after all properties are loaded from storage.
+     */
+       Configuration.prototype.reload = function (aCallback) {
+               var self = this;
+        aCallback = aCallback || function() {};
+
+        if (typeof(tizen) !== 'undefined') {
+            tizen.filesystem.resolve(this._settingsStorageName, function(directory) {
+                var settingsFile;
+                try {
+                     settingsFile = directory.resolve(self._settingsFileName);
+                } catch(ex) {
+                    console.warn("Settings file doesn't exist, creating ...", ex);
+                    settingsFile = directory.createFile(self._settingsFileName);
+                }
+
+                settingsFile.readAsText(function(contents) {
+                    //console.log("Settings file contents", contents);
+                    var configValues = null;
+
+                    if (contents.length > 0) {
+                        try {
+                            configValues = JSON.parse(contents);
+                        }
+                        catch (ex) {
+                            console.error("Error occured during parsing settings file", ex);
+                            aCallback(ex);
+                        }
+                    }
+
+                    if (!configValues || !configValues.version || configValues.version < self._values.version) {
+                        configValues = jQuery.extend({}, self._values);
+                        self.save();
+                    }
+                    //console.log("Loaded settings:", configValues);
+
+                    if (JSON.stringify(configValues) !== JSON.stringify(self._values)) {
+                        console.log("Settings updated.");
+                        self._values = configValues;
+                        self._callListeners();
+                    }
+
+                    aCallback();
+                }, function(ex) {
+                    console.error("Cannot read settings file", ex);
+                    aCallback(ex);
+                });
+            }, function(error) {
+                console.error("Error occured during opening Documents directory", error);
+                aCallback(error);
+            }, "rw");
+        } else {
+            console.warn("Tizen API is not available, cannot read settings from persistent storage.");
+            aCallback();
+        }
+       };
+
+    /**
+     * Method saves all property values to storage.
+     * @method save
+     */
+       Configuration.prototype.save = function () {
+               var self = this;
+
+        if (typeof(tizen) !== 'undefined') {
+            tizen.filesystem.resolve(this._settingsStorageName, function(directory) {
+                var settingsFile;
+                try {
+                     settingsFile = directory.resolve(self._settingsFileName);
+                } catch(ex) {
+                    console.warn("Settings file doesn't exist, creating ...", ex);
+                    settingsFile = directory.createFile(self._settingsFileName);
+                }
+
+                settingsFile.openStream("w", function(stream) {
+                    console.log("Writing new settings", self._values);
+
+                    stream.write(JSON.stringify(self._values));
+
+                    stream.close();
+                }, function(ex) {
+                    console.error("Cannot read settings file", ex);
+                });
+
+            }, function(error) {
+                console.error("Error occured during opening Documents directory", error);
+            }, "rw");
+        } else {
+            console.warn("Tizen API is not available, cannot read settings from persistent storage.");
+        }
+       };
+
+    window.__configuration = undefined === window.__configuration ? new Configuration() : window.__configuration;
+
+    return window.__configuration;
+})();
diff --git a/css/car/components/dateTime/dateTime.css b/css/car/components/dateTime/dateTime.css
new file mode 100644 (file)
index 0000000..6ef741d
--- /dev/null
@@ -0,0 +1,11 @@
+.clockElemnt {
+       position: absolute;
+       left: 515px;
+       top: 92px;
+}
+
+.dateElemnt {
+       position: absolute;
+       left: 25px;
+       top: 92px;
+}
\ No newline at end of file
diff --git a/css/car/components/dateTime/dateTime.js b/css/car/components/dateTime/dateTime.js
new file mode 100644 (file)
index 0000000..8b5270f
--- /dev/null
@@ -0,0 +1,158 @@
+/**
+ * Provides functions for displaying and updating date/time element.
+ * Use following snippet to include component in your `index.html` file:
+ *
+ *     <script type='text/javascript' src='./css/car/components/dateTime/dateTime.js'></script>
+ *     <link rel="stylesheet" href="./css/car/components/dateTime/dateTime.css" />
+ *
+ * and following code to initialize:
+ *
+ *     $("#clockElement").ClockPlugin('init',5);  // initialize clockElement, timer interval is set as 5 seconds
+ *     $("#clockElement").ClockPlugin('startTimer');  // start timer
+ *
+ * @class Clock
+ * @module CarTheme
+ * @constructor
+ *
+ **/
+function Clock() {
+}
+/**
+ * Contains actual time and date strings.
+ * @property status
+ * @type Object
+ * @param {string} timeStr Holds actual time string.
+ * @param {string} dateStr Holds actual date string.
+ * @param {string} dayStr Holds actual day string.
+ **/
+Clock.prototype.status = {
+       timeStr: null,
+       dateStr: null,
+       dayStr: null
+};
+
+/**
+ * Listener for timer events.
+ * @method handleTimerEv
+ * @param clockSelector {string} Define clock selector in document.
+ * @param dateSelector {string} Define date selector in document.
+ **/
+Clock.prototype.handleTimerEv = function (clockSelector, dateSelector) {
+       "use strict";
+       var monthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
+       var date = new Date();
+       var hour = date.getHours();
+       var minute = date.getMinutes();
+       var ampm = hour >= 12 ? 'PM' : 'AM';
+       hour = hour % 12;
+       if (hour === 0) {
+               hour = 12; // the hour '0' should be '12'
+       }
+       minute = minute < 10 ? '0' + minute : minute;
+       hour = hour < 10 ? '0' + hour : hour;
+       this.status.timeStr = hour + ":" + minute + " " + ampm;
+       this.status.dateStr = monthsShort[date.getMonth().toString()].toUpperCase() + " " + date.getDate().toString();
+       if (clockSelector !== null) {
+               $(clockSelector).empty();
+               $(clockSelector).append(this.status.timeStr);
+       }
+       if (dateSelector !== null) {
+               $(dateSelector).empty();
+               $(dateSelector).append(this.status.dateStr);
+       }
+};
+
+(function ($) {
+       "use strict";
+       /**
+        * Provides functions for dateTime JQuery Plugin panel.
+        * @class ClockPlugin
+        * @static
+        **/
+       var ClockPlugin = {
+                       /**
+                        * Holds ID for clock document element.
+                        * @property clockDiv
+                        * @type string
+                        * @default null
+                        **/
+                       clockDiv: null,
+                       /**
+                        * Holds ID for date document element.
+                        * @property dateDiv
+                        * @type string
+                        * @default null
+                        **/
+                       dateDiv: null,
+                       /**
+                        * Holds timer for clock actualization interval.
+                        * @property timer
+                        * @type timer
+                        * @default null
+                        **/
+                       timer: null,
+                       /**
+                        * Holds clock actualization interval in miliseconds.
+                        * @property miliSeconds
+                        * @type int
+                        * @default 0
+                        **/
+                       miliSeconds: 0,
+                       /**
+                        * Holds Clock object after initialization.
+                        * @property clockObj
+                        * @type Object
+                        * @default null
+                        **/
+                       clockObj: null,
+                       /**
+                        * Provides initialization of dateTime plugin.
+                        * @method init
+                        * @param seconds {int} Define clock actualization interval in seconds.
+                        **/
+                       init: function (seconds) {
+                               this.empty();
+                               var appendText = '<div id="clock" class="clockElemnt fontSizeXXLarge  fontColorDark fontWeightBold">TIME</div>';
+                               appendText += '<div id="date" class="dateElemnt fontSizeXXLarge fontColorDark fontWeightBold">DATE</div>';
+                               this.append(appendText);
+                               ClockPlugin.clockDiv = "#clock";
+                               ClockPlugin.dateDiv = "#date";
+                               ClockPlugin.miliSeconds = seconds * 1000;
+                               ClockPlugin.clockObj = new Clock();
+                               ClockPlugin.clockObj.handleTimerEv(ClockPlugin.clockDiv, ClockPlugin.dateDiv);
+                       },
+                       /**
+                        * Provides initialization of clock actualization timer.
+                        * @method startTimer
+                        **/
+                       startTimer: function () {
+                               ClockPlugin.timer = setInterval(function () {
+                                       ClockPlugin.clockObj.handleTimerEv(ClockPlugin.clockDiv, ClockPlugin.dateDiv);
+                               }, ClockPlugin.miliSeconds);
+                       },
+                       /**
+                        * Provides clearing of clock actualization timer.
+                        * @method startTimer
+                        **/
+                       stopTimer: function () {
+                               clearInterval(ClockPlugin.timer);
+                       }
+               };
+       /**
+        * jQuery extension method for {{#crossLink "ClockPlugin"}}{{/crossLink}} plugin.
+        * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+        * @method ClockPlugin
+        * @for jQuery
+        * @return Result of called method.
+        */
+       $.fn.ClockPlugin = function (method) {
+               // Method calling logic
+               if (ClockPlugin[method]) {
+                       return ClockPlugin[method].apply(this, Array.prototype.slice.call(arguments, 1));
+               } else if (typeof method === 'object' || !method) {
+                       return ClockPlugin.init.apply(this, arguments);
+               } else {
+                       $.error('Method ' + method + ' does not exist on jQuery.ClockPlugin');
+               }
+       };
+}(jQuery));
diff --git a/css/car/components/dateTime/moment.min.js b/css/car/components/dateTime/moment.min.js
new file mode 100644 (file)
index 0000000..568ad05
--- /dev/null
@@ -0,0 +1,6 @@
+//! moment.js
+//! version : 2.4.0
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+(function(a){function b(a,b){return function(c){return i(a.call(this,c),b)}}function c(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function d(){}function e(a){u(a),g(this,a)}function f(a){var b=o(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._input=a,this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function g(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function h(a){return 0>a?Math.ceil(a):Math.floor(a)}function i(a,b){for(var c=a+"";c.length<b;)c="0"+c;return c}function j(a,b,c,d){var e,f,g=b._milliseconds,h=b._days,i=b._months;g&&a._d.setTime(+a._d+g*c),(h||i)&&(e=a.minute(),f=a.hour()),h&&a.date(a.date()+h*c),i&&a.month(a.month()+i*c),g&&!d&&bb.updateOffset(a),(h||i)&&(a.minute(e),a.hour(f))}function k(a){return"[object Array]"===Object.prototype.toString.call(a)}function l(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function m(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&q(a[d])!==q(b[d]))&&g++;return g+f}function n(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Kb[a]||Lb[b]||b}return a}function o(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=n(c),b&&(d[b]=a[c]));return d}function p(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}bb[b]=function(e,f){var g,h,i=bb.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=bb().utc().set(d,a);return i.call(bb.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function q(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function r(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function s(a){return t(a)?366:365}function t(a){return 0===a%4&&0!==a%100||0===a%400}function u(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[gb]<0||a._a[gb]>11?gb:a._a[hb]<1||a._a[hb]>r(a._a[fb],a._a[gb])?hb:a._a[ib]<0||a._a[ib]>23?ib:a._a[jb]<0||a._a[jb]>59?jb:a._a[kb]<0||a._a[kb]>59?kb:a._a[lb]<0||a._a[lb]>999?lb:-1,a._pf._overflowDayOfYear&&(fb>b||b>hb)&&(b=hb),a._pf.overflow=b)}function v(a){a._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function w(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function x(a){return a?a.toLowerCase().replace("_","-"):a}function y(a,b){return b.abbr=a,mb[a]||(mb[a]=new d),mb[a].set(b),mb[a]}function z(a){delete mb[a]}function A(a){var b,c,d,e,f=0,g=function(a){if(!mb[a]&&nb)try{require("./lang/"+a)}catch(b){}return mb[a]};if(!a)return bb.fn._lang;if(!k(a)){if(c=g(a))return c;a=[a]}for(;f<a.length;){for(e=x(a[f]).split("-"),b=e.length,d=x(a[f+1]),d=d?d.split("-"):null;b>0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&m(e,d,!0)>=b-1)break;b--}f++}return bb.fn._lang}function B(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function C(a){var b,c,d=a.match(rb);for(b=0,c=d.length;c>b;b++)d[b]=Pb[d[b]]?Pb[d[b]]:B(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function D(a,b){return a.isValid()?(b=E(b,a.lang()),Mb[b]||(Mb[b]=C(b)),Mb[b](a)):a.lang().invalidDate()}function E(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(sb.lastIndex=0;d>=0&&sb.test(a);)a=a.replace(sb,c),sb.lastIndex=0,d-=1;return a}function F(a,b){var c;switch(a){case"DDDD":return vb;case"YYYY":case"GGGG":case"gggg":return wb;case"YYYYY":case"GGGGG":case"ggggg":return xb;case"S":case"SS":case"SSS":case"DDD":return ub;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return zb;case"a":case"A":return A(b._l)._meridiemParse;case"X":return Cb;case"Z":case"ZZ":return Ab;case"T":return Bb;case"SSSS":return yb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"ww":case"W":case"WW":case"e":case"E":return tb;default:return c=new RegExp(N(M(a.replace("\\","")),"i"))}}function G(a){var b=(Ab.exec(a)||[])[0],c=(b+"").match(Hb)||["-",0,0],d=+(60*c[1])+q(c[2]);return"+"===c[0]?-d:d}function H(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[gb]=q(b)-1);break;case"MMM":case"MMMM":d=A(c._l).monthsParse(b),null!=d?e[gb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[hb]=q(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=q(b));break;case"YY":e[fb]=q(b)+(q(b)>68?1900:2e3);break;case"YYYY":case"YYYYY":e[fb]=q(b);break;case"a":case"A":c._isPm=A(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[ib]=q(b);break;case"m":case"mm":e[jb]=q(b);break;case"s":case"ss":e[kb]=q(b);break;case"S":case"SS":case"SSS":case"SSSS":e[lb]=q(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=G(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function I(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=K(a),a._w&&null==a._a[hb]&&null==a._a[gb]&&(f=function(b){return b?b.length<3?parseInt(b,10)>68?"19"+b:"20"+b:b:null==a._a[fb]?bb().weekYear():a._a[fb]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=X(f(g.GG),g.W||1,g.E,4,1):(i=A(a._l),j=null!=g.d?T(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&j<i._week.dow&&k++,h=X(f(g.gg),k,j,i._week.doy,i._week.dow)),a._a[fb]=h.year,a._dayOfYear=h.dayOfYear),a._dayOfYear&&(e=null==a._a[fb]?d[fb]:a._a[fb],a._dayOfYear>s(e)&&(a._pf._overflowDayOfYear=!0),c=S(e,0,a._dayOfYear),a._a[gb]=c.getUTCMonth(),a._a[hb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[ib]+=q((a._tzm||0)/60),l[jb]+=q((a._tzm||0)%60),a._d=(a._useUTC?S:R).apply(null,l)}}function J(a){var b;a._d||(b=o(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],I(a))}function K(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function L(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=A(a._l),h=""+a._i,i=h.length,j=0;for(d=E(a._f,g).match(rb)||[],b=0;b<d.length;b++)e=d[b],c=(F(e,a).exec(h)||[])[0],c&&(f=h.substr(0,h.indexOf(c)),f.length>0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Pb[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),H(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[ib]<12&&(a._a[ib]+=12),a._isPm===!1&&12===a._a[ib]&&(a._a[ib]=0),I(a),u(a)}function M(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function N(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function O(a){var b,c,d,e,f;if(0===a._f.length)return a._pf.invalidFormat=!0,a._d=new Date(0/0),void 0;for(e=0;e<a._f.length;e++)f=0,b=g({},a),v(b),b._f=a._f[e],L(b),w(b)&&(f+=b._pf.charsLeftOver,f+=10*b._pf.unusedTokens.length,b._pf.score=f,(null==d||d>f)&&(d=f,c=b));g(a,c||b)}function P(a){var b,c=a._i,d=Db.exec(c);if(d){for(a._pf.iso=!0,b=4;b>0;b--)if(d[b]){a._f=Fb[b-1]+(d[6]||" ");break}for(b=0;4>b;b++)if(Gb[b][1].exec(c)){a._f+=Gb[b][0];break}Ab.exec(c)&&(a._f+="Z"),L(a)}else a._d=new Date(c)}function Q(b){var c=b._i,d=ob.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?P(b):k(c)?(b._a=c.slice(0),I(b)):l(c)?b._d=new Date(+c):"object"==typeof c?J(b):b._d=new Date(c)}function R(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function S(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function T(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function U(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function V(a,b,c){var d=eb(Math.abs(a)/1e3),e=eb(d/60),f=eb(e/60),g=eb(f/24),h=eb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",eb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,U.apply({},i)}function W(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=bb(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function X(a,b,c,d,e){var f,g,h=new Date(Date.UTC(a,0)).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:s(a-1)+g}}function Y(a){var b=a._i,c=a._f;return"undefined"==typeof a._pf&&v(a),null===b?bb.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=A().preparse(b)),bb.isMoment(b)?(a=g({},b),a._d=new Date(+b._d)):c?k(c)?O(a):L(a):Q(a),new e(a))}function Z(a,b){bb.fn[a]=bb.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),bb.updateOffset(this),this):this._d["get"+c+b]()}}function $(a){bb.duration.fn[a]=function(){return this._data[a]}}function _(a,b){bb.duration.fn["as"+a]=function(){return+this/b}}function ab(a){var b=!1,c=bb;"undefined"==typeof ender&&(this.moment=a?function(){return!b&&console&&console.warn&&(b=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),c.apply(null,arguments)}:bb)}for(var bb,cb,db="2.4.0",eb=Math.round,fb=0,gb=1,hb=2,ib=3,jb=4,kb=5,lb=6,mb={},nb="undefined"!=typeof module&&module.exports,ob=/^\/?Date\((\-?\d+)/i,pb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,qb=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,rb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,sb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,tb=/\d\d?/,ub=/\d{1,3}/,vb=/\d{3}/,wb=/\d{1,4}/,xb=/[+\-]?\d{1,6}/,yb=/\d+/,zb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Ab=/Z|[\+\-]\d\d:?\d\d/i,Bb=/T/i,Cb=/[\+\-]?\d+(\.\d{1,3})?/,Db=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d:?\d\d|Z)?)?$/,Eb="YYYY-MM-DDTHH:mm:ssZ",Fb=["YYYY-MM-DD","GGGG-[W]WW","GGGG-[W]WW-E","YYYY-DDD"],Gb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Hb=/([\+\-]|\d\d)/gi,Ib="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Jb={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Kb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Lb={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Mb={},Nb="DDD w W M D d".split(" "),Ob="M D H h m s w W".split(" "),Pb={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return i(this.year()%100,2)},YYYY:function(){return i(this.year(),4)},YYYYY:function(){return i(this.year(),5)},gg:function(){return i(this.weekYear()%100,2)},gggg:function(){return this.weekYear()},ggggg:function(){return i(this.weekYear(),5)},GG:function(){return i(this.isoWeekYear()%100,2)},GGGG:function(){return this.isoWeekYear()},GGGGG:function(){return i(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return q(this.milliseconds()/100)},SS:function(){return i(q(this.milliseconds()/10),2)},SSS:function(){return i(this.milliseconds(),3)},SSSS:function(){return i(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+i(q(a/60),2)+":"+i(q(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+i(q(10*a/6),4)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()}},Qb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Nb.length;)cb=Nb.pop(),Pb[cb+"o"]=c(Pb[cb],cb);for(;Ob.length;)cb=Ob.pop(),Pb[cb+cb]=b(Pb[cb],2);for(Pb.DDDD=b(Pb.DDD,3),g(d.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=bb.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=bb([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return W(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),bb=function(b,c,d,e){return"boolean"==typeof d&&(e=d,d=a),Y({_i:b,_f:c,_l:d,_strict:e,_isUTC:!1})},bb.utc=function(b,c,d,e){var f;return"boolean"==typeof d&&(e=d,d=a),f=Y({_useUTC:!0,_isUTC:!0,_l:d,_i:b,_f:c,_strict:e}).utc()},bb.unix=function(a){return bb(1e3*a)},bb.duration=function(a,b){var c,d,e,g=bb.isDuration(a),h="number"==typeof a,i=g?a._input:h?{}:a,j=null;return h?b?i[b]=a:i.milliseconds=a:(j=pb.exec(a))?(c="-"===j[1]?-1:1,i={y:0,d:q(j[hb])*c,h:q(j[ib])*c,m:q(j[jb])*c,s:q(j[kb])*c,ms:q(j[lb])*c}):(j=qb.exec(a))&&(c="-"===j[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},i={y:e(j[2]),M:e(j[3]),d:e(j[4]),h:e(j[5]),m:e(j[6]),s:e(j[7]),w:e(j[8])}),d=new f(i),g&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},bb.version=db,bb.defaultFormat=Eb,bb.updateOffset=function(){},bb.lang=function(a,b){var c;return a?(b?y(x(a),b):null===b?(z(a),a="en"):mb[a]||A(a),c=bb.duration.fn._lang=bb.fn._lang=A(a),c._abbr):bb.fn._lang._abbr},bb.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),A(a)},bb.isMoment=function(a){return a instanceof e},bb.isDuration=function(a){return a instanceof f},cb=Qb.length-1;cb>=0;--cb)p(Qb[cb]);for(bb.normalizeUnits=function(a){return n(a)},bb.invalid=function(a){var b=bb.utc(0/0);return null!=a?g(b._pf,a):b._pf.userInvalidated=!0,b},bb.parseZone=function(a){return bb(a).parseZone()},g(bb.fn=e.prototype,{clone:function(){return bb(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){return D(bb(this).utc(),"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return w(this)},isDSTShifted:function(){return this._a?this.isValid()&&m(this._a,(this._isUTC?bb.utc(this._a):bb(this._a)).toArray())>0:!1},parsingFlags:function(){return g({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=D(this,a||bb.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?bb.duration(+b,a):bb.duration(a,b),j(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?bb.duration(+b,a):bb.duration(a,b),j(this,c,-1),this},diff:function(a,b,c){var d,e,f=this._isUTC?bb(a).zone(this._offset||0):bb(a).local(),g=6e4*(this.zone()-f.zone());return b=n(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-bb(this).startOf("month")-(f-bb(f).startOf("month")))/d,e-=6e4*(this.zone()-bb(this).startOf("month").zone()-(f.zone()-bb(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:h(e)},from:function(a,b){return bb.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(bb(),a)},calendar:function(){var a=this.diff(bb().zone(this.zone()).startOf("day"),"days",!0),b=-6>a?"sameElse":-1>a?"lastWeek":0>a?"lastDay":1>a?"sameDay":2>a?"nextDay":7>a?"nextWeek":"sameElse";return this.format(this.lang().calendar(b,this))},isLeapYear:function(){return t(this.year())},isDST:function(){return this.zone()<this.clone().month(0).zone()||this.zone()<this.clone().month(5).zone()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=T(a,this.lang()),this.add({d:a-b})):b},month:function(a){var b,c=this._isUTC?"UTC":"";return null!=a?"string"==typeof a&&(a=this.lang().monthsParse(a),"number"!=typeof a)?this:(b=this.date(),this.date(1),this._d["set"+c+"Month"](a),this.date(Math.min(b,this.daysInMonth())),bb.updateOffset(this),this):this._d["get"+c+"Month"]()},startOf:function(a){switch(a=n(a)){case"year":this.month(0);case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),this},endOf:function(a){return a=n(a),this.startOf(a).add("isoWeek"===a?"week":a,1).subtract("ms",1)},isAfter:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)>+bb(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+bb(a).startOf(b)},isSame:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)===+bb(a).startOf(b)},min:function(a){return a=bb.apply(null,arguments),this>a?this:a},max:function(a){return a=bb.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=G(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&j(this,bb.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?bb(a).zone():0,0===(this.zone()-a)%60},daysInMonth:function(){return r(this.year(),this.month())},dayOfYear:function(a){var b=eb((bb(this).startOf("day")-bb(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},weekYear:function(a){var b=W(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=W(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=W(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=n(a),this[a]()},set:function(a,b){return a=n(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=A(b),this)}}),cb=0;cb<Ib.length;cb++)Z(Ib[cb].toLowerCase().replace(/s$/,""),Ib[cb]);Z("year","FullYear"),bb.fn.days=bb.fn.day,bb.fn.months=bb.fn.month,bb.fn.weeks=bb.fn.week,bb.fn.isoWeeks=bb.fn.isoWeek,bb.fn.toJSON=bb.fn.toISOString,g(bb.duration.fn=f.prototype,{_bubble:function(){var a,b,c,d,e=this._milliseconds,f=this._days,g=this._months,i=this._data;i.milliseconds=e%1e3,a=h(e/1e3),i.seconds=a%60,b=h(a/60),i.minutes=b%60,c=h(b/60),i.hours=c%24,f+=h(c/24),i.days=f%30,g+=h(f/30),i.months=g%12,d=h(g/12),i.years=d},weeks:function(){return h(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+2592e6*(this._months%12)+31536e6*q(this._months/12)},humanize:function(a){var b=+this,c=V(b,!a,this.lang());return a&&(c=this.lang().pastFuture(b,c)),this.lang().postformat(c)},add:function(a,b){var c=bb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=bb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=n(a),this[a.toLowerCase()+"s"]()},as:function(a){return a=n(a),this["as"+a.charAt(0).toUpperCase()+a.slice(1)+"s"]()},lang:bb.fn.lang,toIsoString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"}});for(cb in Jb)Jb.hasOwnProperty(cb)&&(_(cb,Jb[cb]),$(cb.toLowerCase()));_("Weeks",6048e5),bb.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},bb.lang("en",{ordinal:function(a){var b=a%10,c=1===q(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),nb?(module.exports=bb,ab(!0)):"function"==typeof define&&define.amd?define("moment",function(b,c,d){return d.config().noGlobal!==!0&&ab(d.config().noGlobal===a),bb}):ab()}).call(this);
\ No newline at end of file
diff --git a/css/car/components/incomingCall/incomingCall.css b/css/car/components/incomingCall/incomingCall.css
new file mode 100644 (file)
index 0000000..e3ceff7
--- /dev/null
@@ -0,0 +1,95 @@
+.incomingCall {
+       position: absolute;
+       height: 1280px;
+       width:720px;
+       z-index: 1000;
+       -webkit-transition-timing-function: linear;
+       -webkit-transition: 1s;
+
+       -moz-transition-timing-function: linear;
+       -moz-transition: 1s;
+
+       -ms-transition-timing-function: linear;
+       -ms-transition: 1s;
+
+       -o-transition-timing-function: linear;
+       -o-transition: 1s
+}
+.incomingCallShow {
+       top:0;
+}
+.incomingCallHide {
+       top:-1280px;
+}
+.incomingCall .tabsTopPanel {
+       position: inherit;
+       top:0;
+       left:0;
+       width:720px;
+       height:110px;
+
+}
+.incomingCall .tabsTab {
+       position: inherit;
+       top:0;
+       left:0;
+       width:720px;
+       height:110px;
+       background-repeat: repeat-x;
+}
+.incomingCall .TopPanelTitle {
+       position: inherit;
+       left: 19px;
+       top: 30px;
+       font-size: 0;
+}
+.incomingCall .callInfoBox{
+       position: inherit;
+       left:19px;
+       top:150px;
+       width: 400px;
+}
+.incomingCall .callPhotoBox {
+       width: 240px;
+       height: 240px;
+       display: inline-block;
+       background-position: center center;
+       background-repeat: no-repeat;
+       background-size: 100% 100%;
+}
+
+.incomingCall .callPhoto {
+       position: inherit;
+       width: 100%;
+       height: 100%;
+}
+.incomingCall .callName{
+       position: inherit;
+       top:150px;
+       left:280px;
+       text-transform: uppercase;
+}
+.incomingCall .callNumber{
+       position: inherit;
+       top:200px;
+       left:280px;
+       text-transform: uppercase;
+}
+.incomingCall .incomingCallAccept{
+       position: inherit;
+       top:500px;
+       left:20px;
+       text-transform: uppercase;
+}
+.incomingCall .incomingCallDeny{
+       position: inherit;
+       top:500px;
+       left:370px;
+       text-transform: uppercase;
+}
+.incomingCall .callButton {
+       width: 330px;
+       height: 330px;
+       margin-left: 0;
+       margin-top: 0;
+}
diff --git a/css/car/components/incomingCall/incomingCall.js b/css/car/components/incomingCall/incomingCall.js
new file mode 100644 (file)
index 0000000..37710c4
--- /dev/null
@@ -0,0 +1,117 @@
+/* global launchApplication, getAppByID, acceptCall*/
+
+/**
+ * @module CarTheme
+ */
+var IncomingCall = function() {
+       "use strict";
+       /**
+        * Class provides accept/deny for incoming call dialog in every widget. This component is usually initialized by {{#crossLink "Bootstrap"}}{{/crossLink}} class
+     * and can be later accessed using {{#crossLink "Bootstrap/incomingCall:property"}}{{/crossLink}} property.
+     *
+     * Component uses [tizen.phone API]() to perform phone operations and
+     * [Tizen Application API](https://developer.tizen.org/dev-guide/2.2.0/org.tizen.web.device.apireference/tizen/application.html) to launch external application.
+     *
+     * This class requires following components:
+        *
+        * * {{#crossLink "BoxCaption"}}{{/crossLink}} component
+        *
+        * @class IncomingCall
+        * @constructor
+        */
+       var self = this;
+       if (!$("#incomingCall").length) {
+               var appendHtml = '<div id="incomingCall" class="incomingCall incomingCallHide ">';
+               var background = '<div class = "pageBgColorNormalTransparent" style ="width:100%; height: 100%"></div>';
+               var tabs = '<div id = "incomingCallTopPanel" class="tabsTopPanel"></div>';
+               tabs += '<div id = "incomingCallTabs" class="tabsTab"></div>';
+               tabs += '<div id ="incomingCallTitle" class="TopPanelTitle"></div>';
+               var callbox = '<div class = "callInfoBox">';
+               callbox += '<div class = "callPhotoBox noContactPhoto">';
+               callbox += '<img id = "incomingCallPhoto" class="callPhoto"></div>';
+               callbox += '</div>';
+               callbox += '<div id = "incomingCallName" class="callName fontSizeXLarge fontWeightBold fontColorNormal">unknown</div>';
+               callbox += '<div id = "incomingCallNumber" class="callNumber fontSizeXLarge fontWeightBold fontColorTheme">unknown</div>';
+               // callbox += '</div>';
+
+               var buttons = '<div id="incomingCallAccept" class="incomingCallAccept button callButton callingFalse boxShadow4Active" onClick = "bootstrap.incomingCall.acceptIncommingCall()"></div>';
+               buttons += '<div id="incomingCallDeny" class="incomingCallDeny button callButton callingTrue boxShadow4Active" onClick = "bootstrap.incomingCall.denyCall()"></div>';
+
+               appendHtml += background + tabs + callbox + buttons;
+               appendHtml += '</div></div>';
+               $(appendHtml).appendTo("body");
+               $("#incomingCall .TopPanelTitle").boxCaptionPlugin('init', "Incoming Call");
+       }
+};
+/**
+ * Method shows incoming call dialog.
+ * @method show
+ * @param  contact {contact} Contact data from phone.
+ */
+IncomingCall.prototype.show = function(contact) {
+       "use strict";
+       if (contact) {
+               if (contact.name) {
+                       var name = contact.name.firstName || "";
+                       name += contact.name.lastName ? " " + contact.name.lastName : "";
+                       $("#incomingCallName").html(name);
+               }
+
+               if (contact.phoneNumbers) {
+                       $("#incomingCallNumber").html(contact.phoneNumbers[0] && contact.phoneNumbers[0].number ? contact.phoneNumbers[0].number : "");
+               }
+
+               if (contact.photoURI) {
+                       $("#incomingCallPhoto").attr("src", contact.photoURI);
+               }
+       }
+       if ($("#incomingCall").hasClass('incomingCallHide')) {
+               $("#incomingCall").removeClass('incomingCallHide');
+               $("#incomingCall").addClass("incomingCallShow");
+       }
+};
+/**
+ * Method hides incoming call dialog.
+ * @method hide
+ */
+IncomingCall.prototype.hide = function() {
+       "use strict";
+       if ($("#incomingCall").hasClass('incomingCallShow')) {
+               $("#incomingCall").removeClass('incomingCallShow');
+               $("#incomingCall").addClass("incomingCallHide");
+       }
+};
+/**
+ * Method accepts incoming call. If application where call is accepted isn't Phone application (`intelPoc15.phone`), then launches Phone application.
+ * If apllication where call is accepted is Phone application (`intelPoc15.phone`), call {{#crossLink "Phone/acceptCall:method"}}{{/crossLink}} method.
+ * @method acceptIncommingCall
+ */
+IncomingCall.prototype.acceptIncommingCall = function() {
+       "use strict";
+       /* todo add call to phone application */
+       this.hide();
+       var appId = getAppByID('intelPoc15.phone');
+       /* if app isn't phone */
+       if (!appId.running) {
+               launchApplication('intelPoc15.phone');
+               /* if app is phone */
+       } else {
+               if (typeof(tizen) !== 'undefined' && tizen.phone) {
+                       acceptCall(tizen.phone.activeCall.contact);
+               }
+       }
+};
+/**
+ * Method denies incoming call. This method use api fucntion [tizen.phone.hangupCall]().
+ * @method denyCall
+ */
+IncomingCall.prototype.denyCall = function() {
+       "use strict";
+       /* todo deny call */
+       this.hide();
+       if (typeof(tizen) !== 'undefined' && tizen.phone) {
+               tizen.phone.hangupCall(function(result) {
+                       console.log(result.message);
+               });
+       }
+};
\ No newline at end of file
diff --git a/css/car/components/jQuery/jquery-1.8.2.js b/css/car/components/jQuery/jquery-1.8.2.js
new file mode 100644 (file)
index 0000000..0f90772
--- /dev/null
@@ -0,0 +1,9449 @@
+/**
+ * @namespace com.intel.tizen.coulomb.2012
+ **/
+
+/**
+ * Extension methods for jQuery JavaScript Library v1.8.2 provided by theme http://com.intel.tizen/coulomb.2012
+ * @class jQuery
+ */
+
+/*!
+ * jQuery JavaScript Library v1.8.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight Time)
+ */
+(function( window, undefined ) {
+var
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // The deferred used on DOM ready
+       readyList,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+       location = window.location,
+       navigator = window.navigator,
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // Save a reference to some core methods
+       core_push = Array.prototype.push,
+       core_slice = Array.prototype.slice,
+       core_indexOf = Array.prototype.indexOf,
+       core_toString = Object.prototype.toString,
+       core_hasOwn = Object.prototype.hasOwnProperty,
+       core_trim = String.prototype.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Used for matching numbers
+       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+       // Used for detecting and trimming whitespace
+       core_rnotwhite = /\S/,
+       core_rspace = /\s+/,
+
+       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+       // JSON RegExp
+       rvalidchars = /^[\],:{}\s]*$/,
+       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+       // Matches dashed string for camelizing
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return ( letter + "" ).toUpperCase();
+       },
+
+       // The ready event handler and self cleanup method
+       DOMContentLoaded = function() {
+               if ( document.addEventListener ) {
+                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                       jQuery.ready();
+               } else if ( document.readyState === "complete" ) {
+                       // we're here because readyState === "complete" in oldIE
+                       // which is good enough for us to call the dom ready!
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       },
+
+       // [[Class]] -> type pairs
+       class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem, ret, doc;
+
+               // Handle $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
+
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+
+                                       // scripts is true for back-compat
+                                       selector = jQuery.parseHTML( match[1], doc, true );
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               this.attr.call( selector, context, true );
+                                       }
+
+                                       return jQuery.merge( this, selector );
+
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       },
+
+       // Start with an empty selector
+       selector: "",
+
+       // The current version of jQuery being used
+       jquery: "1.8.2",
+
+       // The default length of a jQuery object is 0
+       length: 0,
+
+       // The number of elements contained in the matched element set
+       size: function() {
+               return this.length;
+       },
+
+       toArray: function() {
+               return core_slice.call( this );
+       },
+
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
+
+                       // Return a 'clean' array
+                       this.toArray() :
+
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
+
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems, name, selector ) {
+
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
+
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
+
+               ret.context = this.context;
+
+               if ( name === "find" ) {
+                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
+
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Add the callback
+               jQuery.ready.promise().done( fn );
+
+               return this;
+       },
+
+       eq: function( i ) {
+               i = +i;
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       slice: function() {
+               return this.pushStack( core_slice.apply( this, arguments ),
+                       "slice", core_slice.call(arguments).join(",") );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: core_push,
+       sort: [].sort,
+       splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
+
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
+
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
+
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
+
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
+
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
+
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
+
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
+
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
+                               }
+                       }
+               }
+       }
+
+       // Return the modified object
+       return target;
+};
+
+jQuery.extend({
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
+
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
+
+               return jQuery;
+       },
+
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
+
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready, 1 );
+               }
+
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
+
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
+
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
+
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
+
+       isWindow: function( obj ) {
+               return obj != null && obj == obj.window;
+       },
+
+       isNumeric: function( obj ) {
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       },
+
+       type: function( obj ) {
+               return obj == null ?
+                       String( obj ) :
+                       class2type[ core_toString.call(obj) ] || "object";
+       },
+
+       isPlainObject: function( obj ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
+
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !core_hasOwn.call(obj, "constructor") &&
+                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects #9897
+                       return false;
+               }
+
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
+
+               var key;
+               for ( key in obj ) {}
+
+               return key === undefined || core_hasOwn.call( obj, key );
+       },
+
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in this context, defaults to document
+       // scripts (optional): If true, will include scripts passed in the html string
+       parseHTML: function( data, context, scripts ) {
+               var parsed;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               if ( typeof context === "boolean" ) {
+                       scripts = context;
+                       context = 0;
+               }
+               context = context || document;
+
+               // Single tag
+               if ( (parsed = rsingleTag.exec( data )) ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
+
+               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+               return jQuery.merge( [],
+                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+       },
+
+       parseJSON: function( data ) {
+               if ( !data || typeof data !== "string") {
+                       return null;
+               }
+
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
+
+               // Attempt to parse using the native JSON parser first
+               if ( window.JSON && window.JSON.parse ) {
+                       return window.JSON.parse( data );
+               }
+
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                       .replace( rvalidtokens, "]" )
+                       .replace( rvalidbraces, "")) ) {
+
+                       return ( new Function( "return " + data ) )();
+
+               }
+               jQuery.error( "Invalid JSON: " + data );
+       },
+
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
+               }
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && core_rnotwhite.test( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
+
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+       },
+
+       // args is for internal usage only
+       each: function( obj, callback, args ) {
+               var name,
+                       i = 0,
+                       length = obj.length,
+                       isObj = length === undefined || jQuery.isFunction( obj );
+
+               if ( args ) {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.apply( obj[ name ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               return obj;
+       },
+
+       // Use native String.trim function wherever possible
+       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               core_trim.call( text );
+               } :
+
+               // Otherwise use our own trimming functionality
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               ( text + "" ).replace( rtrim, "" );
+               },
+
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var type,
+                       ret = results || [];
+
+               if ( arr != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                       type = jQuery.type( arr );
+
+                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+                               core_push.call( ret, arr );
+                       } else {
+                               jQuery.merge( ret, arr );
+                       }
+               }
+
+               return ret;
+       },
+
+       inArray: function( elem, arr, i ) {
+               var len;
+
+               if ( arr ) {
+                       if ( core_indexOf ) {
+                               return core_indexOf.call( arr, elem, i );
+                       }
+
+                       len = arr.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in arr && arr[ i ] === elem ) {
+                                       return i;
+                               }
+                       }
+               }
+
+               return -1;
+       },
+
+       merge: function( first, second ) {
+               var l = second.length,
+                       i = first.length,
+                       j = 0;
+
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
+
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
+
+               first.length = i;
+
+               return first;
+       },
+
+       grep: function( elems, callback, inv ) {
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
+               inv = !!inv;
+
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
+
+               return ret;
+       },
+
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value, key,
+                       ret = [],
+                       i = 0,
+                       length = elems.length,
+                       // jquery objects are treated as arrays
+                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+
+               // Go through every key on the object,
+               } else {
+                       for ( key in elems ) {
+                               value = callback( elems[ key ], key, arg );
+
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
+                               }
+                       }
+               }
+
+               // Flatten any nested arrays
+               return ret.concat.apply( [], ret );
+       },
+
+       // A global GUID counter for objects
+       guid: 1,
+
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var tmp, args, proxy;
+
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
+
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
+
+               // Simulated bind
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+               };
+
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+               return proxy;
+       },
+
+       // Multifunctional method to get and set values of a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+               var exec,
+                       bulk = key == null,
+                       i = 0,
+                       length = elems.length;
+
+               // Sets many values
+               if ( key && typeof key === "object" ) {
+                       for ( i in key ) {
+                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+                       }
+                       chainable = 1;
+
+               // Sets one value
+               } else if ( value !== undefined ) {
+                       // Optionally, function values get executed if exec is true
+                       exec = pass === undefined && jQuery.isFunction( value );
+
+                       if ( bulk ) {
+                               // Bulk operations only iterate when executing function values
+                               if ( exec ) {
+                                       exec = fn;
+                                       fn = function( elem, key, value ) {
+                                               return exec.call( jQuery( elem ), value );
+                                       };
+
+                               // Otherwise they run against the entire set
+                               } else {
+                                       fn.call( elems, value );
+                                       fn = null;
+                               }
+                       }
+
+                       if ( fn ) {
+                               for (; i < length; i++ ) {
+                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               }
+                       }
+
+                       chainable = 1;
+               }
+
+               return chainable ?
+                       elems :
+
+                       // Gets
+                       bulk ?
+                               fn.call( elems ) :
+                               length ? fn( elems[0], key ) : emptyGet;
+       },
+
+       now: function() {
+               return ( new Date() ).getTime();
+       }
+});
+
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
+
+               readyList = jQuery.Deferred();
+
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready, 1 );
+
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
+
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
+
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
+
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
+
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
+                                               }
+
+                                               // and execute any waiting functions
+                                               jQuery.ready();
+                                       }
+                               })();
+                       }
+               }
+       }
+       return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.split( core_rspace ), function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *     memory:                 will keep track of previous values and will call any callback added
+ *                                     after the list has been fired right away with the latest "memorized"
+ *                                     values (like a Deferred)
+ *
+ *     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
+
+       var // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list was already fired
+               fired,
+               // Flag to know if list is currently firing
+               firing,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
+               // Fire callbacks
+               fire = function( data ) {
+                       memory = options.memory && data;
+                       fired = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       firing = true;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
+                                       }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
+                               }
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
+                               if ( list ) {
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       var type = jQuery.type( arg );
+                                                       if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
+                                                               list.push( arg );
+                                                       } else if ( arg && arg.length && type !== "string" ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
+                                                               }
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
+                                                               }
+                                                       }
+                                               }
+                                       });
+                               }
+                               return this;
+                       },
+                       // Control if a given callback is in the list
+                       has: function( fn ) {
+                               return jQuery.inArray( fn, list ) > -1;
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               args = args || [];
+                               args = [ context, args.slice ? args.slice() : args ];
+                               if ( list && ( !fired || stack ) ) {
+                                       if ( firing ) {
+                                               stack.push( args );
+                                       } else {
+                                               fire( args );
+                                       }
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
+                               },
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
+                                       return this;
+                               },
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var action = tuple[ 0 ],
+                                                               fn = fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+                                                               function() {
+                                                                       var returned = fn.apply( this, arguments );
+                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                               returned.promise()
+                                                                                       .done( newDefer.resolve )
+                                                                                       .fail( newDefer.reject )
+                                                                                       .progress( newDefer.notify );
+                                                                       } else {
+                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+                                                                       }
+                                                               } :
+                                                               newDefer[ action ]
+                                                       );
+                                               });
+                                               fns = null;
+                                       }).promise();
+                               },
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
+                               }
+                       },
+                       deferred = {};
+
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
+
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
+
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
+
+                       // deferred[ resolve | reject | notify ] = list.fire
+                       deferred[ tuple[0] ] = list.fire;
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
+
+               // Make the deferred a promise
+               promise.promise( deferred );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = core_slice.call( arguments ),
+                       length = resolveValues.length,
+
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
+                               return function( value ) {
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+                                       if( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+                                       } else if ( !( --remaining ) ) {
+                                               deferred.resolveWith( contexts, values );
+                                       }
+                               };
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
+               if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
+                       for ( ; i < length; i++ ) {
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                               } else {
+                                       --remaining;
+                               }
+                       }
+               }
+
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
+
+               return deferred.promise();
+       }
+});
+jQuery.support = (function() {
+
+       var support,
+               all,
+               a,
+               select,
+               opt,
+               input,
+               fragment,
+               eventName,
+               i,
+               isSupported,
+               clickFn,
+               div = document.createElement("div");
+
+       // Preliminary tests
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+       all = div.getElementsByTagName("*");
+       a = div.getElementsByTagName("a")[ 0 ];
+       a.style.cssText = "top:1px;float:left;opacity:.5";
+
+       // Can't get basic test support
+       if ( !all || !all.length ) {
+               return {};
+       }
+
+       // First batch of supports tests
+       select = document.createElement("select");
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName("input")[ 0 ];
+
+       support = {
+               // IE strips leading whitespace when .innerHTML is used
+               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+               // Make sure that tbody elements aren't automatically inserted
+               // IE will insert them into empty tables
+               tbody: !div.getElementsByTagName("tbody").length,
+
+               // Make sure that link elements get serialized correctly by innerHTML
+               // This requires a wrapper element in IE
+               htmlSerialize: !!div.getElementsByTagName("link").length,
+
+               // Get the style information from getAttribute
+               // (IE uses .cssText instead)
+               style: /top/.test( a.getAttribute("style") ),
+
+               // Make sure that URLs aren't manipulated
+               // (IE normalizes it by default)
+               hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+               // Make sure that element opacity exists
+               // (IE uses filter instead)
+               // Use a regex to work around a WebKit issue. See #5145
+               opacity: /^0.5/.test( a.style.opacity ),
+
+               // Verify style float existence
+               // (IE uses styleFloat instead of cssFloat)
+               cssFloat: !!a.style.cssFloat,
+
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: ( input.value === "on" ),
+
+               // Make sure that a selected-by-default option has a working selected property.
+               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+               optSelected: opt.selected,
+
+               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+               getSetAttribute: div.className !== "t",
+
+               // Tests for enctype support on a form(#6743)
+               enctype: !!document.createElement("form").enctype,
+
+               // Makes sure cloning an html5 element does not cause problems
+               // Where outerHTML is undefined, this still works
+               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+               boxModel: ( document.compatMode === "CSS1Compat" ),
+
+               // Will be defined later
+               submitBubbles: true,
+               changeBubbles: true,
+               focusinBubbles: false,
+               deleteExpando: true,
+               noCloneEvent: true,
+               inlineBlockNeedsLayout: false,
+               shrinkWrapBlocks: false,
+               reliableMarginRight: true,
+               boxSizingReliable: true,
+               pixelPosition: false
+       };
+
+       // Make sure checked status is properly cloned
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
+
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
+
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete div.test;
+       } catch( e ) {
+               support.deleteExpando = false;
+       }
+
+       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+               div.attachEvent( "onclick", clickFn = function() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       support.noCloneEvent = false;
+               });
+               div.cloneNode( true ).fireEvent("onclick");
+               div.detachEvent( "onclick", clickFn );
+       }
+
+       // Check if a radio maintains its value
+       // after being appended to the DOM
+       input = document.createElement("input");
+       input.value = "t";
+       input.setAttribute( "type", "radio" );
+       support.radioValue = input.value === "t";
+
+       input.setAttribute( "checked", "checked" );
+
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       input.setAttribute( "name", "t" );
+
+       div.appendChild( input );
+       fragment = document.createDocumentFragment();
+       fragment.appendChild( div.lastChild );
+
+       // WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
+
+       fragment.removeChild( input );
+       fragment.appendChild( div );
+
+       // Technique from Juriy Zaytsev
+       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+       // We only care about the case where non-standard event systems
+       // are used, namely in IE. Short-circuiting here helps us to
+       // avoid an eval call (in setAttribute) which can cause CSP
+       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+       if ( div.attachEvent ) {
+               for ( i in {
+                       submit: true,
+                       change: true,
+                       focusin: true
+               }) {
+                       eventName = "on" + i;
+                       isSupported = ( eventName in div );
+                       if ( !isSupported ) {
+                               div.setAttribute( eventName, "return;" );
+                               isSupported = ( typeof div[ eventName ] === "function" );
+                       }
+                       support[ i + "Bubbles" ] = isSupported;
+               }
+       }
+
+       // Run tests that need a body at doc ready
+       jQuery(function() {
+               var container, div, tds, marginDiv,
+                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+                       body = document.getElementsByTagName("body")[0];
+
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       return;
+               }
+
+               container = document.createElement("div");
+               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+               body.insertBefore( container, body.firstChild );
+
+               // Construct the test element
+               div = document.createElement("div");
+               container.appendChild( div );
+
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               // (only IE 8 fails this test)
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName("td");
+               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+               tds[ 0 ].style.display = "";
+               tds[ 1 ].style.display = "none";
+
+               // Check if empty table cells still have offsetWidth/Height
+               // (IE <= 8 fail this test)
+               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+               // Check box-sizing and margin behavior
+               div.innerHTML = "";
+               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+               support.boxSizing = ( div.offsetWidth === 4 );
+               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+               // NOTE: To any future maintainer, we've window.getComputedStyle
+               // because jsdom on node.js will break without it.
+               if ( window.getComputedStyle ) {
+                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+                       // Check if div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container. For more
+                       // info see bug #3333
+                       // Fails in WebKit before Feb 2011 nightlies
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       marginDiv = document.createElement("div");
+                       marginDiv.style.cssText = div.style.cssText = divReset;
+                       marginDiv.style.marginRight = marginDiv.style.width = "0";
+                       div.style.width = "1px";
+                       div.appendChild( marginDiv );
+                       support.reliableMarginRight =
+                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+               }
+
+               if ( typeof div.style.zoom !== "undefined" ) {
+                       // Check if natively block-level elements act like inline-block
+                       // elements when setting their display to 'inline' and giving
+                       // them layout
+                       // (IE < 8 does this)
+                       div.innerHTML = "";
+                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+                       // Check if elements with layout shrink-wrap their children
+                       // (IE 6 does this)
+                       div.style.display = "block";
+                       div.style.overflow = "visible";
+                       div.innerHTML = "<div></div>";
+                       div.firstChild.style.width = "5px";
+                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+                       container.style.zoom = 1;
+               }
+
+               // Null elements to avoid leaks in IE
+               body.removeChild( container );
+               container = div = tds = marginDiv = null;
+       });
+
+       // Null elements to avoid leaks in IE
+       fragment.removeChild( div );
+       all = a = select = opt = input = fragment = div = null;
+
+       return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+       cache: {},
+
+       deletedIds: [],
+
+       // Remove at next major release (1.9/2.0)
+       uuid: 0,
+
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+               "applet": true
+       },
+
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
+
+       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
+
+                       // We have to handle DOM nodes and JS objects differently because IE6-7
+                       // can't GC object references properly across the DOM-JS boundary
+                       isNode = elem.nodeType,
+
+                       // Only DOM nodes need the global jQuery cache; JS object data is
+                       // attached directly to the object so GC can occur automatically
+                       cache = isNode ? jQuery.cache : elem,
+
+                       // Only defining an ID for JS objects if its cache already exists allows
+                       // the code to shortcut on the same path as a DOM node with no cache
+                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+               // Avoid doing any more work than we need to when trying to get data on an
+               // object that has no data at all
+               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+                       return;
+               }
+
+               if ( !id ) {
+                       // Only DOM nodes need a new unique ID for each element since their data
+                       // ends up in the global cache
+                       if ( isNode ) {
+                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
+                       } else {
+                               id = internalKey;
+                       }
+               }
+
+               if ( !cache[ id ] ) {
+                       cache[ id ] = {};
+
+                       // Avoids exposing jQuery metadata on plain JS objects when the object
+                       // is serialized using JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
+                       }
+               }
+
+               // An object can be passed to jQuery.data instead of a key/value pair; this gets
+               // shallow copied over onto the existing cache
+               if ( typeof name === "object" || typeof name === "function" ) {
+                       if ( pvt ) {
+                               cache[ id ] = jQuery.extend( cache[ id ], name );
+                       } else {
+                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+                       }
+               }
+
+               thisCache = cache[ id ];
+
+               // jQuery data() is stored in a separate object inside the object's internal data
+               // cache in order to avoid key collisions between internal data and user-defined
+               // data.
+               if ( !pvt ) {
+                       if ( !thisCache.data ) {
+                               thisCache.data = {};
+                       }
+
+                       thisCache = thisCache.data;
+               }
+
+               if ( data !== undefined ) {
+                       thisCache[ jQuery.camelCase( name ) ] = data;
+               }
+
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
+
+                       // First Try to find as-is property data
+                       ret = thisCache[ name ];
+
+                       // Test for null|undefined property data
+                       if ( ret == null ) {
+
+                               // Try to find the camelCased property
+                               ret = thisCache[ jQuery.camelCase( name ) ];
+                       }
+               } else {
+                       ret = thisCache;
+               }
+
+               return ret;
+       },
+
+       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
+
+               var thisCache, i, l,
+
+                       isNode = elem.nodeType,
+
+                       // See jQuery.data for more information
+                       cache = isNode ? jQuery.cache : elem,
+                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+               // If there is already no cache entry for this object, there is no
+               // purpose in continuing
+               if ( !cache[ id ] ) {
+                       return;
+               }
+
+               if ( name ) {
+
+                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+                       if ( thisCache ) {
+
+                               // Support array or space separated string names for data keys
+                               if ( !jQuery.isArray( name ) ) {
+
+                                       // try the string as a key before any manipulation
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
+
+                                               // split the camel cased version by spaces unless a key with the spaces exists
+                                               name = jQuery.camelCase( name );
+                                               if ( name in thisCache ) {
+                                                       name = [ name ];
+                                               } else {
+                                                       name = name.split(" ");
+                                               }
+                                       }
+                               }
+
+                               for ( i = 0, l = name.length; i < l; i++ ) {
+                                       delete thisCache[ name[i] ];
+                               }
+
+                               // If there is no data left in the cache, we want to continue
+                               // and let the cache object itself get destroyed
+                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+                                       return;
+                               }
+                       }
+               }
+
+               // See jQuery.data for more information
+               if ( !pvt ) {
+                       delete cache[ id ].data;
+
+                       // Don't destroy the parent cache unless the internal data object
+                       // had been the only thing left in it
+                       if ( !isEmptyDataObject( cache[ id ] ) ) {
+                               return;
+                       }
+               }
+
+               // Destroy the cache
+               if ( isNode ) {
+                       jQuery.cleanData( [ elem ], true );
+
+               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+                       delete cache[ id ];
+
+               // When all else fails, null
+               } else {
+                       cache[ id ] = null;
+               }
+       },
+
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return jQuery.data( elem, name, data, true );
+       },
+
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+               // nodes accept data unless otherwise specified; rejection can be conditional
+               return !noData || noData !== true && elem.getAttribute("classid") === noData;
+       }
+});
+
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var parts, part, attr, name, l,
+                       elem = this[0],
+                       i = 0,
+                       data = null;
+
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = jQuery.data( elem );
+
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       attr = elem.attributes;
+                                       for ( l = attr.length; i < l; i++ ) {
+                                               name = attr[i].name;
+
+                                               if ( !name.indexOf( "data-" ) ) {
+                                                       name = jQuery.camelCase( name.substring(5) );
+
+                                                       dataAttr( elem, name, data[ name ] );
+                                               }
+                                       }
+                                       jQuery._data( elem, "parsedAttrs", true );
+                               }
+                       }
+
+                       return data;
+               }
+
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
+
+               parts = key.split( ".", 2 );
+               parts[1] = parts[1] ? "." + parts[1] : "";
+               part = parts[1] + "!";
+
+               return jQuery.access( this, function( value ) {
+
+                       if ( value === undefined ) {
+                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+                               // Try to fetch any internally stored data first
+                               if ( data === undefined && elem ) {
+                                       data = jQuery.data( elem, key );
+                                       data = dataAttr( elem, key, data );
+                               }
+
+                               return data === undefined && parts[1] ?
+                                       this.data( parts[0] ) :
+                                       data;
+                       }
+
+                       parts[1] = value;
+                       this.each(function() {
+                               var self = jQuery( this );
+
+                               self.triggerHandler( "setData" + part, parts );
+                               jQuery.data( this, key, value );
+                               self.triggerHandler( "changeData" + part, parts );
+                       });
+               }, null, value, arguments.length > 1, null, false );
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
+       }
+});
+
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+               data = elem.getAttribute( name );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               // Only convert to a number if it doesn't change the string
+                               +data + "" === data ? +data :
+                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
+
+               } else {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       var name;
+       for ( name in obj ) {
+
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
+
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = jQuery._data( elem, type );
+
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || jQuery.isArray(data) ) {
+                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
+
+       dequeue: function( elem, type ) {
+               type = type || "fx";
+
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
+
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
+
+               if ( fn ) {
+
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
+
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               jQuery.removeData( elem, type + "queue", true );
+                               jQuery.removeData( elem, key, true );
+                       })
+               });
+       }
+});
+
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
+
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
+
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
+
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
+
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
+                       };
+
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
+               }
+               type = type || "fx";
+
+               while( i-- ) {
+                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
+                       }
+               }
+               resolve();
+               return defer.promise( obj );
+       }
+});
+var nodeHook, boolHook, fixSpecified,
+       rclass = /[\t\r\n]/g,
+       rreturn = /\r/g,
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea|)$/i,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
+
+       prop: function( name, value ) {
+               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
+
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       },
+
+       addClass: function( value ) {
+               var classNames, i, l, elem,
+                       setClass, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call(this, j, this.className) );
+                       });
+               }
+
+               if ( value && typeof value === "string" ) {
+                       classNames = value.split( core_rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className && classNames.length === 1 ) {
+                                               elem.className = value;
+
+                                       } else {
+                                               setClass = " " + elem.className + " ";
+
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
+                                                               setClass += classNames[ c ] + " ";
+                                                       }
+                                               }
+                                               elem.className = jQuery.trim( setClass );
+                                       }
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       removeClass: function( value ) {
+               var removes, className, elem, c, cl, i, l;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call(this, j, this.className) );
+                       });
+               }
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       removes = ( value || "" ).split( core_rspace );
+
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+                               if ( elem.nodeType === 1 && elem.className ) {
+
+                                       className = (" " + elem.className + " ").replace( rclass, " " );
+
+                                       // loop over each item in the removal list
+                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
+                                               // Remove until there is nothing to remove,
+                                               while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
+                                                       className = className.replace( " " + removes[ c ] + " " , " " );
+                                               }
+                                       }
+                                       elem.className = value ? jQuery.trim( className ) : "";
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value,
+                       isBool = typeof stateVal === "boolean";
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
+
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       state = stateVal,
+                                       classNames = value.split( core_rspace );
+
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
+                               }
+
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
+                               }
+
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
+
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       },
+
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
+
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
+                               }
+
+                               ret = elem.value;
+
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
+
+                       return;
+               }
+
+               isFunction = jQuery.isFunction( value );
+
+               return this.each(function( i ) {
+                       var val,
+                               self = jQuery(this);
+
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
+
+                       if ( isFunction ) {
+                               val = value.call( this, i, self.val() );
+                       } else {
+                               val = value;
+                       }
+
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
+                       }
+
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // attributes.value is undefined in Blackberry 4.7 but
+                               // uses .value. See #6932
+                               var val = elem.attributes.value;
+                               return !val || val.specified ? elem.value : elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, i, max, option,
+                                       index = elem.selectedIndex,
+                                       values = [],
+                                       options = elem.options,
+                                       one = elem.type === "select-one";
+
+                               // Nothing was selected
+                               if ( index < 0 ) {
+                                       return null;
+                               }
+
+                               // Loop through all the selected options
+                               i = one ? index : 0;
+                               max = one ? index + 1 : options.length;
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
+
+                                       // Don't return options that are disabled or in a disabled optgroup
+                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
+
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
+
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
+
+                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+                               if ( one && !values.length && options.length ) {
+                                       return jQuery( options[ index ] ).val();
+                               }
+
+                               return values;
+                       },
+
+                       set: function( elem, value ) {
+                               var values = jQuery.makeArray( value );
+
+                               jQuery(elem).find("option").each(function() {
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                               });
+
+                               if ( !values.length ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
+
+       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+       attrFn: {},
+
+       attr: function( elem, name, value, pass ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === "undefined" ) {
+                       return jQuery.prop( elem, name, value );
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( notxml ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+               }
+
+               if ( value !== undefined ) {
+
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+                               return;
+
+                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               elem.setAttribute( name, value + "" );
+                               return value;
+                       }
+
+               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
+
+               } else {
+
+                       ret = elem.getAttribute( name );
+
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret === null ?
+                               undefined :
+                               ret;
+               }
+       },
+
+       removeAttr: function( elem, value ) {
+               var propName, attrNames, name, isBool,
+                       i = 0;
+
+               if ( value && elem.nodeType === 1 ) {
+
+                       attrNames = value.split( core_rspace );
+
+                       for ( ; i < attrNames.length; i++ ) {
+                               name = attrNames[ i ];
+
+                               if ( name ) {
+                                       propName = jQuery.propFix[ name ] || name;
+                                       isBool = rboolean.test( name );
+
+                                       // See #9699 for explanation of this approach (setting first, then removal)
+                                       // Do not do this for boolean attributes (see #10870)
+                                       if ( !isBool ) {
+                                               jQuery.attr( elem, name, "" );
+                                       }
+                                       elem.removeAttribute( getSetAttribute ? name : propName );
+
+                                       // Set corresponding property to false for boolean attributes
+                                       if ( isBool && propName in elem ) {
+                                               elem[ propName ] = false;
+                                       }
+                               }
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
+                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to it's default in case type is set after value
+                                       // This is for element creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               },
+               // Use the value property for back compat
+               // Use the nodeHook for button elements in IE6/7 (#1954)
+               value: {
+                       get: function( elem, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.get( elem, name );
+                               }
+                               return name in elem ?
+                                       elem.value :
+                                       null;
+                       },
+                       set: function( elem, value, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.set( elem, value, name );
+                               }
+                               // Does not return so that setAttribute is also used
+                               elem.value = value;
+                       }
+               }
+       },
+
+       propFix: {
+               tabindex: "tabIndex",
+               readonly: "readOnly",
+               "for": "htmlFor",
+               "class": "className",
+               maxlength: "maxLength",
+               cellspacing: "cellSpacing",
+               cellpadding: "cellPadding",
+               rowspan: "rowSpan",
+               colspan: "colSpan",
+               usemap: "useMap",
+               frameborder: "frameBorder",
+               contenteditable: "contentEditable"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
+
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
+
+               if ( value !== undefined ) {
+                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               return ( elem[ name ] = value );
+                       }
+
+               } else {
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                               return ret;
+
+                       } else {
+                               return elem[ name ];
+                       }
+               }
+       },
+
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               var attributeNode = elem.getAttributeNode("tabindex");
+
+                               return attributeNode && attributeNode.specified ?
+                                       parseInt( attributeNode.value, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               undefined;
+                       }
+               }
+       }
+});
+
+// Hook for boolean attributes
+boolHook = {
+       get: function( elem, name ) {
+               // Align boolean attributes with corresponding properties
+               // Fall back to attribute presence where some booleans are not supported
+               var attrNode,
+                       property = jQuery.prop( elem, name );
+               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+                       name.toLowerCase() :
+                       undefined;
+       },
+       set: function( elem, value, name ) {
+               var propName;
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       // value is true since we know at this point it's type boolean and not false
+                       // Set boolean attributes to the same name and set the DOM property
+                       propName = jQuery.propFix[ name ] || name;
+                       if ( propName in elem ) {
+                               // Only set the IDL specifically if it already exists on the element
+                               elem[ propName ] = true;
+                       }
+
+                       elem.setAttribute( name, name.toLowerCase() );
+               }
+               return name;
+       }
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+       fixSpecified = {
+               name: true,
+               id: true,
+               coords: true
+       };
+
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret;
+                       ret = elem.getAttributeNode( name );
+                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+                               ret.value :
+                               undefined;
+               },
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               ret = document.createAttribute( name );
+                               elem.setAttributeNode( ret );
+                       }
+                       return ( ret.value = value + "" );
+               }
+       };
+
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
+                       }
+               });
+       });
+
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               get: nodeHook.get,
+               set: function( elem, value, name ) {
+                       if ( value === "" ) {
+                               value = "false";
+                       }
+                       nodeHook.set( elem, value, name );
+               }
+       };
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       get: function( elem ) {
+                               var ret = elem.getAttribute( name, 2 );
+                               return ret === null ? undefined : ret;
+                       }
+               });
+       });
+}
+
+if ( !jQuery.support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Normalize to lowercase since IE uppercases css property names
+                       return elem.style.cssText.toLowerCase() || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = value + "" );
+               }
+       };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
+
+                       if ( parent ) {
+                               parent.selectedIndex;
+
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
+               }
+       });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+       jQuery.each([ "radio", "checkbox" ], function() {
+               jQuery.valHooks[ this ] = {
+                       get: function( elem ) {
+                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                               return elem.getAttribute("value") === null ? "on" : elem.value;
+                       }
+               };
+       });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       });
+});
+var rformElems = /^(?:textarea|input|select)$/i,
+       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       hoverHack = function( events ) {
+               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+       add: function( elem, types, handler, data, selector ) {
+
+               var elemData, eventHandle, events,
+                       t, tns, type, namespaces, handleObj,
+                       handleObjIn, handlers, special;
+
+               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+                       return;
+               }
+
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
+               }
+
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
+
+               // Init the element's event structure and main handler, if this is the first
+               events = elemData.events;
+               if ( !events ) {
+                       elemData.events = events = {};
+               }
+               eventHandle = elemData.handle;
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
+                       };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
+               }
+
+               // Handle multiple events separated by a space
+               // jQuery(...).bind("mouseover mouseout", fn);
+               types = jQuery.trim( hoverHack(types) ).split( " " );
+               for ( t = 0; t < types.length; t++ ) {
+
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = tns[1];
+                       namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
+
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: tns[1],
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
+
+                       // Init the event handler queue if we're the first
+                       handlers = events[ type ];
+                       if ( !handlers ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
+
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
+
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
+
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
+
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
+                               }
+                       }
+
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
+
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
+
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
+
+       global: {},
+
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+
+               var t, tns, type, origType, namespaces, origCount,
+                       j, events, special, eventType, handleObj,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
+
+               // Once for each type.namespace in types; type may be omitted
+               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+               for ( t = 0; t < types.length; t++ ) {
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tns[1];
+                       namespaces = tns[2];
+
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+                               }
+                               continue;
+                       }
+
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector? special.delegateType : special.bindType ) || type;
+                       eventType = events[ type ] || [];
+                       origCount = eventType.length;
+                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+
+                       // Remove matching events
+                       for ( j = 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
+
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                        ( !handler || handler.guid === handleObj.guid ) &&
+                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       eventType.splice( j--, 1 );
+
+                                       if ( handleObj.selector ) {
+                                               eventType.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
+
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( eventType.length === 0 && origCount !== eventType.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
+
+                               delete events[ type ];
+                       }
+               }
+
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
+
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery.removeData( elem, "events", true );
+               }
+       },
+
+       // Events that are safe to short-circuit if no handlers are attached.
+       // Native DOM events should not be added, they may have inline handlers.
+       customEvent: {
+               "getData": true,
+               "setData": true,
+               "changeData": true
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+               // Don't do events on text and comment nodes
+               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+                       return;
+               }
+
+               // Event object or event type
+               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+                       type = event.type || event,
+                       namespaces = [];
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
+
+               if ( type.indexOf( "!" ) >= 0 ) {
+                       // Exclusive events trigger only for the exact event (no namespaces)
+                       type = type.slice(0, -1);
+                       exclusive = true;
+               }
+
+               if ( type.indexOf( "." ) >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+
+               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                       // No jQuery handlers for this event type, and it can't have inline handlers
+                       return;
+               }
+
+               // Caller can pass in an Event, Object, or just an event type string
+               event = typeof event === "object" ?
+                       // jQuery.Event object
+                       event[ jQuery.expando ] ? event :
+                       // Object literal
+                       new jQuery.Event( type, event ) :
+                       // Just the event type (string)
+                       new jQuery.Event( type );
+
+               event.type = type;
+               event.isTrigger = true;
+               event.exclusive = exclusive;
+               event.namespace = namespaces.join( "." );
+               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+               // Handle a global trigger
+               if ( !elem ) {
+
+                       // TODO: Stop taunting the data cache; remove global events and always attach to document
+                       cache = jQuery.cache;
+                       for ( i in cache ) {
+                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                               }
+                       }
+                       return;
+               }
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data != null ? jQuery.makeArray( data ) : [];
+               data.unshift( event );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
+               }
+
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               eventPath = [[ elem, special.bindType || type ]];
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+                       for ( old = elem; cur; cur = cur.parentNode ) {
+                               eventPath.push([ cur, bubbleType ]);
+                               old = cur;
+                       }
+
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( old === (elem.ownerDocument || document) ) {
+                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+                       }
+               }
+
+               // Fire handlers on the event path
+               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+                       cur = eventPath[i][0];
+                       event.type = eventPath[i][1];
+
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+                       // Note that this is a bare JS function and not a jQuery handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
+                       }
+               }
+               event.type = type;
+
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               // IE<9 dies on focus/blur to hidden element (#1486)
+                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       old = elem[ ontype ];
+
+                                       if ( old ) {
+                                               elem[ ontype ] = null;
+                                       }
+
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
+
+                                       if ( old ) {
+                                               elem[ ontype ] = old;
+                                       }
+                               }
+                       }
+               }
+
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event || window.event );
+
+               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+                       delegateCount = handlers.delegateCount,
+                       args = core_slice.call( arguments ),
+                       run_all = !event.exclusive && !event.namespace,
+                       special = jQuery.event.special[ event.type ] || {},
+                       handlerQueue = [];
+
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
+
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
+               // Determine handlers that should run if there are delegated events
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && !(event.button && event.type === "click") ) {
+
+                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.disabled !== true || event.type !== "click" ) {
+                                       selMatch = {};
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+                                               sel = handleObj.selector;
+
+                                               if ( selMatch[ sel ] === undefined ) {
+                                                       selMatch[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) >= 0 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
+                                               }
+                                               if ( selMatch[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, matches: matches });
+                                       }
+                               }
+                       }
+               }
+
+               // Add the remaining (directly-bound) handlers
+               if ( handlers.length > delegateCount ) {
+                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+               }
+
+               // Run delegates first; they may want to stop propagation beneath us
+               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+                       matched = handlerQueue[ i ];
+                       event.currentTarget = matched.elem;
+
+                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+                               handleObj = matched.matches[ j ];
+
+                               // Triggered event must either 1) be non-exclusive and have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
+
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
+               return event.result;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+       fixHooks: {},
+
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
+
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
+                       }
+
+                       return event;
+               }
+       },
+
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var eventDoc, doc, body,
+                               button = original.button,
+                               fromElement = original.fromElement;
+
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
+
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
+
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
+
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+                       }
+
+                       return event;
+               }
+       },
+
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
+
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop,
+                       originalEvent = event,
+                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
+                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+               event = jQuery.Event( originalEvent );
+
+               for ( i = copy.length; i; ) {
+                       prop = copy[ --i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
+
+               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
+
+               // Target should not be a text node (#504, Safari)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+               event.metaKey = !!event.metaKey;
+
+               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+
+               focus: {
+                       delegateType: "focusin"
+               },
+               blur: {
+                       delegateType: "focusout"
+               },
+
+               beforeunload: {
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( jQuery.isWindow( this ) ) {
+                                       this.onbeforeunload = eventHandle;
+                               }
+                       },
+
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
+                               }
+                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       { type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               var name = "on" + type;
+
+               if ( elem.detachEvent ) {
+
+                       // #8545, #7054, preventing memory leaks for custom events in IE6-8 â€“
+                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
+                       if ( typeof elem[ name ] === "undefined" ) {
+                               elem[ name ] = null;
+                       }
+
+                       elem.detachEvent( name, handle );
+               }
+       };
+
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
+
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+       // Event type
+       } else {
+               this.type = src;
+       }
+
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
+
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
+
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       preventDefault: function() {
+               this.isDefaultPrevented = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+
+               // if preventDefault exists run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
+
+               // otherwise set the returnValue property of the original event to false (IE)
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               this.isPropagationStopped = returnTrue;
+
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               // if stopPropagation exists run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+               // otherwise set the cancelBubble property of the original event to true (IE)
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj,
+                               selector = handleObj.selector;
+
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               event._submit_bubble = true;
+                                       });
+                                       jQuery._data( form, "_submit_attached", true );
+                               }
+                       });
+                       // return undefined since we don't need an event listener
+               },
+
+               postDispatch: function( event ) {
+                       // If form was submitted by the user, bubble the event up the tree
+                       if ( event._submit_bubble ) {
+                               delete event._submit_bubble;
+                               if ( this.parentNode && !event.isTrigger ) {
+                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                               }
+                       }
+               },
+
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
+
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
+               }
+       };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+       jQuery.event.special.change = {
+
+               setup: function() {
+
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
+                                               }
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
+                                                       this._just_changed = false;
+                                               }
+                                               // Allow triggered, simulated change events (#11500)
+                                               jQuery.event.simulate( "change", this, event, true );
+                                       });
+                               }
+                               return false;
+                       }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
+
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       jQuery._data( elem, "_change_attached", true );
+                               }
+                       });
+               },
+
+               handle: function( event ) {
+                       var elem = event.target;
+
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
+                       }
+               },
+
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
+
+                       return !rformElems.test( this.nodeName );
+               }
+       };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
+
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
+                               }
+                       }
+               };
+       });
+}
+
+jQuery.fn.extend({
+
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var origFn, type;
+
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) { // && selector != null
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
+               }
+
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
+
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on( types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
+                       }
+                       return this;
+               }
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       live: function( types, data, fn ) {
+               jQuery( this.context ).on( types, this.selector, data, fn );
+               return this;
+       },
+       die: function( types, fn ) {
+               jQuery( this.context ).off( types, this.selector || "**", fn );
+               return this;
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               if ( this[0] ) {
+                       return jQuery.event.trigger( type, data, this[0], true );
+               }
+       },
+
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments,
+                       guid = fn.guid || jQuery.guid++,
+                       i = 0,
+                       toggler = function( event ) {
+                               // Figure out which function to execute
+                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+                               // Make sure that clicks stop
+                               event.preventDefault();
+
+                               // and execute the function
+                               return args[ lastToggle ].apply( this, arguments ) || false;
+                       };
+
+               // link all the functions, so any of them can unbind this click handler
+               toggler.guid = guid;
+               while ( i < args.length ) {
+                       args[ i++ ].guid = guid;
+               }
+
+               return this.click( toggler );
+       },
+
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+       }
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
+               }
+
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+
+       if ( rkeyEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+       }
+
+       if ( rmouseEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+       }
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var cachedruns,
+       assertGetIdNotName,
+       Expr,
+       getText,
+       isXML,
+       contains,
+       compile,
+       sortOrder,
+       hasDuplicate,
+       outermostContext,
+
+       baseHasDuplicate = true,
+       strundefined = "undefined",
+
+       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
+
+       Token = String,
+       document = window.document,
+       docElem = document.documentElement,
+       dirruns = 0,
+       done = 0,
+       pop = [].pop,
+       push = [].push,
+       slice = [].slice,
+       // Use a stripped-down indexOf if a native one is unavailable
+       indexOf = [].indexOf || function( elem ) {
+               var i = 0,
+                       len = this.length;
+               for ( ; i < len; i++ ) {
+                       if ( this[i] === elem ) {
+                               return i;
+                       }
+               }
+               return -1;
+       },
+
+       // Augment a function for special use by Sizzle
+       markFunction = function( fn, value ) {
+               fn[ expando ] = value == null || value;
+               return fn;
+       },
+
+       createCache = function() {
+               var cache = {},
+                       keys = [];
+
+               return markFunction(function( key, value ) {
+                       // Only keep the most recent entries
+                       if ( keys.push( key ) > Expr.cacheLength ) {
+                               delete cache[ keys.shift() ];
+                       }
+
+                       return (cache[ key ] = value);
+               }, cache );
+       },
+
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+
+       // Regex
+
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+       whitespace = "[\\x20\\t\\r\\n\\f]",
+       // http://www.w3.org/TR/css3-syntax/#characters
+       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
+
+       // Loosely modeled on CSS identifier characters
+       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+       identifier = characterEncoding.replace( "w", "w#" ),
+
+       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+       operators = "([*^$|!~]?=)",
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+       // Prefer arguments not in parens/brackets,
+       //   then attribute selectors and non-pseudos (denoted by :),
+       //   then anything else
+       // These preferences are here to reduce the number of selectors
+       //   needing tokenize in the PSEUDO preFilter
+       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
+
+       // For matchExpr.POS and matchExpr.needsContext
+       pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+               "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
+
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+       rpseudo = new RegExp( pseudos ),
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
+
+       rnot = /^:not/,
+       rsibling = /[\x20\t\r\n\f]*[+~]/,
+       rendsWithNot = /:not\($/,
+
+       rheader = /h\d/i,
+       rinputs = /input|select|textarea|button/i,
+
+       rbackslash = /\\(?!\\)/g,
+
+       matchExpr = {
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+               "ATTR": new RegExp( "^" + attributes ),
+               "PSEUDO": new RegExp( "^" + pseudos ),
+               "POS": new RegExp( pos, "i" ),
+               "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+               // For use in libraries implementing .is()
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
+       },
+
+       // Support
+
+       // Used for testing something on an element
+       assert = function( fn ) {
+               var div = document.createElement("div");
+
+               try {
+                       return fn( div );
+               } catch (e) {
+                       return false;
+               } finally {
+                       // release memory in IE
+                       div = null;
+               }
+       },
+
+       // Check if getElementsByTagName("*") returns only elements
+       assertTagNameNoComments = assert(function( div ) {
+               div.appendChild( document.createComment("") );
+               return !div.getElementsByTagName("*").length;
+       }),
+
+       // Check if getAttribute returns normalized href attributes
+       assertHrefNotNormalized = assert(function( div ) {
+               div.innerHTML = "<a href='#'></a>";
+               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+                       div.firstChild.getAttribute("href") === "#";
+       }),
+
+       // Check if attributes should be retrieved by attribute nodes
+       assertAttributes = assert(function( div ) {
+               div.innerHTML = "<select></select>";
+               var type = typeof div.lastChild.getAttribute("multiple");
+               // IE8 returns a string for some attributes even when not present
+               return type !== "boolean" && type !== "string";
+       }),
+
+       // Check if getElementsByClassName can be trusted
+       assertUsableClassName = assert(function( div ) {
+               // Opera can't find a second classname (in 9.6)
+               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+                       return false;
+               }
+
+               // Safari 3.2 caches class attributes and doesn't catch changes
+               div.lastChild.className = "e";
+               return div.getElementsByClassName("e").length === 2;
+       }),
+
+       // Check if getElementById returns elements by name
+       // Check if getElementsByName privileges form controls or returns elements by ID
+       assertUsableName = assert(function( div ) {
+               // Inject content
+               div.id = expando + 0;
+               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+               docElem.insertBefore( div, docElem.firstChild );
+
+               // Test
+               var pass = document.getElementsByName &&
+                       // buggy browsers will return fewer than the correct 2
+                       document.getElementsByName( expando ).length === 2 +
+                       // buggy browsers will return more than the correct 0
+                       document.getElementsByName( expando + 0 ).length;
+               assertGetIdNotName = !document.getElementById( expando );
+
+               // Cleanup
+               docElem.removeChild( div );
+
+               return pass;
+       });
+
+// If slice is not available, provide a backup
+try {
+       slice.call( docElem.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+       slice = function( i ) {
+               var elem,
+                       results = [];
+               for ( ; (elem = this[i]); i++ ) {
+                       results.push( elem );
+               }
+               return results;
+       };
+}
+
+function Sizzle( selector, context, results, seed ) {
+       results = results || [];
+       context = context || document;
+       var match, elem, xml, m,
+               nodeType = context.nodeType;
+
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       if ( nodeType !== 1 && nodeType !== 9 ) {
+               return [];
+       }
+
+       xml = isXML( context );
+
+       if ( !xml && !seed ) {
+               if ( (match = rquickExpr.exec( selector )) ) {
+                       // Speed-up: Sizzle("#ID")
+                       if ( (m = match[1]) ) {
+                               if ( nodeType === 9 ) {
+                                       elem = context.getElementById( m );
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE, Opera, and Webkit return items
+                                               // by name instead of ID
+                                               if ( elem.id === m ) {
+                                                       results.push( elem );
+                                                       return results;
+                                               }
+                                       } else {
+                                               return results;
+                                       }
+                               } else {
+                                       // Context is not a document
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+                                               contains( context, elem ) && elem.id === m ) {
+                                               results.push( elem );
+                                               return results;
+                                       }
+                               }
+
+                       // Speed-up: Sizzle("TAG")
+                       } else if ( match[2] ) {
+                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+                               return results;
+
+                       // Speed-up: Sizzle(".CLASS")
+                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
+                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+                               return results;
+                       }
+               }
+       }
+
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
+}
+
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+       return Sizzle( expr, null, null, [ elem ] ).length > 0;
+};
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return name === "input" && elem.type === type;
+       };
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return (name === "input" || name === "button") && elem.type === type;
+       };
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+       return markFunction(function( argument ) {
+               argument = +argument;
+               return markFunction(function( seed, matches ) {
+                       var j,
+                               matchIndexes = fn( [], seed.length, argument ),
+                               i = matchIndexes.length;
+
+                       // Match elements found at the specified indexes
+                       while ( i-- ) {
+                               if ( seed[ (j = matchIndexes[i]) ] ) {
+                                       seed[j] = !(matches[j] = seed[j]);
+                               }
+                       }
+               });
+       });
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+       var node,
+               ret = "",
+               i = 0,
+               nodeType = elem.nodeType;
+
+       if ( nodeType ) {
+               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+                       // Use textContent for elements
+                       // innerText usage removed for consistency of new lines (see #11153)
+                       if ( typeof elem.textContent === "string" ) {
+                               return elem.textContent;
+                       } else {
+                               // Traverse its children
+                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                                       ret += getText( elem );
+                               }
+                       }
+               } else if ( nodeType === 3 || nodeType === 4 ) {
+                       return elem.nodeValue;
+               }
+               // Do not include comment or processing instruction nodes
+       } else {
+
+               // If no nodeType, this is expected to be an array
+               for ( ; (node = elem[i]); i++ ) {
+                       // Do not traverse comment nodes
+                       ret += getText( node );
+               }
+       }
+       return ret;
+};
+
+isXML = Sizzle.isXML = function( elem ) {
+       // documentElement is verified for cases where it doesn't yet exist
+       // (such as loading iframes in IE - #4833)
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Element contains another
+contains = Sizzle.contains = docElem.contains ?
+       function( a, b ) {
+               var adown = a.nodeType === 9 ? a.documentElement : a,
+                       bup = b && b.parentNode;
+               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
+       } :
+       docElem.compareDocumentPosition ?
+       function( a, b ) {
+               return b && !!( a.compareDocumentPosition( b ) & 16 );
+       } :
+       function( a, b ) {
+               while ( (b = b.parentNode) ) {
+                       if ( b === a ) {
+                               return true;
+                       }
+               }
+               return false;
+       };
+
+Sizzle.attr = function( elem, name ) {
+       var val,
+               xml = isXML( elem );
+
+       if ( !xml ) {
+               name = name.toLowerCase();
+       }
+       if ( (val = Expr.attrHandle[ name ]) ) {
+               return val( elem );
+       }
+       if ( xml || assertAttributes ) {
+               return elem.getAttribute( name );
+       }
+       val = elem.getAttributeNode( name );
+       return val ?
+               typeof elem[ name ] === "boolean" ?
+                       elem[ name ] ? name : null :
+                       val.specified ? val.value : null :
+               null;
+};
+
+Expr = Sizzle.selectors = {
+
+       // Can be adjusted by the user
+       cacheLength: 50,
+
+       createPseudo: markFunction,
+
+       match: matchExpr,
+
+       // IE6/7 return a modified href
+       attrHandle: assertHrefNotNormalized ?
+               {} :
+               {
+                       "href": function( elem ) {
+                               return elem.getAttribute( "href", 2 );
+                       },
+                       "type": function( elem ) {
+                               return elem.getAttribute("type");
+                       }
+               },
+
+       find: {
+               "ID": assertGetIdNotName ?
+                       function( id, context, xml ) {
+                               if ( typeof context.getElementById !== strundefined && !xml ) {
+                                       var m = context.getElementById( id );
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       return m && m.parentNode ? [m] : [];
+                               }
+                       } :
+                       function( id, context, xml ) {
+                               if ( typeof context.getElementById !== strundefined && !xml ) {
+                                       var m = context.getElementById( id );
+
+                                       return m ?
+                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+                                                       [m] :
+                                                       undefined :
+                                               [];
+                               }
+                       },
+
+               "TAG": assertTagNameNoComments ?
+                       function( tag, context ) {
+                               if ( typeof context.getElementsByTagName !== strundefined ) {
+                                       return context.getElementsByTagName( tag );
+                               }
+                       } :
+                       function( tag, context ) {
+                               var results = context.getElementsByTagName( tag );
+
+                               // Filter out possible comments
+                               if ( tag === "*" ) {
+                                       var elem,
+                                               tmp = [],
+                                               i = 0;
+
+                                       for ( ; (elem = results[i]); i++ ) {
+                                               if ( elem.nodeType === 1 ) {
+                                                       tmp.push( elem );
+                                               }
+                                       }
+
+                                       return tmp;
+                               }
+                               return results;
+                       },
+
+               "NAME": assertUsableName && function( tag, context ) {
+                       if ( typeof context.getElementsByName !== strundefined ) {
+                               return context.getElementsByName( name );
+                       }
+               },
+
+               "CLASS": assertUsableClassName && function( className, context, xml ) {
+                       if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
+                               return context.getElementsByClassName( className );
+                       }
+               }
+       },
+
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
+
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( rbackslash, "" );
+
+                       // Move the given value to match[3] whether quoted or unquoted
+                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
+
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
+
+                       return match.slice( 0, 4 );
+               },
+
+               "CHILD": function( match ) {
+                       /* matches from matchExpr["CHILD"]
+                               1 type (only|nth|...)
+                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+                               3 xn-component of xn+y argument ([+-]?\d*n|)
+                               4 sign of xn-component
+                               5 x of xn-component
+                               6 sign of y-component
+                               7 y of y-component
+                       */
+                       match[1] = match[1].toLowerCase();
+
+                       if ( match[1] === "nth" ) {
+                               // nth-child requires argument
+                               if ( !match[2] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               // numeric x and y parameters for Expr.filter.CHILD
+                               // remember that false/true cast respectively to 0/1
+                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
+                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
+
+                       // other types prohibit arguments
+                       } else if ( match[2] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       return match;
+               },
+
+               "PSEUDO": function( match ) {
+                       var unquoted, excess;
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                               return null;
+                       }
+
+                       if ( match[3] ) {
+                               match[2] = match[3];
+                       } else if ( (unquoted = match[4]) ) {
+                               // Only check arguments that contain a pseudo
+                               if ( rpseudo.test(unquoted) &&
+                                       // Get excess from tokenize (recursively)
+                                       (excess = tokenize( unquoted, true )) &&
+                                       // advance to the next closing parenthesis
+                                       (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+                                       // excess is a negative index
+                                       unquoted = unquoted.slice( 0, excess );
+                                       match[0] = match[0].slice( 0, excess );
+                               }
+                               match[2] = unquoted;
+                       }
+
+                       // Return only captures needed by the pseudo filter method (type and argument)
+                       return match.slice( 0, 3 );
+               }
+       },
+
+       filter: {
+               "ID": assertGetIdNotName ?
+                       function( id ) {
+                               id = id.replace( rbackslash, "" );
+                               return function( elem ) {
+                                       return elem.getAttribute("id") === id;
+                               };
+                       } :
+                       function( id ) {
+                               id = id.replace( rbackslash, "" );
+                               return function( elem ) {
+                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                                       return node && node.value === id;
+                               };
+                       },
+
+               "TAG": function( nodeName ) {
+                       if ( nodeName === "*" ) {
+                               return function() { return true; };
+                       }
+                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
+
+                       return function( elem ) {
+                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+                       };
+               },
+
+               "CLASS": function( className ) {
+                       var pattern = classCache[ expando ][ className ];
+                       if ( !pattern ) {
+                               pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );
+                       }
+                       return function( elem ) {
+                               return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+                       };
+               },
+
+               "ATTR": function( name, operator, check ) {
+                       return function( elem, context ) {
+                               var result = Sizzle.attr( elem, name );
+
+                               if ( result == null ) {
+                                       return operator === "!=";
+                               }
+                               if ( !operator ) {
+                                       return true;
+                               }
+
+                               result += "";
+
+                               return operator === "=" ? result === check :
+                                       operator === "!=" ? result !== check :
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
+                                       operator === "$=" ? check && result.substr( result.length - check.length ) === check :
+                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
+                                       false;
+                       };
+               },
+
+               "CHILD": function( type, argument, first, last ) {
+
+                       if ( type === "nth" ) {
+                               return function( elem ) {
+                                       var node, diff,
+                                               parent = elem.parentNode;
+
+                                       if ( first === 1 && last === 0 ) {
+                                               return true;
+                                       }
+
+                                       if ( parent ) {
+                                               diff = 0;
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               diff++;
+                                                               if ( elem === node ) {
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+
+                                       // Incorporate the offset (or cast to NaN), then check against cycle size
+                                       diff -= last;
+                                       return diff === first || ( diff % first === 0 && diff / first >= 0 );
+                               };
+                       }
+
+                       return function( elem ) {
+                               var node = elem;
+
+                               switch ( type ) {
+                                       case "only":
+                                       case "first":
+                                               while ( (node = node.previousSibling) ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               return false;
+                                                       }
+                                               }
+
+                                               if ( type === "first" ) {
+                                                       return true;
+                                               }
+
+                                               node = elem;
+
+                                               /* falls through */
+                                       case "last":
+                                               while ( (node = node.nextSibling) ) {
+                                                       if ( node.nodeType === 1 ) {
+                                                               return false;
+                                                       }
+                                               }
+
+                                               return true;
+                               }
+                       };
+               },
+
+               "PSEUDO": function( pseudo, argument ) {
+                       // pseudo-class names are case-insensitive
+                       // http://www.w3.org/TR/selectors/#pseudo-classes
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+                       // Remember that setFilters inherits from pseudos
+                       var args,
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );
+
+                       // The user may use createPseudo to indicate that
+                       // arguments are needed to create the filter function
+                       // just as Sizzle does
+                       if ( fn[ expando ] ) {
+                               return fn( argument );
+                       }
+
+                       // But maintain support for old signatures
+                       if ( fn.length > 1 ) {
+                               args = [ pseudo, pseudo, "", argument ];
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+                                       markFunction(function( seed, matches ) {
+                                               var idx,
+                                                       matched = fn( seed, argument ),
+                                                       i = matched.length;
+                                               while ( i-- ) {
+                                                       idx = indexOf.call( seed, matched[i] );
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
+                                               }
+                                       }) :
+                                       function( elem ) {
+                                               return fn( elem, 0, args );
+                                       };
+                       }
+
+                       return fn;
+               }
+       },
+
+       pseudos: {
+               "not": markFunction(function( selector ) {
+                       // Trim the selector passed to compile
+                       // to avoid treating leading and trailing
+                       // spaces as combinators
+                       var input = [],
+                               results = [],
+                               matcher = compile( selector.replace( rtrim, "$1" ) );
+
+                       return matcher[ expando ] ?
+                               markFunction(function( seed, matches, context, xml ) {
+                                       var elem,
+                                               unmatched = matcher( seed, null, xml, [] ),
+                                               i = seed.length;
+
+                                       // Match elements unmatched by `matcher`
+                                       while ( i-- ) {
+                                               if ( (elem = unmatched[i]) ) {
+                                                       seed[i] = !(matches[i] = elem);
+                                               }
+                                       }
+                               }) :
+                               function( elem, context, xml ) {
+                                       input[0] = elem;
+                                       matcher( input, null, xml, results );
+                                       return !results.pop();
+                               };
+               }),
+
+               "has": markFunction(function( selector ) {
+                       return function( elem ) {
+                               return Sizzle( selector, elem ).length > 0;
+                       };
+               }),
+
+               "contains": markFunction(function( text ) {
+                       return function( elem ) {
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+                       };
+               }),
+
+               "enabled": function( elem ) {
+                       return elem.disabled === false;
+               },
+
+               "disabled": function( elem ) {
+                       return elem.disabled === true;
+               },
+
+               "checked": function( elem ) {
+                       // In CSS3, :checked should return both checked and selected elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       var nodeName = elem.nodeName.toLowerCase();
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+               },
+
+               "selected": function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+
+                       return elem.selected === true;
+               },
+
+               "parent": function( elem ) {
+                       return !Expr.pseudos["empty"]( elem );
+               },
+
+               "empty": function( elem ) {
+                       // http://www.w3.org/TR/selectors/#empty-pseudo
+                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+                       //   not comment, processing instructions, or others
+                       // Thanks to Diego Perini for the nodeName shortcut
+                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+                       var nodeType;
+                       elem = elem.firstChild;
+                       while ( elem ) {
+                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
+                                       return false;
+                               }
+                               elem = elem.nextSibling;
+                       }
+                       return true;
+               },
+
+               "header": function( elem ) {
+                       return rheader.test( elem.nodeName );
+               },
+
+               "text": function( elem ) {
+                       var type, attr;
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+                       // use getAttribute instead to test this case
+                       return elem.nodeName.toLowerCase() === "input" &&
+                               (type = elem.type) === "text" &&
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
+               },
+
+               // Input types
+               "radio": createInputPseudo("radio"),
+               "checkbox": createInputPseudo("checkbox"),
+               "file": createInputPseudo("file"),
+               "password": createInputPseudo("password"),
+               "image": createInputPseudo("image"),
+
+               "submit": createButtonPseudo("submit"),
+               "reset": createButtonPseudo("reset"),
+
+               "button": function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && elem.type === "button" || name === "button";
+               },
+
+               "input": function( elem ) {
+                       return rinputs.test( elem.nodeName );
+               },
+
+               "focus": function( elem ) {
+                       var doc = elem.ownerDocument;
+                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
+               },
+
+               "active": function( elem ) {
+                       return elem === elem.ownerDocument.activeElement;
+               },
+
+               // Positional types
+               "first": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ 0 ];
+               }),
+
+               "last": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ length - 1 ];
+               }),
+
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ argument < 0 ? argument + length : argument ];
+               }),
+
+               "even": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       for ( var i = 0; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "odd": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       for ( var i = 1; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               })
+       }
+};
+
+function siblingCheck( a, b, ret ) {
+       if ( a === b ) {
+               return ret;
+       }
+
+       var cur = a.nextSibling;
+
+       while ( cur ) {
+               if ( cur === b ) {
+                       return -1;
+               }
+
+               cur = cur.nextSibling;
+       }
+
+       return 1;
+}
+
+sortOrder = docElem.compareDocumentPosition ?
+       function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
+                       a.compareDocumentPosition :
+                       a.compareDocumentPosition(b) & 4
+               ) ? -1 : 1;
+       } :
+       function( a, b ) {
+               // The nodes are identical, we can exit early
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes
+               } else if ( a.sourceIndex && b.sourceIndex ) {
+                       return a.sourceIndex - b.sourceIndex;
+               }
+
+               var al, bl,
+                       ap = [],
+                       bp = [],
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       cur = aup;
+
+               // If the nodes are siblings (or identical) we can do a quick check
+               if ( aup === bup ) {
+                       return siblingCheck( a, b );
+
+               // If no parents were found then the nodes are disconnected
+               } else if ( !aup ) {
+                       return -1;
+
+               } else if ( !bup ) {
+                       return 1;
+               }
+
+               // Otherwise they're somewhere else in the tree so we need
+               // to build up a full list of the parentNodes for comparison
+               while ( cur ) {
+                       ap.unshift( cur );
+                       cur = cur.parentNode;
+               }
+
+               cur = bup;
+
+               while ( cur ) {
+                       bp.unshift( cur );
+                       cur = cur.parentNode;
+               }
+
+               al = ap.length;
+               bl = bp.length;
+
+               // Start walking down the tree looking for a discrepancy
+               for ( var i = 0; i < al && i < bl; i++ ) {
+                       if ( ap[i] !== bp[i] ) {
+                               return siblingCheck( ap[i], bp[i] );
+                       }
+               }
+
+               // We ended someplace up the tree so do a sibling check
+               return i === al ?
+                       siblingCheck( a, bp[i], -1 ) :
+                       siblingCheck( ap[i], b, 1 );
+       };
+
+// Always assume the presence of duplicates if sort doesn't
+// pass them to our comparison function (as in Google Chrome).
+[0, 0].sort( sortOrder );
+baseHasDuplicate = !hasDuplicate;
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               i = 1;
+
+       hasDuplicate = baseHasDuplicate;
+       results.sort( sortOrder );
+
+       if ( hasDuplicate ) {
+               for ( ; (elem = results[i]); i++ ) {
+                       if ( elem === results[ i - 1 ] ) {
+                               results.splice( i--, 1 );
+                       }
+               }
+       }
+
+       return results;
+};
+
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+function tokenize( selector, parseOnly ) {
+       var matched, match, tokens, type, soFar, groups, preFilters,
+               cached = tokenCache[ expando ][ selector ];
+
+       if ( cached ) {
+               return parseOnly ? 0 : cached.slice( 0 );
+       }
+
+       soFar = selector;
+       groups = [];
+       preFilters = Expr.preFilter;
+
+       while ( soFar ) {
+
+               // Comma and first run
+               if ( !matched || (match = rcomma.exec( soFar )) ) {
+                       if ( match ) {
+                               soFar = soFar.slice( match[0].length );
+                       }
+                       groups.push( tokens = [] );
+               }
+
+               matched = false;
+
+               // Combinators
+               if ( (match = rcombinators.exec( soFar )) ) {
+                       tokens.push( matched = new Token( match.shift() ) );
+                       soFar = soFar.slice( matched.length );
+
+                       // Cast descendant combinators to space
+                       matched.type = match[0].replace( rtrim, " " );
+               }
+
+               // Filters
+               for ( type in Expr.filter ) {
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+                               // The last two arguments here are (context, xml) for backCompat
+                               (match = preFilters[ type ]( match, document, true ))) ) {
+
+                               tokens.push( matched = new Token( match.shift() ) );
+                               soFar = soFar.slice( matched.length );
+                               matched.type = type;
+                               matched.matches = match;
+                       }
+               }
+
+               if ( !matched ) {
+                       break;
+               }
+       }
+
+       // Return the length of the invalid excess
+       // if we're just parsing
+       // Otherwise, throw an error or return tokens
+       return parseOnly ?
+               soFar.length :
+               soFar ?
+                       Sizzle.error( selector ) :
+                       // Cache the tokens
+                       tokenCache( selector, groups ).slice( 0 );
+}
+
+function addCombinator( matcher, combinator, base ) {
+       var dir = combinator.dir,
+               checkNonElements = base && combinator.dir === "parentNode",
+               doneName = done++;
+
+       return combinator.first ?
+               // Check against closest ancestor/preceding element
+               function( elem, context, xml ) {
+                       while ( (elem = elem[ dir ]) ) {
+                               if ( checkNonElements || elem.nodeType === 1  ) {
+                                       return matcher( elem, context, xml );
+                               }
+                       }
+               } :
+
+               // Check against all ancestor/preceding elements
+               function( elem, context, xml ) {
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+                       if ( !xml ) {
+                               var cache,
+                                       dirkey = dirruns + " " + doneName + " ",
+                                       cachedkey = dirkey + cachedruns;
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( checkNonElements || elem.nodeType === 1 ) {
+                                               if ( (cache = elem[ expando ]) === cachedkey ) {
+                                                       return elem.sizset;
+                                               } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
+                                                       if ( elem.sizset ) {
+                                                               return elem;
+                                                       }
+                                               } else {
+                                                       elem[ expando ] = cachedkey;
+                                                       if ( matcher( elem, context, xml ) ) {
+                                                               elem.sizset = true;
+                                                               return elem;
+                                                       }
+                                                       elem.sizset = false;
+                                               }
+                                       }
+                               }
+                       } else {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( checkNonElements || elem.nodeType === 1 ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       return elem;
+                                               }
+                                       }
+                               }
+                       }
+               };
+}
+
+function elementMatcher( matchers ) {
+       return matchers.length > 1 ?
+               function( elem, context, xml ) {
+                       var i = matchers.length;
+                       while ( i-- ) {
+                               if ( !matchers[i]( elem, context, xml ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               } :
+               matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+       var elem,
+               newUnmatched = [],
+               i = 0,
+               len = unmatched.length,
+               mapped = map != null;
+
+       for ( ; i < len; i++ ) {
+               if ( (elem = unmatched[i]) ) {
+                       if ( !filter || filter( elem, context, xml ) ) {
+                               newUnmatched.push( elem );
+                               if ( mapped ) {
+                                       map.push( i );
+                               }
+                       }
+               }
+       }
+
+       return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+       if ( postFilter && !postFilter[ expando ] ) {
+               postFilter = setMatcher( postFilter );
+       }
+       if ( postFinder && !postFinder[ expando ] ) {
+               postFinder = setMatcher( postFinder, postSelector );
+       }
+       return markFunction(function( seed, results, context, xml ) {
+               // Positional selectors apply to seed elements, so it is invalid to follow them with relative ones
+               if ( seed && postFinder ) {
+                       return;
+               }
+
+               var i, elem, postFilterIn,
+                       preMap = [],
+                       postMap = [],
+                       preexisting = results.length,
+
+                       // Get initial elements from seed or context
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ),
+
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
+                       matcherIn = preFilter && ( seed || !selector ) ?
+                               condense( elems, preMap, preFilter, context, xml ) :
+                               elems,
+
+                       matcherOut = matcher ?
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+                                       // ...intermediate processing is necessary
+                                       [] :
+
+                                       // ...otherwise use results directly
+                                       results :
+                               matcherIn;
+
+               // Find primary matches
+               if ( matcher ) {
+                       matcher( matcherIn, matcherOut, context, xml );
+               }
+
+               // Apply postFilter
+               if ( postFilter ) {
+                       postFilterIn = condense( matcherOut, postMap );
+                       postFilter( postFilterIn, [], context, xml );
+
+                       // Un-match failing elements by moving them back to matcherIn
+                       i = postFilterIn.length;
+                       while ( i-- ) {
+                               if ( (elem = postFilterIn[i]) ) {
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+                               }
+                       }
+               }
+
+               // Keep seed and results synchronized
+               if ( seed ) {
+                       // Ignore postFinder because it can't coexist with seed
+                       i = preFilter && matcherOut.length;
+                       while ( i-- ) {
+                               if ( (elem = matcherOut[i]) ) {
+                                       seed[ preMap[i] ] = !(results[ preMap[i] ] = elem);
+                               }
+                       }
+               } else {
+                       matcherOut = condense(
+                               matcherOut === results ?
+                                       matcherOut.splice( preexisting, matcherOut.length ) :
+                                       matcherOut
+                       );
+                       if ( postFinder ) {
+                               postFinder( null, results, matcherOut, xml );
+                       } else {
+                               push.apply( results, matcherOut );
+                       }
+               }
+       });
+}
+
+function matcherFromTokens( tokens ) {
+       var checkContext, matcher, j,
+               len = tokens.length,
+               leadingRelative = Expr.relative[ tokens[0].type ],
+               implicitRelative = leadingRelative || Expr.relative[" "],
+               i = leadingRelative ? 1 : 0,
+
+               // The foundational matcher ensures that elements are reachable from top-level context(s)
+               matchContext = addCombinator( function( elem ) {
+                       return elem === checkContext;
+               }, implicitRelative, true ),
+               matchAnyContext = addCombinator( function( elem ) {
+                       return indexOf.call( checkContext, elem ) > -1;
+               }, implicitRelative, true ),
+               matchers = [ function( elem, context, xml ) {
+                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                               (checkContext = context).nodeType ?
+                                       matchContext( elem, context, xml ) :
+                                       matchAnyContext( elem, context, xml ) );
+               } ];
+
+       for ( ; i < len; i++ ) {
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+                       matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+               } else {
+                       // The concatenated values are (context, xml) for backCompat
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+                       // Return special upon seeing a positional matcher
+                       if ( matcher[ expando ] ) {
+                               // Find the next relative operator (if any) for proper handling
+                               j = ++i;
+                               for ( ; j < len; j++ ) {
+                                       if ( Expr.relative[ tokens[j].type ] ) {
+                                               break;
+                                       }
+                               }
+                               return setMatcher(
+                                       i > 1 && elementMatcher( matchers ),
+                                       i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
+                                       matcher,
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+                                       j < len && tokens.join("")
+                               );
+                       }
+                       matchers.push( matcher );
+               }
+       }
+
+       return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+       var bySet = setMatchers.length > 0,
+               byElement = elementMatchers.length > 0,
+               superMatcher = function( seed, context, xml, results, expandContext ) {
+                       var elem, j, matcher,
+                               setMatched = [],
+                               matchedCount = 0,
+                               i = "0",
+                               unmatched = seed && [],
+                               outermost = expandContext != null,
+                               contextBackup = outermostContext,
+                               // We must always have either seed elements or context
+                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+                               // Nested matchers should use non-integer dirruns
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
+
+                       if ( outermost ) {
+                               outermostContext = context !== document && context;
+                               cachedruns = superMatcher.el;
+                       }
+
+                       // Add elements passing elementMatchers directly to results
+                       for ( ; (elem = elems[i]) != null; i++ ) {
+                               if ( byElement && elem ) {
+                                       for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       results.push( elem );
+                                                       break;
+                                               }
+                                       }
+                                       if ( outermost ) {
+                                               dirruns = dirrunsUnique;
+                                               cachedruns = ++superMatcher.el;
+                                       }
+                               }
+
+                               // Track unmatched elements for set filters
+                               if ( bySet ) {
+                                       // They will have gone through all possible matchers
+                                       if ( (elem = !matcher && elem) ) {
+                                               matchedCount--;
+                                       }
+
+                                       // Lengthen the array for every element, matched or not
+                                       if ( seed ) {
+                                               unmatched.push( elem );
+                                       }
+                               }
+                       }
+
+                       // Apply set filters to unmatched elements
+                       matchedCount += i;
+                       if ( bySet && i !== matchedCount ) {
+                               for ( j = 0; (matcher = setMatchers[j]); j++ ) {
+                                       matcher( unmatched, setMatched, context, xml );
+                               }
+
+                               if ( seed ) {
+                                       // Reintegrate element matches to eliminate the need for sorting
+                                       if ( matchedCount > 0 ) {
+                                               while ( i-- ) {
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {
+                                                               setMatched[i] = pop.call( results );
+                                                       }
+                                               }
+                                       }
+
+                                       // Discard index placeholder values to get only actual matches
+                                       setMatched = condense( setMatched );
+                               }
+
+                               // Add matches to results
+                               push.apply( results, setMatched );
+
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
+                               if ( outermost && !seed && setMatched.length > 0 &&
+                                       ( matchedCount + setMatchers.length ) > 1 ) {
+
+                                       Sizzle.uniqueSort( results );
+                               }
+                       }
+
+                       // Override manipulation of globals by nested matchers
+                       if ( outermost ) {
+                               dirruns = dirrunsUnique;
+                               outermostContext = contextBackup;
+                       }
+
+                       return unmatched;
+               };
+
+       superMatcher.el = 0;
+       return bySet ?
+               markFunction( superMatcher ) :
+               superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+       var i,
+               setMatchers = [],
+               elementMatchers = [],
+               cached = compilerCache[ expando ][ selector ];
+
+       if ( !cached ) {
+               // Generate a function of recursive functions that can be used to check each element
+               if ( !group ) {
+                       group = tokenize( selector );
+               }
+               i = group.length;
+               while ( i-- ) {
+                       cached = matcherFromTokens( group[i] );
+                       if ( cached[ expando ] ) {
+                               setMatchers.push( cached );
+                       } else {
+                               elementMatchers.push( cached );
+                       }
+               }
+
+               // Cache the compiled function
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+       }
+       return cached;
+};
+
+function multipleContexts( selector, contexts, results, seed ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results, seed );
+       }
+       return results;
+}
+
+function select( selector, context, results, seed, xml ) {
+       var i, tokens, token, type, find,
+               match = tokenize( selector ),
+               j = match.length;
+
+       if ( !seed ) {
+               // Try to minimize operations if there is only one group
+               if ( match.length === 1 ) {
+
+                       // Take a shortcut and set the context if the root selector is an ID
+                       tokens = match[0] = match[0].slice( 0 );
+                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                                       context.nodeType === 9 && !xml &&
+                                       Expr.relative[ tokens[1].type ] ) {
+
+                               context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
+                               if ( !context ) {
+                                       return results;
+                               }
+
+                               selector = selector.slice( tokens.shift().length );
+                       }
+
+                       // Fetch a seed set for right-to-left matching
+                       for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
+                               token = tokens[i];
+
+                               // Abort if we hit a combinator
+                               if ( Expr.relative[ (type = token.type) ] ) {
+                                       break;
+                               }
+                               if ( (find = Expr.find[ type ]) ) {
+                                       // Search, expanding context for leading sibling combinators
+                                       if ( (seed = find(
+                                               token.matches[0].replace( rbackslash, "" ),
+                                               rsibling.test( tokens[0].type ) && context.parentNode || context,
+                                               xml
+                                       )) ) {
+
+                                               // If seed is empty or no tokens remain, we can return early
+                                               tokens.splice( i, 1 );
+                                               selector = seed.length && tokens.join("");
+                                               if ( !selector ) {
+                                                       push.apply( results, slice.call( seed, 0 ) );
+                                                       return results;
+                                               }
+
+                                               break;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       // Compile and execute a filtering function
+       // Provide `match` to avoid retokenization if we modified the selector above
+       compile( selector, match )(
+               seed,
+               context,
+               xml,
+               results,
+               rsibling.test( selector )
+       );
+       return results;
+}
+
+if ( document.querySelectorAll ) {
+       (function() {
+               var disconnectedMatch,
+                       oldSelect = select,
+                       rescape = /'|\\/g,
+                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+                       // qSa(:focus) reports false when true (Chrome 21),
+                       // A support test would require too much code (would include document ready)
+                       rbuggyQSA = [":focus"],
+
+                       // matchesSelector(:focus) reports false when true (Chrome 21),
+                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+                       // A support test would require too much code (would include document ready)
+                       // just skip matchesSelector for :active
+                       rbuggyMatches = [ ":active", ":focus" ],
+                       matches = docElem.matchesSelector ||
+                               docElem.mozMatchesSelector ||
+                               docElem.webkitMatchesSelector ||
+                               docElem.oMatchesSelector ||
+                               docElem.msMatchesSelector;
+
+               // Build QSA regex
+               // Regex strategy adopted from Diego Perini
+               assert(function( div ) {
+                       // Select is set to empty string on purpose
+                       // This is to test IE's treatment of not explictly
+                       // setting a boolean content attribute,
+                       // since its presence should be enough
+                       // http://bugs.jquery.com/ticket/12359
+                       div.innerHTML = "<select><option selected=''></option></select>";
+
+                       // IE8 - Some boolean attributes are not treated correctly
+                       if ( !div.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+                       }
+
+                       // Webkit/Opera - :checked should return selected option elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       // IE8 throws error here (do not put tests after this one)
+                       if ( !div.querySelectorAll(":checked").length ) {
+                               rbuggyQSA.push(":checked");
+                       }
+               });
+
+               assert(function( div ) {
+
+                       // Opera 10-12/IE9 - ^= $= *= and empty values
+                       // Should not select anything
+                       div.innerHTML = "<p test=''></p>";
+                       if ( div.querySelectorAll("[test^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+                       }
+
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+                       // IE8 throws error here (do not put tests after this one)
+                       div.innerHTML = "<input type='hidden'/>";
+                       if ( !div.querySelectorAll(":enabled").length ) {
+                               rbuggyQSA.push(":enabled", ":disabled");
+                       }
+               });
+
+               // rbuggyQSA always contains :focus, so no need for a length check
+               rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
+
+               select = function( selector, context, results, seed, xml ) {
+                       // Only use querySelectorAll when not filtering,
+                       // when this is not xml,
+                       // and when no QSA bugs apply
+                       if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+                               var groups, i,
+                                       old = true,
+                                       nid = expando,
+                                       newContext = context,
+                                       newSelector = context.nodeType === 9 && selector;
+
+                               // qSA works strangely on Element-rooted queries
+                               // We can work around this by specifying an extra ID on the root
+                               // and working up from there (Thanks to Andrew Dupont for the technique)
+                               // IE 8 doesn't work on object elements
+                               if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                                       groups = tokenize( selector );
+
+                                       if ( (old = context.getAttribute("id")) ) {
+                                               nid = old.replace( rescape, "\\$&" );
+                                       } else {
+                                               context.setAttribute( "id", nid );
+                                       }
+                                       nid = "[id='" + nid + "'] ";
+
+                                       i = groups.length;
+                                       while ( i-- ) {
+                                               groups[i] = nid + groups[i].join("");
+                                       }
+                                       newContext = rsibling.test( selector ) && context.parentNode || context;
+                                       newSelector = groups.join(",");
+                               }
+
+                               if ( newSelector ) {
+                                       try {
+                                               push.apply( results, slice.call( newContext.querySelectorAll(
+                                                       newSelector
+                                               ), 0 ) );
+                                               return results;
+                                       } catch(qsaError) {
+                                       } finally {
+                                               if ( !old ) {
+                                                       context.removeAttribute("id");
+                                               }
+                                       }
+                               }
+                       }
+
+                       return oldSelect( selector, context, results, seed, xml );
+               };
+
+               if ( matches ) {
+                       assert(function( div ) {
+                               // Check to see if it's possible to do matchesSelector
+                               // on a disconnected node (IE 9)
+                               disconnectedMatch = matches.call( div, "div" );
+
+                               // This should fail with an exception
+                               // Gecko does not error, returns false instead
+                               try {
+                                       matches.call( div, "[test!='']:sizzle" );
+                                       rbuggyMatches.push( "!=", pseudos );
+                               } catch ( e ) {}
+                       });
+
+                       // rbuggyMatches always contains :active and :focus, so no need for a length check
+                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
+
+                       Sizzle.matchesSelector = function( elem, expr ) {
+                               // Make sure that attribute selectors are quoted
+                               expr = expr.replace( rattributeQuotes, "='$1']" );
+
+                               // rbuggyMatches always contains :active, so no need for an existence check
+                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
+                                       try {
+                                               var ret = matches.call( elem, expr );
+
+                                               // IE 9's matchesSelector returns false on disconnected nodes
+                                               if ( ret || disconnectedMatch ||
+                                                               // As well, disconnected nodes are said to be in a document
+                                                               // fragment in IE 9
+                                                               elem.document && elem.document.nodeType !== 11 ) {
+                                                       return ret;
+                                               }
+                                       } catch(e) {}
+                               }
+
+                               return Sizzle( expr, null, null, [ elem ] ).length > 0;
+                       };
+               }
+       })();
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Back-compat
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       isSimple = /^.[^:#\[\.,]*$/,
+       rneedsContext = jQuery.expr.match.needsContext,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i, l, length, n, r, ret,
+                       self = this;
+
+               if ( typeof selector !== "string" ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       });
+               }
+
+               ret = this.pushStack( "", "find", selector );
+
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
+
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
+
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
+
+       is: function( selector ) {
+               return !!selector && (
+                       typeof selector === "string" ?
+                               // If this is a positional/relative selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               rneedsContext.test( selector ) ?
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       ret = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( ; i < l; i++ ) {
+                       cur = this[i];
+
+                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                       ret.push( cur );
+                                       break;
+                               }
+                               cur = cur.parentNode;
+                       }
+               }
+
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+               return this.pushStack( ret, "closest", selectors );
+       },
+
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
+
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
+
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+function sibling( cur, dir ) {
+       do {
+               cur = cur[ dir ];
+       } while ( cur && cur.nodeType !== 1 );
+
+       return cur;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
+
+               if ( !runtil.test( name ) ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+               if ( this.length > 1 && rparentsprev.test( name ) ) {
+                       ret = ret.reverse();
+               }
+
+               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+       };
+});
+
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
+
+               return elems.length === 1 ?
+                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+                       jQuery.find.matches(expr, elems);
+       },
+
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
+
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
+                       }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
+
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
+
+               return r;
+       }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+       // Can't pass null or undefined to indexOf in Firefox 4
+       // Set to 0 to skip string check
+       qualifier = qualifier || 0;
+
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       var retVal = !!qualifier.call( elem, i, elem );
+                       return retVal === keep;
+               });
+
+       } else if ( qualifier.nodeType ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return ( elem === qualifier ) === keep;
+               });
+
+       } else if ( typeof qualifier === "string" ) {
+               var filtered = jQuery.grep(elements, function( elem ) {
+                       return elem.nodeType === 1;
+               });
+
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter(qualifier, filtered, !keep);
+               } else {
+                       qualifier = jQuery.filter( qualifier, filtered );
+               }
+       }
+
+       return jQuery.grep(elements, function( elem, i ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+       });
+}
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+       safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
+               }
+       }
+       return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style|link)/i,
+       rnocache = /<(?:script|object|embed|option|style)/i,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       rcheckableType = /^(?:checkbox|radio)$/,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /\/(java|ecma)script/i,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       },
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+       text: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
+       },
+
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
+
+                       wrap.map(function() {
+                               var elem = this;
+
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
+
+                               return elem;
+                       }).append( this );
+               }
+
+               return this;
+       },
+
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
+
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
+
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
+
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
+
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
+
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               });
+       },
+
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
+       },
+
+       append: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.appendChild( elem );
+                       }
+               });
+       },
+
+       prepend: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.insertBefore( elem, this.firstChild );
+                       }
+               });
+       },
+
+       before: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this );
+                       });
+               }
+
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+               }
+       },
+
+       after: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       });
+               }
+
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+               }
+       },
+
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
+                               }
+
+                               if ( elem.parentNode ) {
+                                       elem.parentNode.removeChild( elem );
+                               }
+                       }
+               }
+
+               return this;
+       },
+
+       empty: function() {
+               var elem,
+                       i = 0;
+
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
+                       }
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
+
+               return this;
+       },
+
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       var elem = this[0] || {},
+                               i = 0,
+                               l = this.length;
+
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       undefined;
+                       }
+
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
+                       }
+
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
+       },
+
+       replaceWith: function( value ) {
+               if ( !isDisconnected( this[0] ) ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
+
+                       if ( typeof value !== "string" ) {
+                               value = jQuery( value ).detach();
+                       }
+
+                       return this.each(function() {
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
+
+                               jQuery( this ).remove();
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
+               }
+
+               return this.length ?
+                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                       this;
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
+
+       domManip: function( args, table, callback ) {
+
+               // Flatten any nested arrays
+               args = [].concat.apply( [], args );
+
+               var results, first, fragment, iNoClone,
+                       i = 0,
+                       value = args[0],
+                       scripts = [],
+                       l = this.length;
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call( this, i, table ? self.html() : undefined );
+                               self.domManip( args, table, callback );
+                       });
+               }
+
+               if ( this[0] ) {
+                       results = jQuery.buildFragment( args, this, scripts );
+                       fragment = results.fragment;
+                       first = fragment.firstChild;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
+
+                       if ( first ) {
+                               table = table && jQuery.nodeName( first, "tr" );
+
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               // Fragments from the fragment cache must always be cloned and never used in place.
+                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+                                       callback.call(
+                                               table && jQuery.nodeName( this[i], "table" ) ?
+                                                       findOrAppend( this[i], "tbody" ) :
+                                                       this[i],
+                                               i === iNoClone ?
+                                                       fragment :
+                                                       jQuery.clone( fragment, true, true )
+                                       );
+                               }
+                       }
+
+                       // Fix #11809: Avoid leaking memory
+                       fragment = first = null;
+
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, function( i, elem ) {
+                                       if ( elem.src ) {
+                                               if ( jQuery.ajax ) {
+                                                       jQuery.ajax({
+                                                               url: elem.src,
+                                                               type: "GET",
+                                                               dataType: "script",
+                                                               async: false,
+                                                               global: false,
+                                                               "throws": true
+                                                       });
+                                               } else {
+                                                       jQuery.error("no ajax");
+                                               }
+                                       } else {
+                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                       }
+
+                                       if ( elem.parentNode ) {
+                                               elem.parentNode.removeChild( elem );
+                                       }
+                               });
+                       }
+               }
+
+               return this;
+       }
+});
+
+function findOrAppend( elem, tag ) {
+       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+function cloneCopyEvent( src, dest ) {
+
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
+
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
+
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
+
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
+                       }
+               }
+       }
+
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
+       }
+}
+
+function cloneFixAttributes( src, dest ) {
+       var nodeName;
+
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
+
+       // clearAttributes removes the attributes, which we don't want,
+       // but also removes the attachEvent events, which we *do* want
+       if ( dest.clearAttributes ) {
+               dest.clearAttributes();
+       }
+
+       // mergeAttributes, in contrast, only merges back on the
+       // original attributes, not the events
+       if ( dest.mergeAttributes ) {
+               dest.mergeAttributes( src );
+       }
+
+       nodeName = dest.nodeName.toLowerCase();
+
+       if ( nodeName === "object" ) {
+               // IE6-10 improperly clones children of object elements using classid.
+               // IE10 throws NoModificationAllowedError if parent is null, #12132.
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
+               }
+
+               // This path appears unavoidable for IE9. When cloning an object
+               // element in IE9, the outerHTML strategy above is not sufficient.
+               // If the src has innerHTML and the destination does not,
+               // copy the src.innerHTML into the dest.innerHTML. #10324
+               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+                       dest.innerHTML = src.innerHTML;
+               }
+
+       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
+
+               dest.defaultChecked = dest.checked = src.checked;
+
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
+               }
+
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.selected = src.defaultSelected;
+
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
+
+       // IE blanks contents when cloning scripts
+       } else if ( nodeName === "script" && dest.text !== src.text ) {
+               dest.text = src.text;
+       }
+
+       // Event data gets referenced instead of copied if the expando
+       // gets copied too
+       dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+       var fragment, cacheable, cachehit,
+               first = args[ 0 ];
+
+       // Set context from what may come in as undefined or a jQuery collection or a node
+       // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+       // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+       context = context || document;
+       context = !context.nodeType && context[0] || context;
+       context = context.ownerDocument || context;
+
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+               first.charAt(0) === "<" && !rnocache.test( first ) &&
+               (jQuery.support.checkClone || !rchecked.test( first )) &&
+               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+               // Mark cacheable and look for a hit
+               cacheable = true;
+               fragment = jQuery.fragments[ first ];
+               cachehit = fragment !== undefined;
+       }
+
+       if ( !fragment ) {
+               fragment = context.createDocumentFragment();
+               jQuery.clean( args, context, fragment, scripts );
+
+               // Update the cache, but only store false
+               // unless this is a second parsing of the same content
+               if ( cacheable ) {
+                       jQuery.fragments[ first ] = cachehit && fragment;
+               }
+       }
+
+       return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       i = 0,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       l = insert.length,
+                       parent = this.length === 1 && this[0].parentNode;
+
+               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+               } else {
+                       for ( ; i < l; i++ ) {
+                               elems = ( i > 0 ? this.clone(true) : this ).get();
+                               jQuery( insert[i] )[ original ]( elems );
+                               ret = ret.concat( elems );
+                       }
+
+                       return this.pushStack( ret, name, insert.selector );
+               }
+       };
+});
+
+function getAll( elem ) {
+       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+               return elem.getElementsByTagName( "*" );
+
+       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+               return elem.querySelectorAll( "*" );
+
+       } else {
+               return [];
+       }
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( rcheckableType.test( elem.type ) ) {
+               elem.defaultChecked = elem.checked;
+       }
+}
+
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var srcElements,
+                       destElements,
+                       i,
+                       clone;
+
+               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( true );
+
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
+
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                       // IE copies events bound via attachEvent when using cloneNode.
+                       // Calling detachEvent on the clone will also remove the events
+                       // from the original. In order to get around this, we use some
+                       // proprietary methods to clear the events. Thanks to MooTools
+                       // guys for this hotness.
+
+                       cloneFixAttributes( elem, clone );
+
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+                       srcElements = getAll( elem );
+                       destElements = getAll( clone );
+
+                       // Weird iteration because IE will replace the length property
+                       // with an element if you are cloning the body and one of the
+                       // elements on the page has a name or id of "length"
+                       for ( i = 0; srcElements[i]; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       cloneFixAttributes( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       cloneCopyEvent( elem, clone );
+
+                       if ( deepDataAndEvents ) {
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
+
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
+
+               srcElements = destElements = null;
+
+               // Return the cloned set
+               return clone;
+       },
+
+       clean: function( elems, context, fragment, scripts ) {
+               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+                       safe = context === document && safeFragment,
+                       ret = [];
+
+               // Ensure that context is a document
+               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+                       context = document;
+               }
+
+               // Use the already-created safe fragment if context permits
+               for ( i = 0; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
+
+                       if ( !elem ) {
+                               continue;
+                       }
+
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" ) {
+                               if ( !rhtml.test( elem ) ) {
+                                       elem = context.createTextNode( elem );
+                               } else {
+                                       // Ensure a safe container in which to render the html
+                                       safe = safe || createSafeFragment( context );
+                                       div = context.createElement("div");
+                                       safe.appendChild( div );
+
+                                       // Fix "XHTML"-style tags in all browsers
+                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+                                       // Go to html and back, then peel off extra wrappers
+                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+                                       depth = wrap[0];
+                                       div.innerHTML = wrap[1] + elem + wrap[2];
+
+                                       // Move to the right depth
+                                       while ( depth-- ) {
+                                               div = div.lastChild;
+                                       }
+
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
+
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               hasBody = rtbody.test(elem);
+                                                       tbody = tag === "table" && !hasBody ?
+                                                               div.firstChild && div.firstChild.childNodes :
+
+                                                               // String was a bare <thead> or <tfoot>
+                                                               wrap[1] === "<table>" && !hasBody ?
+                                                                       div.childNodes :
+                                                                       [];
+
+                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                                       }
+                                               }
+                                       }
+
+                                       // IE completely kills leading whitespace when innerHTML is used
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                       }
+
+                                       elem = div.childNodes;
+
+                                       // Take out of fragment container (we need a fresh div each time)
+                                       div.parentNode.removeChild( div );
+                               }
+                       }
+
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               jQuery.merge( ret, elem );
+                       }
+               }
+
+               // Fix #11356: Clear elements from safeFragment
+               if ( div ) {
+                       elem = div = safe = null;
+               }
+
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !jQuery.support.appendChecked ) {
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               if ( jQuery.nodeName( elem, "input" ) ) {
+                                       fixDefaultChecked( elem );
+                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+                               }
+                       }
+               }
+
+               // Append elements to a provided document fragment
+               if ( fragment ) {
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
+                       };
+
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       },
+
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var data, id, elem, type,
+                       i = 0,
+                       internalKey = jQuery.expando,
+                       cache = jQuery.cache,
+                       deleteExpando = jQuery.support.deleteExpando,
+                       special = jQuery.event.special;
+
+               for ( ; (elem = elems[i]) != null; i++ ) {
+
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
+
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
+
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
+
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
+                                       }
+
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
+
+                                               delete cache[ id ];
+
+                                               // IE does not allow us to delete expando properties from nodes,
+                                               // nor does it have a removeAttribute function on Document nodes;
+                                               // we must handle all of these cases
+                                               if ( deleteExpando ) {
+                                                       delete elem[ internalKey ];
+
+                                               } else if ( elem.removeAttribute ) {
+                                                       elem.removeAttribute( internalKey );
+
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
+
+                                               jQuery.deletedIds.push( id );
+                                       }
+                               }
+                       }
+               }
+       }
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+       browser[ matched.browser ] = true;
+       browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+       browser.webkit = true;
+} else if ( browser.webkit ) {
+       browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                       context = jQuerySub( context );
+               }
+
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       return jQuerySub;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+       ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity=([^)]*)/,
+       rposition = /^(top|right|bottom|left)$/,
+       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rmargin = /^margin/,
+       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+       elemdisplay = {},
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: 0,
+               fontWeight: 400
+       },
+
+       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+       eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
+
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
+
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
+
+       return origName;
+}
+
+function isHidden( elem, el ) {
+       elem = el || elem;
+       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+       var elem, display,
+               values = [],
+               index = 0,
+               length = elements.length;
+
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && elem.style.display === "none" ) {
+                               elem.style.display = "";
+                       }
+
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       display = curCSS( elem, "display" );
+
+                       if ( !values[ index ] && display !== "none" ) {
+                               jQuery._data( elem, "olddisplay", display );
+                       }
+               }
+       }
+
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
+
+       return elements;
+}
+
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       },
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state, fn2 ) {
+               var bool = typeof state === "boolean";
+
+               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+                       return eventsToggle.apply( this, arguments );
+               }
+
+               return this.each(function() {
+                       if ( bool ? state : isHidden( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               });
+       }
+});
+
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
+
+                               }
+                       }
+               }
+       },
+
+       // Exclude the following css properties to add px
+       cssNumber: {
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
+
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
+
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
+
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
+
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
+
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
+
+       css: function( elem, name, numeric, extra ) {
+               var val, num, hooks,
+                       origName = jQuery.camelCase( name );
+
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
+
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name );
+               }
+
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
+
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( numeric || extra !== undefined ) {
+                       num = parseFloat( val );
+                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+               }
+               return val;
+       },
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations
+       swap: function( elem, options, callback ) {
+               var ret, name,
+                       old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
+
+               ret = callback.call( elem );
+
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
+
+               return ret;
+       }
+});
+
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+       curCSS = function( elem, name ) {
+               var ret, width, minWidth, maxWidth,
+                       computed = window.getComputedStyle( elem, null ),
+                       style = elem.style;
+
+               if ( computed ) {
+
+                       ret = computed[ name ];
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
+
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
+
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
+                       }
+               }
+
+               return ret;
+       };
+} else if ( document.documentElement.currentStyle ) {
+       curCSS = function( elem, name ) {
+               var left, rsLeft,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       style = elem.style;
+
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
+               }
+
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               // but not position css attributes, as those are proportional to the parent element instead
+               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+                       // Remember the original values
+                       left = style.left;
+                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = elem.currentStyle.left;
+                       }
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
+
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
+
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+                       value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
+
+               val = 0;
+
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       // we use jQuery.css instead of curCSS here
+                       // because of the reliableMarginRight CSS hook!
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
+               }
+
+               // From this point on we use curCSS for maximum performance (relevant in animations)
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+                       }
+
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                       }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+                       }
+               }
+       }
+
+       return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+       // Start with offset property, which is equivalent to the border-box value
+       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               valueIsBorderBox = true,
+               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+       if ( val <= 0 || val == null ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
+               }
+
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
+               }
+
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
+
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox
+               )
+       ) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+       if ( elemdisplay[ nodeName ] ) {
+               return elemdisplay[ nodeName ];
+       }
+
+       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+               display = elem.css("display");
+       elem.remove();
+
+       // If the simple way fails,
+       // get element's real default display by attaching it to a temp iframe
+       if ( display === "none" || display === "" ) {
+               // Use the already-created iframe if possible
+               iframe = document.body.appendChild(
+                       iframe || jQuery.extend( document.createElement("iframe"), {
+                               frameBorder: 0,
+                               width: 0,
+                               height: 0
+                       })
+               );
+
+               // Create a cacheable copy of the iframe document on first call.
+               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+               // document to it; WebKit & Firefox won't allow reusing the iframe document.
+               if ( !iframeDoc || !iframe.createElement ) {
+                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                       iframeDoc.write("<!doctype html><html><body>");
+                       iframeDoc.close();
+               }
+
+               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+               display = curCSS( elem, "display" );
+               document.body.removeChild( iframe );
+       }
+
+       // Store the correct default display
+       elemdisplay[ nodeName ] = display;
+
+       return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               // certain elements can have dimension info if we invisibly show them
+                               // however, it must have a current display style that would benefit from this
+                               if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+                                       return jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       });
+                               } else {
+                                       return getWidthOrHeight( elem, name, extra );
+                               }
+                       }
+               },
+
+               set: function( elem, value, extra ) {
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+                               ) : 0
+                       );
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+                               computed ? "1" : "";
+               },
+
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                               style.removeAttribute ) {
+
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
+
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               return curCSS( elem, "marginRight" );
+                                       }
+                               });
+                       }
+               };
+       }
+
+       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+       // getComputedStyle returns percent when specified for top/left/bottom/right
+       // rather than make the css module depend on the offset module, we just check for it here
+       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+               jQuery.each( [ "top", "left" ], function( i, prop ) {
+                       jQuery.cssHooks[ prop ] = {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               var ret = curCSS( elem, prop );
+                                               // if curCSS returns percentage, fallback to offset
+                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+                                       }
+                               }
+                       };
+               });
+       }
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+       };
+
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i,
+
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ],
+                               expanded = {};
+
+                       for ( i = 0; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
+               }
+       };
+
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
+
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
+
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
+
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
+               }
+       }
+
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
+
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
+
+                       } else {
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+var
+       // Document location
+       ajaxLocParts,
+       ajaxLocation,
+
+       rhash = /#.*$/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rquery = /\?/,
+       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+       rts = /([?&])_=[^&]*/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+        */
+       prefilters = {},
+
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
+
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
+               }
+
+               var dataType, list, placeBefore,
+                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+                       i = 0,
+                       length = dataTypes.length;
+
+               if ( jQuery.isFunction( func ) ) {
+                       // For each dataType in the dataTypeExpression
+                       for ( ; i < length; i++ ) {
+                               dataType = dataTypes[ i ];
+                               // We control if we're asked to add before
+                               // any existing element
+                               placeBefore = /^\+/.test( dataType );
+                               if ( placeBefore ) {
+                                       dataType = dataType.substr( 1 ) || "*";
+                               }
+                               list = structure[ dataType ] = structure[ dataType ] || [];
+                               // then we add to the structure accordingly
+                               list[ placeBefore ? "unshift" : "push" ]( func );
+                       }
+               }
+       };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+               dataType /* internal */, inspected /* internal */ ) {
+
+       dataType = dataType || options.dataTypes[ 0 ];
+       inspected = inspected || {};
+
+       inspected[ dataType ] = true;
+
+       var selection,
+               list = structure[ dataType ],
+               i = 0,
+               length = list ? list.length : 0,
+               executeOnly = ( structure === prefilters );
+
+       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+               selection = list[ i ]( options, originalOptions, jqXHR );
+               // If we got redirected to another dataType
+               // we try there if executing only and not done already
+               if ( typeof selection === "string" ) {
+                       if ( !executeOnly || inspected[ selection ] ) {
+                               selection = undefined;
+                       } else {
+                               options.dataTypes.unshift( selection );
+                               selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
+                       }
+               }
+       }
+       // If we're only executing or nothing was selected
+       // we try the catchall dataType if not done already
+       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+               selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+       }
+       // unnecessary when only executing (prefilters)
+       // but it'll be ignored by the caller in that case
+       return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
+       }
+
+       // Don't do a request if no elements are being requested
+       if ( !this.length ) {
+               return this;
+       }
+
+       var selector, type, response,
+               self = this,
+               off = url.indexOf(" ");
+
+       if ( off >= 0 ) {
+               selector = url.slice( off, url.length );
+               url = url.slice( 0, off );
+       }
+
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
+
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
+
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
+
+       // Request the remote document
+       jQuery.ajax({
+               url: url,
+
+               // if "type" variable is undefined, then "GET" method will be used
+               type: type,
+               dataType: "html",
+               data: params,
+               complete: function( jqXHR, status ) {
+                       if ( callback ) {
+                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+                       }
+               }
+       }).done(function( responseText ) {
+
+               // Save response for use in complete callback
+               response = arguments;
+
+               // See if a selector was specified
+               self.html( selector ?
+
+                       // Create a dummy div to hold the results
+                       jQuery("<div>")
+
+                               // inject the contents of the document in, removing the scripts
+                               // to avoid any 'Permission Denied' errors in IE
+                               .append( responseText.replace( rscript, "" ) )
+
+                               // Locate the specified elements
+                               .find( selector ) :
+
+                       // If not, just inject the full result
+                       responseText );
+
+       });
+
+       return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+       jQuery.fn[ o ] = function( f ){
+               return this.on( o, f );
+       };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       type: method,
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       };
+});
+
+jQuery.extend({
+
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               if ( settings ) {
+                       // Building a settings object
+                       ajaxExtend( target, jQuery.ajaxSettings );
+               } else {
+                       // Extending ajaxSettings
+                       settings = target;
+                       target = jQuery.ajaxSettings;
+               }
+               ajaxExtend( target, settings );
+               return target;
+       },
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+               processData: true,
+               async: true,
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               throws: false,
+               traditional: false,
+               headers: {},
+               */
+
+               accepts: {
+                       xml: "application/xml, text/xml",
+                       html: "text/html",
+                       text: "text/plain",
+                       json: "application/json, text/javascript",
+                       "*": allTypes
+               },
+
+               contents: {
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText"
+               },
+
+               // List of data converters
+               // 1) key format is "source_type destination_type" (a single space in-between)
+               // 2) the catchall symbol "*" can be used for source_type
+               converters: {
+
+                       // Convert anything to text
+                       "* text": window.String,
+
+                       // Text to html (true = no transformation)
+                       "text html": true,
+
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
+
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
+
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       context: true,
+                       url: true
+               }
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+       // Main method
+       ajax: function( url, options ) {
+
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var // ifModified key
+                       ifModifiedKey,
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                       globalEventContext = callbackContext !== s &&
+                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                               jQuery( callbackContext ) : jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // The jqXHR state
+                       state = 0,
+                       // Default abort message
+                       strAbort = "canceled",
+                       // Fake xhr
+                       jqXHR = {
+
+                               readyState: 0,
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( !state ) {
+                                               var lname = name.toLowerCase();
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+                                                       }
+                                               }
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match === undefined ? null : match;
+                               },
+
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
+                                       }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       statusText = statusText || strAbort;
+                                       if ( transport ) {
+                                               transport.abort( statusText );
+                                       }
+                                       done( 0, statusText );
+                                       return this;
+                               }
+                       };
+
+               // Callback for when everything is done
+               // It is defined here because jslint complains if it is declared
+               // at the end of the function (which would be more logical and readable)
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
+
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
+
+                       // State is "done" now
+                       state = 2;
+
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
+
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
+
+                       // Cache response headers
+                       responseHeadersString = headers || "";
+
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
+
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
+
+                       // If successful, handle type chaining
+                       if ( status >= 200 && status < 300 || status === 304 ) {
+
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("Etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ ifModifiedKey ] = modified;
+                                       }
+                               }
+
+                               // If not modified
+                               if ( status === 304 ) {
+
+                                       statusText = "notmodified";
+                                       isSuccess = true;
+
+                               // If we have data
+                               } else {
+
+                                       isSuccess = ajaxConvert( s, response );
+                                       statusText = isSuccess.state;
+                                       success = isSuccess.data;
+                                       error = isSuccess.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( !statusText || status ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
+
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
+
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                       }
+
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
+
+               // Attach deferreds
+               deferred.promise( jqXHR );
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+               jqXHR.complete = completeDeferred.add;
+
+               // Status-dependent callbacks
+               jqXHR.statusCode = function( map ) {
+                       if ( map ) {
+                               var tmp;
+                               if ( state < 2 ) {
+                                       for ( tmp in map ) {
+                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+                                       }
+                               } else {
+                                       tmp = map[ jqXHR.status ];
+                                       jqXHR.always( tmp );
+                               }
+                       }
+                       return this;
+               };
+
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+
+               // A cross-domain request is in order when we have a protocol:host:port mismatch
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() ) || false;
+                       s.crossDomain = parts && ( parts.join(":") + ( parts[ 3 ] ? "" : parts[ 1 ] === "http:" ? 80 : 443 ) ) !==
+                               ( ajaxLocParts.join(":") + ( ajaxLocParts[ 3 ] ? "" : ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) );
+               }
+
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
+
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+               // If request was aborted inside a prefilter, stop there
+               if ( state === 2 ) {
+                       return jqXHR;
+               }
+
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
+
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
+
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
+
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
+
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
+
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
+
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
+
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
+
+                               var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                       ret = s.url.replace( rts, "$1_=" + ts );
+
+                               // if nothing was replaced, add timestamp to the end
+                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+                       }
+               }
+
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
+
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                       }
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       }
+               }
+
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
+
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                               // Abort if not done already and return
+                               return jqXHR.abort();
+
+               }
+
+               // aborting is no longer a cancellation
+               strAbort = "abort";
+
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
+
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout( function(){
+                                       jqXHR.abort( "timeout" );
+                               }, s.timeout );
+                       }
+
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch (e) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       throw e;
+                               }
+                       }
+               }
+
+               return jqXHR;
+       },
+
+       // Counter for holding the number of active queries
+       active: 0,
+
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+       var ct, type, finalDataType, firstDataType,
+               contents = s.contents,
+               dataTypes = s.dataTypes,
+               responseFields = s.responseFields;
+
+       // Fill responseXXX fields
+       for ( type in responseFields ) {
+               if ( type in responses ) {
+                       jqXHR[ responseFields[type] ] = responses[ type ];
+               }
+       }
+
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+               }
+       }
+
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
+
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
+
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+       var conv, conv2, current, tmp,
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice(),
+               prev = dataTypes[ 0 ],
+               converters = {},
+               i = 0;
+
+       // Apply the dataFilter if provided
+       if ( s.dataFilter ) {
+               response = s.dataFilter( response, s.dataType );
+       }
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
+       }
+
+       // Convert to each sequential dataType, tolerating list modification
+       for ( ; (current = dataTypes[++i]); ) {
+
+               // There's only work to do if current dataType is non-auto
+               if ( current !== "*" ) {
+
+                       // Convert response if prev dataType is non-auto and differs from current
+                       if ( prev !== "*" && prev !== current ) {
+
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split(" ");
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.splice( i--, 0, current );
+                                                               }
+
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s["throws"] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Update prev for next iteration
+                       prev = current;
+               }
+       }
+
+       return { state: "success", data: response };
+}
+var oldCallbacks = [],
+       rquestion = /\?/,
+       rjsonp = /(=)\?(?=&|$)|\?\?/,
+       nonce = jQuery.now();
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var callbackName, overwritten, responseContainer,
+               data = s.data,
+               url = s.url,
+               hasCallback = s.jsonp !== false,
+               replaceInUrl = hasCallback && rjsonp.test( url ),
+               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+                       rjsonp.test( data );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+               overwritten = window[ callbackName ];
+
+               // Insert callback into url or form data
+               if ( replaceInUrl ) {
+                       s.url = url.replace( rjsonp, "$1" + callbackName );
+               } else if ( replaceInData ) {
+                       s.data = data.replace( rjsonp, "$1" + callbackName );
+               } else if ( hasCallback ) {
+                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
+
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
+
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
+
+               // Install callback
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
+
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
+                       }
+
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
+                       }
+
+                       responseContainer = overwritten = undefined;
+               });
+
+               // Delegate to script
+               return "script";
+       }
+});
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /javascript|ecmascript/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
+
+               var script,
+                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+               return {
+
+                       send: function( _, callback ) {
+
+                               script = document.createElement( "script" );
+
+                               script.async = "async";
+
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
+
+                               script.src = s.url;
+
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
+
+                                               // Remove the script
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
+                                               }
+
+                                               // Dereference the script
+                                               script = undefined;
+
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                               // This arises when a base node is used (#2709 and #4378).
+                               head.insertBefore( script, head.firstChild );
+                       },
+
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( 0, 1 );
+                               }
+                       }
+               };
+       }
+});
+var xhrCallbacks,
+       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject ? function() {
+               // Abort all pending requests
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( 0, 1 );
+               }
+       } : false,
+       xhrId = 0;
+
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
+}
+
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+       /* Microsoft failed to properly
+        * implement the XMLHttpRequest in IE7 (can't request local files),
+        * so we use the ActiveXObject when it is available
+        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+        * we need a fallback.
+        */
+       function() {
+               return !this.isLocal && createStandardXHR() || createActiveXHR();
+       } :
+       // For all other browsers, use the standard XMLHttpRequest object
+       createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+       jQuery.extend( jQuery.support, {
+               ajax: !!xhr,
+               cors: !!xhr && ( "withCredentials" in xhr )
+       });
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+       jQuery.ajaxTransport(function( s ) {
+               // Cross domain only allowed if supported through XMLHttpRequest
+               if ( !s.crossDomain || jQuery.support.cors ) {
+
+                       var callback;
+
+                       return {
+                               send: function( headers, complete ) {
+
+                                       // Get a new xhr
+                                       var handle, i,
+                                               xhr = s.xhr();
+
+                                       // Open the socket
+                                       // Passing null username, generates a login popup on Opera (#2865)
+                                       if ( s.username ) {
+                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                       } else {
+                                               xhr.open( s.type, s.url, s.async );
+                                       }
+
+                                       // Apply custom fields if provided
+                                       if ( s.xhrFields ) {
+                                               for ( i in s.xhrFields ) {
+                                                       xhr[ i ] = s.xhrFields[ i ];
+                                               }
+                                       }
+
+                                       // Override mime type if needed
+                                       if ( s.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( s.mimeType );
+                                       }
+
+                                       // X-Requested-With header
+                                       // For cross-domain requests, seeing as conditions for a preflight are
+                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                       // (it can always be set on a per-request basis or even using ajaxSetup)
+                                       // For same-domain requests, won't change header if already provided.
+                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                       }
+
+                                       // Need an extra try/catch for cross domain requests in Firefox 3
+                                       try {
+                                               for ( i in headers ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                               }
+                                       } catch( _ ) {}
+
+                                       // Do send the request
+                                       // This may raise an exception which is actually
+                                       // handled in jQuery.ajax (so no try/catch here)
+                                       xhr.send( ( s.hasContent && s.data ) || null );
+
+                                       // Listener
+                                       callback = function( _, isAbort ) {
+
+                                               var status,
+                                                       statusText,
+                                                       responseHeaders,
+                                                       responses,
+                                                       xml;
+
+                                               // Firefox throws exceptions when accessing properties
+                                               // of an xhr when a network error occurred
+                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                               try {
+
+                                                       // Was never called and is aborted or complete
+                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+                                                               // Only called once
+                                                               callback = undefined;
+
+                                                               // Do not keep as active anymore
+                                                               if ( handle ) {
+                                                                       xhr.onreadystatechange = jQuery.noop;
+                                                                       if ( xhrOnUnloadAbort ) {
+                                                                               delete xhrCallbacks[ handle ];
+                                                                       }
+                                                               }
+
+                                                               // If it's an abort
+                                                               if ( isAbort ) {
+                                                                       // Abort it manually if needed
+                                                                       if ( xhr.readyState !== 4 ) {
+                                                                               xhr.abort();
+                                                                       }
+                                                               } else {
+                                                                       status = xhr.status;
+                                                                       responseHeaders = xhr.getAllResponseHeaders();
+                                                                       responses = {};
+                                                                       xml = xhr.responseXML;
+
+                                                                       // Construct response list
+                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                               responses.xml = xml;
+                                                                       }
+
+                                                                       // When requesting binary data, IE6-9 will throw an exception
+                                                                       // on any attempt to access responseText (#11426)
+                                                                       try {
+                                                                               responses.text = xhr.responseText;
+                                                                       } catch( _ ) {
+                                                                       }
+
+                                                                       // Firefox throws an exception when accessing
+                                                                       // statusText for faulty cross-domain requests
+                                                                       try {
+                                                                               statusText = xhr.statusText;
+                                                                       } catch( e ) {
+                                                                               // We normalize with Webkit giving an empty statusText
+                                                                               statusText = "";
+                                                                       }
+
+                                                                       // Filter status for non standard behaviors
+
+                                                                       // If the request is local and we have data: assume a success
+                                                                       // (success with no data won't get notified, that's the best we
+                                                                       // can do given current implementations)
+                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                               status = responses.text ? 200 : 404;
+                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                       } else if ( status === 1223 ) {
+                                                                               status = 204;
+                                                                       }
+                                                               }
+                                                       }
+                                               } catch( firefoxAccessException ) {
+                                                       if ( !isAbort ) {
+                                                               complete( -1, firefoxAccessException );
+                                                       }
+                                               }
+
+                                               // Call complete if needed
+                                               if ( responses ) {
+                                                       complete( status, statusText, responses, responseHeaders );
+                                               }
+                                       };
+
+                                       if ( !s.async ) {
+                                               // if we're in sync mode we fire the callback
+                                               callback();
+                                       } else if ( xhr.readyState === 4 ) {
+                                               // (IE6 & IE7) if it's in cache and has been
+                                               // retrieved directly we need to fire the callback
+                                               setTimeout( callback, 0 );
+                                       } else {
+                                               handle = ++xhrId;
+                                               if ( xhrOnUnloadAbort ) {
+                                                       // Create the active xhrs callbacks list if needed
+                                                       // and attach the unload handler
+                                                       if ( !xhrCallbacks ) {
+                                                               xhrCallbacks = {};
+                                                               jQuery( window ).unload( xhrOnUnloadAbort );
+                                                       }
+                                                       // Add to list of active xhrs callbacks
+                                                       xhrCallbacks[ handle ] = callback;
+                                               }
+                                               xhr.onreadystatechange = callback;
+                                       }
+                               },
+
+                               abort: function() {
+                                       if ( callback ) {
+                                               callback(0,1);
+                                       }
+                               }
+                       };
+               }
+       });
+}
+var fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [function( prop, value ) {
+                       var end, unit,
+                               tween = this.createTween( prop, value ),
+                               parts = rfxnum.exec( value ),
+                               target = tween.cur(),
+                               start = +target || 0,
+                               scale = 1,
+                               maxIterations = 20;
+
+                       if ( parts ) {
+                               end = +parts[2];
+                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+                               // We need to compute starting value
+                               if ( unit !== "px" && start ) {
+                                       // Iteratively approximate from a nonzero starting point
+                                       // Prefer the current property, because this process will be trivial if it uses the same units
+                                       // Fallback to end or a simple constant
+                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+                                       do {
+                                               // If previous iteration zeroed out, double until we get *something*
+                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                               scale = scale || ".5";
+
+                                               // Adjust and apply
+                                               start = start / scale;
+                                               jQuery.style( tween.elem, prop, start + unit );
+
+                                       // Update scale, tolerating zero or NaN from tween.cur()
+                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+                               }
+
+                               tween.unit = unit;
+                               tween.start = start;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+                       }
+                       return tween;
+               }]
+       };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       }, 0 );
+       return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+       jQuery.each( props, function( prop, value ) {
+               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+                       index = 0,
+                       length = collection.length;
+               for ( ; index < length; index++ ) {
+                       if ( collection[ index ].call( animation, prop, value ) ) {
+
+                               // we're done with this property
+                               return;
+                       }
+               }
+       });
+}
+
+function Animation( elem, properties, options ) {
+       var result,
+               index = 0,
+               tweenerIndex = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               percent = 1 - ( remaining / animation.duration || 0 ),
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
+                               return false;
+                       }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end, easing ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
+
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
+
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
+                       }
+               }),
+               props = animation.props;
+
+       propFilter( props, animation.opts.specialEasing );
+
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
+       }
+
+       createTweens( animation, props );
+
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
+       }
+
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       anim: animation,
+                       queue: animation.opts.queue,
+                       elem: elem
+               })
+       );
+
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
+
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
+
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
+
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
+
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
+                               }
+                       }
+               } else {
+                       specialEasing[ name ] = easing;
+               }
+       }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
+               }
+
+               var prop,
+                       index = 0,
+                       length = props.length;
+
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
+               }
+       },
+
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
+       }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+       var index, prop, value, length, dataShow, tween, hooks, oldfire,
+               anim = this,
+               style = elem.style,
+               orig = {},
+               handled = [],
+               hidden = elem.nodeType && isHidden( elem );
+
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
+                       };
+               }
+               hooks.unqueued++;
+
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       });
+               });
+       }
+
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE does not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               if ( jQuery.css( elem, "display" ) === "inline" &&
+                               jQuery.css( elem, "float" ) === "none" ) {
+
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
+
+                       } else {
+                               style.zoom = 1;
+                       }
+               }
+       }
+
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !jQuery.support.shrinkWrapBlocks ) {
+                       anim.done(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
+                       });
+               }
+       }
+
+
+       // show/hide pass
+       for ( index in props ) {
+               value = props[ index ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ index ];
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+                               continue;
+                       }
+                       handled.push( index );
+               }
+       }
+
+       length = handled.length;
+       if ( length ) {
+               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery.removeData( elem, "fxshow", true );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( index = 0 ; index < length ; index++ ) {
+                       prop = handled[ index ];
+                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
+                       }
+               }
+       }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
+               }
+               this.now = ( this.end - this.start ) * eased + this.start;
+
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
+               }
+
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
+               }
+               return this;
+       }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
+
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
+
+                       // passing any value as a 4th parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, false, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
+                       }
+               }
+       }
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ||
+                       // special check for .toggle( handler, handler, ... )
+                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
+
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
+
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+                               // Empty animations resolve immediately
+                               if ( empty ) {
+                                       anim.stop( true );
+                               }
+                       };
+
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
+
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
+
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
+
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
+                               }
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
+                               }
+                       }
+
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
+                       }
+
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
+                       }
+               });
+       }
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       includeWidth = includeWidth? 1 : 0;
+       for( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+       }
+
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
+
+       return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
+
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
+
+       // Queueing
+       opt.old = opt.complete;
+
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
+               }
+
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
+       };
+
+       return opt;
+};
+
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p*Math.PI ) / 2;
+       }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
+
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+};
+
+jQuery.fx.timer = function( timer ) {
+       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
+
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+       if ( arguments.length ) {
+               return options === undefined ?
+                       this :
+                       this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+       }
+
+       var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+               box = { top: 0, left: 0 },
+               elem = this[ 0 ],
+               doc = elem && elem.ownerDocument;
+
+       if ( !doc ) {
+               return;
+       }
+
+       if ( (body = doc.body) === elem ) {
+               return jQuery.offset.bodyOffset( elem );
+       }
+
+       docElem = doc.documentElement;
+
+       // Make sure it's not a disconnected DOM node
+       if ( !jQuery.contains( docElem, elem ) ) {
+               return box;
+       }
+
+       // If we don't have gBCR, just use 0,0 rather than error
+       // BlackBerry 5, iOS 3 (original iPhone)
+       if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+               box = elem.getBoundingClientRect();
+       }
+       win = getWindow( doc );
+       clientTop  = docElem.clientTop  || body.clientTop  || 0;
+       clientLeft = docElem.clientLeft || body.clientLeft || 0;
+       scrollTop  = win.pageYOffset || docElem.scrollTop;
+       scrollLeft = win.pageXOffset || docElem.scrollLeft;
+       return {
+               top: box.top  + scrollTop  - clientTop,
+               left: box.left + scrollLeft - clientLeft
+       };
+};
+
+jQuery.offset = {
+
+       bodyOffset: function( body ) {
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
+
+               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+               }
+
+               return { top: top, left: left };
+       },
+
+       setOffset: function( elem, options, i ) {
+               var position = jQuery.css( elem, "position" );
+
+               // set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
+
+               var curElem = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curCSSTop = jQuery.css( elem, "top" ),
+                       curCSSLeft = jQuery.css( elem, "left" ),
+                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
+
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
+
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
+
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
+
+
+jQuery.fn.extend({
+
+       position: function() {
+               if ( !this[0] ) {
+                       return;
+               }
+
+               var elem = this[0],
+
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
+
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+               // Subtract element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+               // Subtract the two offsets
+               return {
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
+               };
+       },
+
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent || document.body;
+               });
+       }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+       var top = /Y/.test( prop );
+
+       jQuery.fn[ method ] = function( val ) {
+               return jQuery.access( this, function( elem, method, val ) {
+                       var win = getWindow( elem );
+
+                       if ( val === undefined ) {
+                               return win ? (prop in win) ? win[ prop ] :
+                                       win.document.documentElement[ method ] :
+                                       elem[ method ];
+                       }
+
+                       if ( win ) {
+                               win.scrollTo(
+                                       !top ? val : jQuery( win ).scrollLeft(),
+                                        top ? val : jQuery( win ).scrollTop()
+                               );
+
+                       } else {
+                               elem[ method ] = val;
+                       }
+               }, method, val, arguments.length, null );
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+               // margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+                       return jQuery.access( this, function( elem, type, value ) {
+                               var doc;
+
+                               if ( jQuery.isWindow( elem ) ) {
+                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
+                                       // https://github.com/jquery/jquery/pull/764
+                                       return elem.document.documentElement[ "client" + name ];
+                               }
+
+                               // Get document width or height
+                               if ( elem.nodeType === 9 ) {
+                                       doc = elem.documentElement;
+
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+                                       return Math.max(
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
+                                       );
+                               }
+
+                               return value === undefined ?
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, value, extra ) :
+
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable, null );
+               };
+       });
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
diff --git a/css/car/components/jQuery/jquery.nouisliderix.js b/css/car/components/jQuery/jquery.nouisliderix.js
new file mode 100644 (file)
index 0000000..e57302e
--- /dev/null
@@ -0,0 +1,364 @@
+/* noUiSlider 3.2.1 */
+(function ($) {
+
+       $.fn.noUiSlider = function (options, flag) {
+
+               // test for mouse, pointer or touch
+               var EVENT = window.navigator.msPointerEnabled ? 2 : 'ontouchend' in document ? 3 : 1;
+               if (window.debug && console) {
+                       console.log(EVENT);
+               }
+
+               // shorthand for test=function, calling
+               function call(f, scope, args) {
+                       if (typeof f === "function") {
+                               f.call(scope, args);
+                       }
+               }
+
+               // function wrapper for calculating to and from range values
+               var percentage = {
+                       to : function (range, value) {
+                               value = range[0] < 0 ? value + Math.abs(range[0]) : value - range[0];
+                               return (value * 100) / this._length(range);
+                       },
+                       from : function (range, value) {
+                               return (value * 100) / this._length(range);
+                       },
+                       is : function (range, value) {
+                               return 100 - ((value * this._length(range)) / 100) + range[0];
+                       },
+                       _length : function (range) {
+                               return (range[0] > range[1] ? range[0] - range[1] : range[1] - range[0]);
+                       }
+               }
+
+               // bounce handles of eachother, the edges of the slider
+               function correct(proposal, slider, handle) {
+
+                       var
+                       setup = slider.data('setup'),
+                       handles = setup.handles,
+                       settings = setup.settings,
+                       pos = setup.pos;
+
+                       proposal = proposal < 0 ? 0 : proposal > 100 ? 100 : proposal;
+
+                       if (settings.handles == 2) {
+                               if (handle.is(':first-child')) {
+                                       var other = parseFloat(handles[1][0].style[pos]) - settings.margin;
+                                       proposal = proposal > other ? other : proposal;
+                               } else {
+                                       var other = parseFloat(handles[0][0].style[pos]) + settings.margin;
+                                       proposal = proposal < other ? other : proposal;
+                               }
+                       }
+
+                       if (settings.step) {
+                               var per = percentage.from(settings.range, settings.step);
+                               proposal = Math.round(proposal / per) * per;
+                       }
+
+                       return proposal;
+
+               }
+
+               // get standarised clientX and clientY
+               function client(f) {
+                       try {
+                               return [(f.clientX || f.originalEvent.clientX || f.originalEvent.touches[0].clientX), (f.clientY || f.originalEvent.clientY || f.originalEvent.touches[0].clientY)];
+                       } catch (e) {
+                               return ['x', 'y'];
+                       }
+               }
+
+               // get native inline style value in %
+               function place(handle, pos) {
+                       return parseFloat(handle[0].style[pos]);
+               }
+
+               // simplified defaults
+               var defaults = {
+                       handles : 2,
+                       serialization : {
+                               to : ['', ''],
+                               resolution : 0.01
+                       }
+               };
+
+               // contains all methods
+               methods = {
+                       create : function () {
+
+                               return this.each(function () {
+
+                                       // set handle to position
+                                       function setHandle(handle, to, slider) {
+                                               handle.css(pos, to + '%').data('input').val(percentage.is(settings.range, to).toFixed(res));
+                                       }
+
+                                       var
+                                       settings = $.extend(defaults, options),
+                                       // handles
+                                       handlehtml = '<a><div></div></a>',
+                                       // save this to variable, // allows identification
+                                       slider = $(this).data('_isnS_', true),
+                                       // array of handles
+                                       handles = [],
+                                       // the way the handles are positioned for this slider, top/left
+                                       pos,
+                                       // for quick orientation testing and array matching
+                                       orientation,
+                                       // append classes
+                                       classes = "",
+                                       // tests numerical
+                                       num = function (e) {
+                                               return !isNaN(parseFloat(e)) && isFinite(e);
+                                       },
+                                       // counts decimals in serialization, sets default
+                                       split = (settings.serialization.resolution = settings.serialization.resolution || 0.01).toString().split('.'),
+                                       res = split[0] == 1 ? 0 : split[1].length;
+
+                                       settings.start = num(settings.start) ? [settings.start, 0] : settings.start;
+
+                                       // logs bad input values, if possible
+                                       $.each(settings, function (a, b) {
+
+                                               if (num(b)) {
+                                                       settings[a] = parseFloat(b);
+                                               } else if (typeof b == "object" && num(b[0])) {
+                                                       b[0] = parseFloat(b[0]);
+                                                       if (num(b[1])) {
+                                                               b[1] = parseFloat(b[1]);
+                                                       }
+                                               }
+
+                                               var e = false;
+                                               b = typeof b == "undefined" ? "x" : b;
+
+                                               switch (a) {
+                                               case 'range':
+                                               case 'start':
+                                                       e = b.length != 2 || !num(b[0]) || !num(b[1]);
+                                                       break;
+                                               case 'handles':
+                                                       e = (b < 1 || b > 2 || !num(b));
+                                                       break;
+                                               case 'connect':
+                                                       e = b != "lower" && b != "upper" && typeof b != "boolean";
+                                                       break;
+                                               case 'orientation':
+                                                       e = (b != "vertical" && b != "horizontal");
+                                                       break;
+                                               case 'margin':
+                                               case 'step':
+                                                       e = typeof b != "undefined" && !num(b);
+                                                       break;
+                                               case 'serialization':
+                                                       e = typeof b != "object" || !num(b.resolution) || (typeof b.to == 'object' && b.to.length < settings.handles);
+                                                       break;
+                                               case 'slide':
+                                                       e = typeof b != "function";
+                                                       break;
+                                               }
+
+                                               if (e && console) {
+                                                       console.error('Bad input for ' + a + ' on slider:', slider);
+                                               }
+
+                                       });
+
+                                       settings.margin = settings.margin ? percentage.from(settings.range, settings.margin) : 0;
+
+                                       // tests serialization to be strings or jQuery objects
+                                       if (settings.serialization.to instanceof jQuery || typeof settings.serialization.to == 'string' || settings.serialization.to === false) {
+                                               settings.serialization.to = [settings.serialization.to];
+                                       }
+
+                                       if (settings.orientation == "vertical") {
+                                               classes += "vertical";
+                                               pos = 'top';
+                                               orientation = 1;
+                                       } else {
+                                               classes += "horizontal";
+                                               pos = 'right';
+                                               orientation = 0;
+                                       }
+
+                                       classes += settings.connect ? settings.connect == "lower" ? " connect lower" : " connect" : "";
+
+                                       slider.addClass(classes);
+
+                                       for (var i = 0; i < settings.handles; i++) {
+
+                                               handles[i] = slider.append(handlehtml).children(':last');
+                                               var setTo = 100 - percentage.to(settings.range, settings.start[i]);
+                                               handles[i].css(pos, setTo + '%');
+                                               if (setTo == 100 && handles[i].is(':first-child')) {
+                                                       handles[i].css('z-index', 2);
+                                               }
+
+                                               var bind = '.noUiSlider',
+                                               onEvent = (EVENT === 1 ? 'mousedown' : EVENT === 2 ? 'MSPointerDown' : EVENT === 3 ? 'mousedown' : 'touchstart') + bind + 'X',
+                                               moveEvent = (EVENT === 1 ? 'mousemove' : EVENT === 2 ? 'MSPointerMove' : EVENT === 3 ? 'mousemove' : 'touchmove') + bind,
+                                               offEvent = (EVENT === 1 ? 'mouseup' : EVENT === 2 ? 'MSPointerUp' : EVENT === 3 ? 'mouseup' :'touchend') + bind
+
+                                               handles[i].find('div').on(onEvent, function (e) {
+
+                                                       $('body').bind('selectstart' + bind, function () {
+                                                               return false;
+                                                       });
+
+                                                       if (!slider.hasClass('disabled')) {
+
+                                                               $('body').addClass('TOUCH');
+
+                                                               var handle = $(this).addClass('active').parent(),
+                                                               unbind = handle.add($(document)).add('body'),
+                                                               originalPosition = 100 - parseFloat(handle[0].style[pos]),
+                                                               originalClick = client(e),
+                                                               previousClick = originalClick,
+                                                               previousProposal = false;
+
+                                                               $(document).on(moveEvent, function (f) {
+
+                                                                       f.preventDefault();
+
+                                                                       var currentClick = client(f);
+
+                                                                       if (currentClick[0] == "x") {
+                                                                               return;
+                                                                       }
+
+                                                                       currentClick[0] -= originalClick[0];
+                                                                       currentClick[1] -= originalClick[1];
+
+                                                                       var movement = [
+                                                                               previousClick[0] != currentClick[0], previousClick[1] != currentClick[1]
+                                                                       ],
+                                                                       proposal = originalPosition + ((currentClick[orientation] * 100) / (orientation ? slider.height() : slider.width()));
+                                                                       proposal = 100 - correct(proposal, slider, handle);
+
+                                                                       if (movement[orientation] && proposal != previousProposal) {
+                                                                               handle.css(pos, proposal + '%').data('input').val(percentage.is(settings.range, proposal).toFixed(res));
+                                                                               call(settings.slide, slider.data('_n', true));
+                                                                               previousProposal = proposal;
+                                                                               handle.css('z-index', handles.length == 2 && proposal == 100 && handle.is(':first-child') ? 2 : 1);
+                                                                       }
+
+                                                                       previousClick = currentClick;
+
+                                                               }).on(offEvent, function () {
+
+                                                                       unbind.off(bind);
+                                                                       $('body').removeClass('TOUCH');
+                                                                       if (slider.find('.active').removeClass('active').end().data('_n')) {
+                                                                               slider.data('_n', false).change();
+                                                                       }
+
+                                                               });
+
+                                                       }
+                                               }).on('click', function (e) {
+                                                       e.stopPropagation();
+                                               });
+
+                                       }
+
+                                       if (EVENT == 1) {
+                                               slider.on('click', function (f) {
+                                                       if (!slider.hasClass('disabled')) {
+                                                               var currentClick = client(f),
+                                                               proposal = ((currentClick[orientation] - slider.offset()[pos]) * 100) / (orientation ? slider.height() : slider.width()),
+                                                               handle = handles.length > 1 ? (currentClick[orientation] < (handles[0].offset()[pos] + handles[1].offset()[pos]) / 2 ? handles[0] : handles[1]) : handles[0];
+                                                               setHandle(handle, correct(proposal, slider, handle), slider);
+                                                               call(settings.slide, slider);
+                                                               slider.change();
+                                                       }
+                                               });
+                                       }
+
+                                       for (var i = 0; i < handles.length; i++) {
+                                               var val = percentage.is(settings.range, place(handles[i], pos)).toFixed(res);
+                                               if (typeof settings.serialization.to[i] == 'string') {
+                                                       handles[i].data('input',
+                                                               slider.append('<input type="hidden" name="' + settings.serialization.to[i] + '">').find('input:last')
+                                                               .val(val)
+                                                               .change(function (a) {
+                                                                       a.stopPropagation();
+                                                               }));
+                                               } else if (settings.serialization.to[i] == false) {
+                                                       handles[i].data('input', {
+                                                               val : function (a) {
+                                                                       if (typeof a != 'undefined') {
+                                                                               this.handle.data('noUiVal', a);
+                                                                       } else {
+                                                                               return this.handle.data('noUiVal');
+                                                                       }
+                                                               },
+                                                               handle : handles[i]
+                                                       });
+                                               } else {
+                                                       handles[i].data('input', settings.serialization.to[i].data('handleNR', i).val(val).change(function () {
+                                                                       var arr = [null, null];
+                                                                       arr[$(this).data('handleNR')] = $(this).val();
+                                                                       slider.val(arr);
+                                                               }));
+                                               }
+                                       }
+
+                                       $(this).data('setup', {
+                                               settings : settings,
+                                               handles : handles,
+                                               pos : pos,
+                                               res : res
+                                       });
+
+                               });
+                       },
+                       val : function () {
+
+                               if (typeof arguments[0] !== 'undefined') {
+
+                                       var val = typeof arguments[0] == 'number' ? [arguments[0]] : arguments[0];
+
+                                       return this.each(function () {
+
+                                               var setup = $(this).data('setup');
+
+                                               for (var i = 0; i < setup.handles.length; i++) {
+                                                       if (val[i] != null) {
+                                                               var proposal = 100 - correct(percentage.to(setup.settings.range, val[i]), $(this), setup.handles[i]);
+                                                               setup.handles[i].css(setup.pos, proposal + '%').data('input').val(percentage.is(setup.settings.range, proposal).toFixed(setup.res));
+                                                       }
+                                               }
+                                       });
+
+                               } else {
+
+                                       var handles = $(this).data('setup').handles,
+                                       re = [];
+                                       for (var i = 0; i < handles.length; i++) {
+                                               re.push(parseFloat(handles[i].data('input').val()));
+                                       }
+                                       return re.length == 1 ? re[0] : re;
+
+                               }
+                       },
+                       disabled : function () {
+                               return flag ? $(this).addClass('disabled') : $(this).removeClass('disabled');
+                       }
+               }
+
+               // remap the native/current val function to noUiSlider
+               var $_val = jQuery.fn.val;
+
+               jQuery.fn.val = function () {
+                       return this.data('_isnS_') ? methods.val.apply(this, arguments) : $_val.apply(this, arguments);
+               }
+
+               return options == "disabled" ? methods.disabled.apply(this) : methods.create.apply(this);
+
+       }
+
+})(jQuery);
diff --git a/css/car/components/jsViews/jsrender.js b/css/car/components/jsViews/jsrender.js
new file mode 100644 (file)
index 0000000..5dc985d
--- /dev/null
@@ -0,0 +1,996 @@
+/*! JsRender v1.0pre: http://github.com/BorisMoore/jsrender */
+/*
+* Optimized version of jQuery Templates, for rendering to string.
+* Does not require jQuery, or HTML DOM
+* Integrates with JsViews (http://github.com/BorisMoore/jsviews)
+* Copyright 2012, Boris Moore
+* Released under the MIT License.
+*/
+// informal pre beta commit counter: 15
+
+this.jsviews || this.jQuery && jQuery.views || (function(global, undefined) {
+
+       //========================== Top-level vars ==========================
+
+       var versionNumber = "v1.0pre",
+
+               $, rTag, rTmplString, extend,
+               delimOpenChar0 = "{", delimOpenChar1 = "{", delimCloseChar0 = "}", delimCloseChar1 = "}", sub = {},
+               FALSE = false, TRUE = true,
+               jQuery = global.jQuery,
+
+               rPath = /^(?:null|true|false|\d[\d.]*|([\w$]+|~([\w$]+)|#(view|([\w$]+))?)([\w$.]*?)(?:[.[]([\w$]+)\]?)?|(['"]).*\8)$/g,
+               //                               nil   object   helper    view  viewProperty pathTokens   leafToken     string
+
+               rParams = /(\()(?=|\s*\()|(?:([([])\s*)?(?:([#~]?[\w$.]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*!:?\/]|(=))\s*|([#~]?[\w$.]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*([)\]])([([]?))|(\s+)/g,
+               //          lftPrn        lftPrn2                path    operator err                                                eq         path2       prn    comma   lftPrn2   apos quot        rtPrn   prn2   space
+               // (left paren? followed by (path? followed by operator) or (path followed by paren?)) or comma or apos or quot or right paren or space
+
+               rNewLine = /\r?\n/g,
+               rUnescapeQuotes = /\\(['"])/g,
+               rEscapeQuotes = /\\?(['"])/g,
+               rBuildHash = /\x08(~)?([^\x08]+)\x08/g,
+
+               autoViewKey = 0,
+               autoTmplName = 0,
+               escapeMapForHtml = {
+                       "&": "&amp;",
+                       "<": "&lt;",
+                       ">": "&gt;"
+               },
+               tmplAttr = "data-jsv-tmpl",
+               fnDeclStr = "var j=j||" + (jQuery ? "jQuery." : "js") + "views,",
+               htmlSpecialChar = /[\x00"&'<>]/g,
+               slice = Array.prototype.slice,
+
+               render = {},
+
+               // jsviews object ($.views if jQuery is loaded)
+               jsv = {
+                       jsviews: versionNumber,
+                       sub: sub, // subscription, e.g. JsViews integration
+                       debugMode: TRUE,
+                       render: render,
+                       templates: templates,
+                       tags: tags,
+                       helpers: helpers,
+                       converters: converters,
+                       View: View,
+                       delimiters: setDelimiters,
+                       _convert: convert,
+                       _err: function(e) {
+                               return jsv.debugMode ? ("<br/><b>Error:</b> <em> " + (e.message || e) + ". </em>") : '""';
+                       },
+                       _tmplFn: tmplFn,
+                       _tag: renderTag
+               };
+       //========================== Top-level functions ==========================
+
+       //===================
+       // jsviews.delimiters
+       //===================
+
+       function setDelimiters(openChars, closeChars) {
+               // Set the tag opening and closing delimiters. Default is "{{" and "}}"
+               // openChar, closeChars: opening and closing strings, each with two characters
+
+               if (!jsv.rTag || arguments.length) {
+                       delimOpenChar0 = openChars ? "\\" + openChars.charAt(0) : delimOpenChar0; // Escape the characters - since they could be regex special characters
+                       delimOpenChar1 = openChars ? "\\" + openChars.charAt(1) : delimOpenChar1;
+                       delimCloseChar0 = closeChars ? "\\" + closeChars.charAt(0) : delimCloseChar0;
+                       delimCloseChar1 = closeChars ? "\\" + closeChars.charAt(0) : delimCloseChar1;
+
+                       // Build regex with new delimiters
+                       jsv.rTag = rTag // make rTag available to JsViews (or other components) for parsing binding expressions
+                               //          tag    (followed by / space or })   or cvtr+colon or html or code
+                               = "(?:(?:(\\w+(?=[\\/\\s" + delimCloseChar0 + "]))|(?:(\\w+)?(:)|(>)|(\\*)))"
+                               //     params
+                               + "\\s*((?:[^" + delimCloseChar0 + "]|" + delimCloseChar0 + "(?!" + delimCloseChar1 + "))*?)";
+
+                       //                                         slash or closeBlock           }}
+                       rTag = new RegExp(delimOpenChar0 + delimOpenChar1 + rTag + "(\\/)?|(?:\\/(\\w+)))" + delimCloseChar0 + delimCloseChar1, "g");
+
+                       // Default rTag:    tag      converter colon html code     params            slash   closeBlock
+                       //    /{{(?:(?:(\w+(?=[\/\s}]))|(?:(\w+)?(:)|(>)|(\*)))\s*((?:[^}]|}(?!}))*?)(\/)?|(?:\/(\w+)))}}
+
+                       rTmplString = new RegExp("<.*>|" + openChars + ".*" + closeChars);
+               }
+               return [delimOpenChar0, delimOpenChar1, delimCloseChar0, delimCloseChar1];
+       }
+
+       //=================
+       // View._hlp
+       //=================
+
+       function getHelper(helper) {
+               // Helper method called as view._hlp() from compiled template, for helper functions or template parameters ~foo
+               var view = this,
+                       tmplHelpers = view.tmpl.helpers || {};
+
+               helper = (view.ctx[helper] !== undefined ? view.ctx : tmplHelpers[helper] !== undefined ? tmplHelpers : helpers[helper] !== undefined ? helpers : {})[helper];
+               return typeof helper !== "function" ? helper : function() {
+                       return helper.apply(view, arguments);
+               };
+       }
+
+       //=================
+       // jsviews.convert
+       //=================
+
+       function convert(converter, view, tmpl, text) {
+               var tmplConverters = tmpl.converters;
+               converter = tmplConverters && tmplConverters[converter] || converters[converter];
+               return converter ? converter.call(view, text) : text;
+       }
+
+       //=================
+       // jsviews.tag
+       //=================
+
+       function renderTag(tag, parentView, parentTmpl, converter, content, tagObject) {
+               // Called from within compiled template function, to render a nested tag
+               // Returns the rendered tag
+               var ret,
+                       tmplTags = parentTmpl.tags,
+                       nestedTemplates = parentTmpl.templates,
+                       tmpl = tagObject.props && tagObject.props.tmpl,
+                       args = arguments,
+                       tagFn = tmplTags && tmplTags[tag] || tags[tag];
+
+               if (!tagFn) {
+                       return "";
+               }
+               // Set the tmpl property to the content of the block tag, unless set as an override property on the tag
+               content = content && parentTmpl.tmpls[content - 1];
+               tmpl = tmpl || content || undefined;
+
+               tagObject.tmpl =
+               "" + tmpl === tmpl // if a string
+                       ? nestedTemplates && nestedTemplates[tmpl] || templates[tmpl] || templates(tmpl)
+                       : tmpl;
+
+               tagObject.isTag = TRUE;
+               tagObject.converter = converter;
+               tagObject.view = parentView;
+               tagObject.renderContent = renderContent;
+
+               ret = tagFn.apply(tagObject, args.length > 6 ? slice.call(args, 6) : []);
+               return ret || (ret == undefined ? "" : ret.toString()); // (If ret is the value 0 or false, will render to string)
+       }
+
+       //=================
+       // View constructor
+       //=================
+
+       function View(context, path, parentView, data, template, key, onRender, isArray) {
+               // Constructor for view object in view hierarchy. (Augmented by JsViews if JsViews is loaded)
+               var views,
+                       self = {
+                               tmpl: template,
+                               path: path,
+                               parent: parentView,
+                               data: data,
+                               ctx: context,
+                               // If the data is an array, this is an 'Array View' with a views array for each child 'Instance View'
+                               // If the data is not an array, this is an 'Instance View' with a views 'map' object for any child nested views
+                               views: isArray ? [] : {},
+                               isArray: isArray, // is an 'Array View' owning a data array, with child views for each item
+                               _hlp: getHelper,
+                               _onRender: onRender
+                       };
+
+               if (parentView) {
+                       views = parentView.views;
+                       if (parentView.isArray) {
+                               // Parent is an 'Array View'. Add this view to its views array
+                               views.splice(
+                               // self.key = self.key - the index in the parent view array
+                               self.key = self.index = key !== undefined
+                                       ? key
+                                       : views.length,
+                               0, self);
+                       } else {
+                               // Parent is an 'Instance View'. Add this view to its views object
+                               // self.key = is the key in the parent view map
+                               views[self.key = "_" + autoViewKey++] = self;
+                               // self.index = is index of the parent
+                               self.index = parentView.index;
+                       }
+               }
+               return self;
+       }
+
+       //=================
+       // Registration
+       //=================
+
+       function addToStore(self, store, name, item, process) {
+               // Add item to named store such as templates, helpers, converters...
+               var key, onStore;
+               if (name && typeof name === "object" && !name.nodeType) {
+                       // If name is a map, iterate over map and call store for key
+                       for (key in name) {
+                               store(key, name[key]);
+                       }
+                       return self;
+               }
+               if (!name || item === undefined) {
+                       if (process) {
+                               item = process(undefined, item || name);
+                       }
+               } else if ("" + name === name) { // name must be a string
+                       if (item === null) {
+                               // If item is null, delete this entry
+                               delete store[name];
+                       } else if (item = process ? process(name, item) : item) {
+                               store[name] = item;
+                       }
+               }
+               if (onStore = sub.onStoreItem) {
+                       // e.g. JsViews integration
+                       onStore(store, name, item, process);
+               }
+               return item;
+       }
+
+       function templates(name, tmpl) {
+               // Register templates
+               // Setter: Use $.view.tags( name, tagFn ) or $.view.tags({ name: tagFn, ... }) to add additional tags to the registered tags collection.
+               // Getter: Use var tagFn = $.views.tags( name ) or $.views.tags[name] or $.views.tags.name to return the function for the registered tag.
+               // Remove: Use $.view.tags( name, null ) to remove a registered tag from $.view.tags.
+
+               // When registering for {{foo a b c==d e=f}}, tagFn should be a function with the signature:
+               // function(a,b). The 'this' pointer will be a hash with properties c and e.
+               return addToStore(this, templates, name, tmpl, compile);
+       }
+
+       function tags(name, tagFn) {
+               // Register template tags
+               // Setter: Use $.view.tags( name, tagFn ) or $.view.tags({ name: tagFn, ... }) to add additional tags to the registered tags collection.
+               // Getter: Use var tagFn = $.views.tags( name ) or $.views.tags[name] or $.views.tags.name to return the function for the registered tag.
+               // Remove: Use $.view.tags( name, null ) to remove a registered tag from $.view.tags.
+
+               // When registering for {{foo a b c==d e=f}}, tagFn should be a function with the signature:
+               // function(a,b). The 'this' pointer will be a hash with properties c and e.
+               return addToStore(this, tags, name, tagFn);
+       }
+
+       function helpers(name, helperFn) {
+               // Register helper functions for use in templates (or in data-link expressions if JsViews is loaded)
+               // Setter: Use $.view.helpers( name, helperFn ) or $.view.helpers({ name: helperFn, ... }) to add additional helpers to the registered helpers collection.
+               // Getter: Use var helperFn = $.views.helpers( name ) or $.views.helpers[name] or $.views.helpers.name to return the function.
+               // Remove: Use $.view.helpers( name, null ) to remove a registered helper function from $.view.helpers.
+               // Within a template, access the helper using the syntax: {{... ~myHelper(...) ...}}.
+               return addToStore(this, helpers, name, helperFn);
+       }
+
+       function converters(name, converterFn) {
+               // Register converter functions for use in templates (or in data-link expressions if JsViews is loaded)
+               // Setter: Use $.view.converters( name, converterFn ) or $.view.converters({ name: converterFn, ... }) to add additional converters to the registered converters collection.
+               // Getter: Use var converterFn = $.views.converters( name ) or $.views.converters[name] or $.views.converters.name to return the converter function.
+               // Remove: Use $.view.converters( name, null ) to remove a registered converter from $.view.converters.
+               // Within a template, access the converter using the syntax: {{myConverter:...}}.
+               return addToStore(this, converters, name, converterFn);
+       }
+
+       //=================
+       // renderContent
+       //=================
+
+       function renderContent(data, context, path, key, parentView, onRender) {
+               // Render template against data as a tree of subviews (nested template), or as a string (top-level template).
+               // tagName parameter for internal use only. Used for rendering templates registered as tags (which may have associated presenter objects)
+               var i, l, dataItem, newView, itemWrap, itemsWrap, itemResult, parentContext, tmpl, onRender, props, swapContent, isLayout,
+                       self = this,
+                       result = "";
+
+               if (key === TRUE) {
+                       swapContent = TRUE;
+                       key = 0;
+               }
+               if (self.isTag) {
+                       // This is a call from renderTag
+                       tmpl = self.tmpl;
+                       if (self.props && self.ctx) {
+                               extend(self.ctx, self.props);
+                       }
+                       if (self.ctx && context) {
+                               context = extend(self.ctx, context);
+                       }
+                       context = self.ctx || context;
+                       parentView = parentView || self.view;
+                       path = path || self.path;
+                       key = key || self.key;
+                       props = self.props;
+               } else {
+                       tmpl = self.jquery && self[0] // This is a call from $(selector).render
+                       || self; // This is a call from tmpl.render
+               }
+               if (tmpl) {
+                       if (parentView) {
+                               parentContext = parentView.ctx;
+                               if (data === parentView) {
+                                       // Inherit the data from the parent view.
+                                       // This may be the contents of an {{if}} block
+                                       // Set isLayout = true so we don't iterate the if block if the data is an array.
+                                       data = parentView.data;
+                                       isLayout = TRUE;
+                               }
+                               onRender = onRender || parentView._onRender;
+                       } else {
+                               parentContext = jsv.helpers;
+                       }
+
+                       // Set additional context on views created here, (as modified context inherited from the parent, and to be inherited by child views)
+                       // Note: If no jQuery, extend does not support chained copies - so limit extend() to two parameters
+                       // TODO could make this a reusable helper for merging context.
+                       context = (context && context !== parentContext)
+                               ? extend(extend({}, parentContext), context)
+                               : parentContext;
+
+                       if (!tmpl.fn) {
+                               tmpl = templates[tmpl] || templates(tmpl);
+                       }
+
+                       if (tmpl) {
+                               if ($.isArray(data) && !isLayout) {
+                                       // Create a view for the array, whose child views correspond to each data item.
+                                       // (Note: if key and parentView are passed in along with parent view, treat as
+                                       // insert -e.g. from view.addViews - so parentView is already the view item for array)
+                                       newView = swapContent ? parentView : (key !== undefined && parentView) || View(context, path, parentView, data, tmpl, key, onRender, TRUE);
+                                       var iterator = createIterator("foreach", data.length);
+                                       // data.iterator = helpers.iterator;
+                                       for (i = 0, l = data.length; i < l; i++) {
+                                               // Create a view for each data item.
+                                               dataItem = data[i];
+                                               dataItem.iterator = iterator;
+                                               itemResult = tmpl.fn(dataItem, View(context, path, newView, dataItem, tmpl, (key || 0) + i, onRender), jsv);
+                                               result += onRender ? onRender(itemResult, tmpl, props) : itemResult;
+                                               iterator.counter++;
+                                       }
+                               } else {
+                                       // Create a view for singleton data object.
+                                       newView = swapContent ? parentView : View(context, path, parentView, data, tmpl, key, onRender);
+                                       newView._onRender = onRender;
+                                       result += tmpl.fn(data, newView, jsv);
+                               }
+                               return onRender ? onRender(result, tmpl, props, newView.key, path) : result;
+                       }
+               }
+               return ""; // No tmpl. Could throw...
+       }
+
+       //===========================
+       // Build and compile template
+       //===========================
+
+       // Generate a reusable function that will serve to render a template against data
+       // (Compile AST then build template function)
+
+       function syntaxError(message, e) {
+               throw (e ? (e.name + ': "' + e.message + '"') : "Syntax error") + (message ? (" \n" + message) : "");
+       }
+
+       function tmplFn(markup, tmpl, bind) {
+               // Compile markup to AST (abtract syntax tree) then build the template function code from the AST nodes
+               // Used for compiling templates, and also by JsViews to build functions for data link expressions
+               var newNode, node, i, l, code, hasTag, hasEncoder, getsValue, hasConverter, hasViewPath, tag, converter, params, hash, nestedTmpl, allowCode,
+                       tmplOptions = tmpl ? {
+                               allowCode: allowCode = tmpl.allowCode,
+                               debug: tmpl.debug
+                       } : {},
+                       nested = tmpl && tmpl.tmpls,
+                       astTop = [],
+                       loc = 0,
+                       stack = [],
+                       content = astTop,
+                       current = [, , , astTop],
+                       nestedIndex = 0;
+
+               //==== nested functions ====
+               function pushPreceedingContent(shift) {
+                       shift -= loc;
+                       if (shift) {
+                               content.push(markup.substr(loc, shift).replace(rNewLine, "\\n"));
+                       }
+               }
+
+               function parseTag(all, tagName, converter, colon, html, code, params, slash, closeBlock, index) {
+                       //                  tag           converter colon  html  code     params         slash   closeBlock
+                       //      /{{(?:(?:(\w+(?=[\/!\s\}!]))|(?:(\w+)?(:)|(?:(>)|(\*)))((?:[^\}]|}(?!}))*?)(\/)?|(?:\/(\w+)))}}/g;
+                       // Build abstract syntax tree (AST): [ tagName, converter, params, content, hash, contentMarkup ]
+                       if (html) {
+                               colon = ":";
+                               converter = "html";
+                       }
+                       var hash = "",
+                               passedCtx = "",
+                               // Block tag if not self-closing and not {{:}} or {{>}} (special case) and not a data-link expression (has bind parameter)
+                               block = !slash && !colon && !bind;
+
+                       //==== nested helper function ====
+
+                       tagName = tagName || colon;
+                       pushPreceedingContent(index);
+                       loc = index + all.length; // location marker - parsed up to here
+                       if (code) {
+                               if (allowCode) {
+                                       content.push(["*", params.replace(rUnescapeQuotes, "$1")]);
+                               }
+                       } else if (tagName) {
+                               if (tagName === "else") {
+                                       current[5] = markup.substring(current[5], index); // contentMarkup for block tag
+                                       current = stack.pop();
+                                       content = current[3];
+                                       block = TRUE;
+                               }
+                               if (tagName === "set" || tagName === "continueIf" || tagName === "breakIf") {
+                                       block = false;
+                               }
+                               params = (params
+                               ? parseParams(params, bind)
+                                       .replace(rBuildHash, function(all, isCtx, keyValue) {
+                                               if (isCtx) {
+                                                       passedCtx += keyValue + ",";
+                                               } else {
+                                                       hash += keyValue + ",";
+                                               }
+                                               return "";
+                                       })
+                               : "");
+                               hash = hash.slice(0, -1);
+                               params = params.slice(0, -1);
+                               newNode = [
+                               tagName,
+                               converter || "",
+                               params,
+                               block && [],
+                               "{" + (hash ? ("props:{" + hash + "},") : "") + "path:'" + params + "'" + (passedCtx ? ",ctx:{" + passedCtx.slice(0, -1) + "}" : "") + "}"
+                       ];
+                               if (block) {
+                                       stack.push(current);
+                                       current = newNode;
+                                       current[5] = loc; // Store current location of open tag, to be able to add contentMarkup when we reach closing tag
+                               }
+                               content.push(newNode);
+                       } else if (closeBlock) {
+                               //if ( closeBlock !== current[ 0 ]) {
+                               //      throw "unmatched close tag: /" + closeBlock + ". Expected /" + current[ 0 ];
+                               //}
+                               current[5] = markup.substring(current[5], index); // contentMarkup for block tag
+                               current = stack.pop();
+                       }
+                       if (!current) {
+                               throw "Expected block tag";
+                       }
+                       content = current[3];
+               }
+               //==== /end of nested functions ====
+
+               markup = markup.replace(rEscapeQuotes, "\\$1");
+
+               // Build the AST (abstract syntax tree) under astTop
+               markup.replace(rTag, parseTag);
+
+               pushPreceedingContent(markup.length);
+
+               // Use the AST (astTop) to build the template function
+               l = astTop.length;
+               code = (l ? "" : '"";');
+
+               for (i = 0; i < l; i++) {
+                       // AST nodes: [ tagName, converter, params, content, hash, contentMarkup ]
+                       node = astTop[i];
+                       if ("" + node === node) { // type string
+                               code += '"' + node + '"+';
+                       } else if (node[0] === "*") {
+                               code = code.slice(0, i ? -1 : -3) + ";" + node[1] + (i + 1 < l ? "ret+=" : "");
+                       } else {
+                               tag = node[0];
+                               converter = node[1];
+                               params = node[2];
+                               content = node[3];
+                               hash = node[4];
+                               markup = node[5];
+                               if (content) {
+                                       // Create template object for nested template
+                                       nestedTmpl = TmplObject(markup, tmplOptions, tmpl, nestedIndex++);
+                                       // Compile to AST and then to compiled function
+                                       tmplFn(markup, nestedTmpl);
+                                       nested.push(nestedTmpl);
+                               }
+                               hasViewPath = hasViewPath || hash.indexOf("view") > -1;
+                               code += (tag === ":"
+                               ? (converter === "html"
+                                       ? (hasEncoder = TRUE, "e(" + params)
+                                       : converter
+                                               ? (hasConverter = TRUE, 'c("' + converter + '",view,this,' + params)
+                                               : (getsValue = TRUE, "((v=" + params + ')!=u?v:""')
+                               )
+                               : (hasTag = TRUE, 't("' + tag + '",view,this,"' + (converter || "") + '",'
+                                       + (content ? nested.length : '""') // For block tags, pass in the key (nested.length) to the nested content template
+                                       + "," + hash + (params ? "," : "") + params))
+                                       + ")+";
+                       }
+               }
+               code = fnDeclStr
+               + (getsValue ? "v," : "")
+               + (hasTag ? "t=j._tag," : "")
+               + (hasConverter ? "c=j._convert," : "")
+               + (hasEncoder ? "e=j.converters.html," : "")
+               + "ret; try{\n\n"
+               + (tmplOptions.debug ? "debugger;" : "")
+               + (allowCode ? 'ret=' : 'return ')
+               + code.slice(0, -1) + ";\n\n"
+               + (allowCode ? "return ret;" : "")
+               + "}catch(e){return j._err(e);}";
+
+               try {
+                       code = new Function("data, view, j, b, u", code);
+               } catch (e) {
+                       syntaxError("Error in compiled template code:\n" + code, e);
+               }
+
+               // Include only the var references that are needed in the code
+               if (tmpl) {
+                       tmpl.fn = code;
+               }
+               return code;
+       }
+
+       function parseParams(params, bind) {
+               var named,
+                       fnCall = {},
+                       parenDepth = 0,
+                       quoted = FALSE, // boolean for string content in double quotes
+                       aposed = FALSE; // or in single quotes
+
+               function parseTokens(all, lftPrn0, lftPrn, path, operator, err, eq, path2, prn, comma, lftPrn2, apos, quot, rtPrn, prn2, space) {
+                       // rParams = /(?:([([])\s*)?(?:([#~]?[\w$.]+)?\s*((\+\+|--)|\+|-|&&|\|\||===|!==|==|!=|<=|>=|[<>%*!:?\/]|(=))\s*|([#~]?[\w$.^]+)([([])?)|(,\s*)|(\(?)\\?(?:(')|("))|(?:\s*([)\]])([([]?))|(\s+)/g,
+                       //            lftPrn                  path    operator err                                                eq         path2       prn    comma   lftPrn3   apos quot        rtPrn   prn2   space
+                       // (left paren? followed by (path? followed by operator) or (path followed by paren?)) or comma or apos or quot or right paren or space
+                       operator = operator || "";
+                       lftPrn = lftPrn || lftPrn0 || lftPrn2;
+                       path = path || path2;
+                       prn = prn || prn2 || "";
+                       operator = operator || "";
+                       var bindParam = bind && prn !== "(";
+
+                       function parsePath(all, object, helper, view, viewProperty, pathTokens, leafToken) {
+                               // rPath = /^(?:null|true|false|\d[\d.]*|([\w$]+|~([\w$]+)|#(view|([\w$]+))?)([\w$.]*?)(?:[.[]([\w$]+)\]?)?|(['"]).*\8)$/g,
+                               //                                        object   helper    view  viewProperty pathTokens   leafToken     string
+                               if (object) {
+                                       var leaf,
+                                               ret = (helper
+                                                       ? 'view._hlp("' + helper + '")'
+                                                       : view
+                                                               ? "view"
+                                                               : "data")
+                                               + (leafToken
+                                                       ? (viewProperty
+                                                               ? "." + viewProperty
+                                                               : helper
+                                                                       ? ""
+                                                                       : (view ? "" : "." + object)
+                                                               ) + (pathTokens || "")
+                                                       : (leafToken = helper ? "" : view ? viewProperty || "" : object, ""));
+
+                                       leaf = (leafToken ? "." + leafToken : "")
+                                       if (!bindParam) {
+                                               ret = ret + leaf;
+                                       }
+                                       ret = ret.slice(0, 9) === "view.data"
+                                       ? ret.slice(5) // convert #view.data... to data...
+                                       : ret;
+                                       if (bindParam) {
+                                               ret = "b(" + ret + ',"' + leafToken + '")' + leaf;
+                                       }
+                                       return ret;
+                               }
+                               return all;
+                       }
+
+                       if (err) {
+                               syntaxError();
+                       } else {
+                               return (aposed
+                               // within single-quoted string
+                               ? (aposed = !apos, (aposed ? all : '"'))
+                               : quoted
+                               // within double-quoted string
+                                       ? (quoted = !quot, (quoted ? all : '"'))
+                                       :
+                               (
+                                       (lftPrn
+                                                       ? (parenDepth++, lftPrn)
+                                                       : "")
+                                       + (space
+                                               ? (parenDepth
+                                                       ? ""
+                                                       : named
+                                                               ? (named = FALSE, "\b")
+                                                               : ","
+                                               )
+                                               : eq
+                               // named param
+                                                       ? (parenDepth && syntaxError(), named = TRUE, '\b' + path + ':')
+                                                       : path
+                               // path
+                                                               ? (path.replace(rPath, parsePath)
+                                                                       + (prn
+                                                                               ? (fnCall[++parenDepth] = TRUE, prn)
+                                                                               : operator)
+                                                               )
+                                                               : operator
+                                                                       ? operator
+                                                                       : rtPrn
+                               // function
+                                                                               ? ((fnCall[parenDepth--] = FALSE, rtPrn)
+                                                                                       + (prn
+                                                                                               ? (fnCall[++parenDepth] = TRUE, prn)
+                                                                                               : "")
+                                                                               )
+                                                                               : comma
+                                                                                       ? (fnCall[parenDepth] || syntaxError(), ",") // We don't allow top-level literal arrays or objects
+                                                                                       : lftPrn0
+                                                                                               ? ""
+                                                                                               : (aposed = apos, quoted = quot, '"')
+                               ))
+                       );
+                       }
+               }
+               params = (params + " ").replace(rParams, parseTokens);
+               return params;
+       }
+
+       function compile(name, tmpl, parent, options) {
+               console.log("function: compile(name, tmpl, parent, options) :");
+               // tmpl is either a template object, a selector for a template script block, the name of a compiled template, or a template object
+               // options is the set of template properties, c
+               var tmplOrMarkup, elem, key, nested, nestedItem;
+
+               //==== nested functions ====
+               function tmplOrMarkupFromStr(value) {
+                       // If value is of type string - treat as selector, or name of compiled template
+                       // Return the template object, if already compiled, or the markup string
+
+                       console.log("function: tmplOrMarkupFromStr");
+                       if (("" + value === value) || value.nodeType > 0) {
+                               try {
+                                       elem = value.nodeType > 0
+                                       ? value
+                                       : !rTmplString.test(value)
+                                       // If value is a string and does not contain HTML or tag content, then test as selector
+                                               && jQuery && jQuery(value)[0];
+                                       // If selector is valid and returns at least one element, get first element
+                                       // If invalid, jQuery will throw. We will stay with the original string.
+                               } catch (e) { }
+
+                               if (elem) {
+                                       if (!elem.type) {
+                                               // If elem is not a script element, return undefined
+                                               return;
+                                       }
+                                       // It is a script element
+                                       // Create a name for data linking if none provided
+                                       value = templates[elem.getAttribute(tmplAttr)];
+                                       console.log("tmplOrMarkupFromStr in elem");
+                                       if (!value) {
+                                               console.log("tmplOrMarkupFromStr in !value");
+                                               // Not already compiled and cached, so compile and cache the name
+                                               name = name || "_" + autoTmplName++;
+                                               elem.setAttribute(tmplAttr, name);
+                                               value = compile(name, elem.innerHTML, parent, options); // Use tmpl as options
+                                               templates[name] = value;
+                                       }
+                               }
+                               return value;
+                       }
+                       // If value is not a string, return undefined
+               }
+
+               //==== Compile the template ====
+               tmpl = tmpl || "";
+               tmplOrMarkup = tmplOrMarkupFromStr(tmpl);
+
+               // If tmpl is a template object, use it for options
+               options = options || (tmpl.markup ? tmpl : {});
+               options.name = name;
+               nested = options.templates;
+
+               // If tmpl is not a markup string or a selector string, then it must be a template object
+               // In that case, get it from the markup property of the object
+               if (!tmplOrMarkup && tmpl.markup && (tmplOrMarkup = tmplOrMarkupFromStr(tmpl.markup))) {
+                       if (tmplOrMarkup.fn && (tmplOrMarkup.debug !== tmpl.debug || tmplOrMarkup.allowCode !== tmpl.allowCode)) {
+                               // if the string references a compiled template object, but the debug or allowCode props are different, need to recompile
+                               tmplOrMarkup = tmplOrMarkup.markup;
+                       }
+               }
+               if (tmplOrMarkup !== undefined) {
+                       if (name && !parent) {
+                               render[name] = function() {
+                                       return tmpl.render.apply(tmpl, arguments);
+                               };
+                       }
+                       if (tmplOrMarkup.fn || tmpl.fn) {
+                               // tmpl is already compiled, so use it, or if different name is provided, clone it
+                               if (tmplOrMarkup.fn) {
+                                       if (name && name !== tmplOrMarkup.name) {
+                                               tmpl = extend(extend({}, tmplOrMarkup), options);
+                                       } else {
+                                               tmpl = tmplOrMarkup;
+                                       }
+                               }
+                       } else {
+                               // tmplOrMarkup is a markup string, not a compiled template
+                               // Create template object
+                               tmpl = TmplObject(tmplOrMarkup, options, parent, 0);
+                               // Compile to AST and then to compiled function
+                               tmplFn(tmplOrMarkup, tmpl);
+                       }
+                       for (key in nested) {
+                               // compile nested template declarations
+                               nestedItem = nested[key];
+                               if (nestedItem.name !== key) {
+
+                                       console.log("nested");
+                                       nested[key] = compile(key, nestedItem, tmpl);
+                               }
+                       }
+                       return tmpl;
+               }
+       }
+       //==== /end of function compile ====
+
+       function TmplObject(markup, options, parent, key) {
+               // Template object constructor
+
+               // nested helper function
+               function extendStore(storeName) {
+                       if (parent[storeName]) {
+                               // Include parent items except if overridden by item of same name in options
+                               tmpl[storeName] = extend(extend({}, parent[storeName]), options[storeName]);
+                       }
+               }
+
+               options = options || {};
+               var tmpl = {
+                       markup: markup,
+                       tmpls: [],
+                       links: [],
+                       render: renderContent
+               };
+
+               if (parent) {
+                       if (parent.templates) {
+                               tmpl.templates = extend(extend({}, parent.templates), options.templates);
+                       }
+                       tmpl.parent = parent;
+                       tmpl.name = parent.name + "[" + key + "]";
+                       tmpl.key = key;
+               }
+
+               extend(tmpl, options);
+               if (parent) {
+                       extendStore("templates");
+                       extendStore("tags");
+                       extendStore("helpers");
+                       extendStore("converters");
+               }
+               return tmpl;
+       }
+
+       //========================== Initialize ==========================
+
+       if (jQuery) {
+               ////////////////////////////////////////////////////////////////////////////////////////////////
+               // jQuery is loaded, so make $ the jQuery object
+               $ = jQuery;
+               $.templates = templates;
+               $.render = render;
+               $.views = jsv;
+               $.fn.render = renderContent;
+
+       } else {
+               ////////////////////////////////////////////////////////////////////////////////////////////////
+               // jQuery is not loaded.
+
+               $ = global.jsviews = jsv;
+               $.extend = function(target, source) {
+                       var name;
+                       target = target || {};
+                       for (name in source) {
+                               target[name] = source[name];
+                       }
+                       return target;
+               };
+
+               $.isArray = Array && Array.isArray || function(obj) {
+                       return Object.prototype.toString.call(obj) === "[object Array]";
+               };
+       }
+
+       extend = $.extend;
+
+       function replacerForHtml(ch) {
+               // Original code from Mike Samuel <msamuel@google.com>
+               return escapeMapForHtml[ch]
+                       // Intentional assignment that caches the result of encoding ch.
+                       || (escapeMapForHtml[ch] = "&#" + ch.charCodeAt(0) + ";");
+       }
+
+       //========================== Register tags ==========================
+
+       tags({
+               "if": function() {
+                       var ifTag = this,
+                               view = ifTag.view;
+
+                       view.onElse = function(tagObject, args) {
+                               var i = 0,
+                                       l = args.length;
+
+                               while (l && !args[i++]) {
+                                       // Only render content if args.length === 0 (i.e. this is an else with no condition) or if a condition argument is truey
+                                       if (i === l) {
+                                               return "";
+                                       }
+                               }
+                               view.onElse = undefined; // If condition satisfied, so won't run 'else'.
+                               tagObject.path = "";
+                               return tagObject.renderContent(view);
+                               // Test is satisfied, so render content, while remaining in current data context
+                               // By passing the view, we inherit data context from the parent view, and the content is treated as a layout template
+                               // (so if the data is an array, it will not iterate over the data
+                       };
+                       return view.onElse(this, arguments);
+               },
+               "else": function() {
+                       var view = this.view;
+                       return view.onElse ? view.onElse(this, arguments) : "";
+               },
+               "foreach": function() {
+                       var i,
+                               self = this,
+                               result = "",
+                               args = arguments,
+                               l = args.length;
+
+                       if (l === 0) {
+                               // If no parameters, render once, with #data undefined
+                               l = 1;
+                       }
+                       for (i = 0; i < l; i++) {
+                               result += self.renderContent(args[i]);
+                       }
+                       return result;
+               },
+               "while" : function(){
+                       var self = this;
+
+                       var view = this.view;
+                       var data = view.data;
+                       var args = this.path;
+                       var returnContent = "";
+                       var temp = "";
+                       var cond = false;
+                       var iterator = createIterator("while");
+
+                       while(true){
+                               view.data.iterator = iterator;
+                               returnContent = self.renderContent(data);
+                               helpers.iterator.counter++;
+                               cond = eval(args);
+                               if(!cond)
+                                       break;
+
+                       }
+                       return returnContent;
+               },
+
+               "for" : function(){
+                       var self = this;
+                       var view = this.view;
+                       var args = this.path.split(",");
+                       if((args.length != 5 || args.length != 7) && args[0].length < 5 && args[1] != "data.from" && args[3] != "data.to")
+                               return "";
+                       var varName = args[0].substr(5);
+                       var from = arguments[2];
+                       var to = arguments[4];
+                       var by = 0;
+                       if(args.length == 7 && args[5] == "data.by" && arguments[6] > 0)
+                               by=arguments[6];
+                       else
+                               by = 1;
+
+                       var returnContent = "";
+                       var iterator = createIterator("for", Math.floor(Math.abs(to-from) / by) + 1);
+
+                       if(from <= to){
+
+                               for(i = from; i <= to; i = i + by)
+                               {
+                                       view.data.iterator = iterator;
+                                       view.data[varName] = i;
+                                       returnContent += self.renderContent(view.data);
+                                       iterator.counter++;
+                               }
+                       }
+                       else{
+                               for(i = from; i >= to; i = i - by)
+                               {
+                                       view.data.iterator = iterator;
+                                       view.data[varName] = i;
+                                       returnContent += self.renderContent(view.data);
+                                       iterator.counter++;
+                               }
+                       }
+                       return returnContent;
+               },
+
+               "set" : function(){
+                       var data = this.view.data;
+                       var args = this.path.split(",");
+                       //view.data[args[0].substr(5)] = arguments[1];
+                       eval(args[0] + "="+ args[1]);
+                       return;
+               },
+
+
+               "#" : function(){
+                       return;
+               },
+               "*": function(value) {
+                       return value;
+               }
+       });
+
+       //========================== Register global helpers ==========================
+
+               helpers({ // Global helper functions
+                       //todo helpers
+
+               });
+
+
+       function createIterator(pLoopType, pLoops){
+                               return {
+                                       counter : 1,
+                                       loopType : pLoopType != undefined ? pLoopType : "for",
+                                       loops : pLoops != undefined ? pLoops : -1,
+                                       isOdd : function(){
+                                               return this.counter % 2 == 1;
+                                       },
+                                       isEven : function(){
+                                               return this.counter % 2 == 0;
+                                       },
+                                       isFirst : function(){
+                                               return this.counter == 1;
+                                       },
+                                       isLast : function(){
+                                               return this.loopType != "while" && this.counter >= this.loops;
+                                       }
+                               }
+                               }
+
+       //========================== Register converters ==========================
+
+       converters({
+               html: function(text) {
+                       // HTML encoding helper: Replace < > & and ' and " by corresponding entities.
+                       // inspired by Mike Samuel <msamuel@google.com>
+                       return text != undefined ? String(text).replace(htmlSpecialChar, replacerForHtml) : "";
+               },
+               encode: function(text) {
+                       return text != undefined ? encodeURI(text) : "";
+               },
+               escape: function(text) {
+                       return text != undefined ? escape(text) : "";
+               }
+
+       });
+
+       //========================== Define default delimiters ==========================
+       setDelimiters();
+
+})(this);
diff --git a/css/car/components/jsViews/template.js b/css/car/components/jsViews/template.js
new file mode 100644 (file)
index 0000000..f49f4f0
--- /dev/null
@@ -0,0 +1,26 @@
+var template = {
+               // params:
+               // model - model to apply
+               // pathToTemplate - path to file where template is located
+               // element - (type string) name of element, where template will be rendered,
+               // default: content
+               compile: function (model, pathToTemplate, element, doneCallBack) {
+                       "use strict";
+                       if (element === null || element === undefined) {
+                               element = "#content";
+                       }
+
+                       $.get(pathToTemplate, function (data) {
+                               $.templates({
+                                       tmpl : data
+                               });
+                               $(element).html($.render.tmpl(model));
+                               if (!!doneCallBack) {
+                                       doneCallBack();
+                               }
+                       }, "html").error(function (data) {
+                               console.log(pathToTemplate + " jQuery GET error status: " + data.status + " status text: " + data.statusText);
+                               console.log(data);
+                       });
+               }
+       };
\ No newline at end of file
diff --git a/css/car/components/knockout/knockout.js b/css/car/components/knockout/knockout.js
new file mode 100644 (file)
index 0000000..d93e497
--- /dev/null
@@ -0,0 +1,85 @@
+// Knockout JavaScript library v2.2.1
+// (c) Steven Sanderson - http://knockoutjs.com/
+// License: MIT (http://www.opensource.org/licenses/mit-license.php)
+
+(function() {function j(w){throw w;}var m=!0,p=null,r=!1;function u(w){return function(){return w}};var x=window,y=document,ga=navigator,F=window.jQuery,I=void 0;
+function L(w){function ha(a,d,c,e,f){var g=[];a=b.j(function(){var a=d(c,f)||[];0<g.length&&(b.a.Ya(M(g),a),e&&b.r.K(e,p,[c,a,f]));g.splice(0,g.length);b.a.P(g,a)},p,{W:a,Ka:function(){return 0==g.length||!b.a.X(g[0])}});return{M:g,j:a.pa()?a:I}}function M(a){for(;a.length&&!b.a.X(a[0]);)a.splice(0,1);if(1<a.length){for(var d=a[0],c=a[a.length-1],e=[d];d!==c;){d=d.nextSibling;if(!d)return;e.push(d)}Array.prototype.splice.apply(a,[0,a.length].concat(e))}return a}function S(a,b,c,e,f){var g=Math.min,
+h=Math.max,k=[],l,n=a.length,q,s=b.length,v=s-n||1,G=n+s+1,J,A,z;for(l=0;l<=n;l++){A=J;k.push(J=[]);z=g(s,l+v);for(q=h(0,l-1);q<=z;q++)J[q]=q?l?a[l-1]===b[q-1]?A[q-1]:g(A[q]||G,J[q-1]||G)+1:q+1:l+1}g=[];h=[];v=[];l=n;for(q=s;l||q;)s=k[l][q]-1,q&&s===k[l][q-1]?h.push(g[g.length]={status:c,value:b[--q],index:q}):l&&s===k[l-1][q]?v.push(g[g.length]={status:e,value:a[--l],index:l}):(g.push({status:"retained",value:b[--q]}),--l);if(h.length&&v.length){a=10*n;var t;for(b=c=0;(f||b<a)&&(t=h[c]);c++){for(e=
+0;k=v[e];e++)if(t.value===k.value){t.moved=k.index;k.moved=t.index;v.splice(e,1);b=e=0;break}b+=e}}return g.reverse()}function T(a,d,c,e,f){f=f||{};var g=a&&N(a),g=g&&g.ownerDocument,h=f.templateEngine||O;b.za.vb(c,h,g);c=h.renderTemplate(c,e,f,g);("number"!=typeof c.length||0<c.length&&"number"!=typeof c[0].nodeType)&&j(Error("Template engine must return an array of DOM nodes"));g=r;switch(d){case "replaceChildren":b.e.N(a,c);g=m;break;case "replaceNode":b.a.Ya(a,c);g=m;break;case "ignoreTargetNode":break;
+default:j(Error("Unknown renderMode: "+d))}g&&(U(c,e),f.afterRender&&b.r.K(f.afterRender,p,[c,e.$data]));return c}function N(a){return a.nodeType?a:0<a.length?a[0]:p}function U(a,d){if(a.length){var c=a[0],e=a[a.length-1];V(c,e,function(a){b.Da(d,a)});V(c,e,function(a){b.s.ib(a,[d])})}}function V(a,d,c){var e;for(d=b.e.nextSibling(d);a&&(e=a)!==d;)a=b.e.nextSibling(e),(1===e.nodeType||8===e.nodeType)&&c(e)}function W(a,d,c){a=b.g.aa(a);for(var e=b.g.Q,f=0;f<a.length;f++){var g=a[f].key;if(e.hasOwnProperty(g)){var h=
+e[g];"function"===typeof h?(g=h(a[f].value))&&j(Error(g)):h||j(Error("This template engine does not support the '"+g+"' binding within its templates"))}}a="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+b.g.ba(a)+" } })()})";return c.createJavaScriptEvaluatorBlock(a)+d}function X(a,d,c,e){function f(a){return function(){return k[a]}}function g(){return k}var h=0,k,l;b.j(function(){var n=c&&c instanceof b.z?c:new b.z(b.a.d(c)),q=n.$data;e&&b.eb(a,n);if(k=("function"==typeof d?
+d(n,a):d)||b.J.instance.getBindings(a,n)){if(0===h){h=1;for(var s in k){var v=b.c[s];v&&8===a.nodeType&&!b.e.I[s]&&j(Error("The binding '"+s+"' cannot be used with virtual elements"));if(v&&"function"==typeof v.init&&(v=(0,v.init)(a,f(s),g,q,n))&&v.controlsDescendantBindings)l!==I&&j(Error("Multiple bindings ("+l+" and "+s+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.")),l=s}h=2}if(2===h)for(s in k)(v=b.c[s])&&"function"==
+typeof v.update&&(0,v.update)(a,f(s),g,q,n)}},p,{W:a});return{Nb:l===I}}function Y(a,d,c){var e=m,f=1===d.nodeType;f&&b.e.Ta(d);if(f&&c||b.J.instance.nodeHasBindings(d))e=X(d,p,a,c).Nb;e&&Z(a,d,!f)}function Z(a,d,c){for(var e=b.e.firstChild(d);d=e;)e=b.e.nextSibling(d),Y(a,d,c)}function $(a,b){var c=aa(a,b);return c?0<c.length?c[c.length-1].nextSibling:a.nextSibling:p}function aa(a,b){for(var c=a,e=1,f=[];c=c.nextSibling;){if(H(c)&&(e--,0===e))return f;f.push(c);B(c)&&e++}b||j(Error("Cannot find closing comment tag to match: "+
+a.nodeValue));return p}function H(a){return 8==a.nodeType&&(K?a.text:a.nodeValue).match(ia)}function B(a){return 8==a.nodeType&&(K?a.text:a.nodeValue).match(ja)}function P(a,b){for(var c=p;a!=c;)c=a,a=a.replace(ka,function(a,c){return b[c]});return a}function la(){var a=[],d=[];this.save=function(c,e){var f=b.a.i(a,c);0<=f?d[f]=e:(a.push(c),d.push(e))};this.get=function(c){c=b.a.i(a,c);return 0<=c?d[c]:I}}function ba(a,b,c){function e(e){var g=b(a[e]);switch(typeof g){case "boolean":case "number":case "string":case "function":f[e]=
+g;break;case "object":case "undefined":var h=c.get(g);f[e]=h!==I?h:ba(g,b,c)}}c=c||new la;a=b(a);if(!("object"==typeof a&&a!==p&&a!==I&&!(a instanceof Date)))return a;var f=a instanceof Array?[]:{};c.save(a,f);var g=a;if(g instanceof Array){for(var h=0;h<g.length;h++)e(h);"function"==typeof g.toJSON&&e("toJSON")}else for(h in g)e(h);return f}function ca(a,d){if(a)if(8==a.nodeType){var c=b.s.Ua(a.nodeValue);c!=p&&d.push({sb:a,Fb:c})}else if(1==a.nodeType)for(var c=0,e=a.childNodes,f=e.length;c<f;c++)ca(e[c],
+d)}function Q(a,d,c,e){b.c[a]={init:function(a){b.a.f.set(a,da,{});return{controlsDescendantBindings:m}},update:function(a,g,h,k,l){h=b.a.f.get(a,da);g=b.a.d(g());k=!c!==!g;var n=!h.Za;if(n||d||k!==h.qb)n&&(h.Za=b.a.Ia(b.e.childNodes(a),m)),k?(n||b.e.N(a,b.a.Ia(h.Za)),b.Ea(e?e(l,g):l,a)):b.e.Y(a),h.qb=k}};b.g.Q[a]=r;b.e.I[a]=m}function ea(a,d,c){c&&d!==b.k.q(a)&&b.k.T(a,d);d!==b.k.q(a)&&b.r.K(b.a.Ba,p,[a,"change"])}var b="undefined"!==typeof w?w:{};b.b=function(a,d){for(var c=a.split("."),e=b,f=0;f<
+c.length-1;f++)e=e[c[f]];e[c[c.length-1]]=d};b.p=function(a,b,c){a[b]=c};b.version="2.2.1";b.b("version",b.version);b.a=new function(){function a(a,d){if("input"!==b.a.u(a)||!a.type||"click"!=d.toLowerCase())return r;var c=a.type;return"checkbox"==c||"radio"==c}var d=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,c={},e={};c[/Firefox\/2/i.test(ga.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];c.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");
+for(var f in c){var g=c[f];if(g.length)for(var h=0,k=g.length;h<k;h++)e[g[h]]=f}var l={propertychange:m},n,c=3;f=y.createElement("div");for(g=f.getElementsByTagName("i");f.innerHTML="\x3c!--[if gt IE "+ ++c+"]><i></i><![endif]--\x3e",g[0];);n=4<c?c:I;return{Na:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],o:function(a,b){for(var d=0,c=a.length;d<c;d++)b(a[d])},i:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var d=0,c=a.length;d<
+c;d++)if(a[d]===b)return d;return-1},lb:function(a,b,d){for(var c=0,e=a.length;c<e;c++)if(b.call(d,a[c]))return a[c];return p},ga:function(a,d){var c=b.a.i(a,d);0<=c&&a.splice(c,1)},Ga:function(a){a=a||[];for(var d=[],c=0,e=a.length;c<e;c++)0>b.a.i(d,a[c])&&d.push(a[c]);return d},V:function(a,b){a=a||[];for(var d=[],c=0,e=a.length;c<e;c++)d.push(b(a[c]));return d},fa:function(a,b){a=a||[];for(var d=[],c=0,e=a.length;c<e;c++)b(a[c])&&d.push(a[c]);return d},P:function(a,b){if(b instanceof Array)a.push.apply(a,
+b);else for(var d=0,c=b.length;d<c;d++)a.push(b[d]);return a},extend:function(a,b){if(b)for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);return a},ka:function(a){for(;a.firstChild;)b.removeNode(a.firstChild)},Hb:function(a){a=b.a.L(a);for(var d=y.createElement("div"),c=0,e=a.length;c<e;c++)d.appendChild(b.A(a[c]));return d},Ia:function(a,d){for(var c=0,e=a.length,g=[];c<e;c++){var f=a[c].cloneNode(m);g.push(d?b.A(f):f)}return g},N:function(a,d){b.a.ka(a);if(d)for(var c=0,e=d.length;c<e;c++)a.appendChild(d[c])},
+Ya:function(a,d){var c=a.nodeType?[a]:a;if(0<c.length){for(var e=c[0],g=e.parentNode,f=0,h=d.length;f<h;f++)g.insertBefore(d[f],e);f=0;for(h=c.length;f<h;f++)b.removeNode(c[f])}},bb:function(a,b){7>n?a.setAttribute("selected",b):a.selected=b},D:function(a){return(a||"").replace(d,"")},Rb:function(a,d){for(var c=[],e=(a||"").split(d),f=0,g=e.length;f<g;f++){var h=b.a.D(e[f]);""!==h&&c.push(h)}return c},Ob:function(a,b){a=a||"";return b.length>a.length?r:a.substring(0,b.length)===b},tb:function(a,b){if(b.compareDocumentPosition)return 16==
+(b.compareDocumentPosition(a)&16);for(;a!=p;){if(a==b)return m;a=a.parentNode}return r},X:function(a){return b.a.tb(a,a.ownerDocument)},u:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},n:function(b,d,c){var e=n&&l[d];if(!e&&"undefined"!=typeof F){if(a(b,d)){var f=c;c=function(a,b){var d=this.checked;b&&(this.checked=b.nb!==m);f.call(this,a);this.checked=d}}F(b).bind(d,c)}else!e&&"function"==typeof b.addEventListener?b.addEventListener(d,c,r):"undefined"!=typeof b.attachEvent?b.attachEvent("on"+
+d,function(a){c.call(b,a)}):j(Error("Browser doesn't support addEventListener or attachEvent"))},Ba:function(b,d){(!b||!b.nodeType)&&j(Error("element must be a DOM node when calling triggerEvent"));if("undefined"!=typeof F){var c=[];a(b,d)&&c.push({nb:b.checked});F(b).trigger(d,c)}else"function"==typeof y.createEvent?"function"==typeof b.dispatchEvent?(c=y.createEvent(e[d]||"HTMLEvents"),c.initEvent(d,m,m,x,0,0,0,0,0,r,r,r,r,0,b),b.dispatchEvent(c)):j(Error("The supplied element doesn't support dispatchEvent")):
+"undefined"!=typeof b.fireEvent?(a(b,d)&&(b.checked=b.checked!==m),b.fireEvent("on"+d)):j(Error("Browser doesn't support triggering events"))},d:function(a){return b.$(a)?a():a},ua:function(a){return b.$(a)?a.t():a},da:function(a,d,c){if(d){var e=/[\w-]+/g,f=a.className.match(e)||[];b.a.o(d.match(e),function(a){var d=b.a.i(f,a);0<=d?c||f.splice(d,1):c&&f.push(a)});a.className=f.join(" ")}},cb:function(a,d){var c=b.a.d(d);if(c===p||c===I)c="";if(3===a.nodeType)a.data=c;else{var e=b.e.firstChild(a);
+!e||3!=e.nodeType||b.e.nextSibling(e)?b.e.N(a,[y.createTextNode(c)]):e.data=c;b.a.wb(a)}},ab:function(a,b){a.name=b;if(7>=n)try{a.mergeAttributes(y.createElement("<input name='"+a.name+"'/>"),r)}catch(d){}},wb:function(a){9<=n&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},ub:function(a){if(9<=n){var b=a.style.width;a.style.width=0;a.style.width=b}},Lb:function(a,d){a=b.a.d(a);d=b.a.d(d);for(var c=[],e=a;e<=d;e++)c.push(e);return c},L:function(a){for(var b=[],d=0,c=a.length;d<
+c;d++)b.push(a[d]);return b},Pb:6===n,Qb:7===n,Z:n,Oa:function(a,d){for(var c=b.a.L(a.getElementsByTagName("input")).concat(b.a.L(a.getElementsByTagName("textarea"))),e="string"==typeof d?function(a){return a.name===d}:function(a){return d.test(a.name)},f=[],g=c.length-1;0<=g;g--)e(c[g])&&f.push(c[g]);return f},Ib:function(a){return"string"==typeof a&&(a=b.a.D(a))?x.JSON&&x.JSON.parse?x.JSON.parse(a):(new Function("return "+a))():p},xa:function(a,d,c){("undefined"==typeof JSON||"undefined"==typeof JSON.stringify)&&
+j(Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js"));return JSON.stringify(b.a.d(a),d,c)},Jb:function(a,d,c){c=c||{};var e=c.params||{},f=c.includeFields||this.Na,g=a;if("object"==typeof a&&"form"===b.a.u(a))for(var g=a.action,h=f.length-1;0<=h;h--)for(var k=b.a.Oa(a,f[h]),l=k.length-1;0<=l;l--)e[k[l].name]=k[l].value;d=b.a.d(d);var n=y.createElement("form");
+n.style.display="none";n.action=g;n.method="post";for(var w in d)a=y.createElement("input"),a.name=w,a.value=b.a.xa(b.a.d(d[w])),n.appendChild(a);for(w in e)a=y.createElement("input"),a.name=w,a.value=e[w],n.appendChild(a);y.body.appendChild(n);c.submitter?c.submitter(n):n.submit();setTimeout(function(){n.parentNode.removeChild(n)},0)}}};b.b("utils",b.a);b.b("utils.arrayForEach",b.a.o);b.b("utils.arrayFirst",b.a.lb);b.b("utils.arrayFilter",b.a.fa);b.b("utils.arrayGetDistinctValues",b.a.Ga);b.b("utils.arrayIndexOf",
+b.a.i);b.b("utils.arrayMap",b.a.V);b.b("utils.arrayPushAll",b.a.P);b.b("utils.arrayRemoveItem",b.a.ga);b.b("utils.extend",b.a.extend);b.b("utils.fieldsIncludedWithJsonPost",b.a.Na);b.b("utils.getFormFields",b.a.Oa);b.b("utils.peekObservable",b.a.ua);b.b("utils.postJson",b.a.Jb);b.b("utils.parseJson",b.a.Ib);b.b("utils.registerEventHandler",b.a.n);b.b("utils.stringifyJson",b.a.xa);b.b("utils.range",b.a.Lb);b.b("utils.toggleDomNodeCssClass",b.a.da);b.b("utils.triggerEvent",b.a.Ba);b.b("utils.unwrapObservable",
+b.a.d);Function.prototype.bind||(Function.prototype.bind=function(a){var b=this,c=Array.prototype.slice.call(arguments);a=c.shift();return function(){return b.apply(a,c.concat(Array.prototype.slice.call(arguments)))}});b.a.f=new function(){var a=0,d="__ko__"+(new Date).getTime(),c={};return{get:function(a,d){var c=b.a.f.la(a,r);return c===I?I:c[d]},set:function(a,d,c){c===I&&b.a.f.la(a,r)===I||(b.a.f.la(a,m)[d]=c)},la:function(b,f){var g=b[d];if(!g||!("null"!==g&&c[g])){if(!f)return I;g=b[d]="ko"+
+a++;c[g]={}}return c[g]},clear:function(a){var b=a[d];return b?(delete c[b],a[d]=p,m):r}}};b.b("utils.domData",b.a.f);b.b("utils.domData.clear",b.a.f.clear);b.a.F=new function(){function a(a,d){var e=b.a.f.get(a,c);e===I&&d&&(e=[],b.a.f.set(a,c,e));return e}function d(c){var e=a(c,r);if(e)for(var e=e.slice(0),k=0;k<e.length;k++)e[k](c);b.a.f.clear(c);"function"==typeof F&&"function"==typeof F.cleanData&&F.cleanData([c]);if(f[c.nodeType])for(e=c.firstChild;c=e;)e=c.nextSibling,8===c.nodeType&&d(c)}
+var c="__ko_domNodeDisposal__"+(new Date).getTime(),e={1:m,8:m,9:m},f={1:m,9:m};return{Ca:function(b,d){"function"!=typeof d&&j(Error("Callback must be a function"));a(b,m).push(d)},Xa:function(d,e){var f=a(d,r);f&&(b.a.ga(f,e),0==f.length&&b.a.f.set(d,c,I))},A:function(a){if(e[a.nodeType]&&(d(a),f[a.nodeType])){var c=[];b.a.P(c,a.getElementsByTagName("*"));for(var k=0,l=c.length;k<l;k++)d(c[k])}return a},removeNode:function(a){b.A(a);a.parentNode&&a.parentNode.removeChild(a)}}};b.A=b.a.F.A;b.removeNode=
+b.a.F.removeNode;b.b("cleanNode",b.A);b.b("removeNode",b.removeNode);b.b("utils.domNodeDisposal",b.a.F);b.b("utils.domNodeDisposal.addDisposeCallback",b.a.F.Ca);b.b("utils.domNodeDisposal.removeDisposeCallback",b.a.F.Xa);b.a.ta=function(a){var d;if("undefined"!=typeof F)if(F.parseHTML)d=F.parseHTML(a);else{if((d=F.clean([a]))&&d[0]){for(a=d[0];a.parentNode&&11!==a.parentNode.nodeType;)a=a.parentNode;a.parentNode&&a.parentNode.removeChild(a)}}else{var c=b.a.D(a).toLowerCase();d=y.createElement("div");
+c=c.match(/^<(thead|tbody|tfoot)/)&&[1,"<table>","</table>"]||!c.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!c.indexOf("<td")||!c.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||[0,"",""];a="ignored<div>"+c[1]+a+c[2]+"</div>";for("function"==typeof x.innerShiv?d.appendChild(x.innerShiv(a)):d.innerHTML=a;c[0]--;)d=d.lastChild;d=b.a.L(d.lastChild.childNodes)}return d};b.a.ca=function(a,d){b.a.ka(a);d=b.a.d(d);if(d!==p&&d!==I)if("string"!=typeof d&&(d=d.toString()),
+"undefined"!=typeof F)F(a).html(d);else for(var c=b.a.ta(d),e=0;e<c.length;e++)a.appendChild(c[e])};b.b("utils.parseHtmlFragment",b.a.ta);b.b("utils.setHtml",b.a.ca);var R={};b.s={ra:function(a){"function"!=typeof a&&j(Error("You can only pass a function to ko.memoization.memoize()"));var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);R[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},hb:function(a,b){var c=R[a];c===I&&j(Error("Couldn't find any memo with ID "+
+a+". Perhaps it's already been unmemoized."));try{return c.apply(p,b||[]),m}finally{delete R[a]}},ib:function(a,d){var c=[];ca(a,c);for(var e=0,f=c.length;e<f;e++){var g=c[e].sb,h=[g];d&&b.a.P(h,d);b.s.hb(c[e].Fb,h);g.nodeValue="";g.parentNode&&g.parentNode.removeChild(g)}},Ua:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:p}};b.b("memoization",b.s);b.b("memoization.memoize",b.s.ra);b.b("memoization.unmemoize",b.s.hb);b.b("memoization.parseMemoText",b.s.Ua);b.b("memoization.unmemoizeDomNodeAndDescendants",
+b.s.ib);b.Ma={throttle:function(a,d){a.throttleEvaluation=d;var c=p;return b.j({read:a,write:function(b){clearTimeout(c);c=setTimeout(function(){a(b)},d)}})},notify:function(a,d){a.equalityComparer="always"==d?u(r):b.m.fn.equalityComparer;return a}};b.b("extenders",b.Ma);b.fb=function(a,d,c){this.target=a;this.ha=d;this.rb=c;b.p(this,"dispose",this.B)};b.fb.prototype.B=function(){this.Cb=m;this.rb()};b.S=function(){this.w={};b.a.extend(this,b.S.fn);b.p(this,"subscribe",this.ya);b.p(this,"extend",
+this.extend);b.p(this,"getSubscriptionsCount",this.yb)};b.S.fn={ya:function(a,d,c){c=c||"change";var e=new b.fb(this,d?a.bind(d):a,function(){b.a.ga(this.w[c],e)}.bind(this));this.w[c]||(this.w[c]=[]);this.w[c].push(e);return e},notifySubscribers:function(a,d){d=d||"change";this.w[d]&&b.r.K(function(){b.a.o(this.w[d].slice(0),function(b){b&&b.Cb!==m&&b.ha(a)})},this)},yb:function(){var a=0,b;for(b in this.w)this.w.hasOwnProperty(b)&&(a+=this.w[b].length);return a},extend:function(a){var d=this;if(a)for(var c in a){var e=
+b.Ma[c];"function"==typeof e&&(d=e(d,a[c]))}return d}};b.Qa=function(a){return"function"==typeof a.ya&&"function"==typeof a.notifySubscribers};b.b("subscribable",b.S);b.b("isSubscribable",b.Qa);var C=[];b.r={mb:function(a){C.push({ha:a,La:[]})},end:function(){C.pop()},Wa:function(a){b.Qa(a)||j(Error("Only subscribable things can act as dependencies"));if(0<C.length){var d=C[C.length-1];d&&!(0<=b.a.i(d.La,a))&&(d.La.push(a),d.ha(a))}},K:function(a,b,c){try{return C.push(p),a.apply(b,c||[])}finally{C.pop()}}};
+var ma={undefined:m,"boolean":m,number:m,string:m};b.m=function(a){function d(){if(0<arguments.length){if(!d.equalityComparer||!d.equalityComparer(c,arguments[0]))d.H(),c=arguments[0],d.G();return this}b.r.Wa(d);return c}var c=a;b.S.call(d);d.t=function(){return c};d.G=function(){d.notifySubscribers(c)};d.H=function(){d.notifySubscribers(c,"beforeChange")};b.a.extend(d,b.m.fn);b.p(d,"peek",d.t);b.p(d,"valueHasMutated",d.G);b.p(d,"valueWillMutate",d.H);return d};b.m.fn={equalityComparer:function(a,
+b){return a===p||typeof a in ma?a===b:r}};var E=b.m.Kb="__ko_proto__";b.m.fn[E]=b.m;b.ma=function(a,d){return a===p||a===I||a[E]===I?r:a[E]===d?m:b.ma(a[E],d)};b.$=function(a){return b.ma(a,b.m)};b.Ra=function(a){return"function"==typeof a&&a[E]===b.m||"function"==typeof a&&a[E]===b.j&&a.zb?m:r};b.b("observable",b.m);b.b("isObservable",b.$);b.b("isWriteableObservable",b.Ra);b.R=function(a){0==arguments.length&&(a=[]);a!==p&&(a!==I&&!("length"in a))&&j(Error("The argument passed when initializing an observable array must be an array, or null, or undefined."));
+var d=b.m(a);b.a.extend(d,b.R.fn);return d};b.R.fn={remove:function(a){for(var b=this.t(),c=[],e="function"==typeof a?a:function(b){return b===a},f=0;f<b.length;f++){var g=b[f];e(g)&&(0===c.length&&this.H(),c.push(g),b.splice(f,1),f--)}c.length&&this.G();return c},removeAll:function(a){if(a===I){var d=this.t(),c=d.slice(0);this.H();d.splice(0,d.length);this.G();return c}return!a?[]:this.remove(function(d){return 0<=b.a.i(a,d)})},destroy:function(a){var b=this.t(),c="function"==typeof a?a:function(b){return b===
+a};this.H();for(var e=b.length-1;0<=e;e--)c(b[e])&&(b[e]._destroy=m);this.G()},destroyAll:function(a){return a===I?this.destroy(u(m)):!a?[]:this.destroy(function(d){return 0<=b.a.i(a,d)})},indexOf:function(a){var d=this();return b.a.i(d,a)},replace:function(a,b){var c=this.indexOf(a);0<=c&&(this.H(),this.t()[c]=b,this.G())}};b.a.o("pop push reverse shift sort splice unshift".split(" "),function(a){b.R.fn[a]=function(){var b=this.t();this.H();b=b[a].apply(b,arguments);this.G();return b}});b.a.o(["slice"],
+function(a){b.R.fn[a]=function(){var b=this();return b[a].apply(b,arguments)}});b.b("observableArray",b.R);b.j=function(a,d,c){function e(){b.a.o(z,function(a){a.B()});z=[]}function f(){var a=h.throttleEvaluation;a&&0<=a?(clearTimeout(t),t=setTimeout(g,a)):g()}function g(){if(!q)if(n&&w())A();else{q=m;try{var a=b.a.V(z,function(a){return a.target});b.r.mb(function(c){var d;0<=(d=b.a.i(a,c))?a[d]=I:z.push(c.ya(f))});for(var c=s.call(d),e=a.length-1;0<=e;e--)a[e]&&z.splice(e,1)[0].B();n=m;h.notifySubscribers(l,
+"beforeChange");l=c}finally{b.r.end()}h.notifySubscribers(l);q=r;z.length||A()}}function h(){if(0<arguments.length)return"function"===typeof v?v.apply(d,arguments):j(Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.")),this;n||g();b.r.Wa(h);return l}function k(){return!n||0<z.length}var l,n=r,q=r,s=a;s&&"object"==typeof s?(c=s,s=c.read):(c=c||{},s||(s=c.read));"function"!=typeof s&&j(Error("Pass a function that returns the value of the ko.computed"));
+var v=c.write,G=c.disposeWhenNodeIsRemoved||c.W||p,w=c.disposeWhen||c.Ka||u(r),A=e,z=[],t=p;d||(d=c.owner);h.t=function(){n||g();return l};h.xb=function(){return z.length};h.zb="function"===typeof c.write;h.B=function(){A()};h.pa=k;b.S.call(h);b.a.extend(h,b.j.fn);b.p(h,"peek",h.t);b.p(h,"dispose",h.B);b.p(h,"isActive",h.pa);b.p(h,"getDependenciesCount",h.xb);c.deferEvaluation!==m&&g();if(G&&k()){A=function(){b.a.F.Xa(G,arguments.callee);e()};b.a.F.Ca(G,A);var D=w,w=function(){return!b.a.X(G)||D()}}return h};
+b.Bb=function(a){return b.ma(a,b.j)};w=b.m.Kb;b.j[w]=b.m;b.j.fn={};b.j.fn[w]=b.j;b.b("dependentObservable",b.j);b.b("computed",b.j);b.b("isComputed",b.Bb);b.gb=function(a){0==arguments.length&&j(Error("When calling ko.toJS, pass the object you want to convert."));return ba(a,function(a){for(var c=0;b.$(a)&&10>c;c++)a=a();return a})};b.toJSON=function(a,d,c){a=b.gb(a);return b.a.xa(a,d,c)};b.b("toJS",b.gb);b.b("toJSON",b.toJSON);b.k={q:function(a){switch(b.a.u(a)){case "option":return a.__ko__hasDomDataOptionValue__===
+m?b.a.f.get(a,b.c.options.sa):7>=b.a.Z?a.getAttributeNode("value").specified?a.value:a.text:a.value;case "select":return 0<=a.selectedIndex?b.k.q(a.options[a.selectedIndex]):I;default:return a.value}},T:function(a,d){switch(b.a.u(a)){case "option":switch(typeof d){case "string":b.a.f.set(a,b.c.options.sa,I);"__ko__hasDomDataOptionValue__"in a&&delete a.__ko__hasDomDataOptionValue__;a.value=d;break;default:b.a.f.set(a,b.c.options.sa,d),a.__ko__hasDomDataOptionValue__=m,a.value="number"===typeof d?
+d:""}break;case "select":for(var c=a.options.length-1;0<=c;c--)if(b.k.q(a.options[c])==d){a.selectedIndex=c;break}break;default:if(d===p||d===I)d="";a.value=d}}};b.b("selectExtensions",b.k);b.b("selectExtensions.readValue",b.k.q);b.b("selectExtensions.writeValue",b.k.T);var ka=/\@ko_token_(\d+)\@/g,na=["true","false"],oa=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i;b.g={Q:[],aa:function(a){var d=b.a.D(a);if(3>d.length)return[];"{"===d.charAt(0)&&(d=d.substring(1,d.length-1));a=[];for(var c=
+p,e,f=0;f<d.length;f++){var g=d.charAt(f);if(c===p)switch(g){case '"':case "'":case "/":c=f,e=g}else if(g==e&&"\\"!==d.charAt(f-1)){g=d.substring(c,f+1);a.push(g);var h="@ko_token_"+(a.length-1)+"@",d=d.substring(0,c)+h+d.substring(f+1),f=f-(g.length-h.length),c=p}}e=c=p;for(var k=0,l=p,f=0;f<d.length;f++){g=d.charAt(f);if(c===p)switch(g){case "{":c=f;l=g;e="}";break;case "(":c=f;l=g;e=")";break;case "[":c=f,l=g,e="]"}g===l?k++:g===e&&(k--,0===k&&(g=d.substring(c,f+1),a.push(g),h="@ko_token_"+(a.length-
+1)+"@",d=d.substring(0,c)+h+d.substring(f+1),f-=g.length-h.length,c=p))}e=[];d=d.split(",");c=0;for(f=d.length;c<f;c++)k=d[c],l=k.indexOf(":"),0<l&&l<k.length-1?(g=k.substring(l+1),e.push({key:P(k.substring(0,l),a),value:P(g,a)})):e.push({unknown:P(k,a)});return e},ba:function(a){var d="string"===typeof a?b.g.aa(a):a,c=[];a=[];for(var e,f=0;e=d[f];f++)if(0<c.length&&c.push(","),e.key){var g;a:{g=e.key;var h=b.a.D(g);switch(h.length&&h.charAt(0)){case "'":case '"':break a;default:g="'"+h+"'"}}e=e.value;
+c.push(g);c.push(":");c.push(e);e=b.a.D(e);0<=b.a.i(na,b.a.D(e).toLowerCase())?e=r:(h=e.match(oa),e=h===p?r:h[1]?"Object("+h[1]+")"+h[2]:e);e&&(0<a.length&&a.push(", "),a.push(g+" : function(__ko_value) { "+e+" = __ko_value; }"))}else e.unknown&&c.push(e.unknown);d=c.join("");0<a.length&&(d=d+", '_ko_property_writers' : { "+a.join("")+" } ");return d},Eb:function(a,d){for(var c=0;c<a.length;c++)if(b.a.D(a[c].key)==d)return m;return r},ea:function(a,d,c,e,f){if(!a||!b.Ra(a)){if((a=d()._ko_property_writers)&&
+a[c])a[c](e)}else(!f||a.t()!==e)&&a(e)}};b.b("expressionRewriting",b.g);b.b("expressionRewriting.bindingRewriteValidators",b.g.Q);b.b("expressionRewriting.parseObjectLiteral",b.g.aa);b.b("expressionRewriting.preProcessBindings",b.g.ba);b.b("jsonExpressionRewriting",b.g);b.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",b.g.ba);var K="\x3c!--test--\x3e"===y.createComment("test").text,ja=K?/^\x3c!--\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*--\x3e$/:/^\s*ko(?:\s+(.+\s*\:[\s\S]*))?\s*$/,ia=K?/^\x3c!--\s*\/ko\s*--\x3e$/:
+/^\s*\/ko\s*$/,pa={ul:m,ol:m};b.e={I:{},childNodes:function(a){return B(a)?aa(a):a.childNodes},Y:function(a){if(B(a)){a=b.e.childNodes(a);for(var d=0,c=a.length;d<c;d++)b.removeNode(a[d])}else b.a.ka(a)},N:function(a,d){if(B(a)){b.e.Y(a);for(var c=a.nextSibling,e=0,f=d.length;e<f;e++)c.parentNode.insertBefore(d[e],c)}else b.a.N(a,d)},Va:function(a,b){B(a)?a.parentNode.insertBefore(b,a.nextSibling):a.firstChild?a.insertBefore(b,a.firstChild):a.appendChild(b)},Pa:function(a,d,c){c?B(a)?a.parentNode.insertBefore(d,
+c.nextSibling):c.nextSibling?a.insertBefore(d,c.nextSibling):a.appendChild(d):b.e.Va(a,d)},firstChild:function(a){return!B(a)?a.firstChild:!a.nextSibling||H(a.nextSibling)?p:a.nextSibling},nextSibling:function(a){B(a)&&(a=$(a));return a.nextSibling&&H(a.nextSibling)?p:a.nextSibling},jb:function(a){return(a=B(a))?a[1]:p},Ta:function(a){if(pa[b.a.u(a)]){var d=a.firstChild;if(d){do if(1===d.nodeType){var c;c=d.firstChild;var e=p;if(c){do if(e)e.push(c);else if(B(c)){var f=$(c,m);f?c=f:e=[c]}else H(c)&&
+(e=[c]);while(c=c.nextSibling)}if(c=e){e=d.nextSibling;for(f=0;f<c.length;f++)e?a.insertBefore(c[f],e):a.appendChild(c[f])}}while(d=d.nextSibling)}}}};b.b("virtualElements",b.e);b.b("virtualElements.allowedBindings",b.e.I);b.b("virtualElements.emptyNode",b.e.Y);b.b("virtualElements.insertAfter",b.e.Pa);b.b("virtualElements.prepend",b.e.Va);b.b("virtualElements.setDomNodeChildren",b.e.N);b.J=function(){this.Ha={}};b.a.extend(b.J.prototype,{nodeHasBindings:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind")!=
+p;case 8:return b.e.jb(a)!=p;default:return r}},getBindings:function(a,b){var c=this.getBindingsString(a,b);return c?this.parseBindingsString(c,b,a):p},getBindingsString:function(a){switch(a.nodeType){case 1:return a.getAttribute("data-bind");case 8:return b.e.jb(a);default:return p}},parseBindingsString:function(a,d,c){try{var e;if(!(e=this.Ha[a])){var f=this.Ha,g,h="with($context){with($data||{}){return{"+b.g.ba(a)+"}}}";g=new Function("$context","$element",h);e=f[a]=g}return e(d,c)}catch(k){j(Error("Unable to parse bindings.\nMessage: "+
+k+";\nBindings value: "+a))}}});b.J.instance=new b.J;b.b("bindingProvider",b.J);b.c={};b.z=function(a,d,c){d?(b.a.extend(this,d),this.$parentContext=d,this.$parent=d.$data,this.$parents=(d.$parents||[]).slice(0),this.$parents.unshift(this.$parent)):(this.$parents=[],this.$root=a,this.ko=b);this.$data=a;c&&(this[c]=a)};b.z.prototype.createChildContext=function(a,d){return new b.z(a,this,d)};b.z.prototype.extend=function(a){var d=b.a.extend(new b.z,this);return b.a.extend(d,a)};b.eb=function(a,d){if(2==
+arguments.length)b.a.f.set(a,"__ko_bindingContext__",d);else return b.a.f.get(a,"__ko_bindingContext__")};b.Fa=function(a,d,c){1===a.nodeType&&b.e.Ta(a);return X(a,d,c,m)};b.Ea=function(a,b){(1===b.nodeType||8===b.nodeType)&&Z(a,b,m)};b.Da=function(a,b){b&&(1!==b.nodeType&&8!==b.nodeType)&&j(Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node"));b=b||x.document.body;Y(a,b,m)};b.ja=function(a){switch(a.nodeType){case 1:case 8:var d=b.eb(a);if(d)return d;
+if(a.parentNode)return b.ja(a.parentNode)}return I};b.pb=function(a){return(a=b.ja(a))?a.$data:I};b.b("bindingHandlers",b.c);b.b("applyBindings",b.Da);b.b("applyBindingsToDescendants",b.Ea);b.b("applyBindingsToNode",b.Fa);b.b("contextFor",b.ja);b.b("dataFor",b.pb);var fa={"class":"className","for":"htmlFor"};b.c.attr={update:function(a,d){var c=b.a.d(d())||{},e;for(e in c)if("string"==typeof e){var f=b.a.d(c[e]),g=f===r||f===p||f===I;g&&a.removeAttribute(e);8>=b.a.Z&&e in fa?(e=fa[e],g?a.removeAttribute(e):
+a[e]=f):g||a.setAttribute(e,f.toString());"name"===e&&b.a.ab(a,g?"":f.toString())}}};b.c.checked={init:function(a,d,c){b.a.n(a,"click",function(){var e;if("checkbox"==a.type)e=a.checked;else if("radio"==a.type&&a.checked)e=a.value;else return;var f=d(),g=b.a.d(f);"checkbox"==a.type&&g instanceof Array?(e=b.a.i(g,a.value),a.checked&&0>e?f.push(a.value):!a.checked&&0<=e&&f.splice(e,1)):b.g.ea(f,c,"checked",e,m)});"radio"==a.type&&!a.name&&b.c.uniqueName.init(a,u(m))},update:function(a,d){var c=b.a.d(d());
+"checkbox"==a.type?a.checked=c instanceof Array?0<=b.a.i(c,a.value):c:"radio"==a.type&&(a.checked=a.value==c)}};b.c.css={update:function(a,d){var c=b.a.d(d());if("object"==typeof c)for(var e in c){var f=b.a.d(c[e]);b.a.da(a,e,f)}else c=String(c||""),b.a.da(a,a.__ko__cssValue,r),a.__ko__cssValue=c,b.a.da(a,c,m)}};b.c.enable={update:function(a,d){var c=b.a.d(d());c&&a.disabled?a.removeAttribute("disabled"):!c&&!a.disabled&&(a.disabled=m)}};b.c.disable={update:function(a,d){b.c.enable.update(a,function(){return!b.a.d(d())})}};
+b.c.event={init:function(a,d,c,e){var f=d()||{},g;for(g in f)(function(){var f=g;"string"==typeof f&&b.a.n(a,f,function(a){var g,n=d()[f];if(n){var q=c();try{var s=b.a.L(arguments);s.unshift(e);g=n.apply(e,s)}finally{g!==m&&(a.preventDefault?a.preventDefault():a.returnValue=r)}q[f+"Bubble"]===r&&(a.cancelBubble=m,a.stopPropagation&&a.stopPropagation())}})})()}};b.c.foreach={Sa:function(a){return function(){var d=a(),c=b.a.ua(d);if(!c||"number"==typeof c.length)return{foreach:d,templateEngine:b.C.oa};
+b.a.d(d);return{foreach:c.data,as:c.as,includeDestroyed:c.includeDestroyed,afterAdd:c.afterAdd,beforeRemove:c.beforeRemove,afterRender:c.afterRender,beforeMove:c.beforeMove,afterMove:c.afterMove,templateEngine:b.C.oa}}},init:function(a,d){return b.c.template.init(a,b.c.foreach.Sa(d))},update:function(a,d,c,e,f){return b.c.template.update(a,b.c.foreach.Sa(d),c,e,f)}};b.g.Q.foreach=r;b.e.I.foreach=m;b.c.hasfocus={init:function(a,d,c){function e(e){a.__ko_hasfocusUpdating=m;var f=a.ownerDocument;"activeElement"in
+f&&(e=f.activeElement===a);f=d();b.g.ea(f,c,"hasfocus",e,m);a.__ko_hasfocusUpdating=r}var f=e.bind(p,m),g=e.bind(p,r);b.a.n(a,"focus",f);b.a.n(a,"focusin",f);b.a.n(a,"blur",g);b.a.n(a,"focusout",g)},update:function(a,d){var c=b.a.d(d());a.__ko_hasfocusUpdating||(c?a.focus():a.blur(),b.r.K(b.a.Ba,p,[a,c?"focusin":"focusout"]))}};b.c.html={init:function(){return{controlsDescendantBindings:m}},update:function(a,d){b.a.ca(a,d())}};var da="__ko_withIfBindingData";Q("if");Q("ifnot",r,m);Q("with",m,r,function(a,
+b){return a.createChildContext(b)});b.c.options={update:function(a,d,c){"select"!==b.a.u(a)&&j(Error("options binding applies only to SELECT elements"));for(var e=0==a.length,f=b.a.V(b.a.fa(a.childNodes,function(a){return a.tagName&&"option"===b.a.u(a)&&a.selected}),function(a){return b.k.q(a)||a.innerText||a.textContent}),g=a.scrollTop,h=b.a.d(d());0<a.length;)b.A(a.options[0]),a.remove(0);if(h){c=c();var k=c.optionsIncludeDestroyed;"number"!=typeof h.length&&(h=[h]);if(c.optionsCaption){var l=y.createElement("option");
+b.a.ca(l,c.optionsCaption);b.k.T(l,I);a.appendChild(l)}d=0;for(var n=h.length;d<n;d++){var q=h[d];if(!q||!q._destroy||k){var l=y.createElement("option"),s=function(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c},v=s(q,c.optionsValue,q);b.k.T(l,b.a.d(v));q=s(q,c.optionsText,v);b.a.cb(l,q);a.appendChild(l)}}h=a.getElementsByTagName("option");d=k=0;for(n=h.length;d<n;d++)0<=b.a.i(f,b.k.q(h[d]))&&(b.a.bb(h[d],m),k++);a.scrollTop=g;e&&"value"in c&&ea(a,b.a.ua(c.value),m);b.a.ub(a)}}};
+b.c.options.sa="__ko.optionValueDomData__";b.c.selectedOptions={init:function(a,d,c){b.a.n(a,"change",function(){var e=d(),f=[];b.a.o(a.getElementsByTagName("option"),function(a){a.selected&&f.push(b.k.q(a))});b.g.ea(e,c,"value",f)})},update:function(a,d){"select"!=b.a.u(a)&&j(Error("values binding applies only to SELECT elements"));var c=b.a.d(d());c&&"number"==typeof c.length&&b.a.o(a.getElementsByTagName("option"),function(a){var d=0<=b.a.i(c,b.k.q(a));b.a.bb(a,d)})}};b.c.style={update:function(a,
+d){var c=b.a.d(d()||{}),e;for(e in c)if("string"==typeof e){var f=b.a.d(c[e]);a.style[e]=f||""}}};b.c.submit={init:function(a,d,c,e){"function"!=typeof d()&&j(Error("The value for a submit binding must be a function"));b.a.n(a,"submit",function(b){var c,h=d();try{c=h.call(e,a)}finally{c!==m&&(b.preventDefault?b.preventDefault():b.returnValue=r)}})}};b.c.text={update:function(a,d){b.a.cb(a,d())}};b.e.I.text=m;b.c.uniqueName={init:function(a,d){if(d()){var c="ko_unique_"+ ++b.c.uniqueName.ob;b.a.ab(a,
+c)}}};b.c.uniqueName.ob=0;b.c.value={init:function(a,d,c){function e(){h=r;var e=d(),f=b.k.q(a);b.g.ea(e,c,"value",f)}var f=["change"],g=c().valueUpdate,h=r;g&&("string"==typeof g&&(g=[g]),b.a.P(f,g),f=b.a.Ga(f));if(b.a.Z&&("input"==a.tagName.toLowerCase()&&"text"==a.type&&"off"!=a.autocomplete&&(!a.form||"off"!=a.form.autocomplete))&&-1==b.a.i(f,"propertychange"))b.a.n(a,"propertychange",function(){h=m}),b.a.n(a,"blur",function(){h&&e()});b.a.o(f,function(c){var d=e;b.a.Ob(c,"after")&&(d=function(){setTimeout(e,
+0)},c=c.substring(5));b.a.n(a,c,d)})},update:function(a,d){var c="select"===b.a.u(a),e=b.a.d(d()),f=b.k.q(a),g=e!=f;0===e&&(0!==f&&"0"!==f)&&(g=m);g&&(f=function(){b.k.T(a,e)},f(),c&&setTimeout(f,0));c&&0<a.length&&ea(a,e,r)}};b.c.visible={update:function(a,d){var c=b.a.d(d()),e="none"!=a.style.display;c&&!e?a.style.display="":!c&&e&&(a.style.display="none")}};b.c.click={init:function(a,d,c,e){return b.c.event.init.call(this,a,function(){var a={};a.click=d();return a},c,e)}};b.v=function(){};b.v.prototype.renderTemplateSource=
+function(){j(Error("Override renderTemplateSource"))};b.v.prototype.createJavaScriptEvaluatorBlock=function(){j(Error("Override createJavaScriptEvaluatorBlock"))};b.v.prototype.makeTemplateSource=function(a,d){if("string"==typeof a){d=d||y;var c=d.getElementById(a);c||j(Error("Cannot find template with ID "+a));return new b.l.h(c)}if(1==a.nodeType||8==a.nodeType)return new b.l.O(a);j(Error("Unknown template type: "+a))};b.v.prototype.renderTemplate=function(a,b,c,e){a=this.makeTemplateSource(a,e);
+return this.renderTemplateSource(a,b,c)};b.v.prototype.isTemplateRewritten=function(a,b){return this.allowTemplateRewriting===r?m:this.makeTemplateSource(a,b).data("isRewritten")};b.v.prototype.rewriteTemplate=function(a,b,c){a=this.makeTemplateSource(a,c);b=b(a.text());a.text(b);a.data("isRewritten",m)};b.b("templateEngine",b.v);var qa=/(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi,ra=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;b.za={vb:function(a,
+d,c){d.isTemplateRewritten(a,c)||d.rewriteTemplate(a,function(a){return b.za.Gb(a,d)},c)},Gb:function(a,b){return a.replace(qa,function(a,e,f,g,h,k,l){return W(l,e,b)}).replace(ra,function(a,e){return W(e,"\x3c!-- ko --\x3e",b)})},kb:function(a){return b.s.ra(function(d,c){d.nextSibling&&b.Fa(d.nextSibling,a,c)})}};b.b("__tr_ambtns",b.za.kb);b.l={};b.l.h=function(a){this.h=a};b.l.h.prototype.text=function(){var a=b.a.u(this.h),a="script"===a?"text":"textarea"===a?"value":"innerHTML";if(0==arguments.length)return this.h[a];
+var d=arguments[0];"innerHTML"===a?b.a.ca(this.h,d):this.h[a]=d};b.l.h.prototype.data=function(a){if(1===arguments.length)return b.a.f.get(this.h,"templateSourceData_"+a);b.a.f.set(this.h,"templateSourceData_"+a,arguments[1])};b.l.O=function(a){this.h=a};b.l.O.prototype=new b.l.h;b.l.O.prototype.text=function(){if(0==arguments.length){var a=b.a.f.get(this.h,"__ko_anon_template__")||{};a.Aa===I&&a.ia&&(a.Aa=a.ia.innerHTML);return a.Aa}b.a.f.set(this.h,"__ko_anon_template__",{Aa:arguments[0]})};b.l.h.prototype.nodes=
+function(){if(0==arguments.length)return(b.a.f.get(this.h,"__ko_anon_template__")||{}).ia;b.a.f.set(this.h,"__ko_anon_template__",{ia:arguments[0]})};b.b("templateSources",b.l);b.b("templateSources.domElement",b.l.h);b.b("templateSources.anonymousTemplate",b.l.O);var O;b.wa=function(a){a!=I&&!(a instanceof b.v)&&j(Error("templateEngine must inherit from ko.templateEngine"));O=a};b.va=function(a,d,c,e,f){c=c||{};(c.templateEngine||O)==I&&j(Error("Set a template engine before calling renderTemplate"));
+f=f||"replaceChildren";if(e){var g=N(e);return b.j(function(){var h=d&&d instanceof b.z?d:new b.z(b.a.d(d)),k="function"==typeof a?a(h.$data,h):a,h=T(e,f,k,h,c);"replaceNode"==f&&(e=h,g=N(e))},p,{Ka:function(){return!g||!b.a.X(g)},W:g&&"replaceNode"==f?g.parentNode:g})}return b.s.ra(function(e){b.va(a,d,c,e,"replaceNode")})};b.Mb=function(a,d,c,e,f){function g(a,b){U(b,k);c.afterRender&&c.afterRender(b,a)}function h(d,e){k=f.createChildContext(b.a.d(d),c.as);k.$index=e;var g="function"==typeof a?
+a(d,k):a;return T(p,"ignoreTargetNode",g,k,c)}var k;return b.j(function(){var a=b.a.d(d)||[];"undefined"==typeof a.length&&(a=[a]);a=b.a.fa(a,function(a){return c.includeDestroyed||a===I||a===p||!b.a.d(a._destroy)});b.r.K(b.a.$a,p,[e,a,h,c,g])},p,{W:e})};b.c.template={init:function(a,d){var c=b.a.d(d());if("string"!=typeof c&&!c.name&&(1==a.nodeType||8==a.nodeType))c=1==a.nodeType?a.childNodes:b.e.childNodes(a),c=b.a.Hb(c),(new b.l.O(a)).nodes(c);return{controlsDescendantBindings:m}},update:function(a,
+d,c,e,f){d=b.a.d(d());c={};e=m;var g,h=p;"string"!=typeof d&&(c=d,d=c.name,"if"in c&&(e=b.a.d(c["if"])),e&&"ifnot"in c&&(e=!b.a.d(c.ifnot)),g=b.a.d(c.data));"foreach"in c?h=b.Mb(d||a,e&&c.foreach||[],c,a,f):e?(f="data"in c?f.createChildContext(g,c.as):f,h=b.va(d||a,f,c,a)):b.e.Y(a);f=h;(g=b.a.f.get(a,"__ko__templateComputedDomDataKey__"))&&"function"==typeof g.B&&g.B();b.a.f.set(a,"__ko__templateComputedDomDataKey__",f&&f.pa()?f:I)}};b.g.Q.template=function(a){a=b.g.aa(a);return 1==a.length&&a[0].unknown||
+b.g.Eb(a,"name")?p:"This template engine does not support anonymous templates nested within its templates"};b.e.I.template=m;b.b("setTemplateEngine",b.wa);b.b("renderTemplate",b.va);b.a.Ja=function(a,b,c){a=a||[];b=b||[];return a.length<=b.length?S(a,b,"added","deleted",c):S(b,a,"deleted","added",c)};b.b("utils.compareArrays",b.a.Ja);b.a.$a=function(a,d,c,e,f){function g(a,b){t=l[b];w!==b&&(z[a]=t);t.na(w++);M(t.M);s.push(t);A.push(t)}function h(a,c){if(a)for(var d=0,e=c.length;d<e;d++)c[d]&&b.a.o(c[d].M,
+function(b){a(b,d,c[d].U)})}d=d||[];e=e||{};var k=b.a.f.get(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult")===I,l=b.a.f.get(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult")||[],n=b.a.V(l,function(a){return a.U}),q=b.a.Ja(n,d),s=[],v=0,w=0,B=[],A=[];d=[];for(var z=[],n=[],t,D=0,C,E;C=q[D];D++)switch(E=C.moved,C.status){case "deleted":E===I&&(t=l[v],t.j&&t.j.B(),B.push.apply(B,M(t.M)),e.beforeRemove&&(d[D]=t,A.push(t)));v++;break;case "retained":g(D,v++);break;case "added":E!==I?
+g(D,E):(t={U:C.value,na:b.m(w++)},s.push(t),A.push(t),k||(n[D]=t))}h(e.beforeMove,z);b.a.o(B,e.beforeRemove?b.A:b.removeNode);for(var D=0,k=b.e.firstChild(a),H;t=A[D];D++){t.M||b.a.extend(t,ha(a,c,t.U,f,t.na));for(v=0;q=t.M[v];k=q.nextSibling,H=q,v++)q!==k&&b.e.Pa(a,q,H);!t.Ab&&f&&(f(t.U,t.M,t.na),t.Ab=m)}h(e.beforeRemove,d);h(e.afterMove,z);h(e.afterAdd,n);b.a.f.set(a,"setDomNodeChildrenFromArrayMapping_lastMappingResult",s)};b.b("utils.setDomNodeChildrenFromArrayMapping",b.a.$a);b.C=function(){this.allowTemplateRewriting=
+r};b.C.prototype=new b.v;b.C.prototype.renderTemplateSource=function(a){var d=!(9>b.a.Z)&&a.nodes?a.nodes():p;if(d)return b.a.L(d.cloneNode(m).childNodes);a=a.text();return b.a.ta(a)};b.C.oa=new b.C;b.wa(b.C.oa);b.b("nativeTemplateEngine",b.C);b.qa=function(){var a=this.Db=function(){if("undefined"==typeof F||!F.tmpl)return 0;try{if(0<=F.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,c,e){e=e||{};2>a&&j(Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later."));
+var f=b.data("precompiled");f||(f=b.text()||"",f=F.template(p,"{{ko_with $item.koBindingContext}}"+f+"{{/ko_with}}"),b.data("precompiled",f));b=[c.$data];c=F.extend({koBindingContext:c},e.templateOptions);c=F.tmpl(f,b,c);c.appendTo(y.createElement("div"));F.fragments={};return c};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){y.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(F.tmpl.tag.ko_code=
+{open:"__.push($1 || '');"},F.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};b.qa.prototype=new b.v;w=new b.qa;0<w.Db&&b.wa(w);b.b("jqueryTmplTemplateEngine",b.qa)}"function"===typeof require&&"object"===typeof exports&&"object"===typeof module?L(module.exports||exports):"function"===typeof define&&define.amd?define(["exports"],L):L(x.ko={});m;
+})();
diff --git a/css/car/components/library/library.css b/css/car/components/library/library.css
new file mode 100644 (file)
index 0000000..76f7376
--- /dev/null
@@ -0,0 +1,190 @@
+.library {
+       position: absolute;
+       left: 720px;
+       top: 0;
+       width: 720px;
+       min-height: 1280px;
+       z-index: 100;
+       -webkit-transition: 1s;
+}
+
+.libraryLeftPanel {
+       position: absolute;
+       top: 0;
+       left: 0;
+       width: 100px;
+       min-height: 1280px;
+       height: 100%;
+       background-repeat: no-repeat;
+       background-position: left top;
+}
+
+.libraryLeftControl {
+       margin-top: 164px;
+       width: 100px;
+       cursor: pointer;
+}
+
+.gridIcon {
+       width: 100px;
+       height: 110px;
+       background-repeat: no-repeat;
+       background-position: left top;
+}
+
+.listIcon {
+       width: 100px;
+       height: 110px;
+       background-repeat: no-repeat;
+       background-position: left top;
+}
+
+.searchIcon {
+       width: 100px;
+       height: 110px;
+       background-repeat: no-repeat;
+       background-position: left top;
+}
+
+
+.libraryTopPanel {
+       margin: 0;
+       padding: 0;
+       margin-left: 50px;
+       height: 110px;
+       background-repeat: no-repeat;
+       background-position: left top;
+       z-index: 1;
+       overflow: hidden;
+}
+
+.libraryTopPanel .libraryTopPanelTitle {
+       position: absolute;
+       left: 57px;
+       top: 19px;
+       font-size: 0;
+}
+
+.closeLibraryButton {
+       position: absolute;
+       top: 25px;
+       right: 25px;
+       background-repeat: no-repeat;
+       background-position: left top;
+       width: 42px;
+       height: 42px;
+       z-index: 1;
+}
+
+.closeLibraryButton:active {
+       position: absolute;
+       top: 26px;
+}
+
+.libraryTabs {
+       position: absolute;
+       left: 40px;
+       font-size: 0;
+       overflow-y: hidden;
+       overflow-x: scroll;
+       white-space: nowrap;
+       width: 550px;
+       height: 100%;
+       bottom: -10px;
+       padding-bottom: 10px;
+}
+
+.tabsWrapper {
+       position: absolute;
+       font-size: 0;
+       /*overflow: auto;*/
+       height: 100%;
+}
+
+.libraryTab {
+       float: left;
+       padding-top: 33px;
+       padding-left: 15px;
+       padding-right: 15px;
+       height: 77px;
+       max-width: 220px;
+       overflow: hidden;
+       white-space: nowrap;
+       cursor: pointer;
+       background-repeat: repeat-x;
+       background-position: center top;
+       text-transform: uppercase;
+}
+
+.libraryTabSelected {
+       background-repeat: no-repeat;
+}
+
+.libraryTabClear {
+       display: inline-block;
+       height: 110px;
+       width: 130px;
+       background-repeat: repeat-x;
+       background-position: center top;
+       position: absolute;
+       top: 0;
+       left: 640px;
+}
+
+.libraryTabInlineClear {
+       display: inline-block;
+       height: 110px;
+       max-width: 630px;
+       background-repeat: repeat-x;
+       background-position: center top;
+}
+
+.libraryTopSubPanel {
+       margin-top: -20px;
+       left: 76px;
+       padding-top: 20px;
+       height: 60px;
+       width: 645px;
+       margin-bottom: 20px;
+       z-index: 0;
+       text-transform: uppercase;
+}
+
+.closeLibrarySubPanelButton {
+       height: 43px;
+       background-repeat: no-repeat;
+       background-position: left top;
+       text-align: right;
+       padding: 0 15px 0 35px;
+       line-height: 43px !important;
+       display: block;
+       margin-left: 20px;
+       /*vertical-align: top;*/
+       cursor: pointer;
+       text-transform: uppercase;
+       position: absolute;
+       top: 20px;
+}
+
+.closeLibrarySubPanelButton:active {
+       top: 21px;
+}
+
+.libraryTopSubPanel .subPanelArea {
+       margin-top: -2px;
+       margin-left: 150px;
+       /*vertical-align: top;*/
+       display: block;
+       line-height: 0;
+       max-width: 470px;
+       overflow: hidden;
+       position: absolute;
+}
+
+.libraryContent {
+       margin-left: 90px;
+       margin-right: 50px;
+       overflow-x: hidden;
+       overflow-y: auto;
+       /*-webkit-overflow-scrolling: touch;*/
+}
\ No newline at end of file
diff --git a/css/car/components/library/library.js b/css/car/components/library/library.js
new file mode 100644 (file)
index 0000000..b08ac72
--- /dev/null
@@ -0,0 +1,742 @@
+/*global template, AlphabetBookmark */
+
+/**
+ * @module CarTheme
+ **/
+
+
+/**
+ * Library is standard **JQuery plugin** which represents data UI control element that is used to display list/grid/search
+ * view of data elements in multiple logical sections, so called tabs.
+ * Rendering of individual parts of this element is done by template mechanism.
+ *
+ * This class requires following components:
+ *
+ * * {{#crossLink "AlphabetBookmark"}}{{/crossLink}} component
+ * * {{#crossLink "BoxCaption"}}{{/crossLink}} component
+ *
+ * **Example initialization of Library plugin:**
+ *
+ *     $('#properties').library("init");                                               //enables library plugin for properties element
+ *     $('#properties').library('setAlphabetVisible', false);  //sets library component AlphabetBookmark visibility
+ *
+ *     $('#properties').library('clearContent');                               //clears library content
+ *     $('#properties').off();                                                                 //unregister all library events listeners
+ *
+ *     $('#properties').library('setSectionTitle', 'AMB PROPERTY LIBRARY');
+ *
+ *     //sets left tabe enabled/disabled buttons
+ *     $('#properties').library('setGridBtnDisabled', true);
+ *     $('#properties').library('setListBtnDisabled', false);
+ *     $('#properties').library('setSearchBtnDisabled', false);
+ *
+ *     $('#properties').library('setLeftTabIndex', 1);                 //selects active button of left tab menu by it's index
+ *
+ *     //events registration/handling
+ *     $('#properties').on('eventClick_SearchViewBtn', function(e, data) {
+ *         $('#properties').library('showSubpanel');
+ *     });
+ *     $('#properties').on('eventClick_ListViewBtn', function(e, data) {
+ *         $('#searchInput').val('');
+ *         $('#properties').library('closeSubpanel');
+ *         PropertiesController.renderTabContent(0);
+ *     });
+ *     $('#properties').on('eventClick_menuItemBtn', function(e, data) {
+ *         PropertiesController.renderTabContent(data.Index);
+ *     });
+ *
+ *     //calling of templete compiling for top tab menu and it's setup
+ *     $('#properties').library('tabMenuTemplateCompile', {
+ *         Tabs : [ {
+ *             text : 'Properties',
+ *             selected : true
+ *         } ]
+ *     });
+ *
+ *     //Library sub panel setup (delegate settin, comiling of template, events registering)
+ *     $('#properties').library('setSubpanelContentDelegate', 'templates/searchSubPanelDelegate.html');
+ *     $('#properties').library('subpanelContentTemplateCompile', {}, function() {
+ *         $('#searchInput').on('input', PropertiesController.signalFilter);
+ *         $('#properties').library('closeSubpanel', function() {
+ *             $('#properties').library("showPage");                   //SHOWS LIBRARY PAGE!
+ *         });
+ *     });
+ *
+ *     //Library main content setup (delegate settin, comiling of template, events registering)
+ *     $('#properties').library("setContentDelegate", "templates/propertiesListDelegate.html");
+ *     $('#properties').library("contentTemplateCompile", PropertiesController.CurrentSourceSignals, "ambPropertiesContentGrid", function() {
+ *         $('#libraryContent').find('.contactElement').on('click', PropertiesController.openPropertyDetail);
+ *         $('#properties').library('updateContentHeight');
+ *     });
+ *
+ * Hover and click on elements in images below to navigate to components or driving properties of Library application.
+ *
+ * <img id="Image-Maps_1201312180420487" src="../assets/img/library.png" usemap="#Image-Maps_1201312180420487" border="0" width="649" height="1152" alt="" />
+ *   <map id="_Image-Maps_1201312180420487" name="Image-Maps_1201312180420487">
+ *     <area shape="rect" coords="70,1,360,31" alt="Library title" title="Library title" href="{{#crossLinkRaw "Library/sectionTitle:property"}}{{/crossLinkRaw}}" />
+ *     <area shape="rect" coords="70,32,577,80" alt="Top Tab menu" title="Top tab menu" href="{{#crossLinkRaw "Library/selectedTopTabIndex:propety"}}{{/crossLinkRaw}}" />
+ *     <area shape="rect" coords="578,1,648,80" alt="Close library" title="Closes library" href="{{#crossLinkRaw "Library/hidePage:method"}}{{/crossLinkRaw}}" />
+ *     <area shape="rect" coords="1,170,65,455" alt="Left Tab" title="Left Tab menu" href="{{#crossLinkRaw "Library/selectedLeftTabIndex:property"}}{{/crossLinkRaw}}" >
+ *     <area shape="rect" coords="70,85,648,153" alt="Library sub panel" title="Library sub panel" href="{{#crossLinkRaw "Library/subpanelDelegate:property"}}{{/crossLinkRaw}}" >
+ *     <area shape="rect" coords="80,170,635,1150" alt="Library content" title="Library content" target="_self" href="{{#crossLinkRaw "Library/contentDelegate:property"}}{{/crossLinkRaw}}" >
+ *  </map>
+ * </img>
+ *
+ * @class Library
+ * @static
+ */
+
+
+/**
+ * Library Left Control: grid tab default index.
+ * @property GRID_TAB
+ * @type {String}
+ * @default 0
+ * @static
+ * @final
+ */
+/**
+ * Library Left Control: list tab default index.
+ * @property LIST_TAB
+ * @type {String}
+ * @default 1
+ * @static
+ * @final
+ */
+/**
+ * Library Left Control: search tab default index.
+ * @property SEARCH_TAB
+ * @type {String}
+ * @default 2
+ * @static
+ * @final
+ */
+var GRID_TAB = 0, LIST_TAB = 1, SEARCH_TAB = 2;
+/**
+ * Holds default url to library templates.
+ * @property basePath
+ * @type {String}
+ * @default "./css/car/components/library/templates/"
+ * @static
+ * @final
+ */
+var basePath = "./css/car/components/library/templates/";
+/**
+ * Holds default url to library sub panel template.
+ * @property LIBRARY_SUB_PANEL_DELEGATE_DEFAULT
+ * @type {String}
+ * @default basePath + "subpanelDelegate.html"
+ * @static
+ * @final
+ */
+/**
+ * Holds default url to library top panel template.
+ * @property LIBRARY_TOP_PANEL_DELEGATE_DEFAULT
+ * @type {String}
+ * @default basePath + "tabMenuItemDelegate.html"
+ * @static
+ * @final
+ */
+var LIBRARY_SUB_PANEL_DELEGATE_DEFAULT = basePath + "subpanelDelegate.html", LIBRARY_TOP_PANEL_DELEGATE_DEFAULT = basePath + "tabMenuItemDelegate.html";
+
+(function($) {
+       "use strict";
+       var Library = {
+               thisObj : null,
+               /**
+                * Holds main content template url.
+                * @property contentDelegate
+                * @type {String}
+                * @default null
+                */
+               contentDelegate : null,
+               /**
+                * Holds content template url for content generation.
+                * @property menuItemDelegate
+                * @type {String}
+                * @default LIBRARY_TOP_PANEL_DELEGATE_DEFAULT
+                */
+               menuItemDelegate : LIBRARY_TOP_PANEL_DELEGATE_DEFAULT,
+               /**
+                * Holds sub panel content template.
+                * @property subpanelDelegate
+                * @type {String}
+                * @default LIBRARY_SUB_PANEL_DELEGATE_DEFAULT
+                */
+               subpanelDelegate : LIBRARY_SUB_PANEL_DELEGATE_DEFAULT,
+               /**
+                * Holds library title text.
+                * @property sectionTitle
+                * @type {String}
+                * @default ""
+                */
+               sectionTitle : "",
+               /**
+                * Indicates if list, grid or search view is selected.
+                * @property selectedLeftTabIndex
+                * @type {Number}
+                * @default LIST_TAB
+                */
+               selectedLeftTabIndex : LIST_TAB,
+               /**
+                * Indicates if list, grid button is disabled.
+                * @property gridDisabled
+                * @type {Bool}
+                * @default false
+                */
+               gridDisabled : false,
+               /**
+                * Indicates if list, grid view button is disabled.
+                * @property listDisabled
+                * @type {Bool}
+                * @default false
+                */
+               listDisabled : false,
+               /**
+                * Indicates if list, grid view button is disabled.
+                * @property searchDisabled
+                * @type {Bool}
+                * @default false
+                */
+               searchDisabled : false,
+               /**
+                * Index of selected tab.
+                * @property selectedTopTabIndex
+                * @type {Number}
+                * @default -1
+                */
+               selectedTopTabIndex : -1,
+               /**
+                * Indicates if alphabet component should be visible when sub panel is opened.
+                * @property alphabetVisible
+                * @type {Boolean}
+                * @default false
+                */
+               alphabetVisible : false,
+               /**
+                * Indicates library visibility.
+                * @property visible
+                * @type {Boolean}
+                * @default false
+                */
+               visible : false,
+               /**
+                * Initializes library layout and alphabet component.
+                *
+                * @method init
+                */
+               init : function() {
+                       this.empty();
+                       var str;
+
+                       str = "<div class='libraryLeftPanel'>";
+                       str += "<div class='libraryLeftControl'>";
+
+                       str += "<div id='grid' class='gridIcon ";
+                       if (Library.gridDisabled) {
+                               str += "gridIconDisabled";
+                       } else if (Library.selectedLeftTabIndex === GRID_TAB) {
+                               str += "gridIconActive";
+                       }
+                       str += "' onclick=\"$(\'#" + this.attr('id') + "\').library(\'clickOnGridViewBtn\')\"></div>";
+
+                       str += "<div id='list' class='listIcon ";
+                       if (Library.listDisabled) {
+                               str += "listIconDisabled";
+                       } else if (Library.selectedLeftTabIndex === LIST_TAB) {
+                               str += "listIconActive";
+                       }
+                       str += "' onclick=\"$(\'#" + this.attr('id') + "\').library(\'clickOnListViewBtn\')\"></div>";
+
+                       str += "<div id='search' class='searchIcon ";
+                       if (Library.listDisabled) {
+                               str += "searchIconDisabled";
+                       } else if (Library.selectedLeftTabIndex === SEARCH_TAB) {
+                               str += "serachIconActive";
+                       }
+                       str += "' onclick=\"$(\'#" + this.attr('id') + "\').library(\'clickOnSearchViewBtn\')\"></div>";
+
+                       str += "</div>";
+                       str += "</div>";
+                       str += "<div id='libraryTopPanel' class='libraryTopPanel'>";
+                       str += "<div class='libraryTopPanelTitle'></div>";
+                       str += "<div class='closeLibraryButton' onClick=\'$(\"#" + this.attr('id') + "\").library(\"hidePage\")\'></div>";
+                       str += "<div id='libraryTabsID' class='libraryTabs'><div id='tabsWrapperID' class='tabsWrapper'></div></div>";
+                       str += "</div>";
+                       str += "<div class='libraryTabClear'></div>";
+                       str += "<div id='alphabetBookmarkList'></div>";
+                       str += "<div id='libraryTopSubPanel' class='libraryTopSubPanel bgColorDark'></div>";
+                       str += "<div id='libraryContent' class='libraryContent'>";
+                       str += "</div>";
+                       this.append(str);
+                       $(".libraryTopPanelTitle").boxCaptionPlugin('initSmall', Library.sectionTitle);
+                       AlphabetBookmark.fill();
+                       $("#libraryContent").show();
+                       $("#libraryTopSubPanel").hide();
+                       Library.thisObj = this;
+                       Library.updateContentHeight();
+               },
+               /**
+                * Updates content element height after calling.
+                *
+                * @method updateContentHeight
+                */
+               updateContentHeight : function() {
+                       var height = Library.thisObj.height();
+                       if ($("#libraryTopPanel").is(":visible")) {
+                               height = height - $("#libraryTopPanel").outerHeight();
+                       }
+                       if ($("#libraryTopSubPanel").is(":visible")) {
+                               height = height - $("#libraryTopSubPanel").outerHeight();
+                       }
+                       $("#libraryContent").css({
+                               maxHeight : height + "px"
+                       });
+               },
+               /**
+                * Shows library on the screen. Move in from right to left animation applied.
+                *
+                * @method showPage
+                */
+               showPage : function() {
+                       if (Library.thisObj) {
+                               Library.thisObj.css('left', '0px');
+                               Library.visible = true;
+                       }
+               },
+               /**
+                * Hides library from the screen. Move out from left to right animation applied.
+                *
+                * @method hidePage
+                */
+               hidePage : function() {
+                       if (Library.thisObj) {
+                               Library.thisObj.css('left', '720px');
+                               Library.visible = false;
+                       }
+               },
+               /**
+                * Returns true if library is visible (is in viewport) otherwise false.
+                *
+                * @method isVisible
+                * @return {Bool} True if library is visible (is in viewport) otherwise false.
+                */
+               isVisible : function() {
+                       return Library.visible;
+               },
+               /**
+                * Sets library title.
+                *
+                * @method setSectionTitle
+                */
+               setSectionTitle : function(title) {
+                       Library.sectionTitle = title;
+                       $(".libraryTopPanelTitle").boxCaptionPlugin('initSmall', Library.sectionTitle);
+               },
+               /**
+                * Sets library main content template path stored in {{#crossLink "Library/contentDelegate:property"}}Library.contentDelegate{{/crossLink}}.
+                *
+                * @method setContentDelegate
+                * @param delegate {String} Path to template.
+                */
+               setContentDelegate : function(delegate) {
+                       Library.contentDelegate = delegate;
+               },
+               /**
+                * Renders the given main content model into the main content DOM element utilizing template mechanism.
+                *
+                * @method contentTemplateCompile
+                * @param model {Array} Array of data elements.
+                * @param classes {String} Css classes to be added to main content DOM element.
+                * @param successCallback {Function} Function called when the rendering ends successfully.
+                */
+               contentTemplateCompile : function(model, classes, successCallback) {
+                       Library.clearContent();
+                       Library.changeContentClass(classes);
+                       template.compile(model, Library.contentDelegate, "#libraryContent", successCallback);
+               },
+               /**
+                * Adds classes to the main content DOM element.
+                *
+                * @method changeContentClass
+                * @param classes {String} One or more class names to be added to the class attribute of main content DOM element.
+                */
+               changeContentClass : function(classes) {
+                       $("#libraryContent").removeClass();
+                       $("#libraryContent").addClass("libraryContent " + classes);
+               },
+               /**
+                * Removes all child nodes of the main content DOM element.
+                *
+                * @method clearContent
+                */
+               clearContent : function() {
+                       $("#libraryContent").empty();
+               },
+               /**
+                * Sets library tabs content template.
+                *
+                * @method setMenuItemDelegate
+                * @param delegate {String} Path to template.
+                */
+               setMenuItemDelegate : function(delegate) {
+                       Library.menuItemDelegate = delegate;
+               },
+               /**
+                * Renders the given tabs into the tabs DOM element utilizing template mechanism.
+                *
+                * @method tabMenuTemplateCompile
+                * @param model {Array} Array of tabs.
+                * @param successCallback {Function} Function called when the rendering ends successfully.
+                */
+               tabMenuTemplateCompile : function(model, successCallback) {
+                       var i = 0;
+                       for (i = 0; i < model.Tabs.length; i++) {
+                               model.Tabs[i].index = i;
+                               if (model.Tabs[i].selected) {
+                                       Library.selectedTopTabIndex = model.Tabs[i].index;
+                               }
+                               if (model.Tabs[i].action) {
+                                       model.Tabs[i].action = model.Tabs[i].action + "$(\'#" + this.attr('id') + "\').library(\'libraryTabClick\'," + i + ");";
+                               } else {
+                                       model.Tabs[i].action = "$(\'#" + this.attr('id') + "\').library(\'libraryTabClick\'," + i + ");";
+                               }
+                       }
+                       if (Library.selectedTopTabIndex === -1) {
+                               Library.selectedTopTabIndex = 0;
+                       }
+                       // template.compile(model, Library.menuItemDelegate, "#libraryTabsID", successCallback);
+                       template.compile(model, Library.menuItemDelegate, "#tabsWrapperID", function() {
+                               var clearWidth = $('#libraryTabsID').width() - $('#tabsWrapperID').width();
+                               $('.libraryTabInlineClear').css('width', clearWidth);
+                               if (successCallback) {
+                                       successCallback();
+                               }
+                       });
+               },
+               /**
+                * Returns index of selected tab.
+                *
+                * @method getSelectetTopTabIndex
+                * @return {Number} Index of selected tab.
+                */
+               getSelectetTopTabIndex : function() {
+                       return Library.selectedTopTabIndex;
+               },
+               /**
+                * Sets index and highlight selected tab in top tab menu.
+                *
+                * @method setTopTabIndex
+                * @param index {Number} Index of tab.
+                */
+               setTopTabIndex : function(index) {
+                       Library.selectedTopTabIndex = index;
+                       $(".libraryTab").removeClass("fontColorSelected libraryTabSelected");
+                       var tabId = "#libraryTab" + index;
+                       $(tabId).toggleClass("fontColorSelected libraryTabSelected");
+                       var selectedTabClass = "libraryTab" + index + "Selected";
+                       $("#libraryTopPanel").attr("class", "libraryTopPanel " + selectedTabClass);
+               },
+               /**
+                * Sets library sub panel content template.
+                *
+                * @method setSubpanelContentDelegate
+                * @param delegate {String} Path to template.
+                */
+               setSubpanelContentDelegate : function(delegate) {
+                       Library.subpanelDelegate = delegate;
+               },
+               /**
+                * Renders the given model into the sub panel DOM element utilizing template mechanism.
+                *
+                * @method subpanelContentTemplateCompile
+                * @param model {Object} Data for sub panel.
+                * @param successCallback {Function} Function called when the rendering ends successfully.
+                */
+               subpanelContentTemplateCompile : function(model, successCallback) {
+                       model.id = this.attr('id');
+                       if (!model.action) {
+                               model.action = function() {
+                                       Library.closeSubpanel();
+                               };
+                               model.actionName = "BACK";
+                       }
+                       if (LIBRARY_SUB_PANEL_DELEGATE_DEFAULT === Library.subpanelDelegate) {
+                               template.compile(model, Library.subpanelDelegate, "#libraryTopSubPanel", function() {
+                                       if (!!model.textTitle) {
+                                               $("#libraryTopSubPanelTitle").boxCaptionPlugin('initSmall', model.textTitle);
+                                       }
+                                       if (!!model.action) {
+                                               $("#libraryCloseSubPanelButton").click(function() {
+                                                       model.action();
+                                               });
+                                       }
+                                       Library.showSubpanel();
+                                       if (!!successCallback) {
+                                               successCallback();
+                                       }
+                               });
+                       } else {
+                               template.compile(model, Library.subpanelDelegate, "#libraryTopSubPanel", function() {
+                                       Library.showSubpanel();
+                                       if (!!successCallback) {
+                                               successCallback();
+                                       }
+                               });
+                       }
+               },
+               /**
+                * Returns index of selected left tab.
+                *
+                * @method getSelectetLeftTabIndex
+                * @return {Number} Index of selected tab.
+                */
+               getSelectetLeftTabIndex : function() {
+                       return Library.selectedLeftTabIndex;
+               },
+               /**
+                * Sets index of selected left tab.
+                *
+                * @method setLeftTabIndex
+                * @param index {Number} Index of left tab.
+                */
+               setLeftTabIndex : function(index) {
+                       Library.selectedLeftTabIndex = index;
+                       $(".libraryLeftControl").children('*').removeClass("listIconActive searchIconActive gridIconActive");
+                       switch (index) {
+                               case 0:
+                                       $(".libraryLeftControl #grid").addClass("gridIconActive");
+                                       break;
+                               case 1:
+                                       $(".libraryLeftControl #list").addClass("listIconActive");
+                                       break;
+                               case 2:
+                                       $(".libraryLeftControl #search").addClass("searchIconActive");
+                                       break;
+                       }
+               },
+               /**
+                * Selects grid view button as active and triggers event.
+                *
+                * @method clickOnGridViewBtn
+                */
+               clickOnGridViewBtn : function() {
+                       if (!Library.gridDisabled) {
+                               Library.selectedLeftTabIndex = GRID_TAB;
+                               $(".libraryLeftControl #list").removeClass("listIconActive");
+                               $(".libraryLeftControl #search").removeClass("searchIconActive");
+                               $(".libraryLeftControl #grid").addClass("gridIconActive");
+                               /**
+                                * Fired on left panel grid view button click and if button is not disabled.
+                                * It's standard JQuery event and it fires on Library object.
+                                *
+                                * @event eventClick_GridViewBtn
+                                */
+                               Library.thisObj.trigger('eventClick_GridViewBtn');
+                       }
+               },
+               /**
+                * Enable/disable grid button in left tab menu.
+                *
+                * @method setGridBtnDisabled
+                */
+               setGridBtnDisabled : function(value) {
+                       Library.gridDisabled = value;
+                       if (value) {
+                               $(".libraryLeftControl #grid").removeClass("gridIconActive").addClass("gridIconDisabled");
+                       }
+                       else {
+                               $(".libraryLeftControl #grid").removeClass("gridIconDisabled");
+                       }
+               },
+               /**
+                * Selects list view button as active and triggers event.
+                *
+                * @method clickOnListViewBtn
+                */
+               clickOnListViewBtn : function() {
+                       if (!Library.listDisabled) {
+                               Library.selectedLeftTabIndex = LIST_TAB;
+                               $(".libraryLeftControl #grid").removeClass("gridIconActive");
+                               $(".libraryLeftControl #search").removeClass("searchIconActive");
+                               $(".libraryLeftControl #list").addClass("listIconActive");
+                               /**
+                                * Fired on left panel list view button click and if button is not disabled.
+                                * It's standard JQuery event and it fires on Library object.
+                                *
+                                * @event eventClick_ListViewBtn
+                                */
+                               Library.thisObj.trigger('eventClick_ListViewBtn');
+                       }
+               },
+               /**
+                * Enable/disable list button in left tab menu.
+                *
+                * @method setListBtnDisabled
+                */
+               setListBtnDisabled : function(value) {
+                       Library.listDisabled = value;
+                       if (value) {
+                               $(".libraryLeftControl #list").removeClass("listIconActive").addClass("listIconDisabled");
+                       }
+                       else {
+                               $(".libraryLeftControl #list").removeClass("listIconDisabled");
+                       }
+               },
+               /**
+                * Selects search view button as active and triggers event.
+                *
+                * @method clickOnSearchViewBtn
+                */
+               clickOnSearchViewBtn : function() {
+                       if (!Library.searchDisabled) {
+                               $(".libraryLeftControl #grid").removeClass("gridIconActive");
+                               $(".libraryLeftControl #list").removeClass("listIconActive");
+                               $(".libraryLeftControl #search").addClass("searchIconActive");
+                               /**
+                                * Fired on left panel search view button click and if button is not disabled.
+                                * It's standard JQuery event and it fires on Library object.
+                                *
+                                * @event eventClick_SearchViewBtn
+                                */
+                               Library.thisObj.trigger('eventClick_SearchViewBtn');
+                       }
+               },
+               /**
+                * Enable/disable search button in left tab menu.
+                *
+                * @method setSearchBtnDisabled
+                */
+               setSearchBtnDisabled : function(value) {
+                       Library.searchDisabled = value;
+                       if (value) {
+                               $(".libraryLeftControl #search").removeClass("searchIconActive").addClass("searchIconDisabled");
+                       }
+                       else {
+                               $(".libraryLeftControl #search").removeClass("searchIconDisabled");
+                       }
+               },
+               /**
+                * Shows sub panel and triggers {{#crossLink "Library/eventClick_showSubpanel:event"}}eventClick_showSubpanel{{/crossLink}}.
+                *
+                * @method showSubpanel
+                */
+               showSubpanel : function(completeCallback) {
+                       if ($("#libraryTopSubPanel").is(":hidden")) {
+                               $("#libraryTopSubPanel").show("fast", function() {
+                                       Library.updateContentHeight();
+                                       if (completeCallback) {
+                                               completeCallback();
+                                       }
+                               });
+                               if (!Library.alphabetVisible) {
+                                       Library.hideAlphabet();
+                               } else {
+                                       $("#alphabetBookmarkList").css('top', '175px');
+                               }
+                               /**
+                                * Fired when {{#crossLink "Library/showSubpanel:method"}}showSubpanel{{/crossLink}} is called.
+                                * It's standard JQuery event and it fires on Library object.
+                                *
+                                * @event eventClick_showSubpanel
+                                */
+                               Library.thisObj.trigger('eventClick_showSubpanel');
+                       }
+               },
+               /**
+                * Hides sub panel and triggers {{#crossLink "Library/eventClick_closeSubpanel:event"}}eventClick_closeSubpanel{{/crossLink}} event.
+                *
+                * @method closeSubpanel
+                */
+               closeSubpanel : function(completeCallback) {
+                       if ($("#libraryTopSubPanel").is(":visible")) {
+                               $("#libraryTopSubPanel").hide("fast", function() {
+                                       Library.updateContentHeight();
+                                       if (completeCallback) {
+                                               completeCallback();
+                                       }
+                               });
+                               if (Library.alphabetVisible) {
+                                       Library.showAlphabet();
+                               }
+                               $("#alphabetBookmarkList").css('top', '115px');
+                               /**
+                                * Fired when {{#crossLink "Library/closeSubpanel:method"}}closeSubpanel{{/crossLink}} is called.
+                                * It's standard JQuery event and it fires on Library object.
+                                *
+                                * @event eventClick_closeSubpanel
+                                */
+                               Library.thisObj.trigger('eventClick_closeSubpanel');
+                       }
+               },
+               /**
+                * Triggers {{#crossLink "Library/eventClick_menuItemBtn:event"}}eventClick_menuItemBtn{{/crossLink}} event
+                * and calls {{#crossLink "Library/setTopTabIndex:method"}}setTopTabIndex{{/crossLink}} to set
+                * {{#crossLink "Library/selectedTopTabIndex:propety"}}selectedTopTabIndex{{/crossLink}} automatically after clicking on tab.
+                *
+                * @method libraryTabClick
+                * @param index {Number} Index of tab.
+                */
+               libraryTabClick : function(index) {
+                       Library.setTopTabIndex(index);
+                       /**
+                        * Fired when {{#crossLink "Library/libraryTabClick:method"}}libraryTabClick{{/crossLink}} is called.
+                        * It's standard JQuery event and it fires on Library object.
+                        *
+                        * **indexObject example:**
+                        *
+                        *     { Index : 2 }
+                        *
+                        * @event eventClick_menuItemBtn
+                        * @param indexObject {Object} Contains index of clicked tab.
+                        */
+                       Library.thisObj.trigger('eventClick_menuItemBtn', {
+                               Index : index
+                       });
+               },
+               /**
+                * Sets visibility of alphabet component.
+                *
+                * @method setAlphabetVisible
+                * @param visible {Boolean} Visibility of alphabet.
+                */
+               setAlphabetVisible : function(visible) {
+                       Library.alphabetVisible = visible;
+               },
+               /**
+                * Hides alphabet component.
+                *
+                * @method hideAlphabet
+                */
+               hideAlphabet : function() {
+                       $("#alphabetBookmarkList").hide();
+                       $("#libraryContent").css('margin-right', '15px');
+               },
+               /**
+                * Shows alphabet component.
+                *
+                * @method showAlphabet
+                */
+               showAlphabet : function() {
+                       $("#alphabetBookmarkList").show();
+                       $("#libraryContent").css('margin-right', '50px');
+               }
+       };
+       /**
+        * jQuery extension method for {{#crossLink "Library"}}{{/crossLink}} plugin.
+        * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+        * @method library
+        * @for jQuery
+        * @return Result of called method.
+        */
+       $.fn.library = function(method) {
+               // Method calling logic
+               if (Library[method]) {
+                       return Library[method].apply(this, Array.prototype.slice.call(arguments, 1));
+               } else if (typeof method === 'object' || !method) {
+                       return Library.init.apply(this, arguments);
+               } else {
+                       $.error('Method ' + method + ' does not exist on jQuery.library');
+               }
+       };
+}(jQuery));
diff --git a/css/car/components/library/templates/subpanelDelegate.html b/css/car/components/library/templates/subpanelDelegate.html
new file mode 100644 (file)
index 0000000..aa8ee4f
--- /dev/null
@@ -0,0 +1,7 @@
+<div id="libraryCloseSubPanelButton"
+       class='fontSizeSmall fontWeightBold fontColorNormal closeLibrarySubPanelButton'>{{:actionName}}</div>
+<div id='subPanelArea' class='subPanelArea'>
+       <div id='libraryTopSubPanelTitle'></div>
+       <div id='libraryTopSubPanelSubtitle'
+               class='fontSizeLarge fontWeightBold fontColorNormal oneLineEllipsis'>{{:textSubtitle}}</div>
+</div>
\ No newline at end of file
diff --git a/css/car/components/library/templates/tabMenuItemDelegate.html b/css/car/components/library/templates/tabMenuItemDelegate.html
new file mode 100644 (file)
index 0000000..bb671d7
--- /dev/null
@@ -0,0 +1,12 @@
+{{foreach Tabs}}
+       {{if selected == true}}
+                       <div onclick="{{:action}}" id="libraryTab{{:index}}" class="libraryTab libraryTabSelected fontSizeLarger fontWeightBold fontColorNormal fontColorSelected">
+                               {{:text}}
+                       </div>
+       {{else}}
+                       <div onclick="{{:action}}" id="libraryTab{{:index}}" class="libraryTab fontSizeLarger fontWeightBold fontColorNormal">
+                               {{:text}}
+                       </div>
+       {{/if}}
+{{/foreach}}
+<div class="libraryTabInlineClear"></div>
\ No newline at end of file
diff --git a/css/car/components/progressBar/progressBar.css b/css/car/components/progressBar/progressBar.css
new file mode 100644 (file)
index 0000000..f0d3971
--- /dev/null
@@ -0,0 +1,50 @@
+#VCbarWrapper {
+       position: absolute;
+       left: 25px;
+       height: 100%;
+       display: block;
+}
+
+#VCinner {
+       position: absolute;
+       top: 30px;
+       height: 2px;
+}
+
+#VCcircle {
+       position: absolute;
+       top: -10px;
+       width: 80px;
+       height: 80px;
+}
+
+#VCline {
+       position: absolute;
+       top: 36px;
+       height: 1px;
+       width: 100%;
+}
+
+#VCouter {
+       position: absolute;
+       top: 0;
+       left: 0;
+       width: 100%;
+       height: 100%;
+       background-color: inherit;
+}
+
+#VCicon {
+       position: absolute;
+       top: 0;
+       left: 0;
+       width: 37px;
+       height: 18px;
+       background-size: 37px 18px;
+       display: block;
+}
+.circleBase {
+       -webkit-border-radius: 999px;
+       border-radius: 999px;
+       behavior: url(PIE.htc);
+}
\ No newline at end of file
diff --git a/css/car/components/progressBar/progressBar.js b/css/car/components/progressBar/progressBar.js
new file mode 100644 (file)
index 0000000..6c84591
--- /dev/null
@@ -0,0 +1,211 @@
+/**
+ * @module CarTheme
+ **/
+
+(function ($) {
+       "use strict";
+       /**
+        * Class which provides UI and methods to operate with progress bar (e.g. Battery level in {{#crossLinkModule "DashboardApplication"}}{{/crossLinkModule}}).
+        * Progress bar displays values between 0-100%.
+        *
+        * Use following snippet to include component in your `index.html` file:
+        *
+        *     <script type="text/javascript" src="./css/car/components/progressBar/progressBar.js"></script>
+        *     <link rel="stylesheet" href="./css/car/components/progressBar/progressBar.css" />
+        *
+        * and following code to initialize:
+        *
+        *     $("#progressBar").progressBarPlugin('init');
+        *
+        * @class progressBarPlugin
+        * @static
+        */
+       var progressBarPlugin = {
+                       /**
+                        * Holds object of this JQuery object selector.
+                        * @property thisSelector {Object}
+                        */
+                       thisSelector: null,
+                       /**
+                        * Holds value of position.
+                        * @property position {Integer}
+                        */
+                       position: null,
+                       /**
+                        * Holds value of width.
+                        * @property width {Integer}
+                        */
+                       width: null,
+                       /**
+                        * Holds status of animation.
+                        * @property animCmpl {Boolean}
+                        */
+                       animCmpl: null,
+                       /**
+                        * Holds circle percent value.
+                        * @property circleAddPer {Number}
+                        */
+                       circleAddPer: null,
+                       /**
+                        * Holds circle with value.
+                        * @property circleWidth {Integer}
+                        */
+                       circleWidth: null,
+                       /**
+                        * Holds wrapper position value.
+                        * @property wrapperPos {Integer}
+                        */
+                       wrapperPos: null,
+                       /**
+                        * Holds type of appearance.
+                        * @property typeAppearance {String}
+                        * @deprecated
+                        */
+                       typeAppearance: "",
+                       /**
+                        * Holds audio tag selector.
+                        * @property audioSel {String}
+                        * @deprecated
+                        */
+                       audioSel: null,
+                       /**
+                        * Method initialize progress bar
+                        * @method init
+                        */
+                       init : function () {
+                               var appearance = "progressBar";
+                               progressBarPlugin.thisSelector = this;
+                               this.empty();
+                               var appendText;
+                               progressBarPlugin.typeAppearance = appearance;
+                               switch (appearance) {
+                               case "volumeControl":
+                                       appendText = '<div id = "VCouter"  ontouchmove = \'$("#' + this[0].id + '").progressBarPlugin("touch", 0)\' onClick = \'$("#' + this[0].id + '").progressBarPlugin("touch", 1)\'>';
+                                       appendText += '<div id = "VCbarWrapper">';
+                                       appendText += '<div id = "VCicon"></div>';
+                                       appendText += '<div id = "VCline" class =  "bgColorTheme"></div>';
+                                       appendText += '<div id = "VCinner" class =  "bgColorTheme boxShadow3"></div>';
+                                       appendText += '<div id = "VCcircle">';
+                                       appendText += '</div>';
+                                       appendText += '</div>';
+                                       appendText += '</div>';
+                                       break;
+
+                               case "progressBar":
+                                       appendText = '<div id = "VCouter" ontouchmove = "VolumeControl.touch(0)" ontouchstart = "VolumeControl.touch(1)">' +
+                                               '<div id = "VCbarWrapper">' +
+                                               '<div id = "VCline" class =  "bgColorTheme"></div>' +
+                                               '<div id = "VCinner" class = "bgColorTheme boxShadow3"></div>' +
+                                               '</div>' +
+                                               '</div>' +
+                                               '</div>';
+                                       break;
+
+                               default:
+                                       break;
+                               }
+                               this.append(appendText);
+                               if (appearance === "progressBar") {
+                                       $('#VCinner').css('height', '3px');
+                               }
+                               progressBarPlugin.width = this.width();
+                               progressBarPlugin.position = this.offset();
+                               progressBarPlugin.circleWidth = $('#VCcircle').width();
+                               $('#VCbarWrapper').css('width', (progressBarPlugin.width - 50) + 'px');
+                               progressBarPlugin.circleAddPer = (100 / (progressBarPlugin.width - 50)) * (progressBarPlugin.circleWidth / 2);
+                               progressBarPlugin.wrapperPos = $('#VCbarWrapper').position().left;
+
+                               if (progressBarPlugin.audioSel !== null) {
+                                       $(progressBarPlugin.audioSel).get(0).volume = 0.5;
+                               }
+
+                               $('#VCinner').css('width', '50%');
+                               $('#VCcircle').css('left', (50 - (progressBarPlugin.circleAddPer)) + '%');
+                       },
+                       /**
+                        * Method sets progress bar position in percents.
+                        * @method setPosition
+                        * @param pos {Integer} Value of position in progress bar between 0 and 100.
+                        */
+                       setPosition: function (pos) {
+                               var thisID = $(this).attr('id');
+                               $("#"+thisID+' #VCinner').css('width', pos + '%');
+                       },
+                       /**
+                        * Method sets volume control position.
+                        * @method setVolume
+                        * @deprecated
+                        * @param vol {Integer} Value of position in volume control.
+                        */
+                       setVolume: function (vol) {
+                               $('#VCinner').css('width', parseInt(vol, 10) + '%');
+                               $('#VCcircle').css('left', (parseInt(vol, 10) - (progressBarPlugin.circleAddPer)) + '%');
+                               if (progressBarPlugin.audioSel !== null) {
+                                       $(progressBarPlugin.audioSel).get(0).volume = vol / 100;
+                               }
+                       },
+                       /**
+                        * Method sets audio selector.
+                        * @method setAudioSelector
+                        * @deprecated
+                        * @param selector {String} Selector id of audio tag.
+                        */
+                       setAudioSelector: function (selector) {
+                               progressBarPlugin.audioSel = selector;
+                       },
+                       /**
+                        * Method is called after touch event on volume control.
+                        * @method touch
+                        * @deprecated
+                        * @param parm {Integer} Value 0 change position without animation, value 1 is for changing position with animation.
+                        */
+                       touch: function (parm) {
+                               //console.log("touch " + window.event);
+                               var value = 0;
+                               var xPoint = window.event.clientX - progressBarPlugin.position.left;
+                               //console.log("xPoint " + progressBarPlugin.position.left);
+                               if ((xPoint > progressBarPlugin.wrapperPos) && (xPoint <= progressBarPlugin.width - progressBarPlugin.wrapperPos)) {
+                                       value = (xPoint - progressBarPlugin.wrapperPos) / (progressBarPlugin.width - progressBarPlugin.wrapperPos * 2);
+                               }
+                               if (xPoint > progressBarPlugin.width - progressBarPlugin.wrapperPos) {
+                                       value = 1;
+                               }
+                               //value = Math.round(value*Math.pow(10,2))/Math.pow(10,2);
+                               if (progressBarPlugin.audioSel !== null) {
+                                       $(progressBarPlugin.audioSel).get(0).volume = value;
+                               }
+                               //console.log("value " + value);
+                               var dispVal = value * 100;
+                               if ((parm === 0) && progressBarPlugin.animCmpl) {
+                                       $('#VCinner').stop();
+                                       $('#VCinner').css('width', dispVal + '%');
+                                       $('#VCcircle').css('left', (dispVal - progressBarPlugin.circleAddPer) + '%');
+                               }
+                               if (parm === 1) {
+                                       progressBarPlugin.animCmpl = false;
+                                       $('#VCinner').animate({width: (dispVal) + '%'}, 500, function () {progressBarPlugin.animCmpl = true; });
+                                       $('#VCcircle').animate({left: ((dispVal - progressBarPlugin.circleAddPer)) + '%'}, 500, function () {progressBarPlugin.animCmpl = true; });
+                               }
+
+                               progressBarPlugin.thisSelector.trigger('volumeControlTouch', {position: dispVal});
+                               progressBarPlugin.thisSelector.trigger('progressBarTouch', {position: dispVal});
+                       }
+               };
+       /**
+        * jQuery extension method for {{#crossLink "progressBarPlugin"}}{{/crossLink}} plugin.
+        * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+        * @method progressBarPlugin
+        * @for jQuery
+        * @return Result of called method.
+        */
+       $.fn.progressBarPlugin = function (method) {
+               // Method calling logic
+               if (progressBarPlugin[method]) {
+                       return progressBarPlugin[method].apply(this, Array.prototype.slice.call(arguments, 1));
+               } else if (typeof method === 'object' || !method) {
+                       return progressBarPlugin.init.apply(this, arguments);
+               } else {
+                       $.error('Method ' +  method + ' does not exist on jQuery.progressBar');
+               }
+       };
+}(jQuery));
diff --git a/css/car/components/progressBar/volumeSlider.css b/css/car/components/progressBar/volumeSlider.css
new file mode 100644 (file)
index 0000000..83453c7
--- /dev/null
@@ -0,0 +1,99 @@
+.noVolumeSlider,
+.noVolumeSlider * {
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       -webkit-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       display: block;
+       cursor: default;
+}
+.noVolumeSlider {
+       position: relative;
+}
+.noVolumeSlider a {
+       position: absolute;
+       z-index: 1;
+}
+.noVolumeSlider a:nth-child(2) {
+       background: inherit !important;
+}
+.noVolumeSlider.vertical a {
+       width: 100%;
+       bottom: 0;
+}
+.noVolumeSlider.horizontal a {
+       height: 100%;
+       right: 0;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+       .noVolumeSlider:before,
+       .TOUCH,
+       .noVolumeSlider div {
+               -ms-touch-action: none;
+       }
+       .noVolumeSlider:before {
+               display: block;
+               position: absolute;
+               width: 150%;
+               left: -25%;
+               height: 400%;
+               top: -150%;
+               content: "";
+               z-index: -1;
+       }
+       .noVolumeSlider.vertical:before {
+               width: 400%;
+               left: -150%;
+               height: 150%;
+               top: -25%;
+       }
+}
+.noVolumeSlider {
+       border-radius: 3px;
+}
+.noVolumeSlider.connect a,
+.noVolumeSlider.connect.lower {
+       background: transparent;
+
+}
+.noVolumeSlider,
+.noVolumeSlider.connect.lower a {
+       left:0;
+
+}
+/*.noVolumeSlider.disabled,
+.noVolumeSlider.disabled.connect.lower a {
+
+}*/
+.noVolumeSlider div {
+       width:100px;
+       height: 100px;
+       border-radius: 3px;
+       background: #efefe7;
+
+       left:100%;
+}
+/*.noVolumeSlider.disabled div {
+
+
+}
+.noVolumeSlider.horizontal {
+
+}*/
+.noVolumeSlider.horizontal div {
+       margin: -23px 0 0 -50px;
+}
+.noVolumeSlider{
+       width: 100%;
+       height: 100%;
+}
+
+.sliderStart{
+       position:absolute;
+       top: 25px;
+       left: -2px;
+       width: 2px;
+       height: 6px;
+}
diff --git a/css/car/components/settings/config.xml b/css/car/components/settings/config.xml
new file mode 100644 (file)
index 0000000..91d9afa
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://com.intel.tizen/settings" version="0.5" viewmodes="fullscreen">
+    <icon src="icon.png"/>
+    <content src="index.html"/>
+<name>Settings</name>
+<tizen:application id="CF6vRBuTFI" required_version="1.0"/>
+</widget>
diff --git a/css/car/components/settings/css/settings.css b/css/car/components/settings/css/settings.css
new file mode 100644 (file)
index 0000000..d3f9e90
--- /dev/null
@@ -0,0 +1,281 @@
+.settingsContent .settingElement {
+       padding: 20px 0;
+       border-bottom-style: solid;
+       border-bottom-width: 2px;
+       overflow: hidden;
+       white-space: nowrap;
+       cursor: pointer;
+       text-transform: uppercase;
+}
+
+.themesContent {
+       line-height: 0;
+}
+
+.themesContent .themeElement {
+       width: 215px;
+       height: 215px;
+       display: inline-block;
+       margin-right: 7px;
+       margin-bottom: 10px;
+       cursor: pointer;
+}
+
+.themesContent .themeElement .themeImage {
+       width: 100%;
+       height: 100%;
+       background-size: 100% 100%;
+}
+
+.themesContent .themeElement .themeImage img {
+       width: 100%;
+       height: 100%;
+}
+
+.themesContent .themeElement .themeTitle {
+       position: relative;
+       padding-left: 10px;
+       padding-right: 10px;
+       line-height: 80px !important;
+       top: -80px;
+       left: 0;
+       height: 80px;
+       overflow: hidden;
+       text-align: center;
+       text-transform: uppercase;
+}
+
+.wifiElement {
+       padding: 20px 0;
+       border-bottom-style: solid;
+       border-bottom-width: 2px;
+       overflow: hidden;
+       white-space: nowrap;
+       cursor: pointer;
+       text-transform: uppercase;
+}
+
+.wifiElement .wifiElementInfoBox {
+       width: 495px;
+       display: block;
+       float: left;
+}
+
+.wifiElement .wifiElementSubtitle {
+       margin-top: 5px;
+}
+
+.wifiElement .wifiElementButton {
+       display: block;
+       float: right;
+       width: 180px;
+       top: 26px;
+}
+
+.toggleButton {
+       width: 90px;
+       height: 43px;
+}
+
+.toggleButtonBackground {
+       width: 100%;
+       height: 100%;
+       opacity: 0.5;
+}
+
+.toggleButton .toggleButtonText {
+       position: relative;
+       text-align: center;
+       top: -43px;
+       line-height: 43px;
+}
+
+.subPanelToggleButton {
+       position: absolute;
+       right: 20px;
+       top: 20px;
+}
+
+.subPanelToggleButtonWide {
+       width: 200px;
+}
+
+.buttonsArea {
+       width: 680px;
+       margin-top: 20px;
+       min-height: 43px;
+}
+
+.wifiRefreshButton {
+       width: 180px;
+       float: left;
+}
+
+.addNetworkButton {
+       width: 180px;
+       float: right;
+}
+
+.bluetoothRefreshButton {
+       width: 180px;
+       margin: 0 auto;
+}
+
+.wifiNetworkInfoElement {
+       padding: 10px 0;
+       overflow: hidden;
+       white-space: nowrap;
+       cursor: pointer;
+       text-transform: uppercase;
+}
+
+.networkConnectButton {
+       margin: 20px auto;
+       width: 200px;
+}
+
+.loadingSpinnerWifi {
+       position: absolute;
+       top: 33px;
+       right: 240px;
+}
+
+.loadingSpinnerBluetooth {
+       position: absolute;
+       top: 33px;
+       right: 240px;
+}
+
+.popupContainer {
+       position: absolute;
+       width: 100%;
+       height: 100%;
+       z-index: 999;
+       display: none;
+    top: 0;
+    left: 0;
+}
+
+.popupContainerWrapper {
+       width: 100%;
+       height: 100%;
+       display: -webkit-box;
+       -webkit-box-pack: center;
+       -webkit-box-align: center;
+}
+
+.popupWrapper {
+       border-width: 1px;
+       border-style: solid;
+}
+
+.popupHeader {
+       width: 400px;
+       height: 80px;
+       border-bottom-width: 1px;
+       border-bottom-style: solid;
+       display: -webkit-box;
+       -webkit-box-pack: center;
+       -webkit-box-align: center;
+       text-transform: uppercase;
+}
+
+.popupContent {
+       width: 400px;
+       min-height: 100px;
+}
+
+.popupContentContainer {
+       padding: 10px;
+}
+
+.popupContentContainerKey {
+       text-transform: uppercase;
+       display: block;
+}
+
+.popupContentContainerValue {
+       text-transform: uppercase;
+       display: block;
+}
+
+.popupInputBox {
+       margin-top: 10px;
+}
+
+.popupFooter {
+       width: 400px;
+       border-top-width: 1px;
+       border-top-style: solid;
+}
+
+.popupButton {
+       width: 185px;
+       height: 55px;
+       display: inline-block;
+       padding: 10px 0 10px 10px;
+}
+
+.popupButtonBackground {
+       width: 100%;
+       height: 100%;
+       opacity: 0.5;
+}
+
+.popupButton .popupButtonText {
+       position: relative;
+       text-align: center;
+       top: -55px;
+       line-height: 55px;
+}
+
+.contentContainer {
+       padding: 10px;
+}
+
+.contentContainerKey {
+       text-transform: uppercase;
+       display: inline-block;
+       width: 200px;
+}
+
+.contentContainerValue {
+       text-transform: uppercase;
+       display: inline-block;
+}
+
+.contentInputBox {
+       display: inline-block;
+}
+
+.inputBox .settingsInputWideInline {
+       width: 350px;
+}
+
+.inputBox .settingsInputSelectionWideInline {
+       width: 310px;
+}
+
+.wifiHandoverButton {
+       width: 300px;
+       margin: 0 auto;
+}
+
+.disabledArea {
+       width: 100%;
+       height: 100%;
+       position: absolute;
+       top: 0;
+       left: 0;
+       display: none;
+       z-index: 11;
+}
+
+.bluetoothPINCode {
+       float: left;
+       bottom: 10px;
+       left: 34px;
+       z-index: 100;
+       position: absolute;
+       text-transform: uppercase;
+}
\ No newline at end of file
diff --git a/css/car/components/settings/icon.png b/css/car/components/settings/icon.png
new file mode 100644 (file)
index 0000000..253c312
Binary files /dev/null and b/css/car/components/settings/icon.png differ
diff --git a/css/car/components/settings/js/.bluetooth.js.swp b/css/car/components/settings/js/.bluetooth.js.swp
new file mode 100644 (file)
index 0000000..744979e
Binary files /dev/null and b/css/car/components/settings/js/.bluetooth.js.swp differ
diff --git a/css/car/components/settings/js/api-connman.js b/css/car/components/settings/js/api-connman.js
new file mode 100644 (file)
index 0000000..3aa2beb
--- /dev/null
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2013, Intel Corporation.
+ *
+ * This program is licensed under the terms and conditions of the
+ * Apache License, version 2.0.  The full text of the Apache License is at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+
+/* Namespace */
+var settings = settings || {};
+settings.connman = settings.connman || {};
+
+/* Module */
+settings.connman = (function() {
+
+       var default_adapter = null;
+
+       /* Technology class */
+       var ConnmanTechnology = function(technology_path, technology_properties) {
+               this.id = technology_path;
+               this.prop = technology_properties;
+       };
+
+       ConnmanTechnology.prototype.setPowered = function(powered, success_cb, error_cb) {
+               if (wsAPI === undefined)
+                       return;
+               if (this.setPowerInProgress) {
+                       console.log('Enabling/disabling technology in progress');
+                       return;
+               }
+
+               var me = this;
+               this.setPowerInProgress = true;
+               setTimeout(function() {
+                       wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_TECHNOLOGY, 'enable', [ me.id, powered ], function() {
+                               me.setPowerInProgress = false;
+                               success_cb();
+                       }, function(e) {
+                               if (e.indexOf('Already enabled') >= 0) {
+                                       console.log('connman ' + me.prop.Type + ' already enabled');
+                                       me.setPowerInProgress = false;
+                                       success_cb();
+                               } else if (e.indexOf('Already disabled') >= 0) {
+                                       console.log('connman ' + me.prop.Type + ' already disabled');
+                                       me.setPowerInProgress = false;
+                                       success_cb();
+                               } else {
+                                       me.setPowerInProgress = false;
+                                       error_cb(e);
+                               }
+                       })
+               }, 2000);
+       };
+
+       ConnmanTechnology.prototype.getPowered = function(success_cb, error_cb) {
+               if (wsAPI === undefined)
+                       return;
+               var me = this;
+               wsAPI.sendRequest(this.prop.Type, 'is_enabled', null, function(isEnabled) {
+                       if (isEnabled === undefined) {
+                               console.log('Badly formed json message: ' + json_msg);
+                       }
+                       me.powered = isEnabled;
+                       success_cb(me.powered);
+               }, error_cb);
+       };
+
+       ConnmanTechnology.prototype.setTethering = function(identifier, passphrase, enabled, success_cb, error_cb) {
+               if (wsAPI === undefined) {
+                       return;
+               }
+
+               var me = this;
+               var index = me.id.lastIndexOf('/');
+               var technology = me.id.substring(index + 1).toString().trim().toLowerCase();
+               if (technology !== "wifi") {
+                       return;
+               }
+
+               var info = {
+                       path : me.id,
+                       ssid : identifier === undefined ? me.prop.TetheringIdentifier : identifier,
+                       password : passphrase === undefined ? me.prop.TetheringPassphrase : passphrase,
+                       enabled : enabled === undefined ? me.prop.Tethering : enabled
+               };
+               wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_TECHNOLOGY, 'set_tethering', info, function() {
+                       if (!!success_cb) {
+                               success_cb();
+                       }
+               }, function(e) {
+                       if (!!error_cb) {
+                               error_cb(e);
+                       }
+               });
+       };
+
+       /* Service class */
+       ConnmanService = function(service_path, service_properties) {
+               this.id = service_path;
+               this.prop = service_properties;
+       };
+
+       ConnmanService.prototype.connect = function(name, passphrase, type, success_cb, error_cb) {
+               if (wsAPI === undefined)
+                       return;
+
+               var info = [ this.id, {
+                       'Name' : name === undefined ? this.prop.Name : name,
+                       'Type' : type === undefined ? this.prop.EncryptionMode : type,
+                       'Passphrase' : passphrase
+               } ];
+               wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_SERVICE, 'connect', info, success_cb, error_cb);
+       };
+
+       ConnmanService.prototype.disconnect = function(success_cb, error_cb) {
+               if (wsAPI === undefined)
+                       return;
+               wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_SERVICE, 'disconnect', [ this.id, null ], success_cb, error_cb);
+       };
+
+       ConnmanService.prototype.setAutoConnect = function(enabled, success_cb, error_cb) {
+               if (wsAPI === undefined) {
+                       return;
+               }
+
+               var me = this;
+               if (!!me.prop && me.prop.Type !== "wifi") {
+                       return;
+               }
+
+               var info = {
+                       path : me.id,
+                       enable : enabled === undefined ? me.prop.AutoConnect : enabled
+               };
+               wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_SERVICE, 'autoconnect', info, function() {
+                       if (!!success_cb) {
+                               success_cb();
+                       }
+               }, function(e) {
+                       if (!!error_cb) {
+                               error_cb(e);
+                       }
+               });
+       };
+
+       function getTechnologies(success_cb, error_cb) {
+               if (wsAPI === undefined)
+                       return;
+               wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_MANAGER, 'get_technologies', null, function(results) {
+                       if (results.length >= 0 && results[0].length >= 0 && results[0][0][0] === undefined) {
+                               error_cb('Cannot parse technologies');
+                               return;
+                       }
+
+                       var technologies_list = results[0];
+
+                       try {
+                               var technologies = [];
+                               for ( var i = 0; i < technologies_list.length; i++) {
+                                       if (technologies_list[i][0] === undefined || technologies_list[i][1] === undefined) {
+                                               console.log('Badly form json message: ' + json_msg);
+                                       }
+
+                                       var technology = new settings.connman.ConnmanTechnology(technologies_list[i][0], technologies_list[i][1]);
+                                       technologies.push(technology);
+                               }
+                       } catch (e) {
+                               error_cb(e);
+                       }
+                       success_cb(technologies);
+               }, error_cb);
+       }
+
+       function getServices(success_cb, error_cb) {
+               if (wsAPI === undefined)
+                       return;
+               wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_MANAGER, 'get_services', null, function(results) {
+                       if (results.length >= 0 && results[0].length >= 0 && results[0][0][0] === undefined) {
+                               error_cb('Cannot parse get_services results');
+                               return;
+                       }
+
+                       var services_list = results[0];
+
+                       try {
+                               var results = [];
+                               for ( var i = 0; i < services_list.length; i++) {
+                                       if (services_list[i][0] === undefined || services_list[i][1] === undefined) {
+                                               console.log('Badly form json message: ' + json_msg);
+                                       }
+
+                                       var service = new settings.connman.ConnmanService(services_list[i][0], services_list[i][1]);
+                                       results.push(service);
+                               }
+                       } catch (e) {
+                               error_cb(e);
+                       }
+                       success_cb(results);
+               }, error_cb);
+       }
+
+       function scan(technology, success_cb, error_cb) {
+               if (wsAPI === undefined)
+                       return;
+               wsAPI.sendRequest(WS_REQUEST_TYPE.CONNMAN_TECHNOLOGY, 'scan', [ technology, null ], function(results) {
+                       if (results.length >= 0 && results[0].length >= 0 && results[0][0][0] === undefined) {
+                               error_cb('Cannot parse scan results');
+                               return;
+                       }
+
+                       var services_list = results[0];
+
+                       try {
+                               var services = [];
+                               for ( var i = 0; i < services_list.length; i++) {
+                                       if (services_list[i][0] === undefined || services_list[i][1] === undefined) {
+                                               console.log('Badly form json message: ' + json_msg);
+                                       }
+
+                                       var service = new settings.connman.ConnmanService(services_list[i][0], services_list[i][1]);
+                                       services.push(service);
+                               }
+                       } catch (e) {
+                               error_cb(e);
+                       }
+                       success_cb(services);
+               }, error_cb);
+       }
+       ;
+
+       return {
+               ConnmanTechnology : ConnmanTechnology,
+               ConnmanService : ConnmanService,
+               getTechnologies : getTechnologies,
+               getServices : getServices,
+               scan : scan
+       };
+})();
\ No newline at end of file
diff --git a/css/car/components/settings/js/bluetooth.js b/css/car/components/settings/js/bluetooth.js
new file mode 100644 (file)
index 0000000..6d72e8a
--- /dev/null
@@ -0,0 +1,1060 @@
+/* global Configuration, Settings, hideLoadingSpinner, showLoadingSpinner, ko, $, loadTemplate */
+
+/**
+ * Bluetooth class provides list view of nearby and known Bluetooth devices, detailed information view about Bluetooth device,
+ * functionality to pair and unpair remote Bluetooth device, mark phone as selected for incoming calls, contacts and
+ * call history, turn on and off Bluetooth adapter.
+ *
+ * This class requires following components:
+ *
+ * * {{#crossLink "Tabs"}}{{/crossLink}} component
+ * * {{#crossLink "Configuration"}}{{/crossLink}} component
+ * * {{#crossLink "Settings"}}{{/crossLink}} component
+ *
+ * @class Bluetooth
+ * @module Settings
+ * @constructor
+ */
+var Bluetooth = function() {
+       "use strict";
+       var self = this;
+
+       self.loadDefaultAdapter();
+       self.registerDefaultAdapterChangeListener();
+
+       self.loadBluetoothConfig();
+       Configuration.addUpdateListener(function() {
+               self.loadBluetoothConfig();
+       });
+
+       self.registerSelectedRemoteDeviceChangeListener();
+       self.loadSelectedRemoteDevice();
+
+       self._setRefreshDevicesInterval();
+
+       Settings.domElement.on('eventClick_hidePage', function() {
+               self.isVisible(false);
+               var attempts = 0;
+               function stopScanning() {
+                       console.log("attempts: ", attempts);
+                       if (attempts < 3) {
+                               attempts++;
+                               self.stopScan(function(err) {
+                                       if (!!err) {
+                                               setTimeout(function() {
+                                                       stopScanning();
+                                               }, 1000);
+                                       }
+                               }, false);
+                       }
+               }
+               stopScanning();
+       });
+
+       Settings.domElement.on('eventClick_showPage', function() {
+               if ($(".bluetoothContent").length || $(".deviceInfoContent").length) {
+                       self.isVisible(true);
+                       var diff = -1;
+                       if (!!self.lastSync()) {
+                               diff = new Date().getTime() - self.lastSync();
+                       }
+                       if (!self.scanning() && (diff === -1 || diff > 600000 || !self.devices().length)) {
+                               self.clearDevices();
+                               self.scan(true);
+                       }
+                       if (self.scanning()) {
+                               self.showBluetoothLoadingSpinner();
+                       }
+               }
+       });
+
+       /**
+        * Sets the state of a Bluetooth adapter to on or off by sending a request to Bluetooth hardware to change the power state.
+        * After Bluetooth adapter is enabled it starts scanning for nearby and known Bluetooth devices.
+        *
+        * @method togglePower
+        */
+       this.togglePower = function() {
+               console.log("Bluetooth: toggle power called.");
+               //self.loadDefaultAdapter();
+               if (!!self.adapter() && !self.togglePowerLocked()) {
+                       self.togglePowerLocked(true);
+                       if (self.adapter().powered) {
+                               showLoadingSpinner("Turning off");
+                               self.stopScan(function(err) {
+                                       console.log('setPowered(false) called');
+                                       self.adapter().setPowered(false, function() {
+                                               console.log('Successfully disable bluetooth subsystem.');
+                                               self.togglePowerLocked(false);
+                                               //self.loadDefaultAdapter();
+                                               hideLoadingSpinner("Turning off");
+                                       }, function(err) {
+                                               var error = "An error occured while turning bluetooth off.";
+                                               console.log(error, err);
+                                               alert(error);
+                                               self.togglePowerLocked(false);
+                                               //self.loadDefaultAdapter();
+                                               hideLoadingSpinner("Turning off");
+                                       });
+                               }, false);
+                       } else {
+                               showLoadingSpinner("Turning on");
+                               self.stopScan(function(err) {
+                                       console.log('setPowered(true) called');
+                                       self.adapter().setPowered(true, function() {
+                                               console.log('Successfully enable bluetooth subsystem');
+                                               self.togglePowerLocked(false);
+                                               //self.loadDefaultAdapter();
+                                               self.clearDevices();
+                                               self.scanning(false);
+                                               setTimeout(function() {
+                                                       hideLoadingSpinner("Turning on");
+                                                       self.scan(true);
+                                               }, 1000);
+                                       }, function(err) {
+                                               var error = "An error occured while turning bluetooth on.";
+                                               console.log(error, err);
+                                               alert(error);
+                                               self.togglePowerLocked(false);
+                                               //self.loadDefaultAdapter();
+                                               hideLoadingSpinner("Turning on");
+                                       });
+                               });
+                       }
+               }
+       };
+
+       /**
+        * Creates a bond with a remote device by initiating the bonding process with peer device using the given device's MAC address or destroys
+        * the bond with a remote device (initiates the process of removing the specified address from the
+        * list of bonded devices).
+        *
+        * @method togglePair
+        * @param device {Object} Object representing remote Bluetooth device to be paired or unpaired according to current device state.
+        */
+       this.togglePair = function(device) {
+               console.log("Bluetooth: toggle connection called.");
+               console.log(device);
+               if (!!device) {
+                       //self.loadDefaultAdapter();
+                       self._clearRefreshDevicesInterval();
+                       if (!device.isBonded) {
+                               console.log('bluetooth pair to device: ' + device.address);
+                               showLoadingSpinner("Pairing");
+                               self.adapter().createBonding(device.address, function() {
+                                       console.log('bluetooth paired with ' + device.address);
+                                       self._restartRefreshDevicesInterval();
+                                       hideLoadingSpinner("Pairing");
+                               }, function(e) {
+                                       console.log('Error: bluetooth pair failed: ', e);
+                                       self._restartRefreshDevicesInterval();
+                                       alert("An error occured while pairing with " + device.name);
+                                       hideLoadingSpinner("Pairing");
+                               });
+                       } else {
+                               console.log('Bluetooth disconnect from device: ' + device.address);
+                               showLoadingSpinner("Unpairing");
+                               self.adapter().destroyBonding(device.address, function() {
+                                       console.log('bluetooth unpaired from ' + device.address);
+                                       self._restartRefreshDevicesInterval();
+                                       hideLoadingSpinner("Unpairing");
+                               }, function(e) {
+                                       console.log('Error: bluetooth unpairing failed: ' + e);
+                                       self._restartRefreshDevicesInterval();
+                                       alert("An error occured while unpairing from " + device.name);
+                                       hideLoadingSpinner("Unpairing");
+                               });
+                       }
+               }
+       };
+
+       /**
+        * Starts discovering nearby and known remote Bluetooth devices or stops an active discovery session.
+        *
+        * @method toogleScanDevices
+        */
+       this.toogleScanDevices = function() {
+               console.log("Bluetooth: toggle scan devices called.");
+               if (self.scanning()) {
+                       console.log("Bluetooth: stop scan called.");
+                       self.stopScan(function(err) {
+                               if (!!err) {
+                                       alert("An error occured while stopping bluetooth discovery.");
+                               }
+                       }, true);
+               } else {
+                       console.log("Bluetooth: scan called.");
+                       self.clearDevices();
+                       self.scan(true);
+               }
+       };
+
+       /**
+        * Shows more information about given remote Bluetooth device (like name, address, device class, bond, trusted, connection state) in a new view.
+        * That in addition allows to mark phone as selected for incoming calls and pair/unpair remote
+        * Bluetooth device.
+        *
+        * @method openDeviceDetails
+        * @param device {Object} Object representing remote Bluetooth device to be showed in detailed information view.
+        */
+       this.openDeviceDetails = function(device) {
+               console.log("Bluetooth: open device details called: ", device);
+               self.selectedDevice(null);
+               if (!!device) {
+                       self.selectedDevice(device);
+                       var subpanelModel = {
+                               textTitle : "DEVICE INFO",
+                               textSubtitle : device.name.toUpperCase(),
+                               actionName : "BACK",
+                               action : function() {
+                                       console.log("bluetooth openDeviceDetails");
+                                       Settings.openSetting(Settings.selectedSetting);
+                               }
+                       };
+
+                       var createDeviceInfoElement = function(key, value, deviceInfoContent) {
+                               var deviceInfoElement = '<div class="wifiNetworkInfoElement fontSizeLarge fontWeightBold fontColorNormal">';
+                               deviceInfoElement += '<span>';
+                               deviceInfoElement += key;
+                               deviceInfoElement += ": ";
+                               deviceInfoElement += '</span>';
+                               deviceInfoElement += '<span data-bind="text:' + value + '">';
+                               deviceInfoElement += '</span>';
+                               deviceInfoElement += '</div>';
+                               return deviceInfoElement;
+                       };
+
+                       var loadDeviceInfoUI = function() {
+                               if (!$("#bluetoothDeviceInfoBox").length) {
+                                       var button = "";
+                                       button += '<div id="wifiAutoConnectButton" class="toggleButton subPanelToggleButton subPanelToggleButtonWide" data-bind="with: Settings.Bluetooth.selectedDevice, click: Settings.Bluetooth.toggleSelectionOfSelectedDevice, style: { display: Settings.Bluetooth.isSelectedDeviceSelectable() ? \'block\' : \'none\'}">';
+                                       button += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                                       button += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: \'SELECTED\', css: { fontColorSelected: Settings.Bluetooth.isDeviceSelected($data) }"></div>';
+                                       button += '</div>';
+                                       $(button).appendTo($('.tabsTopSubPanel'));
+
+                                       var deviceInfo = '<div id="bluetoothDeviceInfoBox" data-bind="with: Settings.Bluetooth.selectedDevice">';
+                                       deviceInfo += createDeviceInfoElement("Device name", "name");
+                                       deviceInfo += createDeviceInfoElement("Device address", "address");
+                                       deviceInfo += createDeviceInfoElement("Device class", "Settings.Bluetooth.getDeviceClassStr(deviceClass)");
+                                       deviceInfo += createDeviceInfoElement("Paired", "isBonded ? 'Yes' : 'No'");
+                                       deviceInfo += createDeviceInfoElement("Connected", "isConnected ? 'Yes' : 'No'");
+                                       deviceInfo += createDeviceInfoElement("Trusted", "isTrusted ? 'Yes' : 'No'");
+                                       deviceInfo += '<div id="networkConnectButton" class="toggleButton networkConnectButton" data-bind="click: Settings.Bluetooth.togglePair">';
+                                       deviceInfo += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                                       deviceInfo += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: isBonded ? \'UNPAIR\' : \'PAIR\'"></div>';
+                                       deviceInfo += '</div>';
+                                       deviceInfo += '</div>';
+                                       $(deviceInfo).appendTo($('.' + deviceInfoContent));
+                                       ko.applyBindings(window.Settings);
+                               }
+                       };
+
+                       var deviceInfoContent = "deviceInfoContent";
+                       Settings.domElement.tabs("clearContent");
+                       Settings.domElement.tabs("changeContentClass", deviceInfoContent);
+                       Settings.domElement.tabs("subpanelContentTemplateCompile", subpanelModel, loadDeviceInfoUI);
+               }
+       };
+
+       /**
+        * Returns major Bluetooth device class in human readable form.
+        *
+        * @method getDeviceClassStr
+        * @param deviceClass {Object} Object representing Bluetooth device class information.
+        * @return {String} Major Bluetooth device class.
+        */
+       this.getDeviceClassStr = function(deviceClass) {
+               var classStr = "";
+               switch (deviceClass.major) {
+               case tizen.bt.deviceMajor.MISC:
+                       classStr = "MISC";
+                       break;
+               case tizen.bt.deviceMajor.COMPUTER:
+                       classStr = "COMPUTER";
+                       break;
+               case tizen.bt.deviceMajor.PHONE:
+                       classStr = "PHONE";
+                       break;
+               case tizen.bt.deviceMajor.NETWORK:
+                       classStr = "NETWORK";
+                       break;
+               case tizen.bt.deviceMajor.AUDIO_VIDEO:
+                       classStr = "AUDIO/VIDEO";
+                       break;
+               case tizen.bt.deviceMajor.PERIPHERAL:
+                       classStr = "PERIPHERAL";
+                       break;
+               case tizen.bt.deviceMajor.IMAGING:
+                       classStr = "IMAGING";
+                       break;
+               case tizen.bt.deviceMajor.WEARABLE:
+                       classStr = "WEARABLE";
+                       break;
+               case tizen.bt.deviceMajor.TOY:
+                       classStr = "TOY";
+                       break;
+               case tizen.bt.deviceMajor.HEALTH:
+                       classStr = "HEALTH";
+                       break;
+               case tizen.bt.deviceMajor.UNCATEGORIZED:
+                       classStr = "UNCATEGORIZED";
+                       break;
+               default:
+                       classStr = "UNKNOWN";
+                       break;
+               }
+               return classStr;
+       };
+
+       /**
+        * Tests if supplied remote Bluetooth device is marked as selected for incoming calls.
+        *
+        * @method isDeviceSelected
+        * @param device {Object} Object representing remote Bluetooth device to be checked for selection state.
+        * @return {Boolean} True if Bluetooth device is selected otherwise false.
+        */
+       this.isDeviceSelected = function(device) {
+               if (!!device && !!self.selectedPhone() && self.selectedPhone() === device.address) {
+                       return true;
+               }
+               return false;
+       };
+
+       /**
+        * Tests if remote Bluetooth device opened in detail view is selectable for incoming calls (only Bluetooth devices of class Phone can be selected).
+        *
+        * @method isSelectedDeviceSelectable
+        * @return {Boolean} True if remote Bluetooth device is selectable otherwise false.
+        */
+       this.isSelectedDeviceSelectable = function() {
+               if (!!self.selectedDevice()) {
+                       if (self.isDeviceSelected(self.selectedDevice())) {
+                               return true;
+                       }
+                       if (!!self.selectedDevice().isBonded && !!self.selectedDevice().address && !!self.selectedDevice().deviceClass && self.selectedDevice().deviceClass.major === tizen.bt.deviceMajor.PHONE) {
+                               return true;
+                       }
+               }
+               return false;
+       };
+
+       /**
+        * Marks and unmarks remote Bluetooth device opened in detail view as selected for incoming calls.
+        *
+        * @method toggleSelectionOfSelectedDevice
+        */
+       this.toggleSelectionOfSelectedDevice = function() {
+               console.log("Wifi: toggle select device called", self.selectedDevice());
+               if (self.isDeviceSelected(self.selectedDevice())) {
+                       self.unselectRemoteDevice();
+               } else {
+                       if (!!self.selectedPhone()) {
+                               self.unselectRemoteDevice();
+                       }
+                       self.selectRemoteDevice(self.selectedDevice());
+               }
+       };
+};
+
+/**
+ * Contains array of nearby and known remote Bluetooth devices.
+ *
+ * @property devices
+ * @public
+ * @type ko.observableArray
+ * @default []
+ */
+Bluetooth.prototype.devices = ko.observableArray([]);
+/**
+ * Provides access to control the device's Bluetooth adapter.
+ *
+ * @property adapter
+ * @public
+ * @type ko.observable
+ * @default null
+ */
+Bluetooth.prototype.adapter = ko.observable(null);
+/**
+ * Represents remote Bluetooth device showed in detail view.
+ *
+ * @property selectedDevice
+ * @public
+ * @type ko.observable
+ * @default null
+ */
+Bluetooth.prototype.selectedDevice = ko.observable(null);
+/**
+ * Indicates if there is active discovery session for nearby and known remote Bluetooth devices.
+ *
+ * @property scanning
+ * @public
+ * @type ko.observable
+ * @default false
+ */
+Bluetooth.prototype.scanning = ko.observable(false);
+/**
+ * Indicates if Bluetooth settings view is visible (in a viewport).
+ *
+ * @property isVisible
+ * @public
+ * @type ko.observable
+ * @default false
+ */
+Bluetooth.prototype.isVisible = ko.observable(false);
+/**
+ * Defines Bluetooth hardware address of phone marked as selected for incoming calls, contacts and call history.
+ *
+ * @property selectedPhone
+ * @public
+ * @type ko.observable
+ * @default null
+ */
+Bluetooth.prototype.selectedPhone = ko.observable(null);
+/**
+ * Holds information about last synchronisation of nearby and known remote Bluetooth devices with local offline storage.
+ *
+ * @property lastSync
+ * @public
+ * @type ko.observable
+ * @default null
+ */
+Bluetooth.prototype.lastSync = ko.observable(null);
+/**
+ * Indicates if Bluetooth power button is clickable.
+ *
+ * @property togglePowerLocked
+ * @public
+ * @type ko.observable
+ * @default false
+ */
+Bluetooth.prototype.togglePowerLocked = ko.observable(false);
+
+Bluetooth.prototype._refreshDevicesInterval = null;
+Bluetooth.prototype._setRefreshDevicesInterval = function() {
+       "use strict";
+       var self = this;
+       self._clearRefreshDevicesInterval();
+       self._refreshDevicesInterval = setInterval(function() {
+               if (!!self.adapter() && self.isVisible() && !self.scanning() && !document.webkitHidden) {
+                       self.refreshDevices();
+               }
+       }, 10000);
+};
+Bluetooth.prototype._clearRefreshDevicesInterval = function() {
+       "use strict";
+       var self = this;
+       if (!!self._refreshDevicesInterval) {
+               clearInterval(self._refreshDevicesInterval);
+               self._refreshDevicesInterval = null;
+       }
+};
+
+/**
+ * Loads saved remote Bluetooth devices from local offline storage.
+ *
+ * @method loadBluetoothConfig
+ */
+Bluetooth.prototype.loadBluetoothConfig = function() {
+       "use strict";
+       var self = this;
+       self._clearRefreshDevicesInterval();
+       var bluetooth = Configuration.get("bluetooth");
+       console.log("loaded bluetooth config: ", JSON.stringify(bluetooth));
+       //self.loadDefaultAdapter();
+       if (!!bluetooth) {
+               self.lastSync(bluetooth.lastSync);
+               if (!!self.adapter() && self.adapter().powered && !!bluetooth.devices) {
+                       self.devices(bluetooth.devices);
+                       self.refreshDevices();
+                       self._setRefreshDevicesInterval();
+               }
+       }
+};
+
+/**
+ * Updates or adds Bluetooth device for a given device's hardware address.
+ *
+ * @method getDevice
+ * @param device {Object} Object representing Bluetooth device information to be updated or added.
+ */
+Bluetooth.prototype.getDevice = function(device) {
+       "use strict";
+       var self = this;
+       self.adapter().getDevice(device.address, function(dev) {
+               // console.log("getDevice ", dev);
+               self.addUpdateDevice(dev, false);
+               self.sortDevices();
+               self.saveBluetooth();
+               if (self.selectedDevice().address === dev.address) {
+                       self.selectedDevice(dev);
+               }
+       }, function(error) {
+               // console.log ("Could not get device info:", error);
+       });
+};
+
+/**
+ * Loads the default local Bluetooth adapter.
+ *
+ * @method loadDefaultAdapter
+ */
+Bluetooth.prototype.loadDefaultAdapter = function() {
+       "use strict";
+       var self = this;
+       if (typeof (tizen.bt) !== 'undefined' && typeof (tizen.bt.getDefaultAdapter) !== 'undefined') {
+               try {
+                       var adapter = tizen.bt.getDefaultAdapter();
+                       if (adapter === null) {
+                               console.log('Error: Bluetooth adapter not found');
+                       } else {
+                               self.adapter(adapter);
+                       }
+               } catch (err) {
+                       console.log(err);
+               }
+       } else {
+               console.log("Bluetooth API is not available.");
+       }
+};
+
+/**
+ * Sets the listener to receivce notifications about changes of Bluetooth adapter.
+ *
+ * @method registerDefaultAdapterChangeListener
+ */
+Bluetooth.prototype.registerDefaultAdapterChangeListener = function() {
+       "use strict";
+       var self = this;
+       if (!!self.adapter() && typeof (self.adapter().setChangeListener) !== 'undefined') {
+               try {
+                       self.adapter().setChangeListener({
+                               onstatechanged : function(powered) {
+                                       console.log("Power state is changed into: " + powered);
+                                       self.loadDefaultAdapter();
+                                       if (!powered) {
+                                               self.clearDevices();
+                                               self.scanning(false);
+                                               self.hideBluetoothLoadingSpinner();
+                                               hideLoadingSpinner("Scanning");
+                                               self.saveBluetooth();
+                                       }
+                               },
+                               onnamechanged : function(name) {
+                                       console.log("Name is changed to: " + name);
+                                       //self.loadDefaultAdapter();
+                               },
+                               onvisibilitychanged : function(visible) {
+                                       console.log("Visibility is changed into: " + visible);
+                                       //self.loadDefaultAdapter();
+                               }
+                       });
+               } catch (err) {
+                       console.log(err);
+               }
+       } else {
+               console.log("adapter.setChangeListener API not available.");
+       }
+};
+
+/**
+ * Shows list view of nearby and known remote Bluetooth devices and allows to trigger rediscovering, open detail view, pair on unpair selected Bluetooth device, turn on or off Bluetooth adapter.
+ *
+ * @method show
+ */
+Bluetooth.prototype.show = function(successCallback) {
+       "use strict";
+       var self = this;
+       console.log("Bluetooth show called");
+       self.isVisible(true);
+       var subpanelModel = {
+               textTitle : "SETTINGS",
+               textSubtitle : "BLUETOOTH",
+               actionName : "BACK",
+               action : function() {
+                       self.isVisible(false);
+                       Settings.renderSettingsView();
+               }
+       };
+
+       var loadBluetoothDevicesUI = function() {
+               if (!$("#bluetoothDevicesList").length) {
+                       var bluetoothDevicesList = '<div id="bluetoothDevicesList" data-bind="template: { name: \'';
+                       bluetoothDevicesList += templateName;
+                       bluetoothDevicesList += '\', foreach: Settings.Bluetooth.devices }"></div>';
+                       $(bluetoothDevicesList).prependTo($('.' + bluetoothContent));
+
+                       var button = "";
+                       button += '<div class="buttonsArea">';
+                       button += '<div id="bluetoothRefreshButton" class="toggleButton bluetoothRefreshButton" data-bind="click: Settings.Bluetooth.toogleScanDevices, style: { display: Settings.Bluetooth.adapter().powered ? \'block\' : \'none\' }">';
+                       button += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                       button += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: Settings.Bluetooth.scanning() ? \'STOP\' : \'SCAN\'"></div>';
+                       button += '</div>';
+                       button += '</div>';
+                       $(button).appendTo($('.' + bluetoothContent));
+
+                       button = '<div id="wifiPowerButton" class="toggleButton subPanelToggleButton subPanelToggleButtonWide" data-bind="with: Settings.Bluetooth.adapter, click: Settings.Bluetooth.togglePower">';
+                       button += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                       button += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: powered ? \'TURN OFF\' : \'TURN ON\'"></div>';
+                       button += '</div>';
+                       $(button).appendTo($('.tabsTopSubPanel'));
+                       ko.applyBindings(window.Settings);
+
+                       var diff = -1;
+                       if (!!self.lastSync()) {
+                               diff = new Date().getTime() - self.lastSync();
+                       }
+                       if (!self.scanning() && (diff === -1 || diff > 600000 || !self.devices().length)) {
+                               self.clearDevices();
+                               self.scan(true);
+                       }
+                       if (self.scanning()) {
+                               self.showBluetoothLoadingSpinner();
+                       }
+               }
+       };
+
+       var bluetoothContent = "bluetoothContent";
+       var templateName = "template-bluetooth";
+       Settings.domElement.tabs("clearContent");
+       Settings.domElement.tabs("changeContentClass", bluetoothContent);
+       Settings.domElement.tabs("subpanelContentTemplateCompile", subpanelModel, function() {
+               loadTemplate(Settings.SETTINGS_TEMPLATES_PATH, templateName, loadBluetoothDevicesUI);
+       });
+       if (!Settings.domElement.find(".bluetoothPINCode").length) {
+               var pinCode = "<div class='bluetoothPINCode fontSizeXXSmall fontWeightBold fontColorTheme'>Default bluetooth pincode / passkey: 123456</div>";
+               $(pinCode).appendTo(Settings.domElement);
+       }
+};
+
+/**
+ * Shows small loading spinner in header during active discovery session.
+ *
+ * @method showBluetoothLoadingSpinner
+ */
+Bluetooth.prototype.showBluetoothLoadingSpinner = function() {
+       "use strict";
+       if ($(".bluetoothContent").length) {
+               if (!$("#loadingSpinnerBluetooth").length) {
+                       var spinner = '';
+                       spinner += '<div id="loadingSpinnerBluetooth" class="loadingSpinnerBluetooth loading-container loading-container-small">';
+                       spinner += '<div class="loading loading-small"></div>';
+                       spinner += '</div>';
+                       $(spinner).appendTo($(".tabsTopSubPanel"));
+               }
+               $("#loadingSpinnerBluetooth").show();
+       }
+};
+
+/**
+ * Hides small loading spinner in header.
+ *
+ * @method hideBluetoothLoadingSpinner
+ */
+Bluetooth.prototype.hideBluetoothLoadingSpinner = function() {
+       "use strict";
+       if ($("#loadingSpinnerBluetooth").length) {
+               $("#loadingSpinnerBluetooth").hide();
+       }
+};
+
+/**
+ * Discovers nearby Bluetooth devices if any, that is, devices within proximity to the local device and gets all the known devices that have information stored in the local Bluetooth adapter.
+ *
+ * @method scan
+ * @param showSpinner? {Boolean} Indicates if full screen loading spinner should be visible during active discovery session.
+ */
+Bluetooth.prototype.scan = function(showSpinner) {
+       "use strict";
+       var self = this;
+       showSpinner = typeof (showSpinner) === 'undefined' ? true : showSpinner;
+       if (self.scanning()) {
+               self.showBluetoothLoadingSpinner();
+               if (showSpinner) {
+                       showLoadingSpinner("Scanning");
+               }
+               return;
+       }
+       //self.loadDefaultAdapter();
+       self.stopScan(function(err) {
+               if (!!self.adapter() && self.adapter().powered) {
+                       console.log("Bluetooth: discoverDevices called");
+                       if (showSpinner) {
+                               showLoadingSpinner("Scanning");
+                       }
+                       self.showBluetoothLoadingSpinner();
+                       self.scanning(true);
+                       self.lastSync(new Date().getTime());
+
+                       self.adapter().getKnownDevices(function(devices) {
+                               if (devices.length) {
+                                       for ( var i = 0; i < devices.length; ++i) {
+                                               console.log("Known device name: " + devices[i].name + ", Address: " + devices[i].address);
+                                               self.addUpdateDevice(devices[i]);
+                                       }
+                                       self.sortDevices();
+                                       self.saveBluetooth();
+                                       hideLoadingSpinner("Scanning");
+                               }
+                       }, function(error) {
+                               console.log("Could not get known devices: ", error);
+                       });
+
+                       var discoveryTimeout = null;
+                       var clearDiscoveryTimeout = function() {
+                               if (!!discoveryTimeout) {
+                                       clearTimeout(discoveryTimeout);
+                                       discoveryTimeout = null;
+                               }
+                       };
+                       var errorDiscoveryCallback = function(error) {
+                               console.log('An error occured while discovering bluetooth devices: ', error);
+                               self.stopScan(function() {
+                                       clearDiscoveryTimeout();
+                                       self.scanning(false);
+                                       hideLoadingSpinner("Scanning");
+                                       self.hideBluetoothLoadingSpinner();
+                               }, false);
+                       };
+
+                       // Workaround due to https://bugs.tizen.org/jira/browse/TIVI-2565
+                       discoveryTimeout = setTimeout(function() {
+                               errorDiscoveryCallback("Bluetooth adapter busy.");
+                       }, 30000);
+
+                       self.adapter().discoverDevices({
+                               onstarted : function() {
+                                       console.log("Device discovery started.");
+                               },
+                               ondevicefound : function(device) {
+                                       console.log("Found device - name: " + device.name + ", Address: " + device.address);
+                                       clearDiscoveryTimeout();
+                                       self.addUpdateDevice(device);
+                                       self.sortDevices();
+                                       self.saveBluetooth();
+                                       hideLoadingSpinner("Scanning");
+                               },
+                               ondevicedisappeared : function(address) {
+                                       console.log("Device disappeared: " + address);
+                                       clearDiscoveryTimeout();
+                                       self.removeDevice(address);
+                                       self.sortDevices();
+                                       self.saveBluetooth();
+                               },
+                               onfinished : function(devices) {
+                                       console.log("Device discovery finished.");
+                                       clearDiscoveryTimeout();
+                                       for ( var i = 0; i < devices.length; ++i) {
+                                               console.log("Name: " + devices[i].name + ", Address: " + devices[i].address);
+                                               self.addUpdateDevice(devices[i]);
+                                       }
+                                       self.sortDevices();
+                                       self.scanning(false);
+                                       hideLoadingSpinner("Scanning");
+                                       self.hideBluetoothLoadingSpinner();
+                               }
+                       }, function(err) {
+                               errorDiscoveryCallback(err);
+                       });
+               }
+       }, false);
+};
+
+/**
+ * Stops an active device discovery session.
+ *
+ * @method stopScan
+ * @param callback {Function(error)} Callback function to be invoked when stopping ends.
+ * @param showSpinner? {Boolean} Indicates if full screen spinner should be visible during stopping process.
+ */
+Bluetooth.prototype.stopScan = function(callback, showSpinner) {
+       "use strict";
+       var self = this;
+       //self.loadDefaultAdapter();
+       if (!!self.adapter() && self.adapter().powered) {
+               showSpinner = typeof (showSpinner) === 'undefined' ? false : showSpinner;
+               if (showSpinner) {
+                       showLoadingSpinner("Stopping");
+               }
+               self.adapter().stopDiscovery(function() {
+                       console.log("Stop discovery success.");
+                       self.scanning(false);
+                       hideLoadingSpinner("Stopping");
+                       self.hideBluetoothLoadingSpinner();
+                       if (!!callback) {
+                               callback();
+                       }
+               }, function(err) {
+                       console.log("An error occured while stopping bluetooth discovery.", err);
+                       hideLoadingSpinner("Stopping");
+                       if (!!callback) {
+                               callback(err);
+                       }
+               });
+       } else {
+               if (!!callback) {
+                       callback();
+               }
+       }
+};
+
+/**
+ * Adds or updates remote Bluetooth device in list of nearby and known remote Bluetooth devices.
+ *
+ * @method addUpdateDevice
+ * @param device {Object} Object representing Bluetooth device to be added or updated.
+ * @param addDevice? {Boolean} Indicates if device should be added if it is not yet in the list of available and known Bluetooth devices.
+ */
+Bluetooth.prototype.addUpdateDevice = function(device, addDevice) {
+       "use strict";
+       var self = this;
+       // console.log("Device to be added/updated");
+       // console.log(device);
+
+       if (!!device && !!self.devices()) {
+               var deviceExists = false;
+               for ( var i = 0; i < self.devices().length; ++i) {
+                       var dev = self.devices()[i];
+                       if (dev.address === device.address) {
+                               self.devices()[i] = device;
+                               deviceExists = true;
+                               break;
+                       }
+               }
+               addDevice = typeof (addDevice) === 'undefined' ? true : addDevice;
+               if (!deviceExists && addDevice) {
+                       self.devices.push(device);
+               }
+       }
+};
+
+/**
+ * Removes remote Bluetooth device from list of nearby and known remote Bluetooth devices.
+ *
+ * @method removeDevice
+ * @param deviceAddress {String} Bluetooth device hardware address to be removed.
+ */
+Bluetooth.prototype.removeDevice = function(deviceAddress) {
+       "use strict";
+       var self = this;
+       if (!!deviceAddress && deviceAddress !== "" && !!self.devices() && self.devices().length) {
+               self.devices.remove(function(device) {
+                       return device.address === deviceAddress;
+               });
+       }
+};
+
+/**
+ * Clears list of nearby and known remote Bluetooth devices.
+ *
+ * @method clearDevices
+ */
+Bluetooth.prototype.clearDevices = function() {
+       "use strict";
+       this.devices.removeAll();
+       this.devices([]);
+};
+
+/**
+ * Sorts nearby and known remote Bluetooth devices by attribute representing the bond state of remote device with the local device (paired firts).
+ *
+ * @method sortDevices
+ */
+Bluetooth.prototype.sortDevices = function() {
+       "use strict";
+       var self = this;
+       if (!!self.devices() && self.devices().length) {
+               self.devices.sort(function(left, right) {
+                       return left.isBonded === right.isBonded ? 0 : left.isBonded ? -1 : 1;
+               });
+       }
+};
+
+/**
+ * Saves Bluetooth adapter power state and nearby and known remote Bluetooth devices to local offline storage in order to keep same list of devices accross all the applications.
+ *
+ * @method saveBluetooth
+ */
+Bluetooth.prototype.saveBluetooth = function() {
+       "use strict";
+       var devs = ko.toJS(this.devices().slice(0));
+
+       // clean bluetooth device objects from properties that do not need to be saved
+       for ( var i = 0; i < devs.length; ++i) {
+               delete devs[i].connectToServiceByUUID;
+               delete devs[i].uuids;
+               var deviceClass = devs[i].deviceClass;
+               delete devs[i].deviceClass;
+               devs[i].deviceClass = {};
+               if (!!deviceClass) {
+                       devs[i].deviceClass.major = deviceClass.major;
+                       devs[i].deviceClass.minor = deviceClass.minor;
+               }
+       }
+       var newBluetoothConf = {
+               devices : devs,
+               lastSync : this.lastSync()
+       };
+       var savedBluetoothConf = Configuration.get("bluetooth");
+       var savedBluetoothConfStr = JSON.stringify(savedBluetoothConf);
+       //console.log(savedBluetoothConfStr);
+       var newBluetoothConfStr = JSON.stringify(newBluetoothConf);
+       //console.log(newBluetoothConfStr);
+       //console.log("SAME: ", savedBluetoothConfStr == newBluetoothConfStr ? "YES" : "NO");
+       if (!savedBluetoothConf || newBluetoothConfStr !== savedBluetoothConfStr) {
+               Configuration.set("bluetooth", newBluetoothConf, false);
+       }
+};
+
+/**
+ * Loads Bluetooth device hardware address of phone marked as selected for incoming calls.
+ *
+ * @method loadSelectedRemoteDevice
+ */
+Bluetooth.prototype.loadSelectedRemoteDevice = function() {
+       "use strict";
+       var self = this;
+       if (typeof (tizen.phone) !== 'undefined' && typeof (tizen.phone.getSelectedRemoteDevice) !== 'undefined') {
+               try {
+                       tizen.phone.getSelectedRemoteDevice(function(selectedRemoteDev) {
+                               console.log("selected remote device: ", selectedRemoteDev);
+                               if (!!selectedRemoteDev && selectedRemoteDev !== "") {
+                                       self.selectedPhone(selectedRemoteDev);
+                               } else {
+                                       self.selectedPhone(null);
+                               }
+                       });
+               } catch (err) {
+                       console.log("An error occured while loading selected remote device ", err);
+                       self.selectedPhone(null);
+               }
+       }
+};
+
+/**
+ * Marks a given remote Bluetooth device as selected for incoming calls.
+ *
+ * @method selectRemoteDevice
+ * @param device {Object} Object representing remote Bluetooth device to be selected.
+ */
+Bluetooth.prototype.selectRemoteDevice = function(device) {
+       "use strict";
+       var self = this;
+       console.log("selectRemoteDevice called", device);
+       if (!!device && !!device.address && !!device.deviceClass && device.deviceClass.major === tizen.bt.deviceMajor.PHONE && typeof (tizen.phone) !== 'undefined' && typeof (tizen.phone.selectRemoteDevice) !== 'undefined') {
+               showLoadingSpinner("Selecting");
+               try {
+                       tizen.phone.selectRemoteDevice(device.address);
+               } catch (err) {
+                       console.log("An error occured while selecting remote device ", err);
+               }
+       } else {
+               console.log("tizen.phone.selectRemoteDevice API not available or supplied device is not valid.");
+       }
+};
+
+/**
+ * Unmarks previously selected remote Bluetooth device for incoming calls.
+ *
+ * @method unselectRemoteDevice
+ */
+Bluetooth.prototype.unselectRemoteDevice = function() {
+       "use strict";
+       var self = this;
+       console.log("unselectRemoteDevice called");
+       if (typeof (tizen.phone) !== 'undefined' && typeof (tizen.phone.unselectRemoteDevice) !== 'undefined') {
+               try {
+                       tizen.phone.unselectRemoteDevice();
+               } catch (err) {
+                       console.log("An error occured while unselecting remote device ", err);
+               }
+       } else {
+               console.log("tizen.phone.unselectRemoteDevice API not available.");
+       }
+};
+
+/**
+ * Sets the listener to receivce notifications when new remote Bluetooth device was marked as selected for incoming calls.
+ * @method registerSelectedRemoteDeviceChangeListener
+ */
+Bluetooth.prototype.registerSelectedRemoteDeviceChangeListener = function() {
+       "use strict";
+       var self = this;
+
+       if (typeof (tizen.phone) !== 'undefined' && typeof (tizen.phone.addRemoteDeviceSelectedListener) !== 'undefined') {
+               try {
+                       tizen.phone.addRemoteDeviceSelectedListener(function(result) {
+                               console.log("addRemoteDeviceSelectedListener: ", result);
+                               if (!!result && !!result.error) {
+                                       console.log("An error occured while selecting remote device: ", result.error);
+                                       self.selectedPhone(null);
+                               } else if (!!result && !!result.value && result.value.toString().trim() !== "") {
+                                       self.selectedPhone(result.value.toString().trim());
+                               } else {
+                                       self.selectedPhone(null);
+                               }
+                               self._restartRefreshDevicesInterval();
+                               hideLoadingSpinner("Selecting");
+                       });
+               } catch (err) {
+                       console.log("An error occured while registering remote device selected listener ", err);
+               }
+       } else {
+               console.log("tizen.phone.addRemoteDeviceSelectedListener API not available.");
+       }
+};
+
+/**
+ * Reloads list of nearby and knwon remote Bluetooth devices and default local Bluetooth adapter.
+ *
+ * @method refreshDevices
+ */
+Bluetooth.prototype.refreshDevices = function() {
+       "use strict";
+       var self = this;
+       console.log("refreshDevices called");
+       var devices = self.devices().slice(0);
+       self.clearDevices();
+       //self.loadDefaultAdapter();
+       if (!!self.adapter() && self.adapter().powered) {
+               self.devices(devices);
+       }
+
+       function updateDeviceInfo() {
+               for ( var i = 0; i < self.devices().length; ++i) {
+                       var dev = self.devices()[i];
+                       if (!!self.selectedDevice() && self.selectedDevice().address === dev.address) {
+                               self.selectedDevice(dev);
+                       }
+                       if (dev.toString().indexOf("BluetoothDevice") === -1) {
+                               self.getDevice(dev);
+                       }
+               }
+               self.sortDevices();
+               self.saveBluetooth();
+       }
+
+       if (self.devices().length) {
+               self.adapter().getKnownDevices(function(devs) {
+                       if (devs.length) {
+                               for ( var i = 0; i < devs.length; ++i) {
+                                       self.addUpdateDevice(devs[i], false);
+                               }
+                       }
+                       updateDeviceInfo();
+               }, function(error) {
+                       console.log("Could not get known devices: ", error);
+                       updateDeviceInfo();
+               });
+       } else {
+               updateDeviceInfo();
+       }
+};
+
+Bluetooth.prototype._restartRefreshDevicesInterval = function() {
+       "use strict";
+       var self = this;
+       self._clearRefreshDevicesInterval();
+       self.refreshDevices();
+       self._setRefreshDevicesInterval();
+};
diff --git a/css/car/components/settings/js/settings.js b/css/car/components/settings/js/settings.js
new file mode 100644 (file)
index 0000000..9d1b420
--- /dev/null
@@ -0,0 +1,314 @@
+/* global loadScript, Themes, Wifi, Bluetooth, ko, loadTemplate, $ */
+
+/**
+ * Settings class provides list view of available Settings options.
+ *
+ * This class requires following components:
+ *
+ * * {{#crossLink "BoxCaption"}}{{/crossLink}} component
+ * * {{#crossLink "Tabs"}}{{/crossLink}} component
+ * * {{#crossLink "Themes"}}{{/crossLink}} component
+ * * {{#crossLink "Wifi"}}{{/crossLink}} component
+ * * {{#crossLink "Bluetooth"}}{{/crossLink}} component
+ *
+ * @class Settings
+ * @module Settings
+ * @constructor
+ */
+var Settings = (function() {
+       "use strict";
+       /**
+        * @class Settings
+        * @constructor
+        */
+       function Settings() {
+               console.info("Starting up service Settings");
+
+               var self = this;
+
+               /**
+                * Shows a given Settings option.
+                *
+                * @method openSetting
+                * @param setting {Object} Object representing Setting option to be showed.
+                */
+               this.openSetting = function(setting) {
+                       self.selectedSetting = null;
+                       if (!!setting && !self.locked) {
+                               self.locked = true;
+                               self.selectedSetting = setting;
+                               switch (setting.id) {
+                               case "theme":
+                                       loadScript(self.SETTINGS_JS_PATH + "themes.js", function(path, status) {
+                                               if (status === "ok") {
+                                                       if (!self.Theme) {
+                                                               self.Theme = new Themes();
+                                                       }
+                                                       self.Theme.show();
+                                               }
+                                               self.locked = false;
+                                       });
+                                       break;
+                               case "wifinetworks":
+                                       loadScript(self.SETTINGS_JS_PATH + "wifi.js", function(path, status) {
+                                               if (status === "ok") {
+                                                       if (!self.Wifi) {
+                                                               self.Wifi = new Wifi();
+                                                               self.Wifi.init(function(err) {
+                                                                       if (!!err) {
+                                                                               alert(err);
+                                                                               self.Wifi = null;
+                                                                       } else {
+                                                                               self.Wifi.showNetworks();
+                                                                       }
+                                                                       self.locked = false;
+                                                               });
+                                                       } else {
+                                                               self.Wifi.showNetworks();
+                                                               self.locked = false;
+                                                       }
+                                               } else {
+                                                       self.locked = false;
+                                               }
+                                       });
+                                       break;
+                               case "wifitethering":
+                                       loadScript(self.SETTINGS_JS_PATH + "wifi.js", function(path, status) {
+                                               if (status === "ok") {
+                                                       if (!self.Wifi) {
+                                                               self.Wifi = new Wifi();
+                                                               self.Wifi.init(function(err) {
+                                                                       if (!!err) {
+                                                                               alert(err);
+                                                                               self.Wifi = null;
+                                                                       } else {
+                                                                               self.Wifi.showWifiTethering();
+                                                                       }
+                                                                       self.locked = false;
+                                                               });
+                                                       } else {
+                                                               self.Wifi.showWifiTethering();
+                                                               self.locked = false;
+                                                       }
+                                               } else {
+                                                       self.locked = false;
+                                               }
+                                       });
+                                       break;
+                               case "bluetooth":
+                                       loadScript(self.SETTINGS_JS_PATH + "bluetooth.js", function(path, status) {
+                                               if (status === "ok") {
+                                                       if (!self.Bluetooth) {
+                                                               self.Bluetooth = new Bluetooth();
+                                                       }
+                                                       self.Bluetooth.show();
+                                               }
+                                               self.locked = false;
+                                       });
+                                       break;
+                               default:
+                                       self.locked = false;
+                                       break;
+                               }
+                       }
+               };
+       }
+
+       /**
+        * Defines base path to Settings resources.
+        *
+        * @property SETTINGS_BASEPATH
+        * @public
+        * @type String
+        * @default ./css/car/components/settings/
+        */
+       Settings.prototype.SETTINGS_BASEPATH = "./css/car/components/settings/";
+       /**
+        * Defines path to Settings templates.
+        *
+        * @property SETTINGS_TEMPLATES_PATH
+        * @public
+        * @type String
+        * @default ./css/car/components/settings/templates/
+        */
+       Settings.prototype.SETTINGS_TEMPLATES_PATH = "./css/car/components/settings/templates/";
+       /**
+        * Defines path to Settings javascript files.
+        *
+        * @property SETTINGS_JS_PATH
+        * @public
+        * @type String
+        * @default ./css/car/components/settings/js/
+        */
+       Settings.prototype.SETTINGS_JS_PATH = "./css/car/components/settings/js/";
+       /**
+        * Holds the git revision number.
+        *
+        * @property SETTINGS_REVISION
+        * @public
+        * @type String
+        */
+       Settings.prototype.SETTINGS_REVISION = "@revision@";
+       /**
+        * Instance of Theme class.
+        *
+        * @property Theme
+        * @public
+        * @type Themes
+        */
+       Settings.prototype.Theme = null;
+       /**
+        * Instance of Wifi class.
+        *
+        * @property Wifi
+        * @public
+        * @type Wifi
+        */
+       Settings.prototype.Wifi = null;
+       /**
+        * Instance of Bluetooth class.
+        *
+        * @property Bluetooth
+        * @public
+        * @type Bluetooth
+        */
+       Settings.prototype.Bluetooth = null;
+       /**
+        * jQuery representation of Settings Tabs component.
+        *
+        * @property domElement
+        * @public
+        * @type Any
+        */
+       Settings.prototype.domElement = null;
+       /**
+        * Prevents opening of clicked Settings option more times.
+        *
+        * @property locked
+        * @public
+        * @type Boolean
+        * @default false
+        */
+       Settings.prototype.locked = false;
+
+       /**
+        * Contains array of Settings options.
+        *
+        * @property settingsModel
+        * @type {Array}
+        */
+       Settings.prototype.settingsModel = ko.observableArray([ {
+               id : "theme",
+               name : "Theme"
+       }, {
+               id : "wifinetworks",
+               name : "Wifi networks"
+       }, {
+               id : "wifitethering",
+               name : "Wifi tethering"
+       }, {
+               id : "bluetooth",
+               name : "Bluetooth"
+       } ]);
+       /**
+        * Represents opened Settings option.
+        *
+        * @property selectedSetting
+        * @public
+        * @type Any
+        * @default null
+        */
+       Settings.prototype.selectedSetting = null;
+
+       /**
+        * Loads all the javascript and style files, initializes UI components that Settings list view depends on.
+        *
+        * @method init
+        */
+       Settings.prototype.init = function() {
+               var self = this;
+               loadScript('./css/car/components/boxCaption/boxCaption.js', function(path, status) {
+                       if (status === "ok") {
+                               loadScript('./css/car/components/tabs/tabs.js', function(path, status) {
+                                       if (status === "ok") {
+                                               $("head").append($("<link rel='stylesheet' href='./css/car/components/boxCaption/boxCaption.css' />"));
+                                               $("head").append($("<link rel='stylesheet' href='./css/car/components/tabs/tabs.css' />"));
+                                               $("head").append($("<link rel='stylesheet' href='" + self.SETTINGS_BASEPATH + "/css/settings.css' />"));
+
+                                               if (!$("#settingsTabs").length) {
+                                                       var settings = '<div id="settingsTabs" class="tabs pageBgColorNormalTransparent"></div>';
+                                                       $(settings).appendTo("body");
+                                                       self.domElement = $("#settingsTabs");
+                                               }
+
+                                               self.domElement.bind('eventClick_menuItemBtn', function() {
+                                                       self.renderSettingsView();
+                                               });
+
+                                               self.domElement.tabs("setSectionTitle", "APPS");
+                                               var version = typeof tizen === 'undefined' ? "" : tizen.application.getCurrentApplication().appInfo.version;
+                                               self.domElement.tabs("setSectionHint", "v. " + version + " rev. " + self.SETTINGS_REVISION);
+                                               self.domElement.tabs("init");
+
+                                               var tabMenuModel = {
+                                                       Tabs : [ {
+                                                               text : "SETTINGS",
+                                                               selected : true
+                                                       } ]
+                                               };
+
+                                               self.domElement.tabs("tabMenuTemplateCompile", tabMenuModel, function() {
+                                                       self.renderSettingsView(function() {
+                                                               self.show();
+                                                       });
+                                               });
+                                       }
+                               });
+                       }
+               });
+       };
+
+       /**
+        * Fades in the Settings.
+        *
+        * @method show
+        */
+       Settings.prototype.show = function() {
+               var self = this;
+               self.domElement.tabs("showPage");
+       };
+
+       /**
+        * Shows list view of available Settings options.
+        *
+        * @method renderSettingsView
+        * @param successCallback {Function()} Callback function to be invoked when the rendering ends.
+        */
+       Settings.prototype.renderSettingsView = function(successCallback) {
+               var self = this;
+               var settingsContent = "settingsContent";
+               var templateName = "template-settings";
+               self.domElement.tabs('closeSubpanel');
+               self.domElement.tabs("clearContent");
+               self.domElement.tabs("changeContentClass", settingsContent);
+               loadTemplate(self.SETTINGS_TEMPLATES_PATH, templateName, function() {
+                       if (!$("#settingsList").length) {
+                               var settingsList = '<div id="settingsList" data-bind="template: { name: \'';
+                               settingsList += templateName;
+                               settingsList += '\', foreach: Settings.settingsModel }"></div>';
+                               $(settingsList).appendTo($('.' + settingsContent));
+                               ko.applyBindings(window.Settings);
+                       }
+                       if (!!successCallback) {
+                               successCallback();
+                       }
+               });
+               if (self.domElement.find(".bluetoothPINCode").length) {
+                       self.domElement.find(".bluetoothPINCode").remove();
+               }
+       };
+
+       window.__settings = undefined === window.__settings ? new Settings() : window.__settings;
+
+       return window.__settings;
+})();
diff --git a/css/car/components/settings/js/themes.js b/css/car/components/settings/js/themes.js
new file mode 100644 (file)
index 0000000..ca422ef
--- /dev/null
@@ -0,0 +1,115 @@
+/* global ThemeEngine, Settings, ko, $, loadTemplate */
+
+/**
+ * @module Settings
+ */
+/**
+ * Themes class provides grid view of available themes, detection of theme changes and method of updating selected theme.
+ *
+ * This class requires following components:
+ *
+ * * {{#crossLink "Tabs"}}{{/crossLink}} component
+ * * {{#crossLink "ThemeEngine"}}{{/crossLink}} component
+ * * {{#crossLink "Settings"}}{{/crossLink}} component
+ *
+ * @class Themes
+ * @constructor
+ */
+var Themes = function() {
+       "use strict";
+       /**
+        * Marks a given user theme as selected.
+        *
+        * @method setTheme
+        * @param theme {Object} Object representing theme's information.
+        */
+       this.setTheme = function(theme) {
+               if (typeof ThemeEngine !== 'undefined') {
+                       ThemeEngine.setUserTheme(theme.id);
+               }
+       };
+
+       this.init();
+};
+
+/**
+ * Contains array of available user themes.
+ *
+ * @property themes
+ * @public
+ * @type ko.observableArray
+ * @default []
+ */
+Themes.prototype.themes = ko.observableArray([]);
+
+/**
+ * Adds a listener to receive notifications about theme changes and updates the list of available user themes.
+ *
+ * @method init
+ */
+Themes.prototype.init = function() {
+       "use strict";
+       var self = this;
+       if (typeof ThemeEngine !== 'undefined') {
+               ThemeEngine.addStatusListener(function(themeId) {
+                       self.loadThemes();
+               });
+       } else {
+               console.error("ThemeEngine API is not available.");
+       }
+};
+
+/**
+ * Shows grid view of available user themes and allows to change theme.
+ *
+ * @method show
+ */
+Themes.prototype.show = function() {
+       "use strict";
+       var self = this;
+       var subpanelModel = {
+               textTitle : "SETTINGS",
+               textSubtitle : "THEMES",
+               actionName : "BACK",
+               action : function() {
+                       Settings.renderSettingsView();
+               }
+       };
+       var loadThemesUI = function() {
+               if (!$("#themeList").length) {
+                       var themeList = '<div id="themeList" data-bind="template: { name: \'';
+                       themeList += templateName;
+                       themeList += '\', foreach: Settings.Theme.themes }"></div>';
+                       $(themeList).appendTo($('.' + themesContent));
+                       ko.applyBindings(window.Settings);
+               }
+       };
+       var themesContent = "themesContent";
+       var templateName = "template-themes";
+       Settings.domElement.tabs("clearContent");
+       Settings.domElement.tabs("changeContentClass", themesContent);
+       Settings.domElement.tabs("subpanelContentTemplateCompile", subpanelModel, function() {
+               loadTemplate(Settings.SETTINGS_TEMPLATES_PATH, templateName, loadThemesUI);
+       });
+       self.loadThemes();
+};
+
+/**
+ * Loads available user themes from ThemeEngine service.
+ *
+ * @method loadThemes
+ */
+Themes.prototype.loadThemes = function(successCallback) {
+       "use strict";
+       console.log("updateThemes called");
+       var self = this;
+       if (typeof ThemeEngine !== 'undefined') {
+               ThemeEngine.getUserThemes(function(newThemes) {
+                       self.themes.removeAll();
+                       self.themes([]);
+                       for ( var i = 0; i < newThemes.length; ++i) {
+                               self.themes.push(newThemes[i]);
+                       }
+               });
+       }
+};
\ No newline at end of file
diff --git a/css/car/components/settings/js/websocket.js b/css/car/components/settings/js/websocket.js
new file mode 100644 (file)
index 0000000..33e06db
--- /dev/null
@@ -0,0 +1,562 @@
+/*
+ * Copyright (c) 2013, Intel Corporation.
+ *
+ * This program is licensed under the terms and conditions of the
+ * Apache License, version 2.0.  The full text of the Apache License is at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+
+/* Dummy backend for faking websocket daemon */
+var dummyBackend = false;
+
+var ERROR_SETTINGSD_DISCONNECTED = 'Settings daemon is not connected';
+
+var WS_REQUEST_TYPE = {
+       CONNMAN_MANAGER : "connman::manager",
+       CONNMAN_TECHNOLOGY : "connman::technology",
+       CONNMAN_SERVICE : "connman::service",
+       BLUETOOTH : "bluetooth",
+       DISPLAY : "display",
+       SOUND : "sound",
+       DATETIME : "clock",
+       LOCALE : "locale"
+};
+
+var WS_EVENT_TYPE = {
+       CONNMAN : "connman",
+       BLUETOOTH : "bluetooth",
+       DISPLAY : "display",
+       SOUND : "sound",
+       DATETIME : "clock",
+       LOCALE : "locale"
+};
+
+/* web socket module to connect to the settings daemon */
+var wsAPI = (function() {
+       /* number of connection retries to attempt if the socket closes */
+       var self = this;
+       this.connected = false;
+       this.event_callbacks = $.Callbacks();
+
+       /* default values for WebSocket */
+       this.socketUrl = 'ws://localhost:16000/';
+       this.socketProtocol = 'http-only';
+
+       this.timeouttime = 15000;
+       this.methodIdx = 0;
+       this.methodCalls = [];
+       for ( var i = 0; i < 100; i++) {
+               this.methodCalls[i] = null;
+       }
+
+       this.MethodCall = function(id, name, success_cb, error_cb) {
+               var me = this;
+               this.successCB = success_cb;
+               this.errorCB = error_cb;
+               this.transactionid = id;
+               this.name = name;
+               this.done = false;
+               this.start = function() {
+                       me.timeout = setTimeout(function() {
+                               if (me.errorCB !== undefined) {
+                                       me.errorCB('\"' + me.name + '\" method timed out after ' + self.timeouttime + ' ms');
+                               }
+                               me.finish();
+                       }, self.timeouttime);
+               }
+               this.finish = function() {
+                       if (me.timeout !== undefined) {
+                               clearTimeout(me.timeout);
+                       }
+                       me.done = true;
+               }
+       }
+
+       this.EventObject = function(type, id, name, value) {
+               var me = this;
+               this.type = type;
+               this.id = id;
+               this.name = name;
+               this.value = value;
+       }
+
+       function connect(url, protocol, sucess_cb, error_cb) {
+               self.socketUrl = typeof url !== 'undefined' ? url : self.socketUrl;
+               self.socketProtocol = typeof protocol !== 'undefined' ? protocol : self.socketProtocol;
+               self.successCB = sucess_cb;
+               self.errorCB = error_cb;
+
+               if ('WebSocket' in window) {
+                       if (self.socketProtocol.length > 0) {
+                               self.socket = new WebSocket(self.socketUrl, self.socketProtocol);
+                       } else {
+                               self.socket = new WebSocket(self);
+                       }
+                       console.log('Connecting to websocket: ' + self.socketUrl);
+
+                       self.socket.onopen = function() {
+                               self.connected = true;
+                               console.log('websocket opened');
+                               self.successCB();
+                       };
+
+                       self.socket.onclose = function(code, reason, remote) {
+                               self.connected = false;
+                               console.log('websocket closed - ' + reason);
+
+                               if (dummyBackend) {
+                                       /* fake the connection for dummy backend */
+                                       self.connected = true;
+                                       self.successCB();
+                                       return;
+                               }
+
+                               self.errorCB(reason);
+                       };
+
+                       self.socket.onerror = function(e) {
+                               if (dummyBackend) {
+                                       /* ignore websocket error */
+                                       return;
+                               }
+
+                               if (e.data) {
+                                       self.errorCB('websocket error: ' + e.data);
+                               } else {
+                                       self.errorCB('websocket error: unknown');
+                               }
+                       };
+
+                       self.socket.onmessage = function(e) {
+                               receive(e.data);
+                       };
+               } else {
+                       console.log('Websockets not supported');
+               }
+       }
+
+       function reconnect() {
+               if (this.connected)
+                       return;
+
+               setTimeout(function() {
+                       connect(self.socketUrl, self.socketProtocol, self.successCB, self.errorCB);
+               }, 1000);
+       }
+
+       function send(msg, success_cb, error_cb) {
+               if (!this.connected) {
+                       if (error_cb !== undefined) {
+                               error_cb(ERROR_SETTINGSD_DISCONNECTED);
+                       }
+                       return;
+               }
+               var i = this.methodIdx;
+               this.methodIdx = (this.methodIdx + 1) % 100;
+               this.methodCalls[i] = new this.MethodCall(msg.transactionid, msg.name, success_cb, error_cb);
+               this.methodCalls[i].start();
+
+               var jsonMsg = JSON.stringify(msg);
+               console.log('Sending json msg: ' + jsonMsg);
+               if (dummyBackend) {
+                       /* fake with dummy data */
+                       dummyBackendSend(msg);
+               } else {
+                       this.socket.send(jsonMsg);
+               }
+       }
+
+       function fireEvent(type, id, name, value) {
+               var event = new this.EventObject(type, id, name, value);
+               console.log('Firing ' + type + ' event id=' + id + ', name=' + name + ', value=' + value);
+               event_callbacks.fire(event);
+       }
+
+       function receive(msg) {
+               var self = this;
+               var response;
+               try {
+                       console.log("Received json msg: " + msg);
+                       response = JSON.parse(msg);
+               } catch (e) {
+                       console.error('Garbage message: ' + msg);
+                       return;
+               }
+
+               if ((response === undefined) || (response.type === undefined)) {
+                       console.error('Badly formed message: ' + msg);
+               } else if (response.type === 'event' && response.value !== undefined) {
+                       if (response.value.interface_name === 'net.connman.Manager' || response.value.interface_name === 'net.connman.Service'
+                                       || response.value.interface_name === 'net.connman.Technology') {
+                               if (response.value.signal_name === undefined || response.value.parameters === undefined) {
+                                       console.error('Badly formed event: ' + msg);
+                                       return;
+                               }
+                               if (response.value.signal_name === 'ServiceChanged' && response.value.parameters.length !== 2) {
+                                       console.error('Badly formed event parameters: ' + msg);
+                                       return;
+                               }
+
+                               if (response.value.object_path === '/' || response.value.object_path.indexOf('/net/connman/technology/') >= 0) {
+                                       fireEvent(WS_EVENT_TYPE.CONNMAN, response.value.object_path, response.value.signal_name, response.value.parameters);
+                               } else {
+                                       console.error('Unrecognized event object_path, skipping');
+                               }
+                       } else {
+                               console.error('Unrecognized event, skipping');
+                       }
+               } else if (response.transactionid === undefined) {
+                       console.error('Badly formed response: ' + msg);
+               } else {
+                       var calls = this.methodCalls;
+                       for ( var i = 0; i < calls.length; i++) {
+                               var call = calls[i];
+                               if (call && (!call.done) && (call.transactionid === response.transactionid)) {
+                                       call.finish();
+                                       if (response.result !== 'succeeded' && response.reason !== undefined && call.errorCB !== undefined) {
+                                               call.errorCB(response.reason);
+                                       } else if (call.successCB !== undefined) {
+                                               if (response.value !== undefined) {
+                                                       call.successCB(response.value);
+                                               } else {
+                                                       call.successCB();
+                                               }
+                                       }
+                                       return;
+                               }
+                       }
+               }
+       }
+
+       function generateTransactionId() {
+               var i, val = [];
+               for (i = 0; i < 8; i++) {
+                       var num = Math.floor((Math.random() + 1) * 65536);
+                       val[i] = num.toString(16).substring(1);
+               }
+               var uuid = val[0] + val[1] + '-' + val[2] + '-' + val[3] + '-' + val[4] + '-' + val[5] + val[6] + val[7];
+               return uuid;
+       }
+
+       function sendRequest(request_type, request_name, request_args, success_cb, error_cb) {
+               var msg = {
+                       'type' : request_type,
+                       'transactionid' : generateTransactionId(),
+                       'name' : request_name,
+                       'value' : request_args
+               };
+
+               send(msg, success_cb, error_cb);
+       }
+
+       function subscribeEvents(callback) {
+               event_callbacks.add(callback);
+       }
+
+       function unsubscribeEvents(callback) {
+               event_callbacks.remove(callback);
+       }
+
+       /* this is dummy data for testing purposes */
+       function dummyBackendSend(msg) {
+               if (dummyBackend) {
+                       console.log('Sending to dummy server');
+
+                       var calls = this.methodCalls;
+                       var replyMsg = null;
+
+                       for ( var i = 0; i < calls.length; i++) {
+                               var call = calls[i];
+                               if (call && (!call.done) && (call.transactionid === msg.transactionid)) {
+                                       call.finish();
+                                       if (msg.error !== undefined) {
+                                               if (call.errorCB) {
+                                                       call.errorCB(msg.error);
+                                               }
+                                       }
+                                       if (msg.value !== undefined && call.successCB !== undefined) {
+                                               switch (msg.type) {
+                                               case WS_REQUEST_TYPE.CONNMAN_MANAGER:
+                                               case WS_REQUEST_TYPE.CONNMAN_TECHNOLOGY:
+                                                       if (msg.name === 'get_technologies') {
+                                                               var results = [ [ [ "/net/connman/technology/ethernet", {
+                                                                       "Name" : "Wired",
+                                                                       "Type" : "ethernet",
+                                                                       "Powered" : true,
+                                                                       "Connected" : true,
+                                                                       "Tethering" : false
+                                                               } ], [ "/net/connman/technology/wifi", {
+                                                                       "Name" : "WiFi",
+                                                                       "Type" : "wifi",
+                                                                       "Powered" : false,
+                                                                       "Connected" : false,
+                                                                       "Tethering" : false
+                                                               } ], [ "/net/connman/technology/bluetooth", {
+                                                                       "Name" : "Bluetooth",
+                                                                       "Type" : "bluetooth",
+                                                                       "Powered" : false,
+                                                                       "Connected" : false,
+                                                                       "Tethering" : false
+                                                               } ] ] ];
+
+                                                               replyMsg = JSON.stringify(results);
+                                                               call.successCB(results);
+                                                               return;
+                                                       } else if (msg.name === 'enable' && msg.value[1] === true) {
+                                                               call.successCB();
+                                                               fireEvent(WS_EVENT_TYPE.CONNMAN, msg.value[0], 'PropertyChanged', [ "Powered", true ]);
+                                                               return;
+                                                       } else if (msg.name === 'enable' && msg.value[1] === false) {
+                                                               call.successCB();
+                                                               fireEvent(WS_EVENT_TYPE.CONNMAN, msg.value[0], 'PropertyChanged', [ "Powered", false ]);
+                                                               return;
+                                                       } else if (msg.name === 'get_services' || msg.name === 'scan') {
+                                                               var results = [ [ [ "/net/connman/service/ethernet_0010f32f5a70_cable", {
+                                                                       "Type" : "ethernet",
+                                                                       "Security" : [],
+                                                                       "State" : "ready",
+                                                                       "AutoConnect" : true,
+                                                                       "Domains" : [ "ftrdhcpuser.net" ],
+                                                                       "Domains.Configuration" : [],
+                                                                       "Ethernet" : {
+                                                                               "Address" : "10:20:F3:2F:5E:23",
+                                                                               "Interface" : "eno1",
+                                                                               "MTU" : 1500,
+                                                                               "Method" : "auto"
+                                                                       },
+                                                                       "Favorite" : true,
+                                                                       "IPv4" : {
+                                                                               "Address" : "192.168.1.20",
+                                                                               "Gateway" : "192.168.1.1",
+                                                                               "Method" : "dhcp",
+                                                                               "Netmask" : "255.255.255.0"
+                                                                       },
+                                                                       "IPv4.Configuration" : {
+                                                                               "Method" : "dhcp"
+                                                                       },
+                                                                       "IPv6" : {},
+                                                                       "IPv6.Configuration" : {
+                                                                               "Method" : "auto",
+                                                                               "Privacy" : "disabled"
+                                                                       },
+                                                                       "Immutable" : false,
+                                                                       "Name" : "Wired",
+                                                                       "Nameservers" : [ "192.168.1.1", "184.11.12.13" ],
+                                                                       "Nameservers.Configuration" : [],
+                                                                       "Provider" : {},
+                                                                       "Proxy" : {
+                                                                               "Method" : "direct"
+                                                                       },
+                                                                       "Proxy.Configuration" : {},
+                                                                       "Timeservers" : [ "192.168.1.1", "pool.ntp.org" ],
+                                                                       "Timeservers.Configuration" : []
+                                                               } ], [ "/net/connman/service/wifi_c8f733acdf96_3558364737_managed_psk", {
+                                                                       "Type" : "wifi",
+                                                                       "Security" : [ "psk" ],
+                                                                       "State" : "ready",
+                                                                       "Strength" : 50,
+                                                                       "Favorite" : false,
+                                                                       "Immutable" : false,
+                                                                       "AutoConnect" : false,
+                                                                       "Name" : "Access Point 1",
+                                                                       "BSSID" : "11:5d:49:88:3d:20",
+                                                                       "MaxRate" : 54000000,
+                                                                       "Frequency" : 2417,
+                                                                       "EncryptionMode" : "none",
+                                                                       "Ethernet" : {
+                                                                               "Method" : "auto",
+                                                                               "Interface" : "wlp1s0",
+                                                                               "Address" : "B2:D3:55:66:44:22",
+                                                                               "MTU" : 1500
+                                                                       },
+                                                                       "IPv4" : {
+                                                                               "Address" : "192.168.1.20",
+                                                                               "Gateway" : "192.168.1.1",
+                                                                               "Method" : "dhcp",
+                                                                               "Netmask" : "255.255.255.0"
+                                                                       },
+                                                                       "IPv4.Configuration" : {
+                                                                               "Method" : "dhcp"
+                                                                       },
+                                                                       "IPv6" : {},
+                                                                       "IPv6.Configuration" : {
+                                                                               "Method" : "auto",
+                                                                               "Privacy" : "disabled"
+                                                                       },
+                                                                       "Nameservers" : [],
+                                                                       "Nameservers.Configuration" : [],
+                                                                       "Timeservers" : [],
+                                                                       "Timeservers.Configuration" : [],
+                                                                       "Domains" : [],
+                                                                       "Domains.Configuration" : [],
+                                                                       "Proxy" : {},
+                                                                       "Proxy.Configuration" : {},
+                                                                       "Provider" : {}
+                                                               } ], [ "/net/connman/service/wifi_c8f733acdf96_446f75636865626167_managed_psk", {
+                                                                       "Type" : "wifi",
+                                                                       "Security" : [ "psk" ],
+                                                                       "State" : "idle",
+                                                                       "Strength" : 50,
+                                                                       "Favorite" : false,
+                                                                       "Immutable" : false,
+                                                                       "AutoConnect" : false,
+                                                                       "Name" : "Access Point 2",
+                                                                       "BSSID" : "21:ef:30:b9:ad:86",
+                                                                       "MaxRate" : 54000000,
+                                                                       "Frequency" : 2417,
+                                                                       "EncryptionMode" : "aes",
+                                                                       "Ethernet" : {
+                                                                               "Method" : "auto",
+                                                                               "Interface" : "wlp1s0",
+                                                                               "Address" : "E8:F2:33:AC:DF:96",
+                                                                               "MTU" : 1500
+                                                                       },
+                                                                       "IPv4" : {},
+                                                                       "IPv4.Configuration" : {
+                                                                               "Method" : "dhcp"
+                                                                       },
+                                                                       "IPv6" : {},
+                                                                       "IPv6.Configuration" : {
+                                                                               "Method" : "auto",
+                                                                               "Privacy" : "disabled"
+                                                                       },
+                                                                       "Nameservers" : [],
+                                                                       "Nameservers.Configuration" : [],
+                                                                       "Timeservers" : [],
+                                                                       "Timeservers.Configuration" : [],
+                                                                       "Domains" : [],
+                                                                       "Domains.Configuration" : [],
+                                                                       "Proxy" : {},
+                                                                       "Proxy.Configuration" : {},
+                                                                       "Provider" : {}
+                                                               } ], [ "/net/connman/service/wifi_c8f733acdf96_536563757265446f75636865626167_managed_psk", {
+                                                                       "Type" : "wifi",
+                                                                       "Security" : [ "psk" ],
+                                                                       "State" : "idle",
+                                                                       "Strength" : 50,
+                                                                       "Favorite" : false,
+                                                                       "Immutable" : false,
+                                                                       "AutoConnect" : false,
+                                                                       "Name" : "Access Point 3",
+                                                                       "BSSID" : "25:ad:44:b7:e3:66",
+                                                                       "MaxRate" : 54000000,
+                                                                       "Frequency" : 2417,
+                                                                       "EncryptionMode" : "aes",
+                                                                       "Ethernet" : {
+                                                                               "Method" : "auto",
+                                                                               "Interface" : "wlp1s0",
+                                                                               "Address" : "A9:28:44:AD:FF:26",
+                                                                               "MTU" : 1500
+                                                                       },
+                                                                       "IPv4" : {},
+                                                                       "IPv4.Configuration" : {
+                                                                               "Method" : "dhcp"
+                                                                       },
+                                                                       "IPv6" : {},
+                                                                       "IPv6.Configuration" : {
+                                                                               "Method" : "auto",
+                                                                               "Privacy" : "disabled"
+                                                                       },
+                                                                       "Nameservers" : [],
+                                                                       "Nameservers.Configuration" : [],
+                                                                       "Timeservers" : [],
+                                                                       "Timeservers.Configuration" : [],
+                                                                       "Domains" : [],
+                                                                       "Domains.Configuration" : [],
+                                                                       "Proxy" : {},
+                                                                       "Proxy.Configuration" : {},
+                                                                       "Provider" : {}
+                                                               } ] ] ];
+
+                                                               replyMsg = JSON.stringify(results);
+                                                               /* simulate scan behavior */
+                                                               setTimeout(function() {
+                                                                       call.successCB(results);
+                                                               }, 2000);
+                                                               return;
+                                                       }
+                                               case WS_REQUEST_TYPE.CONNMAN_SERVICE:
+                                                       if (msg.name === 'connect') {
+                                                               if (msg.value[0] === '/net/connman/service/wifi_c8f733acdf96_3558364737_managed_psk'
+                                                                               && msg.value[1].Passphrase !== '123') {
+                                                                       call.errorCB('Invalid passphrase');
+                                                               } else if (msg.value[0] === '/net/connman/service/wifi_c8f733acdf96_446f75636865626167_managed_psk'
+                                                                               && msg.value[1].Passphrase !== '123') {
+                                                                       call.errorCB('Invalid passphrase');
+                                                               } else {
+                                                                       call.successCB();
+                                                                       setTimeout(function() {
+                                                                               fireEvent(WS_EVENT_TYPE.CONNMAN, msg.value[0], 'PropertyChanged', [ "Connected", true ]);
+                                                                       }, 2000);
+                                                               }
+                                                               return;
+                                                       } else if (msg.name === 'disconnect') {
+                                                               call.successCB();
+                                                               setTimeout(function() {
+                                                                       fireEvent(WS_EVENT_TYPE.CONNMAN, msg.value[0], 'PropertyChanged', [ "Connected", false ]);
+                                                               }, 2000);
+                                                               return;
+                                                       } else {
+                                                               if (call.errorCB) {
+                                                                       call.errorCB('Unsupported request: ' + msg.name + ', ' + msg.value);
+                                                               }
+                                                               return;
+                                                       }
+                                                       break;
+                                               case WS_REQUEST_TYPE.DATETIME:
+                                                       if (msg.name === 'is_time_updates_auto' && msg.value !== undefined) {
+                                                               /* default to manual */
+                                                               call.successCB(false);
+                                                               return;
+                                                       } else if (msg.name === 'is_timezone_updates_auto' && msg.value !== undefined) {
+                                                               /* default to manual */
+                                                               call.successCB(false);
+                                                               return;
+                                                       } else if (msg.name === 'time' && msg.value !== undefined) {
+                                                               call.successCB();
+                                                               return;
+                                                       } else if (msg.name === 'timezone' && msg.value !== undefined) {
+                                                               call.successCB();
+                                                               return;
+                                                       } else if (msg.name === 'time_updates' && msg.value !== undefined) {
+                                                               call.successCB();
+                                                               return;
+                                                       } else if (msg.name === 'timezone_updates' && msg.value !== undefined) {
+                                                               call.successCB();
+                                                               return;
+                                                       } else {
+                                                               if (call.errorCB) {
+                                                                       call.errorCB('Unsupported request: ' + msg.name + ', ' + msg.value);
+                                                               }
+                                                               return;
+                                                       }
+                                                       break;
+                                               case WS_REQUEST_TYPE.DISPLAY:
+                                               case WS_REQUEST_TYPE.SOUND:
+                                               case WS_REQUEST_TYPE.LOCALE:
+                                                       if (call.errorCB) {
+                                                               call.errorCB('Request not implemented');
+                                                       }
+                                                       return;
+                                               default:
+                                                       if (call.errorCB) {
+                                                               call.errorCB('Invalid request type: ' + msg.type);
+                                                       }
+                                                       return;
+                                               }
+                                       }
+                                       return;
+                               }
+                       }
+               }
+       }
+
+       return {
+               connect : connect,
+               reconnect : reconnect,
+               sendRequest : sendRequest,
+               subscribeEvents : subscribeEvents,
+               unsubscribeEvents : unsubscribeEvents
+       }
+})();
\ No newline at end of file
diff --git a/css/car/components/settings/js/wifi.js b/css/car/components/settings/js/wifi.js
new file mode 100644 (file)
index 0000000..57db0ad
--- /dev/null
@@ -0,0 +1,1774 @@
+/* global showLoadingSpinner, hideLoadingSpinner, Settings, settings, $, ko, loadScript, wsAPI, WS_EVENT_TYPE, loadTemplate */
+
+/**
+ * Wifi class provides list view of available WiFi networks, detailed information view with signal strength, security or IP address for WiFi network, functionality to connect and disconnect to open and protected WiFi networks, connect to
+ * hidden WiFi network by providing SSID and passphrase, mark and unmark Wifi network for auto-connect, enable and disable WiFi tethering with SSID and passphrase entry, turn on and off WiFi adapter.
+ *
+ * This class requires following components:
+ *
+ * * {{#crossLink "Tabs"}}{{/crossLink}} component
+ * * {{#crossLink "Settings"}}{{/crossLink}} component
+ *
+ * @class Wifi
+ * @module Settings
+ * @constructor
+ */
+var Wifi = function() {
+       "use strict";
+       var self = this;
+       /**
+        * Sets the state of a WiFi technology to on or off by sending a request to WiFi hardware to change the power state. After WiFi technology is enabled it starts scanning for available WiFi networks.
+        *
+        * @method togglePower
+        */
+       this.togglePower = function() {
+               console.log("Wifi: toggle power called.");
+               if (!!self.adapter() && !self.togglePowerLocked()) {
+                       self.rescanEnabled(false);
+                       self.togglePowerLocked(true);
+                       if (self.isPowered()) {
+                               showLoadingSpinner("Turning off");
+                               self.adapter().technology.setPowered(false, function() {
+                                       console.log('Successfully disable wifi subsystem');
+                                       self.togglePowerLocked(false);
+                                       self.setAdapterProperty("Powered", false);
+                                       hideLoadingSpinner("Turning off");
+                                       self.rescanEnabled(true);
+                               }, function(err) {
+                                       var error = "An error occured while turning wifi off.";
+                                       console.log(error, err);
+                                       self.togglePowerLocked(false);
+                                       hideLoadingSpinner("Turning off");
+                                       alert(error);
+                                       self.rescanEnabled(true);
+                               });
+                       } else {
+                               showLoadingSpinner("Turning on");
+                               self.adapter().technology.setPowered(true, function() {
+                                       console.log('Successfully enable WiFi subsystem');
+                                       self.togglePowerLocked(false);
+                                       self.setAdapterProperty("Powered", true);
+                                       hideLoadingSpinner("Turning on");
+                                       self.scanNetwork();
+                               }, function(err) {
+                                       var error = "An error occured while turning wifi on.";
+                                       console.log(error, err);
+                                       self.togglePowerLocked(false);
+                                       hideLoadingSpinner("Turning on");
+                                       alert(error);
+                                       self.rescanEnabled(true);
+                               });
+                       }
+               }
+       };
+
+       /**
+        * Connects or disconnects to/from supplied WiFi network. Shows popup to enter passphrase in case supplied network is protected.
+        *
+        * @method toggleConnection
+        * @param network {Object} Object representing WiFi network to be connected to or disconnected from.
+        */
+       this.toggleConnection = function(network) {
+               console.log("Wifi: toggle connection called.", network);
+               if (!!network) {
+                       if (!self.isConnected(network.prop) && self.getEncryptionStr(network.prop).toString().trim().toLowerCase() !== 'none') {
+                               self.showEnterWifiPasswordPopup(network);
+                       } else {
+                               self.connectDisconnectNetwork(network, undefined);
+                       }
+               } else {
+                       console.log("Supplied network is undefined.");
+               }
+       };
+
+       /**
+        * Shows more information about supplied WiFi network (like SSID, encryption, security, signal strength, state, IP address, gateway, netmask) in a new view that in addition allows to mark and unmark for auto-connect and provides
+        * connect/disconnect operations.
+        *
+        * @method openNetworkDetails
+        * @param network {Object} Object representing WiFi network to be showed in detailed information view.
+        */
+       this.openNetworkDetails = function(network) {
+               console.log("Wifi: open network details called.", network);
+               self.selectedNetwork(null);
+               if (!!network) {
+                       self.selectedNetwork(network);
+                       var subpanelModel = {
+                               textTitle : "NETWORK INFO",
+                               textSubtitle : self.getSsidStr(network.prop),
+                               actionName : "BACK",
+                               action : function() {
+                                       Settings.openSetting(Settings.selectedSetting);
+                               }
+                       };
+                       var wifiNetworkInfoContent = "wifiNetworkInfoContent";
+                       var createNetworkInfoElement = function(key, value) {
+                               var networkInfoElement = '<div class="wifiNetworkInfoElement fontSizeLarge fontWeightBold fontColorNormal">';
+                               networkInfoElement += '<span>';
+                               networkInfoElement += key;
+                               networkInfoElement += ": ";
+                               networkInfoElement += '</span>';
+                               networkInfoElement += '<span data-bind="text:' + value + '">';
+                               networkInfoElement += '</span>';
+                               networkInfoElement += '</div>';
+                               return networkInfoElement;
+                       };
+                       var loadNetworkInfoUI = function() {
+                               if (!$("#wifiNetworkInfoBox").length) {
+                                       var button = "";
+                                       button += '<div id="wifiAutoConnectButton" class="toggleButton subPanelToggleButton subPanelToggleButtonWide" data-bind="with: Settings.Wifi.selectedNetwork, click: Settings.Wifi.toggleSelectedNetworkAutoConnect">';
+                                       button += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                                       button += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: \'AUTO CONNECT\', css: { fontColorSelected: Settings.Wifi.isAutoConnect(prop) }"></div>';
+                                       button += '</div>';
+                                       $(button).appendTo($('.tabsTopSubPanel'));
+
+                                       var networkInfo = '<div id="wifiNetworkInfoBox" data-bind="with: Settings.Wifi.selectedNetwork">';
+                                       networkInfo += createNetworkInfoElement("SSID", "Settings.Wifi.getSsidStr(prop)");
+                                       networkInfo += createNetworkInfoElement("Encryption", "Settings.Wifi.getEncryptionStr(prop)");
+                                       networkInfo += createNetworkInfoElement("Security", "Settings.Wifi.getSecurityStr(prop)");
+                                       networkInfo += createNetworkInfoElement("Signal Strength", "Settings.Wifi.getSignalStrengthNum(prop)");
+                                       networkInfo += createNetworkInfoElement("Connected", "Settings.Wifi.isConnected(prop) ? 'Yes' : 'No'");
+                                       networkInfo += '<div data-bind="with: Settings.Wifi.isConnected(prop)">';
+                                       networkInfo += createNetworkInfoElement("Internet Access", "Settings.Wifi.isOnlineWifiNetwork($parent.id) ? 'Yes' : 'No'");
+                                       networkInfo += createNetworkInfoElement("IP Address", "Settings.Wifi.getIpAddressStr($parent.prop)");
+                                       networkInfo += createNetworkInfoElement("Method", "Settings.Wifi.getMethodStr($parent.prop)");
+                                       networkInfo += createNetworkInfoElement("Gateway", "Settings.Wifi.getGatewayAddressStr($parent.prop)");
+                                       networkInfo += createNetworkInfoElement("Netmask", "Settings.Wifi.getNetmaskAddressStr($parent.prop)");
+                                       networkInfo += '</div>';
+                                       networkInfo += '<div id="networkConnectButton" class="toggleButton networkConnectButton" data-bind="click: Settings.Wifi.toggleConnection">';
+                                       networkInfo += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                                       networkInfo += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: Settings.Wifi.isConnected(prop) ? \'DISCONNECT\' : \'CONNECT\'"></div>';
+                                       networkInfo += '</div>';
+                                       networkInfo += '</div>';
+                                       $(networkInfo).appendTo($('.' + wifiNetworkInfoContent));
+                                       ko.applyBindings(window.Settings);
+                               }
+                       };
+
+                       Settings.domElement.tabs("clearContent");
+                       Settings.domElement.tabs("changeContentClass", wifiNetworkInfoContent);
+                       Settings.domElement.tabs("subpanelContentTemplateCompile", subpanelModel, loadNetworkInfoUI);
+               }
+       };
+
+       /**
+        * Marks or unmarks WiFi network opened in detail view for auto-connect.
+        *
+        * @method toggleSelectedNetworkAutoConnect
+        */
+       this.toggleSelectedNetworkAutoConnect = function() {
+               console.log("Wifi: toggle auto connect called", self.selectedNetwork());
+               if (!!self.selectedNetwork() && !!self.selectedNetwork().service && !!self.selectedNetwork().prop()) {
+                       self.rescanEnabled(false);
+                       var autoConnect = !self.selectedNetwork().prop().AutoConnect;
+                       self.selectedNetwork().service.setAutoConnect(autoConnect, function() {
+                               console.log("AutoConnect set");
+                               self.setNetworkProperty(self.selectedNetwork(), "AutoConnect", autoConnect);
+                               self.scan(false);
+                               self.rescanEnabled(true);
+                       }, function(err) {
+                               console.log("AutoConnect set failed", err);
+                               self.scan(false);
+                               self.rescanEnabled(true);
+                       });
+               }
+       };
+
+       /**
+        * The scanNetwork function is intended to call WiFi.scan function with 1s delay.
+        *
+        * @method scanNetwork
+        */
+       this.scanNetwork = function() {
+               console.log("Wifi: scan network called.");
+               self.stopScan();
+               showLoadingSpinner("Scanning");
+               self.showWifiLoadingSpinner();
+               setTimeout(function() {
+                       self.scan(true);
+                       self.rescanEnabled(true);
+               }, 1000);
+       };
+
+       /**
+        * The showAddNetwork function is intended to call showAddNetworkPopup function.
+        *
+        * @method showAddNetwork
+        */
+       this.showAddNetwork = function() {
+               console.log("Wifi: connect to hidden network called.");
+               self.showAddNetworkPopup();
+       };
+
+       /**
+        * Returns SSID from supplied WiFi network properties.
+        *
+        * @method getSsidStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {String} WiFi network SSID.
+        */
+       this.getSsidStr = function(prop) {
+               var ssidStr = "UNKNOWN";
+               if (!!prop() && !!prop().Name && prop().Name !== "") {
+                       ssidStr = prop().Name.toString().trim().toUpperCase();
+               }
+               return ssidStr;
+       };
+
+       /**
+        * Returns signal strength in human readable form from supplied WiFi network properties.
+        *
+        * @method getSignalStrengthStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {String} WiFi network signal strength.
+        */
+       this.getSignalStrengthStr = function(prop) {
+               var signalStrengthStr = 'UNKNOWN';
+               if (!!prop() && !!prop().Strength) {
+                       var strength = prop().Strength;
+                       if (strength > 0 && strength <= 20) {
+                               strength = 'VERY POOR';
+                       } else if (strength > 20 && strength <= 40) {
+                               signalStrengthStr = 'POOR';
+                       } else if (strength > 40 && strength <= 70) {
+                               signalStrengthStr = 'AVERAGE';
+                       } else if (strength > 70 && strength <= 90) {
+                               signalStrengthStr = 'GOOD';
+                       } else if (strength > 90 && strength <= 100) {
+                               signalStrengthStr = 'EXCELLENT';
+                       }
+               }
+               return signalStrengthStr;
+       };
+
+       /**
+        * Returns signal strength number from supplied WiFi network properties.
+        *
+        * @method getSignalStrengthNum
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {Number} WiFi network signal strength.
+        */
+       this.getSignalStrengthNum = function(prop) {
+               var signalStrengthNum = 0;
+               if (!!prop() && !!prop().Strength) {
+                       signalStrengthNum = prop().Strength;
+               }
+               return signalStrengthNum;
+       };
+
+       /**
+        * Returns encryption mode from supplied WiFi network properties.
+        *
+        * @method getEncryptionStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {String} WiFi network encryption mode.
+        */
+       this.getEncryptionStr = function(prop) {
+               var encryptionStr = "UNKNOWN";
+               if (!!prop() && !!prop().EncryptionMode && prop().EncryptionMode.toString().trim() !== "") {
+                       encryptionStr = prop().EncryptionMode.toString().trim().toUpperCase();
+               }
+               return encryptionStr;
+       };
+
+       /**
+        * Returns security types separated by "," from supplied WiFi network properties.
+        *
+        * @method getSecurityStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {Number} WiFi network security types.
+        */
+       this.getSecurityStr = function(prop) {
+               var securityStr = "UNKNOWN";
+               if (!!prop() && !!prop().Security && prop().Security.length) {
+                       securityStr = prop().Security.join(", ").toString().trim().toUpperCase();
+               }
+               return securityStr;
+       };
+
+       /**
+        * Returns connection state from supplied WiFi network properties.
+        *
+        * @method isConnected
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {Boolean} True if WiFi network is connected otherwise false.
+        */
+       this.isConnected = function(prop) {
+               var connected = false;
+               if (!!prop() && !!prop().State && prop().State.toString().trim() !== "") {
+                       if (prop().State.toString().trim().toLowerCase() === "ready" || prop().State.toString().trim().toLowerCase() === "online") {
+                               connected = true;
+                       }
+               }
+               return connected;
+       };
+
+       /**
+        * Returns auto-connect state from supplied WiFi network properties.
+        *
+        * @method isAutoConnect
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {Boolean} True if WiFi network auto-connect is on otherwise false.
+        */
+       this.isAutoConnect = function(prop) {
+               var autoConnect = false;
+               if (!!prop() && !!prop().AutoConnect && prop().AutoConnect !== undefined) {
+                       autoConnect = prop().AutoConnect;
+               }
+               return autoConnect;
+       };
+
+       /**
+        * Returns IP address from supplied WiFi network properties.
+        *
+        * @method getIpAddressStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {String} WiFi network IP address.
+        */
+       this.getIpAddressStr = function(prop) {
+               var addressStr = "UNKNOWN";
+               if (!!prop() && !!prop().IPv4 && !!prop().IPv4.Address && prop().IPv4.Address.toString().trim() !== "") {
+                       addressStr = prop().IPv4.Address.toString().trim().toUpperCase();
+               }
+               return addressStr;
+       };
+
+       /**
+        * Returns method from supplied WiFi network properties.
+        *
+        * @method getMethodStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {String} WiFi network method.
+        */
+       this.getMethodStr = function(prop) {
+               var methodStr = "UNKNOWN";
+               if (!!prop() && !!prop().IPv4 && !!prop().IPv4.Method && prop().IPv4.Method.toString().trim() !== "") {
+                       methodStr = prop().IPv4.Method.toString().trim().toUpperCase();
+               }
+               return methodStr;
+       };
+
+       /**
+        * Returns gateway address from supplied WiFi network properties.
+        *
+        * @method getGatewayAddressStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {String} WiFi network gateway address.
+        */
+       this.getGatewayAddressStr = function(prop) {
+               var gatewayAddressStr = "UNKNOWN";
+               if (!!prop() && !!prop().IPv4 && !!prop().IPv4.Gateway && prop().IPv4.Gateway.toString().trim() !== "") {
+                       gatewayAddressStr = prop().IPv4.Gateway.toString().trim().toUpperCase();
+               }
+               return gatewayAddressStr;
+       };
+
+       /**
+        * Returns netmask address from supplied WiFi network properties.
+        *
+        * @method getNetmaskAddressStr
+        * @param prop {Object} Object representing WiFi network properties.
+        * @return {String} WiFi network netmask address.
+        */
+       this.getNetmaskAddressStr = function(prop) {
+               var netmaskAddressStr = "UNKNOWN";
+               if (!!prop() && !!prop().IPv4 && !!prop().IPv4.Netmask && prop().IPv4.Netmask.toString().trim() !== "") {
+                       netmaskAddressStr = prop().IPv4.Netmask.toString().trim().toUpperCase();
+               }
+               return netmaskAddressStr;
+       };
+
+       /**
+        * Returns power state of loaded default WiFi adapter.
+        *
+        * @method isPowered
+        * @return {Boolean} True if adapter is powered on otherwise false.
+        */
+       this.isPowered = function() {
+               var powered = false;
+               if (!!self.adapter() && !!self.adapter().prop() && self.adapter().prop().Powered !== undefined) {
+                       powered = self.adapter().prop().Powered;
+               }
+               return powered;
+       };
+
+       /**
+        * Returns tethering state of loaded default WiFi adapter.
+        *
+        * @method isTethering
+        * @return {Boolean} True if WiFi tethering is enabled otherwise false.
+        */
+       this.isTethering = function() {
+               var tethering = false;
+               if (!!self.adapter() && !!self.adapter().prop() && self.adapter().prop().Tethering !== undefined) {
+                       tethering = self.adapter().prop().Tethering;
+               }
+               return tethering;
+       };
+
+       /**
+        * Returns tethering identifier of loaded default WiFi adapter.
+        *
+        * @method getTetheringIdentifierStr
+        * @return {String} WiFi adapter tethering identifier.
+        */
+       this.getTetheringIdentifierStr = function() {
+               var identifier = "";
+               if (!!self.adapter() && !!self.adapter().prop() && !!self.adapter().prop().TetheringIdentifier && self.adapter().prop().TetheringIdentifier.toString().trim() !== "") {
+                       identifier = self.adapter().prop().TetheringIdentifier;
+               }
+               return identifier;
+       };
+
+       /**
+        * Returns tethering passphrase of loaded default WiFi adapter.
+        *
+        * @method getTetheringPassphraseStr
+        * @return {String} WiFi adapter tethering passphrase.
+        */
+       this.getTetheringPassphraseStr = function() {
+               var passphrase = "";
+               if (!!self.adapter() && !!self.adapter().prop() && !!self.adapter().prop().TetheringPassphrase && self.adapter().prop().TetheringPassphrase.toString().trim() !== "") {
+                       passphrase = self.adapter().prop().TetheringPassphrase;
+               }
+               return passphrase;
+       };
+
+       /**
+        * Returns security type from Wifi.SECURITY_TYPE for given index.
+        *
+        * @method getSecurityStrByIndex
+        * @param index {Number} Index of security.
+        * @return {String} Security type.
+        */
+       this.getSecurityStrByIndex = function(index) {
+               if (index < 0) {
+                       index = 0;
+               }
+               if (index >= self.SECURITY_TYPE.length) {
+                       index = self.SECURITY_TYPE.length - 1;
+               }
+               return self.SECURITY_TYPE[index];
+       };
+
+       /**
+        * Returns password minimum and maximum number of ASCII characters for given security index.
+        *
+        * @method getPasswordLengthStr
+        * @param security {Number} Index of security.
+        * @return {Object} Object containing password minimal and maximal length.
+        */
+       this.getPasswordLengthStr = function(security) {
+               var pass = {
+                       str : "",
+                       min : 0,
+                       max : 0
+               };
+               switch (security) {
+               case 1:
+                       pass.str = "13 ASCII CHARACTERS";
+                       pass.min = 13;
+                       pass.max = 13;
+                       break;
+               case 2:
+                       pass.str = "8-63 ASCII CHARACTERS";
+                       pass.min = 8;
+                       pass.max = 63;
+                       break;
+               case 3:
+                       pass.str = "8-63 ASCII CHARACTERS";
+                       pass.min = 8;
+                       pass.max = 63;
+                       break;
+               default:
+                       break;
+               }
+               return pass;
+       };
+
+       /**
+        * Tests if supplied string contains only ASCII characters.
+        *
+        * @method isASCII
+        * @param str {String} String to be checked.
+        * @return {Boolean} True if string contains only ASCII characters otherwise false.
+        */
+       this.isASCII = function(str) {
+               return (/^[\x00-\x7F]*$/).test(str);
+       };
+
+       /**
+        * Tests if supplied password is valid (i.e. contains only ASCII characters and length of password is in given min - max range).
+        *
+        * @method isPasswordValid
+        * @param password {String} Password to be tested.
+        * @param passwordMinLength {Number} Minimum number of characters.
+        * @param passwordMaxLength {Number} Maximum number of characters.
+        * @return {Boolean} True if password is valid otherwise false.
+        */
+       this.isPasswordValid = function(password, passwordMinLength, passwordMaxLength) {
+               if (self.isASCII(password) && password.length >= passwordMinLength && password.length <= passwordMaxLength) {
+                       return true;
+               }
+               return false;
+       };
+
+       /**
+        * Enables or disables WiFi tethering with SSID and passphrase entry. It enables also WiFi adapter in case it is turned off.
+        *
+        * @method toggleTethering
+        */
+       this.toggleTethering = function() {
+               console.log("Wifi: toggle tethering called.");
+               showLoadingSpinner("Processing");
+               if (!self.isPowered()) {
+                       self.adapter().technology.setPowered(true, function() {
+                               console.log('Successfully enable WiFi subsystem');
+                               self.setAdapterProperty("Powered", true);
+                               setTimeout(function() {
+                                       self.setTethering(!self.isTethering());
+                               }, 1000);
+                       }, function(err) {
+                               var error = "An error occured while turning wifi on.";
+                               console.log(error, err);
+                               hideLoadingSpinner("Processing");
+                               alert(error);
+                       });
+               } else {
+                       self.setTethering(!self.isTethering());
+               }
+       };
+
+       /**
+        * Starts or stops WiFi handover sequende. Not implemented yet.
+        *
+        * @method toggleHandover
+        */
+       this.toggleHandover = function() {
+               console.log("Wifi: handover sequence called.");
+               alert("Wifi handover sequence not supported.");
+       };
+
+       /**
+        * Tests if supplied WiFi network has internet access.
+        *
+        * @method isOnlineWifiNetwork
+        * @param networkId {String} WiFi network ID to be tested.
+        * @return {Boolean} True if WiFi network is online otherwise false.
+        */
+       this.isOnlineWifiNetwork = function(networkId) {
+               if (!!self.onlineWifiNetwork() && self.onlineWifiNetwork() === networkId) {
+                       return true;
+               }
+               return false;
+       };
+
+       Settings.domElement.on('eventClick_hidePage', function() {
+               self.rescanEnabled(false);
+       });
+
+       Settings.domElement.on('eventClick_showPage', function() {
+               if ($(".wifiContent").length || $(".wifiNetworkInfoContent").length) {
+                       self.rescanEnabled(true);
+               }
+       });
+};
+
+/**
+ * Contains array of available WiFi networks.
+ *
+ * @property networks
+ * @public
+ * @type ko.observableArray
+ * @default []
+ */
+Wifi.prototype.networks = ko.observableArray([]);
+/**
+ * Contains array of available hidden WiFi networks.
+ *
+ * @property hiddenNetworks
+ * @public
+ * @type ko.observableArray
+ * @default []
+ */
+Wifi.prototype.hiddenNetworks = ko.observableArray([]);
+/**
+ * Provides access to control the device's connman WiFi technology.
+ *
+ * @property adapter
+ * @public
+ * @type ko.observable
+ * @default null
+ */
+Wifi.prototype.adapter = ko.observable(null);
+/**
+ * Represents WiFi network showed in detail view.
+ *
+ * @property selectedNetwork
+ * @public
+ * @type ko.observable
+ * @default null
+ */
+Wifi.prototype.selectedNetwork = ko.observable(null);
+/**
+ * Indicates if there us active scanning session for available WiFi networks.
+ *
+ * @property scanning
+ * @public
+ * @type ko.observable
+ * @default false
+ */
+Wifi.prototype.scanning = ko.observable(false);
+/**
+ * Indicates if WiFi scanning was launched already.
+ *
+ * @property firstScan
+ * @public
+ * @type ko.observable
+ * @default true
+ */
+Wifi.prototype.firstScan = ko.observable(true);
+/**
+ * Indicates if rescanning is enabled or not.
+ *
+ * @property rescanEnabled
+ * @public
+ * @type ko.observable
+ * @default false
+ */
+Wifi.prototype.rescanEnabled = ko.observable(false);
+/**
+ * Holds a rescan interval.
+ *
+ * @property rescanInterval
+ * @public
+ * @type Any
+ * @default false
+ */
+Wifi.prototype.rescanInterval = null;
+/**
+ * Contains array of different security types.
+ *
+ * @property SECURITY_TYPE
+ * @public
+ * @type Array
+ * @default []
+ */
+Wifi.prototype.SECURITY_TYPE = [ "NONE", "WEP", "WPA", "WPA2" ];
+/**
+ * Defines WiFi network with internet access.
+ *
+ * @property onlineWifiNetwork
+ * @public
+ * @type ko.observable
+ * @default null
+ */
+Wifi.prototype.onlineWifiNetwork = ko.observable(null);
+/**
+ * Indicates if WiFi power button is clickable.
+ *
+ * @property togglePowerLocked
+ * @public
+ * @type ko.observable
+ * @default false
+ */
+Wifi.prototype.togglePowerLocked = ko.observable(false);
+/**
+ * Defines security type used for WiFi tethering.
+ *
+ * @property tetheringSecurity
+ * @public
+ * @type ko.observable
+ * @default 3
+ */
+Wifi.prototype.tetheringSecurity = ko.observable(3);
+
+/**
+ * Loads websocket and connman javascript APIs, connects to settings daemon, subscribes to receive notifications about WiFi adapter changes.
+ *
+ * @method init
+ * @param callback {Function(error?)} Callback function to be invoked when initialization is done.
+ */
+Wifi.prototype.init = function(callback) {
+       "use strict";
+       var self = this;
+       var error = null;
+       loadScript(Settings.SETTINGS_JS_PATH + "websocket.js", function(path, status) {
+               if (status === "ok") {
+                       loadScript(Settings.SETTINGS_JS_PATH + "api-connman.js", function(path, status) {
+                               if (status === "ok") {
+                                       wsAPI.connect('ws://localhost:16000/', 'http-only', function() {
+                                               console.log('Settings daemon connected');
+                                               wsAPI.subscribeEvents(function(event) {
+                                                       self.connmanEventReceived(event);
+                                               });
+                                               self.loadDefaultAdapter(function(err) {
+                                                       error = err;
+                                                       if (!!callback) {
+                                                               callback(error);
+                                                       }
+                                               });
+                                       }, function(err) {
+                                               console.log('Settings daemon disconnected...', err);
+                                               if (err === null || err === undefined) {
+                                                       error = 'Error: Cannot connect to settings daemon';
+                                                       console.log(error);
+                                               } else {
+                                                       error = err;
+                                                       console.log("Error", error);
+                                               }
+                                               if (!!callback) {
+                                                       callback(error);
+                                               }
+                                       });
+                               } else {
+                                       error = "Error: Connamn API is not available";
+                                       console.log(error);
+                                       if (!!callback) {
+                                               callback(error);
+                                       }
+                               }
+                       });
+               } else {
+                       error = "Error: Websocket API is not available";
+                       console.log(error);
+                       if (!!callback) {
+                               callback(error);
+                       }
+               }
+       });
+};
+
+/**
+ * The connmanEventReceived callback function is intened to update WiFi adapter properties when changed and e.g. start scanning when WiFi adapter was turned on.
+ *
+ * @method connmanEventReceived
+ * @param event {Object} Object representing event's information.
+ */
+Wifi.prototype.connmanEventReceived = function(event) {
+       "use strict";
+       var self = this;
+       console.log("EVENT: ", event);
+
+       if (event.type === WS_EVENT_TYPE.CONNMAN) {
+               if (event.name === 'PropertyChanged') {
+                       var id = event.id, property = event.value;
+                       if (!!self.adapter()) {
+                               var index = id.lastIndexOf('/');
+                               var technology = id.substring(index + 1).toString().trim().toLowerCase();
+                               if (technology === 'wifi') {
+                                       self.setAdapterProperty(property[0], property[1]);
+                                       if (property[0] === "Powered") {
+                                               if (!property[1]) {
+                                                       self.stopScan();
+                                               } else {
+                                                       setTimeout(function() {
+                                                               self.scan(false);
+                                                       }, 2000);
+                                               }
+                                       }
+
+                                       if (property[0] === "Tethering") {
+                                               if (property[1]) {
+                                                       self.stopScan();
+                                               } else {
+                                                       setTimeout(function() {
+                                                               self.scan(false);
+                                                       }, 2000);
+                                               }
+                                       }
+
+                                       if (property[0] === "Connected") {
+                                               self.checkOnlineWifiNetwork();
+                                       }
+                               }
+                       }
+               } else {
+                       console.log('Unsupported event received: ' + event.name);
+               }
+       }
+};
+
+/**
+ * Enables or disables WiFi tethering and sets entered identifier and passphrase.
+ *
+ * @method setTethering
+ * @param enabled {Boolean} Indicates if WiFi tethering should be turned on or off.
+ */
+Wifi.prototype.setTethering = function(enabled) {
+       "use strict";
+       var self = this;
+       console.log("setTethering called");
+
+       if ($(".wifiTetheringContent").length && !!self.adapter()) {
+               var wifiTetheringContent = $(".wifiTetheringContent");
+               var identifier = wifiTetheringContent.find($("#inputSsid")).val().toString().trim();
+               var passphrase = wifiTetheringContent.find($("#inputPassword")).val().toString().trim();
+
+               if (self.validateWifiCredentials(identifier, self.tetheringSecurity(), passphrase)) {
+                       showLoadingSpinner("Processing");
+                       self.adapter().technology.setTethering(identifier, passphrase, enabled, function() {
+                               console.log("SUCCESS");
+                               hideLoadingSpinner("Processing");
+                       }, function(err) {
+                               console.log("ERROR", err);
+                               alert(err);
+                               hideLoadingSpinner("Processing");
+                       });
+               } else {
+                       hideLoadingSpinner("Processing");
+               }
+       }
+};
+
+/**
+ * Loads connman technologies and sets WiFi technology to Wifi.adapter.
+ *
+ * @method loadDefaultAdapter
+ * @param callback {Function(error?)} Callback function to be invoked when loading process ends.
+ */
+Wifi.prototype.loadDefaultAdapter = function(callback) {
+       "use strict";
+       var self = this;
+       var error = null;
+       if (typeof (settings) !== 'undefined' && typeof (settings.connman) !== 'undefined' && typeof (settings.connman.getTechnologies) !== 'undefined') {
+               settings.connman.getTechnologies(function(technologies) {
+                       for ( var i = 0; i < technologies.length; i++) {
+                               var technology = technologies[i];
+                               if (technology.prop.Type === 'wifi') {
+                                       console.log('Connman technology found: ', technology);
+                                       self.adapter({
+                                               id : technology.id,
+                                               prop : ko.observable(technology.prop),
+                                               technology : technology
+                                       });
+                                       break;
+                               }
+                       }
+                       if (!self.adapter()) {
+                               error = "Wifi technology not found.";
+                               console.log(error);
+                               if (!!callback) {
+                                       callback(error);
+                               }
+                       } else {
+                               if (self.adapter().prop().Powered === undefined) {
+                                       self.updatePowered(function() {
+                                               if (!!callback) {
+                                                       callback();
+                                               }
+                                       }, function(err) {
+                                               error = err;
+                                               if (!!callback) {
+                                                       callback(error);
+                                               }
+                                       });
+                               } else {
+                                       if (!!callback) {
+                                               callback();
+                                       }
+                               }
+                       }
+               }, function(err) {
+                       error = err;
+                       console.log("getTechnologies error ", error);
+                       if (!!callback) {
+                               callback(error);
+                       }
+               });
+       } else {
+               error = "settings.connman.getTechnologies API not available.";
+               console.log(error);
+               if (!!callback) {
+                       callback(error);
+               }
+       }
+};
+
+/**
+ * Shows list view of available WiFi networks and allows to trigger rescanning, open detail view, connect or disconnect from selected WiFi network, turn on or off WiFi technology.
+ *
+ * @method showNetworks
+ */
+Wifi.prototype.showNetworks = function() {
+       "use strict";
+       var self = this;
+       self.rescanEnabled(true);
+       var subpanelModel = {
+               textTitle : "SETTINGS",
+               textSubtitle : "WIFI",
+               actionName : "BACK",
+               action : function() {
+                       self.rescanEnabled(false);
+                       Settings.renderSettingsView();
+               }
+       };
+
+       var loadWifiNetworksUI = function() {
+               if (!$("#bluetoothDevicesList").length) {
+                       var wifiNetworksList = '<div id="wifiNetworksList" data-bind="template: { name: \'';
+                       wifiNetworksList += templateName;
+                       wifiNetworksList += '\', foreach: Settings.Wifi.networks }, style: { display: Settings.Wifi.isPowered() && !Settings.Wifi.isTethering() ? \'block\' : \'none\' }"></div>';
+                       wifiNetworksList += '<div style="text-align: center;" data-bind="style: { display: Settings.Wifi.isPowered() && Settings.Wifi.isTethering() ? \'block\' : \'none\' }" class="fontColorNormal fontSizeMedium fontWeightBold">TETHERING IS ON</div>';
+                       $(wifiNetworksList).prependTo($('.' + wifiContent));
+
+                       var button = "";
+
+                       button += '<div class="buttonsArea">';
+
+                       button += '<div id="wifiRefreshButton" class="toggleButton wifiRefreshButton" data-bind="click: Settings.Wifi.scanNetwork, style: { display: Settings.Wifi.isPowered() && !Settings.Wifi.isTethering() ? \'block\' : \'none\' }">';
+                       button += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                       button += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText">REFRESH</div>';
+                       button += '</div>';
+
+                       button += '<div id="addNetworkButton" class="toggleButton addNetworkButton" data-bind="click: Settings.Wifi.showAddNetwork, style: { display: Settings.Wifi.isPowered() && !Settings.Wifi.isTethering() ? \'block\' : \'none\' }">';
+                       button += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                       button += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText">ADD</div>';
+                       button += '</div>';
+
+                       button += '</div>';
+
+                       $(button).appendTo($('.' + wifiContent));
+
+                       button = '<div id="wifiPowerButton" class="toggleButton subPanelToggleButton subPanelToggleButtonWide" data-bind="with: Settings.Wifi.adapter, click: Settings.Wifi.togglePower">';
+                       button += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                       button += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: Settings.Wifi.isPowered() ? \'TURN OFF\' : \'TURN ON\'"></div>';
+                       button += '</div>';
+                       $(button).appendTo($('.tabsTopSubPanel'));
+                       ko.applyBindings(window.Settings);
+                       self.scan(self.firstScan());
+                       if (!self.rescanInterval) {
+                               self.rescanInterval = setInterval(function() {
+                                       if (self.isPowered() && !self.isTethering() && !self.scanning() && self.rescanEnabled() && !document.webkitHidden) {
+                                               self.scan(false);
+                                       }
+                               }, 5000);
+                       }
+               }
+       };
+
+       var wifiContent = "wifiContent";
+       var templateName = "template-wifi";
+       Settings.domElement.tabs("clearContent");
+       Settings.domElement.tabs("changeContentClass", wifiContent);
+       Settings.domElement.tabs("subpanelContentTemplateCompile", subpanelModel, function() {
+               loadTemplate(Settings.SETTINGS_TEMPLATES_PATH, templateName, loadWifiNetworksUI);
+       });
+};
+
+/**
+ * Shows small loading spinner in header during active scanning session.
+ *
+ * @method showWifiLoadingSpinner
+ */
+Wifi.prototype.showWifiLoadingSpinner = function() {
+       "use strict";
+       var self = this;
+       if ($(".wifiContent").length) {
+               if (!$("#loadingSpinnerWifi").length) {
+                       var spinner = '';
+                       spinner += '<div id="loadingSpinnerWifi" class="loadingSpinnerWifi loading-container loading-container-small">';
+                       spinner += '<div class="loading loading-small"></div>';
+                       spinner += '</div>';
+                       $(spinner).appendTo($(".tabsTopSubPanel"));
+               }
+               $("#loadingSpinnerWifi").show();
+       }
+};
+
+/**
+ * Hides small loading spinner in header.
+ *
+ * @method hideWifiLoadingSpinner
+ */
+Wifi.prototype.hideWifiLoadingSpinner = function() {
+       "use strict";
+       var self = this;
+       if ($("#loadingSpinnerWifi").length) {
+               $("#loadingSpinnerWifi").hide();
+       }
+};
+
+/**
+ * Discovers available WiFi networks if any.
+ *
+ * @method scan
+ * @param showSpinner {Boolean} Indicates if full screen loading spinner should be visible during scanning.
+ */
+Wifi.prototype.scan = function(showSpinner) {
+       "use strict";
+       var self = this;
+       if (self.scanning()) {
+               self.showWifiLoadingSpinner();
+               return;
+       }
+       if (self.isPowered() && !self.isTethering()) {
+               showSpinner = typeof (showSpinner) === 'undefined' ? true : showSpinner;
+               if (showSpinner) {
+                       showLoadingSpinner("Scanning");
+               }
+               self.showWifiLoadingSpinner();
+               self.scanning(true);
+               self.firstScan(false);
+               settings.connman.scan(self.adapter().id, function(networks) {
+                       var wifiNets = ko.utils.arrayFilter(networks, function(network) {
+                               return !!network && !!network.prop && !!network.prop.Type && network.prop.Type === "wifi";
+                       });
+                       var wifiNetworks = [];
+                       var wifiHiddenNetworks = [];
+                       ko.utils.arrayForEach(wifiNets, function(net) {
+                               var _network = {
+                                       id : net.id,
+                                       prop : ko.observable(net.prop),
+                                       service : net
+                               };
+                               if (!!net.prop.Name) {
+                                       wifiNetworks.push(_network);
+                               } else {
+                                       wifiHiddenNetworks.push(_network);
+                               }
+                       });
+                       console.log('Found wifi networks: ', wifiNetworks);
+                       console.log('Found wifi hidden networks: ', wifiHiddenNetworks);
+                       self.networks(wifiNetworks);
+                       self.hiddenNetworks(wifiHiddenNetworks);
+                       self.sortNetworks();
+                       self.checkOnlineWifiNetwork();
+
+                       for ( var i = 0; i < self.networks().length; ++i) {
+                               var network = self.networks()[i];
+                               if (!!self.selectedNetwork() && self.selectedNetwork().id === network.id) {
+                                       self.selectedNetwork(network);
+                               }
+                       }
+
+                       self.scanning(false);
+                       hideLoadingSpinner("Scanning");
+                       self.hideWifiLoadingSpinner();
+               }, function(err) {
+                       console.log('Error: Cannot scan: ' + err);
+                       self.scanning(false);
+                       hideLoadingSpinner("Scanning");
+                       self.hideWifiLoadingSpinner();
+               });
+       } else {
+               console.log("Wifi adapter is null or is turned off.");
+       }
+};
+
+/**
+ * Stops scanning for available WiFi networks.
+ *
+ * @method scan
+ */
+Wifi.prototype.stopScan = function() {
+       "use strict";
+       var self = this;
+       self.scanning(false);
+       self.clearNetworks();
+       hideLoadingSpinner("Scanning");
+       self.hideWifiLoadingSpinner();
+};
+
+/**
+ * Tests if active WiFi network connection from available WiFi networks has internet access.
+ *
+ * @method checkOnlineWifiNetwork
+ */
+Wifi.prototype.checkOnlineWifiNetwork = function() {
+       "use strict";
+       var self = this;
+       console.log("Wifi: checking internet access");
+       var testRequest = function(network) {
+               $.ajax({
+                       type : "GET",
+                       url : "http://www.google.com",
+                       timeout : 1000,
+                       success : function(data, textStatus, jqXHR) {
+                               self.onlineWifiNetwork(network.id);
+                       },
+                       error : function(jqXHR, textStatus, errorThrown) {
+                               self.onlineWifiNetwork(null);
+                       }
+               });
+       };
+       for ( var i = 0; i < self.networks().length; ++i) {
+               var network = self.networks()[i];
+               if (self.isConnected(network.prop)) {
+                       testRequest(network);
+                       return;
+               }
+       }
+       self.onlineWifiNetwork(null);
+};
+
+/**
+ * Gets and updates Wifi.adapter power state.
+ *
+ * @method updatePowered
+ * @param successCallback {Function()} Callback function to be invoked when getting the state ends successfully.
+ * @param errorCallback {Function(error?)} Callback function to be invoked on failure of getting power state.
+ */
+Wifi.prototype.updatePowered = function(successCallback, errorCallback) {
+       "use strict";
+       var self = this;
+       if (!!this.adapter()) {
+               this.adapter().getPowered(function(powered) {
+                       console.log("Wifi adapter is powered: " + powered);
+                       self.setAdapterProperty("Powered", powered);
+                       if (!!successCallback) {
+                               successCallback();
+                       }
+               }, function(err) {
+                       console.log('Error: Cannot get WiFi powered state: ' + err);
+                       self.setAdapterProperty("Powered", false);
+                       if (!!errorCallback) {
+                               errorCallback(err);
+                       }
+               });
+       } else {
+               var err = "Error: Wifi adapter not found.";
+               console.log(err);
+               if (!!errorCallback) {
+                       errorCallback(err);
+               }
+       }
+};
+
+/**
+ * Clears lists of available WiFi networks.
+ *
+ * @method clearNetworks
+ */
+Wifi.prototype.clearNetworks = function() {
+       "use strict";
+       this.networks.removeAll();
+       this.networks([]);
+       this.hiddenNetworks.removeAll();
+       this.hiddenNetworks([]);
+};
+
+/**
+ * The refreshNetworks function is intended to be called when WiFi network properties have changed.
+ *
+ * @method refreshNetworks
+ */
+Wifi.prototype.refreshNetworks = function() {
+       "use strict";
+       var self = this;
+       var networks = self.networks().slice(0);
+       var hiddenNetworks = self.hiddenNetworks().slice(0);
+       self.clearNetworks();
+       self.networks(networks);
+       self.hiddenNetworks(hiddenNetworks);
+       self.sortNetworks();
+};
+
+/**
+ * Sorts available WiFi networks by connection state (connected first).
+ *
+ * @method sortNetworks
+ */
+Wifi.prototype.sortNetworks = function() {
+       "use strict";
+       var self = this;
+       if (!!self.networks() && self.networks().length) {
+               self.networks.sort(function(left, right) {
+                       return self.isConnected(left.prop) === self.isConnected(right.prop) ? 0 : self.isConnected(left.prop) ? -1 : 1;
+               });
+       }
+};
+
+/**
+ * Sets WiFi network property.
+ *
+ * @method setNetworkProperty
+ * @param network {Object} Object representing WiFi network's information to be updated.
+ * @param key {Sring} Property key to be set.
+ * @param value {Any} Value for property to be set.
+ */
+Wifi.prototype.setNetworkProperty = function(network, key, value) {
+       "use strict";
+       var self = this;
+       if (!!network && !!network.prop()) {
+               network.prop()[key] = value;
+               network.prop.valueHasMutated();
+               network.service.prop[key] = value;
+               if (!!self.selectedNetwork() && self.selectedNetwork().id === network.id) {
+                       self.selectedNetwork.valueHasMutated();
+               }
+       }
+};
+
+/**
+ * Sets WiFi technology property.
+ *
+ * @method setAdapterProperty
+ * @param key {Sring} Property key to be set.
+ * @param value {Any} Value for property to be set.
+ */
+Wifi.prototype.setAdapterProperty = function(key, value) {
+       "use strict";
+       var self = this;
+       if (!!self.adapter() && !!self.adapter().prop()) {
+               self.adapter().prop()[key] = value;
+               self.adapter().technology.prop[key] = value;
+               self.adapter().prop.valueHasMutated();
+       }
+};
+
+/**
+ * Connects or disconnects to/from WiFi network.
+ *
+ * @method connectDisconnectNetwork
+ * @param network {Object} Object representing WiFi network's information to be connected to or disconnected from.
+ * @param password {Sring} Password for protected WiFi network.
+ * @param callback {Function(error?)} Callback function to be invoked when connecting/disconnecting ends.
+ */
+Wifi.prototype.connectDisconnectNetwork = function(network, password, callback) {
+       "use strict";
+       var self = this;
+       var error = null;
+       if (!!network && self.isPowered()) {
+               self.rescanEnabled(false);
+               if (!self.isConnected(network.prop)) {
+                       showLoadingSpinner("Connecting");
+                       console.log('WiFi connect to network: ' + self.getSsidStr(network.prop));
+                       network.service.connect(undefined, password, undefined, function() {
+                               console.log('WiFi connected to ' + self.getSsidStr(network.prop));
+                               self.setNetworkProperty(network, "State", "ready");
+                               self.scan(false);
+                               hideLoadingSpinner("Connecting");
+                               self.rescanEnabled(true);
+                               if (!!callback) {
+                                       callback();
+                               }
+                       }, function(err) {
+                               console.log('Error: WiFi connect failed: ', err);
+                               if (err.indexOf("Error.AlreadyConnected") !== -1) {
+                                       self.setNetworkProperty(network, "State", "ready");
+                               }
+                               self.scan(false);
+                               hideLoadingSpinner("Connecting");
+                               self.rescanEnabled(true);
+                               error = err;
+                               if (!!callback) {
+                                       callback(error);
+                               }
+                       });
+               } else {
+                       showLoadingSpinner("Disconnecting");
+                       console.log('Wifi disconnect from network: ' + self.getSsidStr(network.prop));
+                       network.service.disconnect(function() {
+                               console.log('WiFi disconnected from ' + self.getSsidStr(network.prop));
+                               self.setNetworkProperty(network, "State", "idle");
+                               self.scan(false);
+                               hideLoadingSpinner("Disconnecting");
+                               self.rescanEnabled(true);
+                               if (!!callback) {
+                                       callback();
+                               }
+                       }, function(err) {
+                               console.log('Error: Network disconnect failed: ', err);
+                               if (err.indexOf("Error.NotConnected") !== -1) {
+                                       self.setNetworkProperty(network, "State", "idle");
+                               }
+                               self.scan(false);
+                               hideLoadingSpinner("Disconnecting");
+                               self.rescanEnabled(true);
+                               error = err;
+                               if (!!callback) {
+                                       callback(error);
+                               }
+                       });
+               }
+       } else {
+               error = "Supplied network is undefined or wifi adapter is turned off.";
+               console.log(error);
+               if (!!callback) {
+                       callback(error);
+               }
+       }
+};
+
+/**
+ * The showEnterWifiPasswordPopup function is intended to be called before connecting to protected WiFi network that requires password entry.
+ *
+ * @method showEnterWifiPasswordPopup
+ * @param network {Object} Object representing WiFi network's information the passworkd should be entered for.
+ */
+Wifi.prototype.showEnterWifiPasswordPopup = function(network) {
+       "use strict";
+       var self = this;
+
+       var popup = "";
+       popup += '<div class="popupContainer pageBgColorNormalTransparent">';
+       popup += '<div class="popupContainerWrapper">';
+       popup += '<div class="popupWrapper borderColorTheme boxShadow1 bgColorNormal">';
+
+       popup += '<div class="popupHeader fontSizeLarge fontWeightBold fontColorTheme borderColorTheme">';
+       popup += self.getSsidStr(network.prop);
+       popup += '</div>';
+
+       popup += '<div class="popupContent">';
+
+       popup += '<div class="popupContentContainer">';
+       popup += '<span class="popupContentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+       popup += 'Signal Strength';
+       popup += '</span>';
+       popup += '<span class="popupContentContainerValue fontSizeMedium fontWeightBold fontColorNormal">';
+       popup += self.getSignalStrengthStr(network.prop);
+       popup += '</span>';
+       popup += '</div>';
+
+       popup += '<div class="popupContentContainer">';
+       popup += '<span class="popupContentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+       popup += 'Security';
+       popup += '</span>';
+       popup += '<span class="popupContentContainerValue fontSizeMedium fontWeightBold fontColorNormal">';
+       popup += self.getSecurityStr(network.prop);
+       popup += '</span>';
+       popup += '</div>';
+
+       popup += '<div class="popupContentContainer">';
+       popup += '<div class="popupContentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+       popup += 'Password';
+       popup += '</div>';
+       popup += '<div class="inputBox popupInputBox">';
+       popup += '<input id="inputPassword" class="input fontSizeLarge fontSizeBold fontColorNormal boxShadow4 boxShadow4Active" type="text"/>';
+       popup += '<div id="buttonDeletePassword" class="button deleteButton"></div>';
+       popup += '</div>';
+       popup += '</div>';
+
+       popup += '</div>';
+
+       popup += '<div class="popupFooter borderColorTheme">';
+
+       popup += '<div id="cancelButton" class="popupButton">';
+       popup += '<div class="bgColorThemeTransparent boxShadowInset popupButtonBackground"></div>';
+       popup += '<div class="fontColorNormal fontSizeMedium fontWeightBold popupButtonText">CANCEL</div>';
+       popup += '</div>';
+
+       popup += '<div id="connectButton" class="popupButton">';
+       popup += '<div class="bgColorThemeTransparent boxShadowInset popupButtonBackground"></div>';
+       popup += '<div class="fontColorNormal fontSizeMedium fontWeightBold popupButtonText">CONNECT</div>';
+       popup += '</div>';
+
+       popup += '</div>';
+
+       popup += '</div>';
+       popup += '</div>';
+       popup += '</div>';
+
+       popup = $(popup);
+
+       popup.appendTo("body");
+
+       popup.find("#buttonDeletePassword").click(function() {
+               self.deleteCharFromInput(popup.find("#inputPassword"));
+               return false;
+       });
+
+       popup.find("#cancelButton").click(function() {
+               popup.fadeOut("normal", function() {
+                       popup.remove();
+               });
+               return false;
+       });
+
+       popup.find("#connectButton").click(function() {
+               self.connectDisconnectNetwork(network, popup.find("#inputPassword").val(), function(error) {
+                       if (!error) {
+                               popup.fadeOut("normal", function() {
+                                       popup.remove();
+                               });
+                       } else {
+                               alert("An error occured while connecting/disconnecting to/from network. " + error);
+                       }
+               });
+               return false;
+       });
+
+       popup.fadeIn("normal", function() {
+       });
+};
+
+/**
+ * Removes last character from given input field.
+ *
+ * @method deleteCharFromInput
+ * @param input {Any} jQuery representation of input element.
+ */
+Wifi.prototype.deleteCharFromInput = function(input) {
+       "use strict";
+       var inputValue = input.val();
+       inputValue = inputValue.slice(0, inputValue.length - 1);
+       input.val(inputValue);
+       input.focus();
+};
+
+/**
+ * Shows popup to add and connect to hidden WiFi network by providing SSID, security and password.
+ *
+ * @method showAddNetworkPopup
+ */
+Wifi.prototype.showAddNetworkPopup = function() {
+       "use strict";
+       var self = this;
+
+       var popup = "";
+       popup += '<div class="popupContainer pageBgColorNormalTransparent">';
+       popup += '<div class="popupContainerWrapper">';
+       popup += '<div class="popupWrapper borderColorTheme boxShadow1 bgColorNormal">';
+
+       popup += '<div class="popupHeader fontSizeLarge fontWeightBold fontColorTheme borderColorTheme">';
+       popup += 'ADD NETWORK';
+       popup += '</div>';
+
+       popup += '<div class="popupContent">';
+
+       popup += '<div class="popupContentContainer">';
+       popup += '<div class="popupContentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+       popup += 'SSID';
+       popup += '</div>';
+       popup += '<div class="inputBox popupInputBox">';
+       popup += '<input id="inputSsid" class="input fontSizeLarge fontSizeBold fontColorNormal boxShadow4 boxShadow4Active" type="text" />';
+       popup += '<div id="buttonDeleteSsid" class="button deleteButton"></div>';
+       popup += '</div>';
+       popup += '</div>';
+
+       popup += '<div class="popupContentContainer">';
+       popup += '<div class="popupContentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+       popup += 'SECURITY';
+       popup += '</div>';
+       popup += '<div class="inputBox popupInputBox">';
+       popup += '<div id="buttonPreviousSecurity" class="button previousButton"></div>';
+       popup += '<input id="inputSecurity" class="inputSelection fontSizeLarge fontSizeBold fontColorNormal boxShadow4 boxShadow4Active" data-securitytype="0" type="text" value="NONE" disabled />';
+       popup += '<div id="buttonNextSecurity" class="button nextButton"></div>';
+       popup += '</div>';
+       popup += '</div>';
+
+       popup += '<div id="inputPasswordContainer" class="popupContentContainer" style="display: none;">';
+       popup += '<div class="popupContentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+       popup += 'PASSWORD';
+       popup += '</div>';
+       popup += '<div class="inputBox popupInputBox">';
+       popup += '<input id="inputPassword" class="input fontSizeLarge fontSizeBold fontColorNormal boxShadow4 boxShadow4Active" type="text"/>';
+       popup += '<div id="buttonDeletePassword" class="button deleteButton"></div>';
+       popup += '</div>';
+       popup += '</div>';
+
+       popup += '</div>';
+
+       popup += '<div class="popupFooter borderColorTheme">';
+
+       popup += '<div id="cancelButton" class="popupButton">';
+       popup += '<div class="bgColorThemeTransparent boxShadowInset popupButtonBackground"></div>';
+       popup += '<div class="fontColorNormal fontSizeMedium fontWeightBold popupButtonText">CANCEL</div>';
+       popup += '</div>';
+
+       popup += '<div id="addButton" class="popupButton">';
+       popup += '<div class="bgColorThemeTransparent boxShadowInset popupButtonBackground"></div>';
+       popup += '<div class="fontColorNormal fontSizeMedium fontWeightBold popupButtonText">ADD</div>';
+       popup += '</div>';
+
+       popup += '</div>';
+
+       popup += '</div>';
+       popup += '</div>';
+       popup += '</div>';
+
+       popup = $(popup);
+       popup.appendTo("body");
+
+       popup.find("#buttonDeleteSsid").click(function() {
+               self.deleteCharFromInput(popup.find("#inputSsid"));
+               return false;
+       });
+
+       popup.find("#buttonNextSecurity").click(function() {
+               var input = popup.find("#inputSecurity");
+               var currentSecurity = Number(input.data("securitytype"));
+               currentSecurity = currentSecurity + 1;
+               if (currentSecurity >= self.SECURITY_TYPE.length) {
+                       currentSecurity = 0;
+               }
+               if (currentSecurity === 0) {
+                       $("#inputPasswordContainer").hide(0);
+               } else {
+                       $("#inputPasswordContainer").show(0);
+               }
+               input.data("securitytype", currentSecurity);
+               input.attr("value", self.SECURITY_TYPE[currentSecurity]);
+               return false;
+       });
+
+       popup.find("#buttonPreviousSecurity").click(function() {
+               var input = popup.find("#inputSecurity");
+               var currentSecurity = Number(input.data("securitytype"));
+               currentSecurity = currentSecurity - 1;
+               if (currentSecurity < 0) {
+                       currentSecurity = self.SECURITY_TYPE.length - 1;
+               }
+               if (currentSecurity === 0) {
+                       $("#inputPasswordContainer").hide(0);
+               } else {
+                       $("#inputPasswordContainer").show(0);
+               }
+               input.data("securitytype", currentSecurity);
+               input.attr("value", self.SECURITY_TYPE[currentSecurity]);
+               return false;
+       });
+
+       popup.find("#buttonDeletePassword").click(function() {
+               self.deleteCharFromInput(popup.find("#inputPassword"));
+               return false;
+       });
+
+       popup.find("#cancelButton").click(function() {
+               popup.fadeOut("normal", function() {
+                       popup.remove();
+               });
+               return false;
+       });
+
+       popup.find("#addButton").click(function() {
+               var ssid = popup.find("#inputSsid").val().toString().trim();
+               var security = popup.find("#inputSecurity").data("securitytype");
+               var password;
+               if (security > 0) {
+                       password = popup.find("#inputPassword").val().toString().trim();
+                       password = password === "" ? undefined : password;
+                       security = self.SECURITY_TYPE[security];
+               } else {
+                       security = undefined;
+               }
+
+               console.log(ssid, password, security);
+
+               var hiddenNetworks = self.hiddenNetworks().slice(0);
+               if (password === undefined) {
+                       hiddenNetworks = ko.utils.arrayFilter(hiddenNetworks, function(network) {
+                               return !!network && !!network.prop() && !!network.prop().EncryptionMode && network.prop().EncryptionMode === "none";
+                       });
+               }
+               var hiddenNetworkIndex = 0;
+               var connected = false;
+               var error = null;
+
+               function connectedSuccesfully() {
+                       connected = true;
+                       self.scan(false);
+                       hideLoadingSpinner("Connecting");
+                       self.rescanEnabled(true);
+                       popup.fadeOut("normal", function() {
+                               popup.remove();
+                       });
+               }
+
+               function connectToHiddenNetwork(networkIndex) {
+                       var network = hiddenNetworks[networkIndex];
+                       if (!!network) {
+                               console.log("Connecting to: " + network.id);
+                               network.service.connect(ssid, password, security, function() {
+                                       console.log('WiFi connected to ' + self.getSsidStr(network.prop));
+                                       connectedSuccesfully();
+                               }, function(err) {
+                                       console.log('Error: WiFi connect failed: ', err);
+                                       if (err.indexOf("Error.AlreadyConnected") !== -1) {
+                                               connectedSuccesfully();
+                                       } else {
+                                               if (hiddenNetworkIndex + 1 < hiddenNetworks.length) {
+                                                       hiddenNetworkIndex++;
+                                                       connectToHiddenNetwork(hiddenNetworkIndex);
+                                               } else {
+                                                       hideLoadingSpinner("Connecting");
+                                                       self.rescanEnabled(true);
+                                                       error = "Wrong ssid/password or network is unavailable.";
+                                                       console.log(error);
+                                                       alert(error);
+                                               }
+                                       }
+                               });
+                       } else {
+                               console.log("Supplied network is undefined.");
+                               hideLoadingSpinner("Connecting");
+                               self.rescanEnabled(true);
+                       }
+               }
+
+               if (hiddenNetworks.length) {
+                       showLoadingSpinner("Connecting");
+                       self.rescanEnabled(false);
+                       connectToHiddenNetwork(hiddenNetworkIndex);
+               } else {
+                       error = "No hidden networks available.";
+                       console.log(error);
+                       alert(error);
+               }
+
+               return false;
+       });
+
+       popup.fadeIn("normal", function() {
+       });
+};
+
+/**
+ * Validates supplied WiFi SSID and password based on given security.
+ *
+ * @method validateWifiCredentials
+ * @param ssid {String} WiFi network SSID to be validated.
+ * @param security {Number} WiFi network security index.
+ * @param password {String} WiFi network password to be validated.
+ */
+Wifi.prototype.validateWifiCredentials = function(ssid, security, password) {
+       "use strict";
+       var self = this;
+       ssid = ssid.toString().trim();
+       password = password.toString().trim();
+       console.log("validating: ", ssid, security, password);
+       if (ssid !== "") {
+               if (security > 0) {
+                       var pass = self.getPasswordLengthStr(security);
+                       if (!!pass && pass.str !== "") {
+                               if (!self.isPasswordValid(password, pass.min, pass.max)) {
+                                       alert("Password must contain " + pass.str);
+                                       return false;
+                               }
+                       } else {
+                               alert("Security type not supported");
+                               return false;
+                       }
+               }
+               return true;
+       } else {
+               alert("Enter WiFi SSID.");
+               return false;
+       }
+};
+
+/**
+ * Shows WiFi tethering view that provides functionality to enable or disable WiFi tethering, change tethering identifier, security and passphrase.
+ *
+ * @method showWifiTethering
+ */
+Wifi.prototype.showWifiTethering = function() {
+       "use strict";
+       var self = this;
+       var subpanelModel = {
+               textTitle : "SETTINGS",
+               textSubtitle : "WIFI TETHERING",
+               actionName : "BACK",
+               action : function() {
+                       Settings.renderSettingsView();
+               }
+       };
+
+       function loadTetheringUI() {
+               if (!$("#wifiTetheringInfoBox").length) {
+                       var tetheringPowerButton = "";
+                       tetheringPowerButton += '<div id="tetheringPowerButton" class="toggleButton subPanelToggleButton subPanelToggleButtonWide" data-bind="click: Settings.Wifi.toggleTethering">';
+                       tetheringPowerButton += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                       tetheringPowerButton += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: Settings.Wifi.isTethering() ? \'TURN OFF\' : \'TURN ON\'"></div>';
+                       tetheringPowerButton += '</div>';
+                       $(tetheringPowerButton).appendTo($('.tabsTopSubPanel'));
+
+                       var wifiTetheringContent = '<div id="wifiTetheringInfoBox" data-bind="with: Settings.Wifi.adapter">';
+
+                       wifiTetheringContent += '<div class="contentContainer">';
+                       wifiTetheringContent += '<div class="contentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+                       wifiTetheringContent += 'IDENTIFIER';
+                       wifiTetheringContent += '</div>';
+                       wifiTetheringContent += '<div class="inputBox contentInputBox">';
+                       wifiTetheringContent += '<input id="inputSsid" data-bind="value: Settings.Wifi.getTetheringIdentifierStr()" class="input settingsInputWideInline fontSizeLarge fontSizeBold fontColorNormal boxShadow4 boxShadow4Active" type="text"/>';
+                       wifiTetheringContent += '<div id="buttonDeleteSsid" class="button deleteButton"></div>';
+                       wifiTetheringContent += '</div>';
+                       wifiTetheringContent += '</div>';
+
+                       wifiTetheringContent += '<div class="contentContainer">';
+                       wifiTetheringContent += '<div class="contentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+                       wifiTetheringContent += 'SECURITY';
+                       wifiTetheringContent += '</div>';
+                       wifiTetheringContent += '<div class="inputBox contentInputBox">';
+                       wifiTetheringContent += '<div id="buttonPreviousSecurity" class="button previousButton"></div>';
+                       wifiTetheringContent += '<input id="inputSecurity" data-bind="value: Settings.Wifi.getSecurityStrByIndex(Settings.Wifi.tetheringSecurity())" class="inputSelection settingsInputSelectionWideInline fontSizeLarge fontSizeBold fontColorNormal boxShadow4 boxShadow4Active" type="text" disabled />';
+                       wifiTetheringContent += '<div id="buttonNextSecurity" class="button nextButton"></div>';
+                       wifiTetheringContent += '</div>';
+                       wifiTetheringContent += '</div>';
+
+                       wifiTetheringContent += '<div id="inputPasswordContainer" class="contentContainer" data-bind="style: { display: Settings.Wifi.tetheringSecurity() == 0 ? \'none\' : \'block\' }">';
+                       wifiTetheringContent += '<div class="contentContainerKey fontSizeLarge fontWeightBold fontColorTheme">';
+                       wifiTetheringContent += "PASSPHRASE";
+                       wifiTetheringContent += '</div>';
+                       wifiTetheringContent += '<div class="inputBox contentInputBox">';
+                       wifiTetheringContent += '<input id="inputPassword" data-bind="value: Settings.Wifi.getTetheringPassphraseStr(), attr: { maxlength: Settings.Wifi.getPasswordLengthStr(Settings.Wifi.tetheringSecurity()).max, placeholder: Settings.Wifi.getPasswordLengthStr(Settings.Wifi.tetheringSecurity()).str }" class="input settingsInputWideInline fontSizeLarge fontSizeBold fontColorNormal boxShadow4 boxShadow4Active" type="text"/>';
+                       wifiTetheringContent += '<div id="buttonDeletePassword" class="button deleteButton"></div>';
+                       wifiTetheringContent += '</div>';
+                       wifiTetheringContent += '</div>';
+
+                       wifiTetheringContent += '<div class="disabledArea bgColorNormalTransparent" data-bind="style: { display: Settings.Wifi.isTethering() ? \'block\' : \'none\' }"></div>';
+
+                       wifiTetheringContent += '</div>';
+
+                       wifiTetheringContent += '<div class="buttonsArea">';
+                       wifiTetheringContent += '<div id="startWifiHandover" class="toggleButton wifiHandoverButton" data-bind="click: Settings.Wifi.toggleHandover">';
+                       wifiTetheringContent += '<div class="bgColorThemeTransparent boxShadowInset toggleButtonBackground"></div>';
+                       wifiTetheringContent += '<div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: \'START WIFI HANDOVER\'"></div>';
+                       wifiTetheringContent += '</div>';
+                       wifiTetheringContent += '</div>';
+
+                       wifiTetheringContent = $(wifiTetheringContent);
+
+                       wifiTetheringContent.find("#inputSsid").on("change", function() {
+                               // self.setTethering();
+                               return false;
+                       });
+                       wifiTetheringContent.find("#buttonDeleteSsid").click(function() {
+                               self.deleteCharFromInput(wifiTetheringContent.find("#inputSsid"));
+                               // self.setTethering();
+                               return false;
+                       });
+
+                       wifiTetheringContent.find("#inputPassword").on("change", function() {
+                               // self.setTethering();
+                               return false;
+                       });
+                       wifiTetheringContent.find("#buttonDeletePassword").click(function() {
+                               self.deleteCharFromInput(wifiTetheringContent.find("#inputPassword"));
+                               // self.setTethering();
+                               return false;
+                       });
+
+                       wifiTetheringContent.find("#buttonNextSecurity").click(function() {
+                               /*var currentSecurity = self.tetheringSecurity();
+                               currentSecurity = currentSecurity + 1;
+                               if (currentSecurity >= self.SECURITY_TYPE.length) {
+                                       currentSecurity = 0;
+                               }
+                               self.tetheringSecurity(currentSecurity);
+                               self.setTethering();*/
+                               return false;
+                       });
+
+                       wifiTetheringContent.find("#buttonPreviousSecurity").click(function() {
+                               /*var currentSecurity = self.tetheringSecurity();
+                               currentSecurity = currentSecurity - 1;
+                               if (currentSecurity < 0) {
+                                       currentSecurity = self.SECURITY_TYPE.length - 1;
+                               }
+                               self.tetheringSecurity(currentSecurity);
+                               self.setTethering();*/
+                               return false;
+                       });
+
+                       wifiTetheringContent.appendTo("." + wifiTetheringContentClass);
+                       ko.applyBindings(window.Settings);
+               }
+       }
+
+       var wifiTetheringContentClass = "wifiTetheringContent";
+       Settings.domElement.tabs("clearContent");
+       Settings.domElement.tabs("changeContentClass", wifiTetheringContentClass);
+       Settings.domElement.tabs("subpanelContentTemplateCompile", subpanelModel, loadTetheringUI);
+};
\ No newline at end of file
diff --git a/css/car/components/settings/templates/template-bluetooth.html b/css/car/components/settings/templates/template-bluetooth.html
new file mode 100644 (file)
index 0000000..abbb120
--- /dev/null
@@ -0,0 +1,13 @@
+<div class="wifiElement borderColorTheme" data-bind='click: Settings.Bluetooth.openDeviceDetails'>
+       <div class="wifiElementInfoBox">
+               <div class="wifiElementTitle fontSizeLarge fontWeightBold fontColorNormal" data-bind='text: name'></div>
+               <div class="wifiElementSubtitle fontSizeSmaller fontColorNormal fontWeightBold" data-bind='text: "Address: " + address'></div>
+               <div class="wifiElementDescription fontSizeSmaller fontColorNormal fontWeightBold" data-bind='text: "Class: " + Settings.Bluetooth.getDeviceClassStr(deviceClass)'></div>
+               <div class="wifiElementMore fontSizeSmaller fontColorSelected fontWeightBold" data-bind='text: "Paired", style: { display: isBonded ? "block" : "none" }'></div>
+               <div class="wifiElementMore fontSizeSmaller fontColorSelected fontWeightBold" data-bind="text: 'SELECTED PHONE', style: { display: isBonded && Settings.Bluetooth.isDeviceSelected($data) ? 'block' : 'none' }"></div>
+       </div>
+       <div class="toggleButton wifiElementButton" data-bind="clickBubble: false, click: Settings.Bluetooth.togglePair">
+               <div class="bgColorThemeTransparent boxShadowInset toggleButton toggleButtonBackground"></div>
+               <div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: isBonded ? 'UNPAIR' : 'PAIR', css: { fontColorSelected: isBonded == true }"></div>
+       </div>
+</div>
\ No newline at end of file
diff --git a/css/car/components/settings/templates/template-settings.html b/css/car/components/settings/templates/template-settings.html
new file mode 100644 (file)
index 0000000..428476a
--- /dev/null
@@ -0,0 +1,3 @@
+<div
+       class="settingElement fontSizeLarge fontWeightBold fontColorNormal borderColorTheme"
+       data-bind='click: Settings.openSetting, text: name'></div>
diff --git a/css/car/components/settings/templates/template-themes.html b/css/car/components/settings/templates/template-themes.html
new file mode 100644 (file)
index 0000000..474a894
--- /dev/null
@@ -0,0 +1,7 @@
+<div class="themeElement boxShadow4" data-bind='click: Settings.Theme.setTheme'>
+       <div class="themeImage noThemeImage">
+               <img data-bind="attr:{src: iconUrl}" />
+       </div>
+       <div
+               class="fontSizeLarge fontWeightBold fontColorNormal themeTitle textBgColorNormalTransparent" data-bind="text: name, css: { fontColorSelected: selected == true }"></div>
+</div>
\ No newline at end of file
diff --git a/css/car/components/settings/templates/template-wifi.html b/css/car/components/settings/templates/template-wifi.html
new file mode 100644 (file)
index 0000000..d02e61b
--- /dev/null
@@ -0,0 +1,14 @@
+<div class="wifiElement borderColorTheme" data-bind='click: Settings.Wifi.openNetworkDetails'>
+       <div class="wifiElementInfoBox">
+               <div class="wifiElementTitle fontSizeLarge fontWeightBold fontColorNormal fontWeightBold" data-bind="text: Settings.Wifi.getSsidStr(prop)"></div>
+               <div class="wifiElementSubtitle fontSizeSmaller fontColorNormal fontWeightBold" data-bind='text: "Signal: " + Settings.Wifi.getSignalStrengthStr(prop)'></div>
+               <div class="wifiElementDescription fontSizeSmaller fontColorNormal fontWeightBold" data-bind='text: "Encryption: " + Settings.Wifi.getEncryptionStr(prop)'></div>
+               <div class="wifiElementMore fontSizeSmaller fontColorNormal fontWeightBold" data-bind='text: "Security: " + Settings.Wifi.getSecurityStr(prop)'></div>
+               <div class="wifiElementMore fontSizeSmaller fontColorSelected fontWeightBold" data-bind='text: "Connected", style: { display: Settings.Wifi.isConnected(prop) ? "block" : "none" }'></div>
+               <div class="wifiElementMore fontSizeSmaller fontColorSelected fontWeightBold" data-bind="text: Settings.Wifi.isOnlineWifiNetwork(id) ? 'INTERNET ACCESS' : 'NO INTERNET ACCESS', css: { fontColorLightRed: Settings.Wifi.isOnlineWifiNetwork(id) == false }, style: { display: Settings.Wifi.isConnected(prop) ? 'block' : 'none' }"></div>
+       </div>
+       <div class="toggleButton wifiElementButton" data-bind="clickBubble: false, click: Settings.Wifi.toggleConnection">
+               <div class="bgColorThemeTransparent boxShadowInset toggleButton toggleButtonBackground"></div>
+               <div class="fontColorNormal fontSizeMedium fontWeightBold toggleButtonText" data-bind="text: Settings.Wifi.isConnected(prop) ? 'DISCONNECT' : 'CONNECT', css: { fontColorSelected: Settings.Wifi.isConnected(prop) }"></div>
+       </div>
+</div>
\ No newline at end of file
diff --git a/css/car/components/tabs/tabs.css b/css/car/components/tabs/tabs.css
new file mode 100644 (file)
index 0000000..70db13d
--- /dev/null
@@ -0,0 +1,132 @@
+.tabs {
+       position: absolute;
+       left: 0;
+       top: 0;
+       width: 720px;
+       min-height: 1280px;
+       z-index: 100;
+       display: none;
+}
+
+.tabsTopPanel {
+       margin: 0;
+       padding: 0;
+       height: 110px;
+       background-repeat: no-repeat;
+       background-position: left top;
+       z-index: 1;
+}
+
+.tabsTopPanel .tabsTopPanelTitle {
+       position: absolute;
+       left: 30px;
+       top: 19px;
+       font-size: 0;
+}
+
+.tabsCloseButton {
+       position: absolute;
+       top: 0;
+       right: 0;
+       background-repeat: no-repeat;
+       background-position: center;
+       width: 92px;
+       height: 92px;
+       z-index: 1;
+}
+
+.tabsCloseButton:active {
+       position: absolute;
+       top: 1px;
+}
+
+.tabsTabs {
+       position: absolute;
+       left: 15px;
+       width: 705px;
+       overflow: hidden;
+       white-space: nowrap;
+}
+
+.tabsTab {
+       float: left;
+       padding-top: 33px;
+       padding-left: 15px;
+       padding-right: 15px;
+       height: 77px;
+       max-width: 220px;
+       overflow: hidden;
+       white-space: nowrap;
+       cursor: pointer;
+       background-repeat: repeat-x;
+       background-position: center top;
+       text-transform: uppercase;
+}
+
+.tabsTabSelected {
+       background-repeat: no-repeat;
+}
+
+.tabsTabClear {
+       display: inline-block;
+       height: 110px;
+       width: 705px;
+       background-repeat: repeat-x;
+       background-position: center top;
+}
+
+.tabsTopSubPanel {
+       margin-top: -20px;
+       margin-bottom: 20px;
+       padding-top: 20px;
+       height: 60px;
+       z-index: 0;
+}
+
+.tabsCloseSubPanelButton {
+       height: 43px;
+       background-repeat: no-repeat;
+       background-position: left top;
+       text-align: right;
+       padding: 0 15px 0 35px;
+       line-height: 43px !important;
+       display: block;
+       margin-left: 20px;
+       /*vertical-align: top;*/
+       cursor: pointer;
+       text-transform: uppercase;
+       position: absolute;
+       top: 20px;
+}
+
+.tabsCloseSubPanelButton:active {
+       top: 21px;
+}
+
+.tabsTopSubPanel .tabsSubPanelArea {
+       margin-top: -2px;
+       margin-left: 150px;
+       /*vertical-align: top;*/
+       display: block;
+       line-height: 0;
+       text-transform: uppercase;
+       max-width: 330px;
+       overflow: hidden;
+       position: absolute;
+}
+
+.tabsContent {
+       margin-left: 20px;
+       margin-right: 20px;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+
+.tabsTopPanelTitleHint {
+       float: right;
+       bottom: 10px;
+       right: 34px;
+       z-index: 100;
+       position: absolute;
+       text-transform: uppercase;
+}
\ No newline at end of file
diff --git a/css/car/components/tabs/tabs.js b/css/car/components/tabs/tabs.js
new file mode 100644 (file)
index 0000000..c0a9070
--- /dev/null
@@ -0,0 +1,418 @@
+/*global loadScript, template */
+
+/**
+ * @module CarTheme
+ **/
+
+/**
+ * Tabs is standard **JQuery plugin** which represents data UI control element that is used to display to divide UI into multiple logical sections, so called tabs.
+ * Rendering of individual parts of this element is done by template mechanism.
+ *
+ * This class requires following componets:
+ *
+ * * {{#crossLink "BoxCaption"}}{{/crossLink}} component
+ *
+ * This class is usually loaded from {{#crossLink "Settings"}}{{/crossLink}} component and since this component is included in every Tizen PoC
+ * application it's available for future use. Use following code to initialize:
+ *
+ *      $('#tabPage').tabs("setSectionTitle", "SECTION");
+ *      $('#tabPage').tabs("setSectionHint", "section hint");
+ *      $('#tabPage').tabs('init');
+ *
+ * Hover and click on elements in images below to navigate to components or driving properties of Tabs application.
+ *
+ * <img id="Image-Maps_1201312180420487" src="../assets/img/tabs.png" usemap="#Image-Maps_1201312180420487" border="0" width="649" height="1152" alt="" />
+ *   <map id="_Image-Maps_1201312180420487" name="Image-Maps_1201312180420487">
+ *     <area shape="rect" coords="1,1,360,31" alt="Tabs title" title="Tabs title" href="{{#crossLinkRaw "Tabs/sectionTitle:property"}}{{/crossLinkRaw}}" />
+ *     <area shape="rect" coords="1,32,577,80" alt="Top Tab menu" title="Top tab menu" href="{{#crossLinkRaw "Tabs/selectedTopTabIndex:property"}}{{/crossLinkRaw}}" />
+ *     <area shape="rect" coords="578,1,648,80" alt="Close Tabs" title="Closes Tabs" href="{{#crossLinkRaw "Tabs/hidePage:method"}}{{/crossLinkRaw}}" />
+ *     <area shape="rect" coords="1,81,648,1151" alt="Tabs content" title="Tabs content" target="_self" href="{{#crossLinkRaw "Tabs/contentDelegate:property"}}{{/crossLinkRaw}}" >
+ *  </map>
+ * </img>
+ *
+ * @class Tabs
+ * @static
+ */
+
+/**
+ * Default sub panel delegate to render sub panel view.
+ * @property TABS_SUB_PANEL_DELEGATE_DEFAULT
+ * @type {String}
+ * @default "./css/car/components/tabs/templates/subPanelDelegate.html"
+ * @static
+ * @final
+ */
+/**
+ * Default top panel delegate to render top panel view.
+ * @property TABS_TOP_PANEL_DELEGATE_DEFAULT
+ * @type {String}
+ * @default "./css/car/components/tabs/templates/tabMenuItemDelegate.html"
+ * @static
+ * @final
+ */
+var TABS_SUB_PANEL_DELEGATE_DEFAULT = "./css/car/components/tabs/templates/subPanelDelegate.html",
+       TABS_TOP_PANEL_DELEGATE_DEFAULT = "./css/car/components/tabs/templates/tabMenuItemDelegate.html";
+
+(function ($) {
+       "use strict";
+       var Tabs = {
+                       thisObj: null,
+                       /**
+                        * Main content template.
+                        * @property contentDelegate
+                        * @type {String}
+                        * @default null
+                        */
+                       contentDelegate: null,
+                       /**
+                        * Tabs content template.
+                        * @property topPanelDelegate
+                        * @type {String}
+                        * @default TABS_TOP_PANEL_DELEGATE_DEFAULT
+                        */
+                       topPanelDelegate: TABS_TOP_PANEL_DELEGATE_DEFAULT,
+                       /**
+                        * Sub panel content template.
+                        * @property subpanelDelegate
+                        * @type {String}
+                        * @default TABS_SUB_PANEL_DELEGATE_DEFAULT
+                        */
+                       subPanelDelegate: TABS_SUB_PANEL_DELEGATE_DEFAULT,
+                       /**
+                        * Tabs title.
+                        * @property sectionTitle
+                        * @type {String}
+                        * @default null
+                        */
+                       sectionTitle: null,
+                       /**
+                        * Index of selected tab.
+                        * @property selectedTopTabIndex
+                        * @type {Number}
+                        * @default -1
+                        */
+                       selectedTopTabIndex: -1,
+
+                       /**
+                        * Initializes tabs layout and create it's basic view DOM.
+                        *
+                        * @method init
+                        */
+                       init: function () {
+                               this.empty();
+                               var str = "<div id='tabsTopPanel' class='tabsTopPanel'>";
+                               str += "<div class='tabsTopPanelTitle'></div>";
+                               str += "<div class='tabsCloseButton' onClick=\'$(\"#" + this.attr('id') + "\").tabs(\"hidePage\")\'></div>";
+                               str += "<div id='tabsTabsID' class='tabsTabs'></div>";
+                               str += "</div>";
+                               str += "<div id='tabsTopSubPanel' class='tabsTopSubPanel bgColorDark'></div>";
+                               str += "<div id='tabsContent' class='tabsContent'></div>";
+                               str += "<div class='tabsTopPanelTitleHint fontSizeXXSmall fontWeightBold fontColorTheme'>" + Tabs.sectionHint + "</div>";
+                               this.append(str);
+
+                               $(".tabsTopPanelTitle").boxCaptionPlugin('initSmall', Tabs.sectionTitle);
+                               $("#tabsContent").show(0);
+                               $("#tabsTopSubPanel").hide(0);
+                               Tabs.thisObj = this;
+                       },
+                       /**
+                        * Shows tabs on the screen. Move in from right to left animation applied.
+                        * Triggers {{#crossLink "Tabs/eventClick_showPage:event"}}eventClick_showPage{{/crossLink}} event.
+                        *
+                        * @method showPage
+                        */
+                       showPage: function () {
+                               Tabs.thisObj.fadeIn("normal", function() {
+                                       Tabs.updateContentHeight();
+                               });
+                               /**
+                                * Fired when {{#crossLink "Tabs/showPage:method"}}showPage{{/crossLink}} is called.
+                                * It's standard JQuery event and it fires on Tabs object.
+                                *
+                                * @event eventClick_showPage
+                                */
+                               Tabs.thisObj.trigger('eventClick_showPage');
+                       },
+                       /**
+                        * Hides tabs from the screen. Move out from left to right animation applied.
+                        * Triggers {{#crossLink "Tabs/eventClick_hidePage:event"}}eventClick_hidePage{{/crossLink}} event.
+                        *
+                        * @method hidePage
+                        */
+                       hidePage: function () {
+                               Tabs.thisObj.fadeOut();
+                               /**
+                                * Fired when {{#crossLink "Tabs/hidePagee:method"}}hidePage{{/crossLink}} is called.
+                                * It's standard JQuery event and it fires on Tabs object.
+                                *
+                                * @event eventClick_hidePage
+                                */
+                               Tabs.thisObj.trigger('eventClick_hidePage');
+                       },
+                       /**
+                        * Sets tabs title.
+                        *
+                        * @method setSectionTitle
+                        */
+                       setSectionTitle: function (title) {
+                               Tabs.sectionTitle = title;
+                       },
+                       /**
+                        * Sets tabs hint.
+                        *
+                        * @method setSectionHint
+                        */
+                       setSectionHint: function (hint) {
+                               Tabs.sectionHint = hint;
+                       },
+                       /**
+                        * Sets tabs main content template.
+                        *
+                        * @method setContentDelegate
+                        * @param delegate {String} Path to template.
+                        */
+                       setContentDelegate: function (delegate) {
+                               Tabs.contentDelegate = delegate;
+                       },
+                       /**
+                        * Renders the given main content model into the main content DOM element utilizing template mechanism.
+                        *
+                        * @method contentTemplateCompile
+                        * @param model {Array} Array of data elements.
+                        * @param classes {String} Css classes to be added to main content DOM element.
+                        * @param successCallback {Function} Function called when the rendering ends successfully.
+                        */
+                       contentTemplateCompile: function (model, classes, successCallback) {
+                               Tabs.clearContent();
+                               Tabs.changeContentClass(classes);
+                               template.compile(model, Tabs.contentDelegate, "#tabsContent", successCallback);
+                       },
+                       /**
+                        * Adds classes to the main content DOM element.
+                        *
+                        * @method changeContentClass
+                        * @param classes {String} One or more class names to be added to the class attribute of main content DOM element.
+                        */
+                       changeContentClass: function (classes) {
+                               $("#tabsContent").removeClass();
+                               $("#tabsContent").addClass("tabsContent " + classes);
+                       },
+                       /**
+                        * Removes all child nodes of the main content DOM element.
+                        *
+                        * @method clearContent
+                        */
+                       clearContent: function () {
+                               $("#tabsContent").empty();
+                       },
+                       /**
+                        * Sets tabs content template.
+                        *
+                        * @method setMenuItemDelegate
+                        * @param delegate {String} Path to template.
+                        */
+                       setMenuItemDelegate: function (delegate) {
+                               Tabs.topPanelDelegate = delegate;
+                       },
+                       /**
+                        * Renders the given tabs into the tabs DOM element utilizing template mechanism.
+                        *
+                        * @method tabMenuTemplateCompile
+                        * @param model {Array} Array of tabs.
+                        * @param successCallback {Function} Function called when the rendering ends successfully.
+                        */
+                       tabMenuTemplateCompile: function (model, successCallback) {
+                               var i = 0;
+                               for (i = 0; i < model.Tabs.length; i++) {
+                                       model.Tabs[i].index = i;
+                                       if (model.Tabs[i].selected) {
+                                               Tabs.selectedTopTabIndex = model.Tabs[i].index;
+                                       }
+                                       if (model.Tabs[i].action) {
+                                               model.Tabs[i].action = model.Tabs[i].action + "$(\'#" + this.attr('id') + "\').tabs(\'tabsTabClick\'," + i + ");";
+                                       } else {
+                                               model.Tabs[i].action = "$(\'#" + this.attr('id') + "\').tabs(\'tabsTabClick\'," + i + ");";
+                                       }
+                               }
+
+                               if (Tabs.selectedTopTabIndex === -1) {
+                                       Tabs.selectedTopTabIndex = 0;
+                               }
+
+                               template.compile(model, Tabs.topPanelDelegate, "#tabsTabsID", successCallback);
+                       },
+                       /**
+                        * Returns index of selected tab.
+                        *
+                        * @method getSelectetTopTabIndex
+                        * @return {Number} Index of selected tab.
+                        */
+                       getSelectetTopTabIndex: function () {
+                               return Tabs.selectedTopTabIndex;
+                       },
+                       /**
+                        * Sets index and highlight selected tab.
+                        *
+                        * @method setTopTabIndex
+                        * @param index {Number} Index of tab.
+                        */
+                       setTopTabIndex: function (index) {
+                               Tabs.selectedTopTabIndex = index;
+                               $(".tabsTab").removeClass("fontColorSelected tabsTabSelected");
+                               var tabId = "#tabsTab" + index;
+                               $(tabId).toggleClass("fontColorSelected tabsTabSelected");
+                               var selectedTabClass = "tabsTab" + index + "Selected";
+                               $("#tabsTopPanel").attr("class", "tabsTopPanel " + selectedTabClass);
+                       },
+                       /**
+                        * Sets tabs sub panel content template.
+                        *
+                        * @method setSubpanelContentDelegate
+                        * @param delegate {String} Path to template.
+                        */
+                       setSubpanelContentDelegate : function (delegate) {
+                               Tabs.subPanelDelegate = delegate;
+                       },
+                       /**
+                        * Renders the given model into the sub panel DOM element utilizing template mechanism.
+                        *
+                        * @method subpanelContentTemplateCompile
+                        * @param model {Object} Data for sub panel.
+                        * @param successCallback {Function} Function called when the rendering ends successfully.
+                        */
+                       subpanelContentTemplateCompile : function (model, successCallback) {
+                               model.id = this.attr('id');
+                               if (!model.action) {
+                                       model.action = function() {
+                                               Tabs.closeSubpanel(true);
+                                       };
+                                       model.actionName = "BACK";
+                               }
+
+                               if (TABS_SUB_PANEL_DELEGATE_DEFAULT === Tabs.subPanelDelegate) {
+                                       template.compile(model, Tabs.subPanelDelegate, "#tabsTopSubPanel", function() {
+                                               if (!!model.textTitle) {
+                                                       $("#tabsTopSubPanelTitle").boxCaptionPlugin('initSmall', model.textTitle);
+                                               }
+                                               if (!!model.action) {
+                                                       $("#tabsCloseSubPanelButton").click(function() {
+                                                               model.action();
+                                                       });
+                                               }
+                                               Tabs.showSubpanel();
+                                               if (!!successCallback) {
+                                                       successCallback();
+                                               }
+                                       });
+                               } else {
+                                       template.compile(model, Tabs.subPanelDelegate, "#tabsTopSubPanel", function() {
+                                               Tabs.showSubpanel();
+                                               if (!!successCallback) {
+                                                       successCallback();
+                                               }
+                                       });
+                               }
+                       },
+
+                       /**
+                        * Shows sub panel and triggers {{#crossLink "Tabs/eventClick_showSubpanel:event"}}eventClick_showSubpanel{{/crossLink}} event if triggerEvent == true.
+                        *
+                        * @method showSubpanel
+                        * @param triggerEvent {Boolean} Control if {{#crossLink "Tabs/eventClick_showSubpanel:event"}}eventClick_showSubpanel{{/crossLink}} will be triggered.
+                        */
+                       showSubpanel: function (triggerEvent) {
+                               if ($("#tabsTopSubPanel").is(":hidden")) {
+                                       $("#tabsTopSubPanel").show("fast", function() {
+                                               Tabs.updateContentHeight();
+                                       });
+                                       if (!!triggerEvent) {
+                                               /**
+                                                * Fired on sub panel showing caused by calling {{#crossLink "Tabs/showSubpanel:method"}}Tabs.showSubpanel(triggerEvent: boolean){{/crossLink}} method.
+                                                * It's standard JQuery event and it fires on Tabs object.
+                                                *
+                                                * @event eventClick_showSubpanel
+                                                */
+                                               Tabs.thisObj.trigger('eventClick_showSubpanel');
+                                       }
+                               }
+                       },
+                       /**
+                        * Hides sub panel and triggers {{#crossLink "Tabs/eventClick_closeSubpanel:event"}}eventClick_closeSubpanel{{/crossLink}} event if triggerEvent == true.
+                        *
+                        * @method closeSubpanel
+                        * @param triggerEvent {Boolean} Control if {{#crossLink "Tabs/eventClick_closeSubpanel:event"}}eventClick_closeSubpanel{{/crossLink}} will be triggered.
+                        */
+                       closeSubpanel: function (triggerEvent) {
+                               if ($("#tabsTopSubPanel").is(":visible")) {
+                                       $("#tabsTopSubPanel").hide("fast", function() {
+                                               Tabs.updateContentHeight();
+                                       });
+                                       if (!!triggerEvent) {
+                                               /**
+                                                * Fired on sub panel closing caused by calling {{#crossLink "Tabs/closeSubpanel:method"}}Tabs.closeSubpanel(triggerEvent: boolean){{/crossLink}} method.
+                                                * It's standard JQuery event and it fires on Tabs object.
+                                                *
+                                                * @event eventClick_closeSubpanel
+                                                */
+                                               Tabs.thisObj.trigger('eventClick_closeSubpanel');
+                                       }
+                               }
+                       },
+                       /**
+                        * Triggers {{#crossLink "Tabs/eventClick_menuItemBtn:event"}}eventClick_menuItemBtn(triggerEvent: boolean){{/crossLink}} event automatically after clicking on tab.
+                        * Usually used as callback for Tabs tab item click action.
+                        *
+                        * @method tabsTabClick
+                        * @param index {Number} Index of tab.
+                        */
+                       tabsTabClick: function (index) {
+                               Tabs.setTopTabIndex(index);
+                               /**
+                                * Fired on {{#crossLink "Tabs/tabsTabClick:method"}}Tabs.tabsTabClick(index: number){{/crossLink}} method call.
+                                * It's standard JQuery event and it fires on Tabs object.
+                                *
+                                * **indexObject example:**
+                                *
+                                *     { Index : 2 }
+                                *
+                                * @event eventClick_menuItemBtn
+                                * @param indexObject {Object} Contains index of clicked tab.
+                                */
+                               Tabs.thisObj.trigger('eventClick_menuItemBtn', { Index: index });
+                       },
+                       /**
+                        * Updates tab content element height after calling.
+                        *
+                        * @method updateContentHeight
+                        */
+                       updateContentHeight: function() {
+                               var height = Tabs.thisObj.height();
+                               if ($("#tabsTopPanel").is(":visible")) {
+                                       height = height - $("#tabsTopPanel").outerHeight();
+                               }
+                               if ($("#tabsTopSubPanel").is(":visible")) {
+                                       height = height - $("#tabsTopSubPanel").outerHeight();
+                               }
+                               $("#tabsContent").css({
+                                       maxHeight:  height + "px"
+                               });
+                       }
+               };
+       /**
+        * jQuery extension method for for {{#crossLink "Tabs"}}{{/crossLink}} plugin.
+        * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+        * @method tabs
+        * @for jQuery
+        * @return Result of called method.
+        */
+       $.fn.tabs = function (method) {
+               // Method calling logic
+               if (Tabs[method]) {
+                       return Tabs[method].apply(this, Array.prototype.slice.call(arguments, 1));
+               } else if (typeof method === 'object' || !method) {
+                       return Tabs.init.apply(this, arguments);
+               } else {
+                       $.error('Method ' +  method + ' does not exist on jQuery.infoPanelAPI');
+               }
+       };
+}(jQuery));
\ No newline at end of file
diff --git a/css/car/components/tabs/templates/subPanelDelegate.html b/css/car/components/tabs/templates/subPanelDelegate.html
new file mode 100644 (file)
index 0000000..5af3267
--- /dev/null
@@ -0,0 +1,5 @@
+<div id="tabsCloseSubPanelButton" class='tabsCloseSubPanelButton fontSizeSmall fontWeightBold fontColorNormal'>{{:actionName}}</div>
+<div class='tabsSubPanelArea'>
+       <div id='tabsTopSubPanelTitle'></div>
+       <div id='tabsTopSubPanelSubtitle' class='fontSizeLarge fontWeightBold fontColorNormal oneLineEllipsis'>{{:textSubtitle}}</div>
+</div>
\ No newline at end of file
diff --git a/css/car/components/tabs/templates/tabMenuItemDelegate.html b/css/car/components/tabs/templates/tabMenuItemDelegate.html
new file mode 100644 (file)
index 0000000..e85901f
--- /dev/null
@@ -0,0 +1,12 @@
+{{foreach Tabs}}
+       {{if selected == true}}
+                       <div onclick="{{:action}}" id="tabsTab{{:index}}" class="tabsTab tabsTabSelected fontSizeLarger fontWeightBold fontColorNormal fontColorSelected">
+                               {{:text}}
+                       </div>
+       {{else}}
+                       <div onclick="{{:action}}" id="tabsTab{{:index}}" class="tabsTab fontSizeLarger fontWeightBold fontColorNormal">
+                               {{:text}}
+                       </div>
+       {{/if}}
+{{/foreach}}
+                       <div class="tabsTabClear"></div>
\ No newline at end of file
diff --git a/css/car/components/topBarIcons/images/icon_diagnostic_blue.png b/css/car/components/topBarIcons/images/icon_diagnostic_blue.png
new file mode 100644 (file)
index 0000000..f47f24a
Binary files /dev/null and b/css/car/components/topBarIcons/images/icon_diagnostic_blue.png differ
diff --git a/css/car/components/topBarIcons/images/icon_settings_blue.png b/css/car/components/topBarIcons/images/icon_settings_blue.png
new file mode 100644 (file)
index 0000000..155ee9c
Binary files /dev/null and b/css/car/components/topBarIcons/images/icon_settings_blue.png differ
diff --git a/css/car/components/topBarIcons/images/icon_social_blue.png b/css/car/components/topBarIcons/images/icon_social_blue.png
new file mode 100644 (file)
index 0000000..5d956d9
Binary files /dev/null and b/css/car/components/topBarIcons/images/icon_social_blue.png differ
diff --git a/css/car/components/topBarIcons/images/icon_video_blue.png b/css/car/components/topBarIcons/images/icon_video_blue.png
new file mode 100644 (file)
index 0000000..d6f903e
Binary files /dev/null and b/css/car/components/topBarIcons/images/icon_video_blue.png differ
diff --git a/css/car/components/topBarIcons/templates/topBarIconsDelegate.html b/css/car/components/topBarIcons/templates/topBarIconsDelegate.html
new file mode 100644 (file)
index 0000000..8ed3756
--- /dev/null
@@ -0,0 +1,4 @@
+<div
+       class="appIcon {{:css}} borderColorDark {{if lastIcon}} appIconLast {{/if}}"
+       style="{{:style}}"
+       onclick="launchApplication('{{:id}}')"></div>
\ No newline at end of file
diff --git a/css/car/components/topBarIcons/topBarIcons.css b/css/car/components/topBarIcons/topBarIcons.css
new file mode 100644 (file)
index 0000000..10cd4c0
--- /dev/null
@@ -0,0 +1,74 @@
+.topBarIcons {
+       position: absolute;
+       display: block;
+       top: 0;
+       width: 720px;
+       height: 85px;
+       z-index: 1;
+}
+
+.appIcon {
+       cursor: pointer;
+       background-position: center center;
+       background-repeat: no-repeat;
+       visibility: hidden;
+       line-height: 0;
+       width: 79px;
+       height: 84px;
+       display: inline-block;
+       border-right-width: 1px;
+       border-right-style: solid;
+       background-size: 90%;
+       -webkit-transition-timing-function: linear;
+       -webkit-transition: all 1s,background-image 0s;
+
+       -moz-transition-timing-function: linear;
+       -moz-transition: all 1s,background-image 0s;
+
+       -ms-transition-timing-function: linear;
+       -ms-transition:all 1s,background-image 0s;
+
+       -o-transition-timing-function: linear;
+       -o-transition:all 1s,background-image 0s;
+}
+
+.appIconLast {
+       border: none;
+}
+
+.appIconNo {
+       background-image: url('images/icon_back_blue.png');
+}
+
+.appIconNo0 {
+       background-image: url('images/icon_maps_blue.png');
+}
+
+.appIconNo1 {
+       background-image: url('images/icon_fan_blue.png');
+}
+
+.appIconNo2 {
+       background-image: url('images/icon_music_blue.png');
+}
+
+.appIconNo3 {
+       background-image: url('images/icon_video_blue.png');
+}
+
+.appIconNo4 {
+       background-image: url('images/icon_phone_blue.png');
+}
+
+.appIconNo5 {
+       background-image: url('images/icon_social_blue.png');
+}
+
+.appIconNo6 {
+       background-image: url('images/icon_diagnostic_blue.png');
+}
+
+.appIconNo7 {
+       background-image: url('images/icon_settings_blue.png');
+       background-size: 65%;
+}
\ No newline at end of file
diff --git a/css/car/components/topBarIcons/topBarIcons.js b/css/car/components/topBarIcons/topBarIcons.js
new file mode 100644 (file)
index 0000000..ff08b66
--- /dev/null
@@ -0,0 +1,351 @@
+/*global ThemeEngine, loadScript, template, changeCssBgImageColor, ThemeKeyColorSelected, ThemeKeyColor, Speech, Settings */
+
+/**
+ * @module CarTheme
+ **/
+/**
+ * Array of applications that will be rendered to the top bar panel.
+ * @property topBarAplicationsModel
+ * @type {Array}
+ * @for window
+ */
+
+var topBarAplicationsModel = [];
+
+/**
+ * Array of applications that would not fit the top bar panel.
+ * @property extraAppsModel
+ * @type {Array}
+ * @for global
+ */
+var extraAppsModel = [];
+
+/**
+ * The callback to be invoked when the application was not launched successfully.
+ *
+ * @method onError
+ * @for window
+ * @param err {Any} An error message.
+ */
+function onError(err) {
+       "use strict";
+       console.error(err);
+       alert("An error occured while launching the application: " + err.message);
+}
+
+/**
+ * Returns the application object by application id from topBarAplicationsModel.
+ *
+ * @method getAppByID
+ * @for window
+ * @param id {String} Application ID.
+ * @return {Object} Object representing basic application's information.
+ */
+function getAppByID(id) {
+       "use strict";
+       var j, i = 0;
+       for (j = 0; j < topBarAplicationsModel.length; ++j) {
+               if (id === topBarAplicationsModel[j].id) {
+                       return topBarAplicationsModel[j];
+               }
+       }
+       for (i = 0; i < extraAppsModel.length; ++i) {
+               if (id === extraAppsModel[i].id) {
+                       return extraAppsModel[i];
+               }
+       }
+
+       return null;
+}
+
+/**
+ * Returns the application object by application name from topBarAplicationsModel.
+ *
+ * @method getAppByName
+ * @for window
+ * @param appName {String} Application name.
+ * @return {Object} Object representing basic application's information.
+ */
+function getAppByName(appName) {
+       "use strict";
+       for (var j = 0; j < topBarAplicationsModel.length; ++j) {
+               if (appName.toString().trim().toLowerCase() === topBarAplicationsModel[j].appName.toString().trim().toLowerCase()) {
+                       return topBarAplicationsModel[j];
+               }
+       }
+       for (var i = 0; i < extraAppsModel.length; ++i) {
+               if (appName.toString().trim().toLowerCase() === extraAppsModel[i].appName.toString().trim().toLowerCase()) {
+                       return extraAppsModel[i];
+               }
+       }
+
+       return null;
+}
+
+/**
+ * The callback to be invoked when the application was launched successfully.
+ *
+ * @method onAppInfoSuccess
+ * @for window
+ */
+function onLaunchSuccess() {
+       "use strict";
+       console.log("App launched succesfully...");
+       tizen.application.getCurrentApplication().hide();
+}
+
+/**
+ * Launches an application with the given application ID.
+ *
+ * @method launchApplication
+ * @for window
+ * @param id {String} Application ID.
+ */
+function launchApplication(id) {
+       "use strict";
+       if (id === "http://com.intel.tizen/settings") {
+               if (typeof Settings === 'undefined') {
+                       loadScript('./css/car/components/settings/js/settings.js', function(path, status) {
+                               if (status === "ok") {
+                                       Settings.init();
+                               }
+                       });
+               } else {
+                       Settings.show();
+               }
+               return;
+       }
+
+       var app = getAppByID(id);
+       if ( !! app) {
+               if (app.installed && !app.running) {
+                       tizen.application.launch(app.id, onLaunchSuccess, onError);
+               } else if (app.running) {
+                       console.log("Application is running!");
+               }
+       } else {
+               console.log("Application is not installed!");
+               alert("Application is not installed!");
+       }
+}
+
+(function($) {
+       "use strict";
+       /**
+        * Represents top bar UI control element that is used to navigate between predefined set of applications. Applications displayed in this list must have
+        * [application ID](https://developer.tizen.org/dev-guide/2.2.1/org.tizen.web.device.apireference/tizen/application.html#::Application::ApplicationId)
+        * starting with `intelPoC` prefix (e.g. `html5POC04.HomeScreen`). Use following snippet to include component in your `index.html` file:
+     *
+     *     <script type='text/javascript' src='./css/car/components/topBarIcons/topBarIcons.js'></script>
+        *     <link rel="stylesheet" href="./css/car/components/topBarIcons/topBarIcons.css" />
+     *
+     * and following code to initialize:
+     *
+     *     $("#topBarIcons").topBarIconsPlugin('init');
+     *
+        * @class TopBarIcons
+        * @constructor
+        */
+       var TopBarIcons = {
+               /**
+                * Name of the application that is used to highlight only the icon of currently running application.
+                * @property runningAppName
+                * @type {String}
+                * @default ""
+                */
+               runningAppName: "",
+
+               /**
+                * Initializes the element and gets the list of installed application.
+                *
+                * @method init
+                * @param appName {String} Name of running application.
+                */
+               init: function() {
+                       TopBarIcons.initLaunchingAppsByVoiceRecognition();
+                       TopBarIcons.runningAppName = typeof(tizen) === 'undefined' ? "" : tizen.application.getCurrentApplication().appInfo.id;
+
+                       this.empty();
+                       this.addClass("topBarIcons");
+
+                       if (typeof ThemeEngine !== 'undefined') {
+                               ThemeEngine.addStatusListener(function(themeId) {
+                                       TopBarIcons.renderApps();
+                               });
+                       } else {
+                               console.error("ThemeEngine API is not available.");
+                       }
+
+                       TopBarIcons._getApps();
+               },
+
+               _getApps: function() {
+                       try {
+                               if (typeof(tizen) !== 'undefined') {
+                                       tizen.application.getAppsInfo(TopBarIcons.onAppInfoSuccess, function(err) {
+                                               // Workaround due to https://bugs.tizen.org/jira/browse/TIVI-2018
+                                               window.setTimeout(function() {
+                                                       TopBarIcons._getApps();
+                                               }, 1000);
+
+                                               onError(err);
+                                       });
+                               }
+                       } catch (exc) {
+                               console.error(exc.message);
+                       }
+               },
+               appList: [],
+               prevThemeColor: "",
+               /**
+                * The callback to be invoked when the installed application list is retrieved. Compares list of installed applications to predefined list and sets installed and running properties, that are used when launching an application.
+                * Calls render application icons function.
+                * @method onAppInfoSuccess
+                * @param list {Array} Array of installed application.
+                */
+               onAppInfoSuccess: function(list) {
+                       try {
+                               var appListLenght;
+                                       var i = 0,
+                                               j = 0;
+                                       var modelData = [];
+                                       var homeScreenApp = {};
+
+                                       for (i = 0; i < list.length; i++) {
+                                               var app = list[i];
+                                               if (app.id.indexOf('html5POC') >= 0) {
+                                                       var newApp = {
+                                                               id: app.id,
+                                                               appName: app.name,
+                                                               style: "background-image: url('file://" + app.iconPath + "');",
+                                                               iconPath: app.iconPath,
+                                                               css: "app_" + app.id.replace(/\./g, "_").replace(/\ /g, "_"),
+                                                               installed: true,
+                                                               running: TopBarIcons.runningAppName === app.id
+                                                       };
+
+                                                       if (app.id === "html5POC04.HomeScreen") {
+                                                               homeScreenApp = newApp;
+                                                       } else {
+                                                               //app filter to block adding some apps into topbar
+                                                               if (app.id === 'html5POC02.AMBSimulator') {
+                                                                       extraAppsModel.push(newApp);
+                                                               } else if (modelData.length < 7) {
+                                                                       modelData.push(newApp);
+                                                               }
+                                                       }
+                                               }
+                                       }
+
+                                       modelData.sort(function(x, y) {
+                                               return x.appName > y.appName ? 1 : -1;
+                                       });
+
+                                       modelData.unshift(homeScreenApp);
+                                       while (modelData.length < 8) {
+                                               modelData.push({});
+                                       }
+
+                                       modelData.push({
+                                               id: "http://com.intel.tizen/settings",
+                                               appName: "settings",
+                                               css: "appIconNo7",
+                                               installed: true,
+                                               lastIcon: true
+                                       });
+                                       var equals = modelData.length === topBarAplicationsModel.length;
+
+                                       if (equals) {
+                                               for (j = 0; j < modelData.length; j++) {
+                                                       equals = modelData[j].id === topBarAplicationsModel[j].id ? equals : false;
+                                                       equals = modelData[j].appName === topBarAplicationsModel[j].appName ? equals : false;
+                                                       equals = modelData[j].css === topBarAplicationsModel[j].css ? equals : false;
+                                                       equals = modelData[j].iconPath === topBarAplicationsModel[j].iconPath ? equals : false;
+                                               }
+                                       }
+
+                                       if (!equals) {
+                                               topBarAplicationsModel = modelData;
+                                               if (appListLenght !== list.length) {
+                                                       loadScript('./css/car/components/jsViews/jsrender.js', function(path, status) {
+                                                               if (status === "ok") {
+                                                                       loadScript('./css/car/components/jsViews/template.js', function(path, status) {
+                                                                               if (status === "ok") {
+                                                                                       TopBarIcons.renderApps();
+
+                                                                                       // jsRender adds additional properties so we need to store it once again for comparsion in next round
+                                                                                       topBarAplicationsModel = modelData;
+                                                                               }
+                                                                       });
+                                                               }
+                                                       });
+                                               }
+                                       }
+                       } catch (exc) {
+                               console.error(exc.message);
+                       } finally {
+                               // Workaround due to https://bugs.tizen.org/jira/browse/TIVI-2018
+                               window.setTimeout(function() {
+                                       TopBarIcons._getApps();
+                               }, 1000);
+                       }
+               },
+
+               /**
+                * Renders the array of predefined applications into the panel utilizing template mechanism.
+                *
+                * @method renderApps
+                * @param caption {String} Caption text.
+                */
+               renderApps: function() {
+                       $(".topBarIcons").empty();
+                       //$(".topBarIcons").css("display", "none");
+
+                       template.compile(topBarAplicationsModel, "./css/car/components/topBarIcons/templates/topBarIconsDelegate.html", ".topBarIcons", function() {
+                               var j = 0;
+                               for (j = 0; j < topBarAplicationsModel.length; ++j) {
+                                       if (topBarAplicationsModel[j].running) {
+                                               changeCssBgImageColor("." + topBarAplicationsModel[j].css, ThemeKeyColorSelected);
+                                       } else {
+                                               changeCssBgImageColor("." + topBarAplicationsModel[j].css, ThemeKeyColor);
+                                       }
+                               }
+                               setTimeout(function() {
+                                       //      $(".topBarIcons").css("display", "block");
+                               }, 200);
+                       });
+               },
+               initLaunchingAppsByVoiceRecognition: function() {
+                       if (typeof(Speech) !== 'undefined') {
+                               Speech.addVoiceRecognitionListener({
+                                       onapplicationlaunch: function(appName) {
+                                               // check if app is in foreground
+                                               //if (!document. webkitHidden) {
+                                               launchApplication(getAppByName(appName).id);
+                                               //}
+                                       }
+                               });
+                       } else {
+                               console.warn("Speech API is not available.");
+                       }
+               }
+       };
+
+       /**
+        * jQuery extension method for class {{#crossLink "TopBarIcons"}}{{/crossLink}} plugin.
+        * @param method {Object|jQuery selector} Identificator (name) of method or jQuery selector.
+        * @method topBarIconsPlugin
+        * @for jQuery
+        * @return Result of called method.
+        */
+       $.fn.topBarIconsPlugin = function(method) {
+               // Method calling logic
+               if (TopBarIcons[method]) {
+                       return TopBarIcons[method].apply(this, Array.prototype.slice.call(arguments, 1));
+               } else if (typeof method === 'object' || !method) {
+                       return TopBarIcons.init.apply(this, arguments);
+               } else {
+                       $.error('Method ' + method + ' does not exist on jQuery.boxCaptionPlugin');
+               }
+       };
+}(jQuery));
diff --git a/css/car/components/tween/tween.js b/css/car/components/tween/tween.js
new file mode 100644 (file)
index 0000000..b246ead
--- /dev/null
@@ -0,0 +1,741 @@
+/**
+ * @author sole / http://soledadpenades.com
+ * @author mrdoob / http://mrdoob.com
+ * @author Robert Eisele / http://www.xarg.org
+ * @author Philippe / http://philippe.elsass.me
+ * @author Robert Penner / http://www.robertpenner.com/easing_terms_of_use.html
+ * @author Paul Lewis / http://www.aerotwist.com/
+ * @author lechecacharro
+ * @author Josh Faul / http://jocafa.com/
+ * @author egraether / http://egraether.com/
+ * @author endel / http://endel.me
+ * @author Ben Delarre / http://delarre.net
+ */
+
+// Date.now shim for (ahem) Internet Explo(d|r)er
+if ( Date.now === undefined ) {
+
+       Date.now = function () {
+
+               return new Date().valueOf();
+
+       };
+
+}
+
+var TWEEN = TWEEN || ( function () {
+
+       var _tweens = [];
+
+       return {
+
+               REVISION: '12',
+
+               getAll: function () {
+
+                       return _tweens;
+
+               },
+
+               removeAll: function () {
+
+                       _tweens = [];
+
+               },
+
+               add: function ( tween ) {
+
+                       _tweens.push( tween );
+
+               },
+
+               remove: function ( tween ) {
+
+                       var i = _tweens.indexOf( tween );
+
+                       if ( i !== -1 ) {
+
+                               _tweens.splice( i, 1 );
+
+                       }
+
+               },
+
+               update: function ( time ) {
+
+                       if ( _tweens.length === 0 ) return false;
+
+                       var i = 0;
+
+                       time = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() );
+
+                       while ( i < _tweens.length ) {
+
+                               if ( _tweens[ i ].update( time ) ) {
+
+                                       i++;
+
+                               } else {
+
+                                       _tweens.splice( i, 1 );
+
+                               }
+
+                       }
+
+                       return true;
+
+               }
+       };
+
+} )();
+
+TWEEN.Tween = function ( object ) {
+
+       var _object = object;
+       var _valuesStart = {};
+       var _valuesEnd = {};
+       var _valuesStartRepeat = {};
+       var _duration = 1000;
+       var _repeat = 0;
+       var _yoyo = false;
+       var _isPlaying = false;
+       var _reversed = false;
+       var _delayTime = 0;
+       var _startTime = null;
+       var _easingFunction = TWEEN.Easing.Linear.None;
+       var _interpolationFunction = TWEEN.Interpolation.Linear;
+       var _chainedTweens = [];
+       var _onStartCallback = null;
+       var _onStartCallbackFired = false;
+       var _onUpdateCallback = null;
+       var _onCompleteCallback = null;
+
+       // Set all starting values present on the target object
+       for ( var field in object ) {
+
+               _valuesStart[ field ] = parseFloat(object[field], 10);
+
+       }
+
+       this.to = function ( properties, duration ) {
+
+               if ( duration !== undefined ) {
+
+                       _duration = duration;
+
+               }
+
+               _valuesEnd = properties;
+
+               return this;
+
+       };
+
+       this.start = function ( time ) {
+
+               TWEEN.add( this );
+
+               _isPlaying = true;
+
+               _onStartCallbackFired = false;
+
+               _startTime = time !== undefined ? time : ( typeof window !== 'undefined' && window.performance !== undefined && window.performance.now !== undefined ? window.performance.now() : Date.now() );
+               _startTime += _delayTime;
+
+               for ( var property in _valuesEnd ) {
+
+                       // check if an Array was provided as property value
+                       if ( _valuesEnd[ property ] instanceof Array ) {
+
+                               if ( _valuesEnd[ property ].length === 0 ) {
+
+                                       continue;
+
+                               }
+
+                               // create a local copy of the Array with the start value at the front
+                               _valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );
+
+                       }
+
+                       _valuesStart[ property ] = _object[ property ];
+
+                       if( ( _valuesStart[ property ] instanceof Array ) === false ) {
+                               _valuesStart[ property ] *= 1.0; // Ensures we're using numbers, not strings
+                       }
+
+                       _valuesStartRepeat[ property ] = _valuesStart[ property ] || 0;
+
+               }
+
+               return this;
+
+       };
+
+       this.stop = function () {
+
+               if ( !_isPlaying ) {
+                       return this;
+               }
+
+               TWEEN.remove( this );
+               _isPlaying = false;
+               this.stopChainedTweens();
+               return this;
+
+       };
+
+       this.stopChainedTweens = function () {
+
+               for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {
+
+                       _chainedTweens[ i ].stop();
+
+               }
+
+       };
+
+       this.delay = function ( amount ) {
+
+               _delayTime = amount;
+               return this;
+
+       };
+
+       this.repeat = function ( times ) {
+
+               _repeat = times;
+               return this;
+
+       };
+
+       this.yoyo = function( yoyo ) {
+
+               _yoyo = yoyo;
+               return this;
+
+       };
+
+
+       this.easing = function ( easing ) {
+
+               _easingFunction = easing;
+               return this;
+
+       };
+
+       this.interpolation = function ( interpolation ) {
+
+               _interpolationFunction = interpolation;
+               return this;
+
+       };
+
+       this.chain = function () {
+
+               _chainedTweens = arguments;
+               return this;
+
+       };
+
+       this.onStart = function ( callback ) {
+
+               _onStartCallback = callback;
+               return this;
+
+       };
+
+       this.onUpdate = function ( callback ) {
+
+               _onUpdateCallback = callback;
+               return this;
+
+       };
+
+       this.onComplete = function ( callback ) {
+
+               _onCompleteCallback = callback;
+               return this;
+
+       };
+
+       this.update = function ( time ) {
+
+               var property;
+
+               if ( time < _startTime ) {
+
+                       return true;
+
+               }
+
+               if ( _onStartCallbackFired === false ) {
+
+                       if ( _onStartCallback !== null ) {
+
+                               _onStartCallback.call( _object );
+
+                       }
+
+                       _onStartCallbackFired = true;
+
+               }
+
+               var elapsed = ( time - _startTime ) / _duration;
+               elapsed = elapsed > 1 ? 1 : elapsed;
+
+               var value = _easingFunction( elapsed );
+
+               for ( property in _valuesEnd ) {
+
+                       var start = _valuesStart[ property ] || 0;
+                       var end = _valuesEnd[ property ];
+
+                       if ( end instanceof Array ) {
+
+                               _object[ property ] = _interpolationFunction( end, value );
+
+                       } else {
+
+                // Parses relative end values with start as base (e.g.: +10, -3)
+                               if ( typeof(end) === "string" ) {
+                                       end = start + parseFloat(end, 10);
+                               }
+
+                               // protect against non numeric properties.
+                if ( typeof(end) === "number" ) {
+                                       _object[ property ] = start + ( end - start ) * value;
+                               }
+
+                       }
+
+               }
+
+               if ( _onUpdateCallback !== null ) {
+
+                       _onUpdateCallback.call( _object, value );
+
+               }
+
+               if ( elapsed == 1 ) {
+
+                       if ( _repeat > 0 ) {
+
+                               if( isFinite( _repeat ) ) {
+                                       _repeat--;
+                               }
+
+                               // reassign starting values, restart by making startTime = now
+                               for( property in _valuesStartRepeat ) {
+
+                                       if ( typeof( _valuesEnd[ property ] ) === "string" ) {
+                                               _valuesStartRepeat[ property ] = _valuesStartRepeat[ property ] + parseFloat(_valuesEnd[ property ], 10);
+                                       }
+
+                                       if (_yoyo) {
+                                               var tmp = _valuesStartRepeat[ property ];
+                                               _valuesStartRepeat[ property ] = _valuesEnd[ property ];
+                                               _valuesEnd[ property ] = tmp;
+                                               _reversed = !_reversed;
+                                       }
+                                       _valuesStart[ property ] = _valuesStartRepeat[ property ];
+
+                               }
+
+                               _startTime = time + _delayTime;
+
+                               return true;
+
+                       } else {
+
+                               if ( _onCompleteCallback !== null ) {
+
+                                       _onCompleteCallback.call( _object );
+
+                               }
+
+                               for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i++ ) {
+
+                                       _chainedTweens[ i ].start( time );
+
+                               }
+
+                               return false;
+
+                       }
+
+               }
+
+               return true;
+
+       };
+
+};
+
+
+TWEEN.Easing = {
+
+       Linear: {
+
+               None: function ( k ) {
+
+                       return k;
+
+               }
+
+       },
+
+       Quadratic: {
+
+               In: function ( k ) {
+
+                       return k * k;
+
+               },
+
+               Out: function ( k ) {
+
+                       return k * ( 2 - k );
+
+               },
+
+               InOut: function ( k ) {
+
+                       if ( ( k *= 2 ) < 1 ) return 0.5 * k * k;
+                       return - 0.5 * ( --k * ( k - 2 ) - 1 );
+
+               }
+
+       },
+
+       Cubic: {
+
+               In: function ( k ) {
+
+                       return k * k * k;
+
+               },
+
+               Out: function ( k ) {
+
+                       return --k * k * k + 1;
+
+               },
+
+               InOut: function ( k ) {
+
+                       if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;
+                       return 0.5 * ( ( k -= 2 ) * k * k + 2 );
+
+               }
+
+       },
+
+       Quartic: {
+
+               In: function ( k ) {
+
+                       return k * k * k * k;
+
+               },
+
+               Out: function ( k ) {
+
+                       return 1 - ( --k * k * k * k );
+
+               },
+
+               InOut: function ( k ) {
+
+                       if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;
+                       return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );
+
+               }
+
+       },
+
+       Quintic: {
+
+               In: function ( k ) {
+
+                       return k * k * k * k * k;
+
+               },
+
+               Out: function ( k ) {
+
+                       return --k * k * k * k * k + 1;
+
+               },
+
+               InOut: function ( k ) {
+
+                       if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;
+                       return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );
+
+               }
+
+       },
+
+       Sinusoidal: {
+
+               In: function ( k ) {
+
+                       return 1 - Math.cos( k * Math.PI / 2 );
+
+               },
+
+               Out: function ( k ) {
+
+                       return Math.sin( k * Math.PI / 2 );
+
+               },
+
+               InOut: function ( k ) {
+
+                       return 0.5 * ( 1 - Math.cos( Math.PI * k ) );
+
+               }
+
+       },
+
+       Exponential: {
+
+               In: function ( k ) {
+
+                       return k === 0 ? 0 : Math.pow( 1024, k - 1 );
+
+               },
+
+               Out: function ( k ) {
+
+                       return k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );
+
+               },
+
+               InOut: function ( k ) {
+
+                       if ( k === 0 ) return 0;
+                       if ( k === 1 ) return 1;
+                       if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );
+                       return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );
+
+               }
+
+       },
+
+       Circular: {
+
+               In: function ( k ) {
+
+                       return 1 - Math.sqrt( 1 - k * k );
+
+               },
+
+               Out: function ( k ) {
+
+                       return Math.sqrt( 1 - ( --k * k ) );
+
+               },
+
+               InOut: function ( k ) {
+
+                       if ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);
+                       return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);
+
+               }
+
+       },
+
+       Elastic: {
+
+               In: function ( k ) {
+
+                       var s, a = 0.1, p = 0.4;
+                       if ( k === 0 ) return 0;
+                       if ( k === 1 ) return 1;
+                       if ( !a || a < 1 ) { a = 1; s = p / 4; }
+                       else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+                       return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
+
+               },
+
+               Out: function ( k ) {
+
+                       var s, a = 0.1, p = 0.4;
+                       if ( k === 0 ) return 0;
+                       if ( k === 1 ) return 1;
+                       if ( !a || a < 1 ) { a = 1; s = p / 4; }
+                       else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+                       return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );
+
+               },
+
+               InOut: function ( k ) {
+
+                       var s, a = 0.1, p = 0.4;
+                       if ( k === 0 ) return 0;
+                       if ( k === 1 ) return 1;
+                       if ( !a || a < 1 ) { a = 1; s = p / 4; }
+                       else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+                       if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );
+                       return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;
+
+               }
+
+       },
+
+       Back: {
+
+               In: function ( k ) {
+
+                       var s = 1.70158;
+                       return k * k * ( ( s + 1 ) * k - s );
+
+               },
+
+               Out: function ( k ) {
+
+                       var s = 1.70158;
+                       return --k * k * ( ( s + 1 ) * k + s ) + 1;
+
+               },
+
+               InOut: function ( k ) {
+
+                       var s = 1.70158 * 1.525;
+                       if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );
+                       return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );
+
+               }
+
+       },
+
+       Bounce: {
+
+               In: function ( k ) {
+
+                       return 1 - TWEEN.Easing.Bounce.Out( 1 - k );
+
+               },
+
+               Out: function ( k ) {
+
+                       if ( k < ( 1 / 2.75 ) ) {
+
+                               return 7.5625 * k * k;
+
+                       } else if ( k < ( 2 / 2.75 ) ) {
+
+                               return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;
+
+                       } else if ( k < ( 2.5 / 2.75 ) ) {
+
+                               return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;
+
+                       } else {
+
+                               return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;
+
+                       }
+
+               },
+
+               InOut: function ( k ) {
+
+                       if ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;
+                       return TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;
+
+               }
+
+       }
+
+};
+
+TWEEN.Interpolation = {
+
+       Linear: function ( v, k ) {
+
+               var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;
+
+               if ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );
+               if ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );
+
+               return fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );
+
+       },
+
+       Bezier: function ( v, k ) {
+
+               var b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;
+
+               for ( i = 0; i <= n; i++ ) {
+                       b += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );
+               }
+
+               return b;
+
+       },
+
+       CatmullRom: function ( v, k ) {
+
+               var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;
+
+               if ( v[ 0 ] === v[ m ] ) {
+
+                       if ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );
+
+                       return fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );
+
+               } else {
+
+                       if ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );
+                       if ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );
+
+                       return fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i );
+
+               }
+
+       },
+
+       Utils: {
+
+               Linear: function ( p0, p1, t ) {
+
+                       return ( p1 - p0 ) * t + p0;
+
+               },
+
+               Bernstein: function ( n , i ) {
+
+                       var fc = TWEEN.Interpolation.Utils.Factorial;
+                       return fc( n ) / fc( i ) / fc( n - i );
+
+               },
+
+               Factorial: ( function () {
+
+                       var a = [ 1 ];
+
+                       return function ( n ) {
+
+                               var s = 1, i;
+                               if ( a[ n ] ) return a[ n ];
+                               for ( i = n; i > 1; i-- ) s *= i;
+                               return a[ n ] = s;
+
+                       };
+
+               } )(),
+
+               CatmullRom: function ( p0, p1, p2, p3, t ) {
+
+                       var v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;
+                       return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;
+
+               }
+
+       }
+
+};
diff --git a/css/car/components/tween/tween.min.js b/css/car/components/tween/tween.min.js
new file mode 100644 (file)
index 0000000..2c6352d
--- /dev/null
@@ -0,0 +1,15 @@
+// tween.js - http://github.com/sole/tween.js
+'use strict';void 0===Date.now&&(Date.now=function(){return(new Date).valueOf()});
+var TWEEN=TWEEN||function(){var a=[];return{REVISION:"12",getAll:function(){return a},removeAll:function(){a=[]},add:function(c){a.push(c)},remove:function(c){c=a.indexOf(c);-1!==c&&a.splice(c,1)},update:function(c){if(0===a.length)return!1;for(var b=0,c=void 0!==c?c:"undefined"!==typeof window&&void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now();b<a.length;)a[b].update(c)?b++:a.splice(b,1);return!0}}}();
+TWEEN.Tween=function(a){var c={},b={},d={},e=1E3,g=0,h=!1,j=!1,q=0,m=null,v=TWEEN.Easing.Linear.None,w=TWEEN.Interpolation.Linear,n=[],r=null,s=!1,t=null,u=null,k;for(k in a)c[k]=parseFloat(a[k],10);this.to=function(a,c){void 0!==c&&(e=c);b=a;return this};this.start=function(e){TWEEN.add(this);j=!0;s=!1;m=void 0!==e?e:"undefined"!==typeof window&&void 0!==window.performance&&void 0!==window.performance.now?window.performance.now():Date.now();m+=q;for(var f in b){if(b[f]instanceof Array){if(0===b[f].length)continue;
+b[f]=[a[f]].concat(b[f])}c[f]=a[f];!1===c[f]instanceof Array&&(c[f]*=1);d[f]=c[f]||0}return this};this.stop=function(){if(!j)return this;TWEEN.remove(this);j=!1;this.stopChainedTweens();return this};this.stopChainedTweens=function(){for(var a=0,b=n.length;a<b;a++)n[a].stop()};this.delay=function(a){q=a;return this};this.repeat=function(a){g=a;return this};this.yoyo=function(a){h=a;return this};this.easing=function(a){v=a;return this};this.interpolation=function(a){w=a;return this};this.chain=function(){n=
+arguments;return this};this.onStart=function(a){r=a;return this};this.onUpdate=function(a){t=a;return this};this.onComplete=function(a){u=a;return this};this.update=function(p){var f;if(p<m)return!0;!1===s&&(null!==r&&r.call(a),s=!0);var i=(p-m)/e,i=1<i?1:i,j=v(i);for(f in b){var k=c[f]||0,l=b[f];l instanceof Array?a[f]=w(l,j):("string"===typeof l&&(l=k+parseFloat(l,10)),"number"===typeof l&&(a[f]=k+(l-k)*j))}null!==t&&t.call(a,j);if(1==i)if(0<g){isFinite(g)&&g--;for(f in d)"string"===typeof b[f]&&
+(d[f]+=parseFloat(b[f],10)),h&&(i=d[f],d[f]=b[f],b[f]=i),c[f]=d[f];m=p+q}else{null!==u&&u.call(a);f=0;for(i=n.length;f<i;f++)n[f].start(p);return!1}return!0}};
+TWEEN.Easing={Linear:{None:function(a){return a}},Quadratic:{In:function(a){return a*a},Out:function(a){return a*(2-a)},InOut:function(a){return 1>(a*=2)?0.5*a*a:-0.5*(--a*(a-2)-1)}},Cubic:{In:function(a){return a*a*a},Out:function(a){return--a*a*a+1},InOut:function(a){return 1>(a*=2)?0.5*a*a*a:0.5*((a-=2)*a*a+2)}},Quartic:{In:function(a){return a*a*a*a},Out:function(a){return 1- --a*a*a*a},InOut:function(a){return 1>(a*=2)?0.5*a*a*a*a:-0.5*((a-=2)*a*a*a-2)}},Quintic:{In:function(a){return a*a*a*
+a*a},Out:function(a){return--a*a*a*a*a+1},InOut:function(a){return 1>(a*=2)?0.5*a*a*a*a*a:0.5*((a-=2)*a*a*a*a+2)}},Sinusoidal:{In:function(a){return 1-Math.cos(a*Math.PI/2)},Out:function(a){return Math.sin(a*Math.PI/2)},InOut:function(a){return 0.5*(1-Math.cos(Math.PI*a))}},Exponential:{In:function(a){return 0===a?0:Math.pow(1024,a-1)},Out:function(a){return 1===a?1:1-Math.pow(2,-10*a)},InOut:function(a){return 0===a?0:1===a?1:1>(a*=2)?0.5*Math.pow(1024,a-1):0.5*(-Math.pow(2,-10*(a-1))+2)}},Circular:{In:function(a){return 1-
+Math.sqrt(1-a*a)},Out:function(a){return Math.sqrt(1- --a*a)},InOut:function(a){return 1>(a*=2)?-0.5*(Math.sqrt(1-a*a)-1):0.5*(Math.sqrt(1-(a-=2)*a)+1)}},Elastic:{In:function(a){var c,b=0.1;if(0===a)return 0;if(1===a)return 1;!b||1>b?(b=1,c=0.1):c=0.4*Math.asin(1/b)/(2*Math.PI);return-(b*Math.pow(2,10*(a-=1))*Math.sin((a-c)*2*Math.PI/0.4))},Out:function(a){var c,b=0.1;if(0===a)return 0;if(1===a)return 1;!b||1>b?(b=1,c=0.1):c=0.4*Math.asin(1/b)/(2*Math.PI);return b*Math.pow(2,-10*a)*Math.sin((a-c)*
+2*Math.PI/0.4)+1},InOut:function(a){var c,b=0.1;if(0===a)return 0;if(1===a)return 1;!b||1>b?(b=1,c=0.1):c=0.4*Math.asin(1/b)/(2*Math.PI);return 1>(a*=2)?-0.5*b*Math.pow(2,10*(a-=1))*Math.sin((a-c)*2*Math.PI/0.4):0.5*b*Math.pow(2,-10*(a-=1))*Math.sin((a-c)*2*Math.PI/0.4)+1}},Back:{In:function(a){return a*a*(2.70158*a-1.70158)},Out:function(a){return--a*a*(2.70158*a+1.70158)+1},InOut:function(a){return 1>(a*=2)?0.5*a*a*(3.5949095*a-2.5949095):0.5*((a-=2)*a*(3.5949095*a+2.5949095)+2)}},Bounce:{In:function(a){return 1-
+TWEEN.Easing.Bounce.Out(1-a)},Out:function(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+0.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+0.9375:7.5625*(a-=2.625/2.75)*a+0.984375},InOut:function(a){return 0.5>a?0.5*TWEEN.Easing.Bounce.In(2*a):0.5*TWEEN.Easing.Bounce.Out(2*a-1)+0.5}}};
+TWEEN.Interpolation={Linear:function(a,c){var b=a.length-1,d=b*c,e=Math.floor(d),g=TWEEN.Interpolation.Utils.Linear;return 0>c?g(a[0],a[1],d):1<c?g(a[b],a[b-1],b-d):g(a[e],a[e+1>b?b:e+1],d-e)},Bezier:function(a,c){var b=0,d=a.length-1,e=Math.pow,g=TWEEN.Interpolation.Utils.Bernstein,h;for(h=0;h<=d;h++)b+=e(1-c,d-h)*e(c,h)*a[h]*g(d,h);return b},CatmullRom:function(a,c){var b=a.length-1,d=b*c,e=Math.floor(d),g=TWEEN.Interpolation.Utils.CatmullRom;return a[0]===a[b]?(0>c&&(e=Math.floor(d=b*(1+c))),g(a[(e-
+1+b)%b],a[e],a[(e+1)%b],a[(e+2)%b],d-e)):0>c?a[0]-(g(a[0],a[0],a[1],a[1],-d)-a[0]):1<c?a[b]-(g(a[b],a[b],a[b-1],a[b-1],d-b)-a[b]):g(a[e?e-1:0],a[e],a[b<e+1?b:e+1],a[b<e+2?b:e+2],d-e)},Utils:{Linear:function(a,c,b){return(c-a)*b+a},Bernstein:function(a,c){var b=TWEEN.Interpolation.Utils.Factorial;return b(a)/b(c)/b(a-c)},Factorial:function(){var a=[1];return function(c){var b=1,d;if(a[c])return a[c];for(d=c;1<d;d--)b*=d;return a[c]=b}}(),CatmullRom:function(a,c,b,d,e){var a=0.5*(b-a),d=0.5*(d-c),g=
+e*e;return(2*c-2*b+a+d)*e*g+(-3*c+3*b-2*a-d)*g+a*e+c}}};
diff --git a/css/car/fonts/HelveticaNeue-CondensedBold.ttf b/css/car/fonts/HelveticaNeue-CondensedBold.ttf
new file mode 100644 (file)
index 0000000..e11e2ec
Binary files /dev/null and b/css/car/fonts/HelveticaNeue-CondensedBold.ttf differ
diff --git a/css/car/fonts/HelveticaNeue-Light.ttf b/css/car/fonts/HelveticaNeue-Light.ttf
new file mode 100644 (file)
index 0000000..596b579
Binary files /dev/null and b/css/car/fonts/HelveticaNeue-Light.ttf differ
diff --git a/css/car/fonts/HelveticaNeue-Regular.ttf b/css/car/fonts/HelveticaNeue-Regular.ttf
new file mode 100644 (file)
index 0000000..0bf55ad
Binary files /dev/null and b/css/car/fonts/HelveticaNeue-Regular.ttf differ
diff --git a/css/car/images/bt_close.png b/css/car/images/bt_close.png
new file mode 100644 (file)
index 0000000..51ace79
Binary files /dev/null and b/css/car/images/bt_close.png differ
diff --git a/css/car/images/bt_next.png b/css/car/images/bt_next.png
new file mode 100644 (file)
index 0000000..572abee
Binary files /dev/null and b/css/car/images/bt_next.png differ
diff --git a/css/car/images/bt_pause.png b/css/car/images/bt_pause.png
new file mode 100644 (file)
index 0000000..b2240bb
Binary files /dev/null and b/css/car/images/bt_pause.png differ
diff --git a/css/car/images/bt_play.png b/css/car/images/bt_play.png
new file mode 100644 (file)
index 0000000..b28fcf7
Binary files /dev/null and b/css/car/images/bt_play.png differ
diff --git a/css/car/images/bt_previous.png b/css/car/images/bt_previous.png
new file mode 100644 (file)
index 0000000..7f2467f
Binary files /dev/null and b/css/car/images/bt_previous.png differ
diff --git a/css/car/images/default_icon.png b/css/car/images/default_icon.png
new file mode 100644 (file)
index 0000000..9765b1b
Binary files /dev/null and b/css/car/images/default_icon.png differ
diff --git a/css/car/spinner.css b/css/car/spinner.css
new file mode 100644 (file)
index 0000000..f3fd425
--- /dev/null
@@ -0,0 +1,143 @@
+.loadingSpinnerWrapper {
+       position: absolute;
+       width: 100%;
+       height: 100%;
+       z-index: 1000;
+       display: none;
+    top: 0;
+    left: 0;
+}
+
+.loadingSpinner {
+       width: 100%;
+       height: 100%;
+       display: -webkit-box;
+       -webkit-box-pack: center;
+       -webkit-box-align: center;
+}
+
+@-webkit-keyframes spin {
+       0% { -webkit-transform: rotate(0deg);}
+       100% { -webkit-transform: rotate(360deg);}
+}
+
+@keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@-moz-keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@-webkit-keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@-o-keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@-moz-keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@-webkit-keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@-o-keyframes rotate-loading {
+    0%  {transform: rotate(0deg);-ms-transform: rotate(0deg); -webkit-transform: rotate(0deg); -o-transform: rotate(0deg); -moz-transform: rotate(0deg);}
+    100% {transform: rotate(360deg);-ms-transform: rotate(360deg); -webkit-transform: rotate(360deg); -o-transform: rotate(360deg); -moz-transform: rotate(360deg);}
+}
+
+@keyframes loading-text-opacity {
+    0%  {opacity: 0}
+    20% {opacity: 0}
+    50% {opacity: 1}
+    100%{opacity: 0}
+}
+
+@-moz-keyframes loading-text-opacity {
+    0%  {opacity: 0}
+    20% {opacity: 0}
+    50% {opacity: 1}
+    100%{opacity: 0}
+}
+
+@-webkit-keyframes loading-text-opacity {
+    0%  {opacity: 0}
+    20% {opacity: 0}
+    50% {opacity: 1}
+    100%{opacity: 0}
+}
+
+@-o-keyframes loading-text-opacity {
+    0%  {opacity: 0}
+    20% {opacity: 0}
+    50% {opacity: 1}
+    100%{opacity: 0}
+}
+
+.loading-container,
+.loading {
+    height: 100px;
+    position: relative;
+    width: 100px;
+    border-radius: 100%;
+}
+
+.loading-container-small, .loading-small {
+       width: 15px;
+       height: 15px;
+}
+
+.loading {
+    border: 2px solid transparent;
+    border-color: transparent #fff transparent #FFF;
+    -moz-animation: rotate-loading 1.5s linear 0s infinite normal;
+    -moz-transform-origin: 50% 50%;
+    -o-animation: rotate-loading 1.5s linear 0s infinite normal;
+    -o-transform-origin: 50% 50%;
+    -webkit-animation: rotate-loading 1.5s linear 0s infinite normal;
+    -webkit-transform-origin: 50% 50%;
+    animation: rotate-loading 1.5s linear 0s infinite normal;
+    transform-origin: 50% 50%;
+}
+
+.loading-container:hover .loading {
+    border-color: transparent #E45635 transparent #E45635;
+}
+
+.loading-container:hover .loading,
+.loading-container .loading {
+    -webkit-transition: all 0.5s ease-in-out;
+    -moz-transition: all 0.5s ease-in-out;
+    -ms-transition: all 0.5s ease-in-out;
+    -o-transition: all 0.5s ease-in-out;
+    transition: all 0.5s ease-in-out;
+}
+
+.loading-text {
+    -moz-animation: loading-text-opacity 2s linear 0s infinite normal;
+    -o-animation: loading-text-opacity 2s linear 0s infinite normal;
+    -webkit-animation: loading-text-opacity 2s linear 0s infinite normal;
+    animation: loading-text-opacity 2s linear 0s infinite normal;
+    margin-top: 45px;
+    opacity: 0;
+    position: absolute;
+    text-align: center;
+    text-transform: uppercase;
+    top: 0;
+    width: 100%;
+}
\ No newline at end of file
diff --git a/css/car/theme.json b/css/car/theme.json
new file mode 100644 (file)
index 0000000..d1b3191
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       "id": "http://com.intel.tizen/coulomb.2012",
+        "version": "0.5.0",
+       "name": "Intel Coulomb 2012",
+       "type": "car"
+}
\ No newline at end of file
diff --git a/css/user/blue/bottombaricons.css b/css/user/blue/bottombaricons.css
new file mode 100644 (file)
index 0000000..ea7287c
--- /dev/null
@@ -0,0 +1,46 @@
+/* Do not remove this comment, causes crashes on IVI */
+
+.bottomPanelImg {
+       background-image: url('./images/bottombaricons/panel_bottom_blue.png');
+}
+
+.bottomPanelLogoImg {
+       background-image: url('./images/bottombaricons/logo_icon_blue.png');
+}
+
+.bottomBackButtonBackgroundImg {
+       background-image: url('./images/bottombaricons/icon_back.png');
+}
+
+.bottomBackButton {
+       position: absolute;
+       left: 58px;
+       top: 95px;
+       width: 57px;
+       height: 63px;
+       cursor: pointer;
+}
+
+.bottomBackButton:active {
+       position: absolute;
+       left: 58px;
+       top: 97px;
+       width: 57px;
+       height: 63px;
+}
+
+.bottomPanelLogo {
+       position: absolute;
+       left: 250px;
+       top: 49px;
+       width: 200px;
+       height: 150px;
+}
+
+.bottomPanel {
+       position: absolute;
+       left: 0;
+       top: 1080px;
+       width: 720px;
+       height: 200px;
+}
diff --git a/css/user/blue/common.css b/css/user/blue/common.css
new file mode 100644 (file)
index 0000000..d29c40f
--- /dev/null
@@ -0,0 +1,407 @@
+/* FONT SIZE */
+.fontSizeXXSmall {
+       font-size: 14px;
+       line-height: 14px;
+}
+
+.fontSizeXSmall {
+       font-size: 18px;
+       line-height: 18px;
+}
+
+.fontSizeSmaller {
+       font-size: 20px;
+       line-height: 20px;
+}
+
+.fontSizeSmall {
+       font-size: 24px;
+       line-height: 24px;
+}
+
+.fontSizeMedium {
+       font-size: 28px;
+       line-height: 28px;
+}
+
+.fontSizeLarge {
+       font-size: 30px;
+       line-height: 30px;
+}
+
+.fontSizeLarger {
+       font-size: 34px;
+       line-height: 34px;
+}
+
+.fontSizeXLarge {
+       font-size: 40px;
+       line-height: 40px;
+}
+
+.fontSizeXXLarge {
+       font-size: 48px;
+       line-height: 48px;
+}
+
+.fontSizeXXXLarge {
+       font-size: 62px;
+       line-height: 62px;
+}
+
+.fontSizeXXXXLarge {
+       font-size: 80px;
+       line-height: 80px;
+}
+
+.fontWeightNormal {
+       font-weight: normal;
+}
+
+.fontWeightBold {
+       font-weight: bold;
+}
+
+.fontWeightBolder {
+       font-weight: bolder;
+}
+
+.fontWeightLighter {
+       font-weight: lighter;
+}
+
+/* FONT COLOR */
+.fontColorNormal {
+       color: rgb(255, 255, 255);
+       color: rgba(255, 255, 255, 1.0); /*#ffffff*/
+}
+
+.fontColorTheme {
+       color: rgb(58, 174, 255);
+       color: rgba(58, 174, 255, 1.0); /*#3aaeff*/
+}
+
+.fontColorLight {
+       color: rgb(65, 183, 255);
+       color: rgba(65, 183, 255, 1.0); /*#41b7ff*/
+}
+
+.fontColorDark {
+       color: rgb(0, 128, 191); /*#0080bf*/
+       color: rgba(0, 128, 191, 1.0); /*#0080bf*/
+}
+
+.fontColorSelected {
+       color: rgb(0, 171, 255);
+       color: rgba(0, 171, 255, 1.0); /*#00abff*/
+}
+
+.fontColorDimmed {
+       color: rgb(145, 149, 153);
+       color: rgba(145, 149, 153, 1.0); /*#919599*/
+}
+
+.fontColorDimmedLight {
+       color: rgb(199, 199, 199);
+       color: rgba(199, 199, 199, 1.0); /*#c7c7c7*/
+}
+
+.fontColorLightRed {
+       color: rgb(255, 3, 3);
+       color: rgba(255, 3, 3, 0.8);
+}
+
+/* PAGE BACKGROUND COLOR */
+.pageBgColorNormal {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 1.0);
+}
+
+.pageBgColorNormalTransparent {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 0.8);
+}
+
+.pageBgColorTheme {
+       background-color: rgb(58, 174, 255);
+       background-color: rgba(58, 174, 255, 1.0);
+}
+
+.pageBgColorThemeTransparent {
+       background-color: rgb(58, 174, 255);
+       background-color: rgba(58, 174, 255, 0.8);
+}
+
+.pageBgColorLight {
+       background-color: rgb(65, 183, 255);
+       background-color: rgba(65, 183, 255, 1.0);
+}
+
+.pageBgColorLightTransparent {
+       background-color: rgb(65, 183, 255);
+       background-color: rgba(65, 183, 255, 0.8);
+}
+
+.pageBgColorDark {
+       background-color: rgb(0, 128, 191);
+       background-color: rgba(0, 128, 191, 1.0);
+}
+
+.pageBgColorDarkTransparent {
+       background-color: rgb(0, 128, 191);
+       background-color: rgba(0, 128, 191, 0.8);
+}
+
+.pageBgColorSelected {
+       background-color: rgb(0, 171, 255);
+       background-color: rgba(0, 171, 255, 1.0);
+}
+
+.pageBgColorSelectedTransparent {
+       background-color: rgb(0, 171, 255);
+       background-color: rgba(0, 171, 255, 0.8);
+}
+
+.pageBgColorDimmed {
+       background-color: rgb(145, 149, 153);
+       background-color: rgba(145, 149, 153, 1.0);
+}
+
+.pageBgColorDimmedTransparent {
+       background-color: rgb(145, 149, 153);
+       background-color: rgba(145, 149, 153, 0.8);
+}
+
+/* BACKGROUND COLOR */
+.bgColorNormal {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 1.0);
+}
+
+.bgColorNormalTransparent {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 0.5);
+}
+
+.bgColorTheme {
+       background-color: rgb(58, 174, 255);
+       background-color: rgba(58, 174, 255, 1.0);
+}
+
+.bgColorThemeTransparent {
+       background-color: rgb(58, 174, 255);
+       background-color: rgba(58, 174, 255, 0.5);
+}
+
+.bgColorLight {
+       background-color: rgb(65, 183, 255);
+       background-color: rgba(65, 183, 255, 1.0);
+}
+
+.bgColorLightTransparent {
+       background-color: rgb(65, 183, 255);
+       background-color: rgba(65, 183, 255, 0.5);
+}
+
+.bgColorDark {
+       background-color: rgb(6, 36, 55);
+       background-color: rgba(6, 36, 55, 1.0);
+}
+
+.bgColorDarkTransparent {
+       background-color: rgb(6, 36, 55);
+       background-color: rgba(6, 36, 55, 0.5);
+}
+
+.bgColorSelected {
+       background-color: rgb(0, 171, 255);
+       background-color: rgba(0, 171, 255, 1.0);
+}
+
+.bgColorSelectedTransparent {
+       background-color: rgb(0, 171, 255);
+       background-color: rgba(0, 171, 255, 0.5);
+}
+
+.bgColorDimmed {
+       background-color: rgb(145, 149, 153);
+       background-color: rgba(145, 149, 153, 1.0);
+}
+
+.bgColorDimmedTransparent {
+       background-color: rgb(145, 149, 153);
+       background-color: rgba(145, 149, 153, 0.5);
+}
+
+/* BOX SHADOW */
+.boxShadow1 {
+       box-shadow: 0 0 10px 2px rgba(18, 75, 115, 0.8);
+}
+
+.boxShadow1Active:active,.boxShadow1Active:focus {
+       box-shadow: 0 0 10px 2px rgb(18, 75, 115);
+}
+
+.boxShadow2 {
+       box-shadow: 0 0 50px 5px rgba(18, 75, 115, 0.8);
+}
+
+.boxShadow2Active:active,.boxShadow2Active:focus {
+       box-shadow: 0 0 50px 5px rgb(18, 75, 115);
+}
+
+.boxShadow3 {
+       box-shadow: 0 0 30px 2px rgba(29, 162, 255, 0.8);
+}
+
+.boxShadow3Active:active,.boxShadow3Active:focus {
+       box-shadow: 0 0 30px 2px rgb(29, 162, 255);
+}
+
+.boxShadow4 {
+       box-shadow: 0 0 70px 2px rgba(29, 162, 255, 0.4);
+}
+
+.boxShadow4Active:active,.boxShadow4Active:focus {
+       box-shadow: 0 0 70px 2px rgb(29, 162, 255);
+}
+
+.boxShadowInset {
+       box-shadow: 0 0 2px 2px #1DA2FF inset;
+}
+
+.boxShadowInset:active,.boxShadowInset:hover {
+       box-shadow: 0 0 2px 2px #124B73 inset;
+}
+
+/* BORDER COLOR */
+.borderColorNormal {
+       border-color: rgb(0, 0, 0);
+       border-color: rgba(0, 0, 0, 1.0);
+}
+
+.borderColorTheme {
+       border-color: rgb(1, 128, 201);
+       border-color: rgba(1, 128, 201, 0.5);
+}
+
+.borderColorLight {
+       border-color: rgb(128, 203, 255);
+       border-color: rgba(128, 203, 255, 1.0);
+}
+
+.borderColorDark {
+       border-color: rgb(0, 89, 151);
+       border-color: rgba(0, 89, 151, 1.0);
+}
+
+.borderColorSelected {
+       border-color: rgb(29, 162, 255);
+       border-color: rgba(29, 162, 255, 1.0);
+}
+
+.borderColorDimmed {
+       border-color: rgb(199, 199, 199);
+       border-color: rgba(199, 199, 199, 1.0);
+}
+
+/* TEXT BACKGROUND COLOR */
+.textBgColorNormal {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 1.0);
+}
+
+.textBgColorNormalTransparent {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 0.8);
+}
+
+.textBgColorTheme {
+       background-color: rgb(29, 162, 255);
+       background-color: rgba(29, 162, 255, 1.0);
+}
+
+.textBgColorThemeTransparent {
+       background-color: rgb(29, 162, 255);
+       background-color: rgba(29, 162, 255, 0.4);
+}
+
+.textBgColorLight {
+       background-color: rgb(128, 203, 255);
+       background-color: rgba(128, 203, 255, 1.0);
+}
+
+.textBgColorLightTransparent {
+       background-color: rgb(128, 203, 255);
+       background-color: rgba(128, 203, 255, 0.4);
+}
+
+.textBgColorDark {
+       background-color: rgb(0, 89, 151);
+       background-color: rgba(0, 89, 151, 1.0);
+}
+
+.textBgColorDarkTransparent {
+       background-color: rgb(0, 89, 151);
+       background-color: rgba(0, 89, 151, 0.4);
+}
+
+.textBgColorSelected {
+       background-color: rgb(29, 162, 255);
+       background-color: rgba(29, 162, 255, 1.0);
+}
+
+.textBgColorSelectedTransparent {
+       background-color: rgb(29, 162, 255);
+       background-color: rgba(29, 162, 255, 0.4);
+}
+
+.textBgColorDimmed {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 1.0);
+}
+
+.textBgColorDimmedTransparent {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 0.4);
+}
+
+/* OPACITY */
+.opacityFull {
+       opacity: 1.0;
+}
+
+.opacityHeavy {
+       opacity: 0.8;
+}
+
+.opacityMedium {
+       opacity: 0.65;
+}
+
+.opacityLight {
+       opacity: 0.5;
+}
+/* phone button */
+.callButton {
+       vertical-align: top;
+       display: inline-block;
+       margin-left: 108px;
+       border: none;
+       width: 72px;
+       height: 157px;
+       margin-right: 7px;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.callingTrue {
+       margin-top: 279px;
+       background-color: rgb(255, 3, 3);
+       background-color: rgba(255, 3, 3, 0.8);
+}
+
+.callingFalse {
+       margin-top: 117px;
+       background-color: rgb(138, 255, 0);
+       background-color: rgba(138, 255, 0, 0.54);
+}
diff --git a/css/user/blue/dashboard.css b/css/user/blue/dashboard.css
new file mode 100644 (file)
index 0000000..4a97d8f
--- /dev/null
@@ -0,0 +1,74 @@
+.dashboardBackGround {
+       background-image: url('images/dashboard/bg_blue.png');
+}
+
+.carImage {
+       background-image:
+               url('images/dashboard/car_with__inactive_lights_blue.png');
+}
+.whelImage{
+       background-image:
+               url('images/dashboard/wheel_blue.png');
+}
+.dashboardSunElement{
+       background-image:
+               url('images/dashboard/sun_blue.png');
+}
+.dashboardMoonElement{
+       background-image:
+               url('images/dashboard/moon_blue.png');
+}
+.batteryImage {
+       background-image: url('images/dashboard/icon_battery_blue.png');
+}
+.dashboardLineLong {
+       background-image:
+               url('images/dashboard/line_with_pointer_long_blue.png')
+}
+.dashboardLineShort {
+       background-image:
+               url('images/dashboard/line_with_pointer_short_blue.png')
+}
+
+.corner {
+       background-image:
+               url('images/dashboard/corner_blue.png')
+}
+
+.dashboardCircle{
+       background-image:
+               url('images/dashboard/circle_blue.png')
+}
+
+.padlocInactive{
+       background-image:
+               url('images/dashboard/icon_padlock_inactive_blue.png')
+}
+.padlocActive{
+       background-image:
+               url('images/dashboard/icon_padlock_active_blue.png')
+}
+.dashboardFrontLightsActive{
+       background-image:
+               url('images/dashboard/lights_front_active_blue.png')
+}
+.dashboardRearLightsActive{
+       background-image:
+               url('images/dashboard/lights_rear_active_blue.png')
+}
+.dashboardBreakLightsActive{
+       background-image:
+               url('images/dashboard/lights_break_active.png');
+}
+.dashBoardWeatherSun{
+       background-image:
+               url('images/dashboard/icon_sun.png')
+}
+.dashBoardWeatherCloudy{
+       background-image:
+               url('images/dashboard/icon_cloudy.png')
+}
+.dashBoardWeatherThunder{
+       background-image:
+               url('images/dashboard/icon_thunder.png')
+}
diff --git a/css/user/blue/homescreen.css b/css/user/blue/homescreen.css
new file mode 100644 (file)
index 0000000..74bcc82
--- /dev/null
@@ -0,0 +1,74 @@
+/* This is theme aimed for Blue user theme */
+.wrapper {
+       background-color: #07121D;
+}
+.backGround{
+       background: url('./images/homescreen/bg_blue_01.png') no-repeat black;
+}
+.step1{
+       background: url('./images/homescreen/bg_blue_02.png') no-repeat black;
+}
+.step2{
+       background: url('./images/homescreen/bg_blue_03.png') no-repeat black;
+}
+.step3{
+       background: url('./images/homescreen/bg_blue_04.png') no-repeat black;
+}
+.step4{
+       background: url('./images/homescreen/bg_blue_05.png') no-repeat black;
+}
+.step5{
+       background: url('./images/homescreen/bg_blue_06.png') no-repeat black;
+}
+.step6{
+       background: url('./images/homescreen/bg_blue_07.png') no-repeat black;
+}
+.step7{
+       background: url('./images/homescreen/bg_blue_08.png') no-repeat black;
+}
+.step8{
+       background: url('./images/homescreen/bg_blue_09.png') no-repeat black;
+}
+.step9{
+       background: url('./images/homescreen/bg_blue_10.png') no-repeat black;
+}
+
+.sector1{
+       background: url('./images/homescreen/navigation_bg_blue.png') no-repeat transparent;
+}
+.sector2{
+       background: url('./images/homescreen/music_bg_blue.png') no-repeat transparent;
+}
+.sector3{
+       background: url('./images/homescreen/radio_bg_blue.png') no-repeat transparent;
+}
+.sector4{
+       background: url('./images/homescreen/smart_bg_blue.png') no-repeat transparent;
+}
+.sector5{
+       background: url('./images/homescreen/social_bg_blue.png') no-repeat transparent;
+}
+.sector6{
+       background: url('./images/homescreen/store_bg_blue.png') no-repeat transparent;
+}
+.sector7{
+       background: url('./images/homescreen/dashboard_bg_blue.png') no-repeat transparent;
+}
+
+.indicator {
+       background-image: url('./images/homescreen/center_blue.png');
+}
+.centerIco {
+       background-image: url('./images/homescreen/center_ico_blue.png');
+}
+.outerRing {
+       background-image: url('./images/homescreen/center_outer_move_blue.png');
+}
+.innerRing {
+       background-image: url('./images/homescreen/center_inner_move_blue.png');
+}
+
+.homeScrAppGridView {
+       background-color: #20b11;
+       background-color: rgba(2, 11, 17, 0.85);
+}
diff --git a/css/user/blue/hvac.css b/css/user/blue/hvac.css
new file mode 100644 (file)
index 0000000..25bcb20
--- /dev/null
@@ -0,0 +1,382 @@
+html {
+
+       font-family:Sans-Serif;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+
+}
+
+body{
+       width:720px;/*720/1080*/
+       height:1000px;/*/1000/1500*/
+       margin:0;
+       font-size:.775em;/*.775em/1.1625em*/
+}
+.wrapper{
+       width:100%;
+       height:100%;
+       margin:0;
+       position:relative;
+
+       background: rgb(0,0,0); /* Old browsers */
+/* IE9 SVG, needs conditional override of 'filter' to 'none' */
+background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwNDE3MjQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+background: -moz-linear-gradient(top,  rgba(0,0,0,1) 0%, rgba(4,23,36,1) 100%); /* FF3.6+ */
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(0,0,0,1)), color-stop(100%,rgba(4,23,36,1))); /* Chrome,Safari4+ */
+background: -webkit-linear-gradient(top,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* Chrome10+,Safari5.1+ */
+background: -o-linear-gradient(top,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* Opera 11.10+ */
+background: -ms-linear-gradient(top,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* IE10+ */
+background: linear-gradient(to bottom,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* W3C */
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#000000', endColorstr='#041724',GradientType=0 ); /* IE6-8 */
+
+}
+.static_parts_bg{
+       background:url("images/hvac/static_parts_bg.svg") no-repeat;
+       height:60.1%;/*601/1000*/
+       width:100%;/*720/720*/
+       position:absolute;
+       top:18%;
+       /*left:9.861111%;((720-578)/2)/720*/
+       background-size:100%;
+}
+/*********HAZARD BUTTON************/
+.hazard_btn{
+       width:57.777778%;/*416/720*/
+       height:8.1%;/*81/1000*/
+       background:url("images/hvac/hazard_off.svg") no-repeat;
+       top:115px;
+       left:21.1111%; /*152/720*/
+       position:absolute;
+       background-size:100%;
+}
+.hazard_btn.on{
+       background:url("images/hvac/hazard_on.svg") no-repeat;
+}
+
+.hazard_btn.blink{
+       background:url("images/hvac/hazard_blink.svg") no-repeat;
+}
+
+/*********LEFT HEAT SEAT BUTTON************/
+.left_seat_btn{
+       width:22.08333333%;/*159/720*/
+       height:12.9%;/*129/1000*/
+       position:absolute;
+       left:21.1111%; /*152/720*/
+       top:22%;
+}
+
+.left_heat_seat_off{
+       background:url("images/hvac/left_heat_seat_off.svg") no-repeat;
+       background-size:100%;
+       z-index:4;
+       width:100%;
+       height:100%;
+       position:absolute;
+}
+
+.left_heat_seat_on{
+       margin: 0 0 36px 0;
+       background:url("images/hvac/left_heat_seat_on.svg") no-repeat bottom;
+       z-index:4;
+       width:100%;
+       position:absolute;
+       bottom:0;
+       background-size:100%;
+}
+.left_heat_seat_on.stage1{
+       height:0;
+}
+.left_heat_seat_on.stage2{
+       height:34%;
+}
+.left_heat_seat_on.stage3{
+       height:50%;
+}
+.left_heat_seat_on.stage4{
+       height:100%;
+}
+
+/*********RIGHT HEAT SEAT BUTTON************/
+.right_seat_btn{
+       width:22.08333333%;/*159/720*/
+       height:12.9%;/*129/1000*/
+       position:absolute;
+       right:21.1111%; /*152/720*/
+       top:22%;
+}
+
+.right_heat_seat_off{
+       background:url("images/hvac/right_heat_seat_off.svg") no-repeat;
+       z-index:4;
+       width:100%;
+       height:100%;
+       position:absolute;
+       background-size:100%;
+}
+
+.right_heat_seat_on{
+       margin: 0 0 36px 0;
+       background:url("images/hvac/right_heat_seat_on.svg") no-repeat bottom;
+       z-index:4;
+       width:100%;
+       position:absolute;
+       bottom:0;
+       background-size:100%;
+}
+
+.right_heat_seat_on.stage1{
+       height:0;
+}
+.right_heat_seat_on.stage2{
+       height:34%;
+}
+.right_heat_seat_on.stage3{
+       height:50%;
+}
+.right_heat_seat_on.stage4{
+       height:100%;
+}
+
+/*********LEFT NUM SLIDER************/
+
+.left_num_bg{
+       background:url("images/hvac/left_number_bg.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height: 18.1%;
+       position:absolute;
+       left:21.1111%; /*152/720*/
+       top:35%;
+       overflow:hidden;
+       z-index:4;
+       background-size:100%;
+}
+
+.left_num_cover{
+       background:url("images/hvac/left_number_cover.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height:23.1%;/*231/1000*/
+       position:absolute;
+       left:21.1111%; /*152/720*/
+       top:35%;
+       z-index:5;
+    pointer-events:none;
+       background-size:100%;
+}
+
+.scrollable.left{
+       height: 100%;
+       position:absolute;
+       width:100%;
+       top:25%;
+}
+
+.scrollable.left ul{
+       list-style-type:none;
+       font-size:7em;
+       padding:0;
+       margin:0;
+       position: relative; /* Enables positionning of elements inside viewport */
+       height:100%;
+}
+
+.scrollable.left li{
+       width:100%;
+       margin:0;
+       padding:0;
+       color:#fff;
+       line-height:130%;
+       text-align:left;
+       padding-left:5%;
+       position:relative;
+}
+/*********RIGHT NUM SLIDER************/
+
+.right_num_bg{
+       background:url("images/hvac/right_number_bg.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height: 18.1%;
+       position:absolute;
+       right:21.1111%; /*152/720*/
+       top:35%;
+       overflow:hidden;
+       z-index:4;
+       background-size:100%;
+}
+
+.right_num_cover{
+       background:url("images/hvac/right_number_cover.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height:23.1%;/*231/1000*/
+       position:absolute;
+       right:21.1111%; /*152/720*/
+       top:35%;
+       z-index:5;
+    pointer-events:none;
+       background-size:100%;
+}
+
+.scrollable.right{
+       height: 100%;
+       position:absolute;
+       width:100%;
+       top:25%;
+}
+
+.scrollable.right ul{
+       list-style-type:none;
+       font-size:7em;
+       padding:0;
+       margin:0;
+       position: relative; /* Enables positionning of elements inside viewport */
+       height:100%;
+}
+
+.scrollable.right li{
+       width:100%;
+       margin:0;
+       padding:0;
+       color:#fff;
+       line-height:130%;
+       text-align:left;
+       padding-left:16%;
+       position:relative;
+}
+
+/*************lower half******************/
+.fanSpeedOn{
+       width:0;/*42.083333%; 303/720*/
+       height:9.4%; /*94/1000*/
+       background:url("images/hvac/fan_bar_on.svg") no-repeat;
+       position:absolute;
+       left:33.3%;
+       top:57.7%;
+       z-index:0;
+}
+
+
+/********FAN DIRECTION***********/
+.fan_dir_down_btn{
+       background:url("images/hvac/fan_dir_down_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:58.75%;/*20/1000*/
+       left:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_dir_down_btn.on{
+       background:url("images/hvac/fan_dir_down_on.svg") no-repeat;
+}
+.fan_dir_right_btn{
+       background:url("images/hvac/fan_dir_right_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:67.75%;/*20/1000*/
+       left:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+
+.fan_dir_right_btn.on{
+       background:url("images/hvac/fan_dir_right_on.svg") no-repeat;
+}
+
+.fan_dir_up_btn{
+       background:url("images/hvac/fan_dir_up_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:8.8%;/*88/1000*/
+       top:76.1%;/*20/1000*/
+       left:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_dir_up_btn.on{
+       background:url("images/hvac/fan_dir_up_on.svg") no-repeat;
+}
+
+
+
+.fan_control_ac{
+       background:url("images/hvac/fan_control_ac_off.svg") no-repeat;
+       width:15.555556%;/*112/720*/
+       height:8.8%;/*88/1000*/
+       top:67.75%;
+       left:24.333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_control_ac.on{
+       background:url("images/hvac/fan_control_ac_on.svg") no-repeat;
+}
+
+.fan_control_auto{
+       background:url("images/hvac/fan_control_auto_off.svg") no-repeat;
+       width:15.416667%;/*111/720*/
+       height:8.8%;/*88/1000*/
+       top:67.75%;
+       left:42.333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_control_auto.on{
+       background:url("images/hvac/fan_control_auto_on.svg") no-repeat;
+}
+
+.fan_control_circ{
+       background:url("images/hvac/fan_control_circ_off.svg") no-repeat;
+       width:15.555556%;/*112/720*/
+       height:8.8%;/*88/1000*/
+       top:67.75%;
+       left:60.333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_control_circ.on{
+       background:url("images/hvac/fan_control_circ_on.svg") no-repeat;
+}
+
+/***DEFROST****/
+
+.defrost_max_btn{
+       background:url("images/hvac/defrost_max_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:58.75%;/*20/1000*/
+       right:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.defrost_max_btn.on{
+       background:url("images/hvac/defrost_max_on.svg") no-repeat;
+}
+.defrost_rear_btn{
+       background:url("images/hvac/defrost_rear_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:67.75%;/*20/1000*/
+       right:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+
+.defrost_rear_btn.on{
+       background:url("images/hvac/defrost_rear_on.svg") no-repeat;
+}
+
+.defrost_front_btn{
+       background:url("images/hvac/defrost_front_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:8.8%;/*88/1000*/
+       top:76.1%;/*20/1000*/
+       right:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.defrost_front_btn.on{
+       background:url("images/hvac/defrost_front_on.svg") no-repeat;
+}
diff --git a/css/user/blue/icon.png b/css/user/blue/icon.png
new file mode 100644 (file)
index 0000000..3e0c411
Binary files /dev/null and b/css/user/blue/icon.png differ
diff --git a/css/user/blue/images/bottombaricons/icon_back.png b/css/user/blue/images/bottombaricons/icon_back.png
new file mode 100644 (file)
index 0000000..ef85b81
Binary files /dev/null and b/css/user/blue/images/bottombaricons/icon_back.png differ
diff --git a/css/user/blue/images/bottombaricons/logo_icon_blue.png b/css/user/blue/images/bottombaricons/logo_icon_blue.png
new file mode 100644 (file)
index 0000000..6418efe
Binary files /dev/null and b/css/user/blue/images/bottombaricons/logo_icon_blue.png differ
diff --git a/css/user/blue/images/bottombaricons/panel_bottom_blue.png b/css/user/blue/images/bottombaricons/panel_bottom_blue.png
new file mode 100644 (file)
index 0000000..f90679c
Binary files /dev/null and b/css/user/blue/images/bottombaricons/panel_bottom_blue.png differ
diff --git a/css/user/blue/images/common/bt_back_blue.png b/css/user/blue/images/common/bt_back_blue.png
new file mode 100644 (file)
index 0000000..8653731
Binary files /dev/null and b/css/user/blue/images/common/bt_back_blue.png differ
diff --git a/css/user/blue/images/common/bt_library_blue.png b/css/user/blue/images/common/bt_library_blue.png
new file mode 100644 (file)
index 0000000..8358cae
Binary files /dev/null and b/css/user/blue/images/common/bt_library_blue.png differ
diff --git a/css/user/blue/images/common/bt_next_blue.png b/css/user/blue/images/common/bt_next_blue.png
new file mode 100644 (file)
index 0000000..4c8b2af
Binary files /dev/null and b/css/user/blue/images/common/bt_next_blue.png differ
diff --git a/css/user/blue/images/common/bt_previous_blue.png b/css/user/blue/images/common/bt_previous_blue.png
new file mode 100644 (file)
index 0000000..be2cdab
Binary files /dev/null and b/css/user/blue/images/common/bt_previous_blue.png differ
diff --git a/css/user/blue/images/dashboard/bg_blue.png b/css/user/blue/images/dashboard/bg_blue.png
new file mode 100644 (file)
index 0000000..f2e3e2c
Binary files /dev/null and b/css/user/blue/images/dashboard/bg_blue.png differ
diff --git a/css/user/blue/images/dashboard/car_with__inactive_lights_blue.png b/css/user/blue/images/dashboard/car_with__inactive_lights_blue.png
new file mode 100644 (file)
index 0000000..d6bbcc1
Binary files /dev/null and b/css/user/blue/images/dashboard/car_with__inactive_lights_blue.png differ
diff --git a/css/user/blue/images/dashboard/circle_blue.png b/css/user/blue/images/dashboard/circle_blue.png
new file mode 100644 (file)
index 0000000..8b78b75
Binary files /dev/null and b/css/user/blue/images/dashboard/circle_blue.png differ
diff --git a/css/user/blue/images/dashboard/corner_blue.png b/css/user/blue/images/dashboard/corner_blue.png
new file mode 100644 (file)
index 0000000..88e367b
Binary files /dev/null and b/css/user/blue/images/dashboard/corner_blue.png differ
diff --git a/css/user/blue/images/dashboard/icon_battery_blue.png b/css/user/blue/images/dashboard/icon_battery_blue.png
new file mode 100644 (file)
index 0000000..0368763
Binary files /dev/null and b/css/user/blue/images/dashboard/icon_battery_blue.png differ
diff --git a/css/user/blue/images/dashboard/icon_cloudy.png b/css/user/blue/images/dashboard/icon_cloudy.png
new file mode 100644 (file)
index 0000000..e1d80ee
Binary files /dev/null and b/css/user/blue/images/dashboard/icon_cloudy.png differ
diff --git a/css/user/blue/images/dashboard/icon_padlock_active_blue.png b/css/user/blue/images/dashboard/icon_padlock_active_blue.png
new file mode 100644 (file)
index 0000000..4da99a9
Binary files /dev/null and b/css/user/blue/images/dashboard/icon_padlock_active_blue.png differ
diff --git a/css/user/blue/images/dashboard/icon_padlock_inactive_blue.png b/css/user/blue/images/dashboard/icon_padlock_inactive_blue.png
new file mode 100644 (file)
index 0000000..a41a4ef
Binary files /dev/null and b/css/user/blue/images/dashboard/icon_padlock_inactive_blue.png differ
diff --git a/css/user/blue/images/dashboard/icon_sun.png b/css/user/blue/images/dashboard/icon_sun.png
new file mode 100644 (file)
index 0000000..def85f1
Binary files /dev/null and b/css/user/blue/images/dashboard/icon_sun.png differ
diff --git a/css/user/blue/images/dashboard/icon_thunder.png b/css/user/blue/images/dashboard/icon_thunder.png
new file mode 100644 (file)
index 0000000..1de2181
Binary files /dev/null and b/css/user/blue/images/dashboard/icon_thunder.png differ
diff --git a/css/user/blue/images/dashboard/lights_break_active.png b/css/user/blue/images/dashboard/lights_break_active.png
new file mode 100644 (file)
index 0000000..80d4ac1
Binary files /dev/null and b/css/user/blue/images/dashboard/lights_break_active.png differ
diff --git a/css/user/blue/images/dashboard/lights_front_active_blue.png b/css/user/blue/images/dashboard/lights_front_active_blue.png
new file mode 100644 (file)
index 0000000..26d9a91
Binary files /dev/null and b/css/user/blue/images/dashboard/lights_front_active_blue.png differ
diff --git a/css/user/blue/images/dashboard/lights_rear_active_blue.png b/css/user/blue/images/dashboard/lights_rear_active_blue.png
new file mode 100644 (file)
index 0000000..270e71d
Binary files /dev/null and b/css/user/blue/images/dashboard/lights_rear_active_blue.png differ
diff --git a/css/user/blue/images/dashboard/line_with_pointer_long_blue.png b/css/user/blue/images/dashboard/line_with_pointer_long_blue.png
new file mode 100644 (file)
index 0000000..93cf544
Binary files /dev/null and b/css/user/blue/images/dashboard/line_with_pointer_long_blue.png differ
diff --git a/css/user/blue/images/dashboard/line_with_pointer_short_blue.png b/css/user/blue/images/dashboard/line_with_pointer_short_blue.png
new file mode 100644 (file)
index 0000000..1b18964
Binary files /dev/null and b/css/user/blue/images/dashboard/line_with_pointer_short_blue.png differ
diff --git a/css/user/blue/images/dashboard/moon_blue.png b/css/user/blue/images/dashboard/moon_blue.png
new file mode 100644 (file)
index 0000000..00cb923
Binary files /dev/null and b/css/user/blue/images/dashboard/moon_blue.png differ
diff --git a/css/user/blue/images/dashboard/sun_blue.png b/css/user/blue/images/dashboard/sun_blue.png
new file mode 100644 (file)
index 0000000..c3ba8f3
Binary files /dev/null and b/css/user/blue/images/dashboard/sun_blue.png differ
diff --git a/css/user/blue/images/dashboard/wheel_blue.png b/css/user/blue/images/dashboard/wheel_blue.png
new file mode 100644 (file)
index 0000000..dfeeca7
Binary files /dev/null and b/css/user/blue/images/dashboard/wheel_blue.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_01.png b/css/user/blue/images/homescreen/bg_blue_01.png
new file mode 100644 (file)
index 0000000..413c58e
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_01.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_02.png b/css/user/blue/images/homescreen/bg_blue_02.png
new file mode 100644 (file)
index 0000000..dda39f0
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_02.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_03.png b/css/user/blue/images/homescreen/bg_blue_03.png
new file mode 100644 (file)
index 0000000..df25089
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_03.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_04.png b/css/user/blue/images/homescreen/bg_blue_04.png
new file mode 100644 (file)
index 0000000..3b0f2c1
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_04.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_05.png b/css/user/blue/images/homescreen/bg_blue_05.png
new file mode 100644 (file)
index 0000000..b23d33d
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_05.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_06.png b/css/user/blue/images/homescreen/bg_blue_06.png
new file mode 100644 (file)
index 0000000..7cf1a2a
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_06.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_07.png b/css/user/blue/images/homescreen/bg_blue_07.png
new file mode 100644 (file)
index 0000000..a6eabf4
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_07.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_08.png b/css/user/blue/images/homescreen/bg_blue_08.png
new file mode 100644 (file)
index 0000000..33691bc
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_08.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_09.png b/css/user/blue/images/homescreen/bg_blue_09.png
new file mode 100644 (file)
index 0000000..32c78be
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_09.png differ
diff --git a/css/user/blue/images/homescreen/bg_blue_10.png b/css/user/blue/images/homescreen/bg_blue_10.png
new file mode 100644 (file)
index 0000000..b739b96
Binary files /dev/null and b/css/user/blue/images/homescreen/bg_blue_10.png differ
diff --git a/css/user/blue/images/homescreen/bottom_panel_bg_blue.png b/css/user/blue/images/homescreen/bottom_panel_bg_blue.png
new file mode 100644 (file)
index 0000000..20ce902
Binary files /dev/null and b/css/user/blue/images/homescreen/bottom_panel_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/center_blue.png b/css/user/blue/images/homescreen/center_blue.png
new file mode 100644 (file)
index 0000000..e2889ea
Binary files /dev/null and b/css/user/blue/images/homescreen/center_blue.png differ
diff --git a/css/user/blue/images/homescreen/center_ico_blue.png b/css/user/blue/images/homescreen/center_ico_blue.png
new file mode 100644 (file)
index 0000000..9af24a7
Binary files /dev/null and b/css/user/blue/images/homescreen/center_ico_blue.png differ
diff --git a/css/user/blue/images/homescreen/center_inner_move_blue.png b/css/user/blue/images/homescreen/center_inner_move_blue.png
new file mode 100644 (file)
index 0000000..55dd705
Binary files /dev/null and b/css/user/blue/images/homescreen/center_inner_move_blue.png differ
diff --git a/css/user/blue/images/homescreen/center_outer_move_blue.png b/css/user/blue/images/homescreen/center_outer_move_blue.png
new file mode 100644 (file)
index 0000000..de0cc9f
Binary files /dev/null and b/css/user/blue/images/homescreen/center_outer_move_blue.png differ
diff --git a/css/user/blue/images/homescreen/dashboard_bg_blue.png b/css/user/blue/images/homescreen/dashboard_bg_blue.png
new file mode 100644 (file)
index 0000000..b8bd980
Binary files /dev/null and b/css/user/blue/images/homescreen/dashboard_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/music_bg_blue.png b/css/user/blue/images/homescreen/music_bg_blue.png
new file mode 100644 (file)
index 0000000..dd4f11b
Binary files /dev/null and b/css/user/blue/images/homescreen/music_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/navigation_bg_blue.png b/css/user/blue/images/homescreen/navigation_bg_blue.png
new file mode 100644 (file)
index 0000000..d5faabf
Binary files /dev/null and b/css/user/blue/images/homescreen/navigation_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/phone_bg_blue.png b/css/user/blue/images/homescreen/phone_bg_blue.png
new file mode 100644 (file)
index 0000000..f5efa5a
Binary files /dev/null and b/css/user/blue/images/homescreen/phone_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/radio_bg_blue.png b/css/user/blue/images/homescreen/radio_bg_blue.png
new file mode 100644 (file)
index 0000000..8ee5fdf
Binary files /dev/null and b/css/user/blue/images/homescreen/radio_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/smart_bg_blue.png b/css/user/blue/images/homescreen/smart_bg_blue.png
new file mode 100644 (file)
index 0000000..c1b48d0
Binary files /dev/null and b/css/user/blue/images/homescreen/smart_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/social_bg_blue.png b/css/user/blue/images/homescreen/social_bg_blue.png
new file mode 100644 (file)
index 0000000..84fce86
Binary files /dev/null and b/css/user/blue/images/homescreen/social_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/store_bg_blue.png b/css/user/blue/images/homescreen/store_bg_blue.png
new file mode 100644 (file)
index 0000000..0e78a6b
Binary files /dev/null and b/css/user/blue/images/homescreen/store_bg_blue.png differ
diff --git a/css/user/blue/images/homescreen/video_bg_blue.png b/css/user/blue/images/homescreen/video_bg_blue.png
new file mode 100644 (file)
index 0000000..8a87f52
Binary files /dev/null and b/css/user/blue/images/homescreen/video_bg_blue.png differ
diff --git a/css/user/blue/images/hvac/defrost_front_off.svg b/css/user/blue/images/hvac/defrost_front_off.svg
new file mode 100644 (file)
index 0000000..34a5e08
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 876 123 88" overflow="visible" enable-background="new 574 876 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="575" y="876.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="575" y="876.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<path fill="#31ABFF" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>
+<path fill="#31ABFF" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>
+<path fill="#31ABFF" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>
+<path fill="#31ABFF" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>
+<path fill="#31ABFF" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>
+<path fill="#31ABFF" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>
+<path fill="#31ABFF" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="877.6396" x2="635.5" y2="962.9438">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="574.5" y="876.5" display="none" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<path display="none" fill="#FFFFFF" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>
+<path display="none" fill="#FFFFFF" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>
+<path display="none" fill="#FFFFFF" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>
+<path display="none" fill="#FFFFFF" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>
+<path display="none" fill="#FFFFFF" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>
+<path display="none" fill="#FFFFFF" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>
+<path display="none" fill="#FFFFFF" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>
+<text transform="matrix(1 0 0 1 595.9609 904.8877)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="26.1844">FRONT</text>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="3.2325" stroke-miterlimit="10" d="M661.351,946.355
+       c-0.881,2.053-3.306,2.986-5.466,2.263c-12.79-4.31-26.646-4.31-39.437,0c-2.16,0.724-4.586-0.21-5.466-2.263
+       c-3.042-7.342-6.082-14.684-9.123-22.025c-0.88-2.047,1.056-4.84,4.398-5.963c19.399-6.535,40.417-6.535,59.816,0
+       c3.342,1.123,5.279,3.916,4.399,5.963C667.432,931.672,664.392,939.014,661.351,946.355z"/>
+<polyline display="none" fill="none" stroke="#31ABFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+       665,933.5 660.568,933.5 655.295,924.5 655.302,924.5 646.162,940.466 637.021,924.5 637.028,924.5 627.889,940.466 618.748,924.5 
+       618.755,924.5 613.417,933.5 607,933.5 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/defrost_front_on.svg b/css/user/blue/images/hvac/defrost_front_on.svg
new file mode 100644 (file)
index 0000000..fdd7a0b
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 876 123 88" overflow="visible" enable-background="new 574 876 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="575" y="876.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="575" y="876.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<path display="none" fill="#31ABFF" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>
+<path display="none" fill="#31ABFF" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>
+<path display="none" fill="#31ABFF" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>
+<path display="none" fill="#31ABFF" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>
+<path display="none" fill="#31ABFF" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>
+<path display="none" fill="#31ABFF" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>
+<path display="none" fill="#31ABFF" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="877.6396" x2="635.5" y2="962.9438">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="574.5" y="876.5" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<path fill="#FFFFFF" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>
+<path fill="#FFFFFF" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>
+<path fill="#FFFFFF" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>
+<path fill="#FFFFFF" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>
+<path fill="#FFFFFF" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>
+<path fill="#FFFFFF" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>
+<path fill="#FFFFFF" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>
+<text transform="matrix(1 0 0 1 595.9609 904.8877)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="26.1844">FRONT</text>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="3.2325" stroke-miterlimit="10" d="M661.351,946.355
+       c-0.881,2.053-3.306,2.986-5.466,2.263c-12.79-4.31-26.646-4.31-39.437,0c-2.16,0.724-4.586-0.21-5.466-2.263
+       c-3.042-7.342-6.082-14.684-9.123-22.025c-0.88-2.047,1.056-4.84,4.398-5.963c19.399-6.535,40.417-6.535,59.816,0
+       c3.342,1.123,5.279,3.916,4.399,5.963C667.432,931.672,664.392,939.014,661.351,946.355z"/>
+<polyline display="none" fill="none" stroke="#31ABFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+       665,933.5 660.568,933.5 655.295,924.5 655.302,924.5 646.162,940.466 637.021,924.5 637.028,924.5 627.889,940.466 618.748,924.5 
+       618.755,924.5 613.417,933.5 607,933.5 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/defrost_max_off.svg b/css/user/blue/images/hvac/defrost_max_off.svg
new file mode 100644 (file)
index 0000000..d25b687
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="97px" viewBox="697.129 642.492 123 97"
+        overflow="visible" enable-background="new 697.129 642.492 123 97" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>
+<path fill="#31ABFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079c-0.576,2.146-1.31,4.529-2.095,6.755
+       l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096
+       h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07
+       h4.189l1.021,17.648h-3.142L747.514,675.48z"/>
+<path fill="#31ABFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H757.647z
+        M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347
+       H762.701z"/>
+<path fill="#31ABFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"
+       />
+<path fill="#31ABFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>
+<path fill="#31ABFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903c-6.05,8.577,7.235,16.625,0.38,26.625
+       c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path fill="#31ABFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903c-6.049,8.577,7.235,16.625,0.382,26.625
+       c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path fill="#31ABFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903c-6.05,8.577,7.235,16.625,0.38,26.625
+       c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="758.6294" y1="643.626" x2="758.6294" y2="737.4362">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<path display="none" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" d="M697.629,643.039V738.5h122v-80.76
+       C780.629,651.722,739.629,646.832,697.629,643.039z"/>
+<path display="none" fill="#FFFFFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>
+<path display="none" fill="#FFFFFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299
+       l-1.361,4.347H762.701z"/>
+<path display="none" fill="#FFFFFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"
+       />
+<path display="none" fill="#FFFFFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>
+<path display="none" fill="#FFFFFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path display="none" fill="#FFFFFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path display="none" fill="#FFFFFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<text transform="matrix(1 0 0 1 730.7563 682.6807)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="26.1844">MAX</text>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="2.4433" stroke-miterlimit="10" d="M776.192,719.741
+       c-0.579,1.821-2.173,2.65-3.596,2.008c-8.41-3.825-17.523-3.825-25.935,0c-1.42,0.643-3.016-0.187-3.595-2.008
+       c-2-6.518-3.999-13.035-6-19.552c-0.577-1.816,0.696-4.296,2.894-5.293c12.758-5.803,26.58-5.803,39.338,0
+       c2.197,0.997,3.471,3.477,2.894,5.293C780.191,706.706,778.192,713.224,776.192,719.741z"/>
+<path display="none" fill="#31ABFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path display="none" fill="#31ABFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path display="none" fill="#31ABFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<path display="none" fill="none" stroke="#00507F" stroke-miterlimit="10" d="M968.129,664.752
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>
+</svg>
diff --git a/css/user/blue/images/hvac/defrost_max_on.svg b/css/user/blue/images/hvac/defrost_max_on.svg
new file mode 100644 (file)
index 0000000..87f8567
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="97px" viewBox="697.129 642.492 123 97"
+        overflow="visible" enable-background="new 697.129 642.492 123 97" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>
+<path display="none" fill="#31ABFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>
+<path display="none" fill="#31ABFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299
+       l-1.361,4.347H762.701z"/>
+<path display="none" fill="#31ABFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"
+       />
+<path display="none" fill="#31ABFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>
+<path display="none" fill="#31ABFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path display="none" fill="#31ABFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path display="none" fill="#31ABFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="758.6294" y1="643.626" x2="758.6294" y2="737.4362">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" d="M697.629,643.039V738.5h122v-80.76
+       C780.629,651.722,739.629,646.832,697.629,643.039z"/>
+<path fill="#FFFFFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079c-0.576,2.146-1.31,4.529-2.095,6.755
+       l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096
+       h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07
+       h4.189l1.021,17.648h-3.142L747.514,675.48z"/>
+<path fill="#FFFFFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H757.647z
+        M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347
+       H762.701z"/>
+<path fill="#FFFFFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"
+       />
+<path fill="#FFFFFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>
+<path fill="#FFFFFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903c-6.05,8.577,7.235,16.625,0.38,26.625
+       c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path fill="#FFFFFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903c-6.049,8.577,7.235,16.625,0.382,26.625
+       c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path fill="#FFFFFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903c-6.05,8.577,7.235,16.625,0.38,26.625
+       c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<text transform="matrix(1 0 0 1 730.7563 682.6807)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="26.1844">MAX</text>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="2.4433" stroke-miterlimit="10" d="M776.192,719.741
+       c-0.579,1.821-2.173,2.65-3.596,2.008c-8.41-3.825-17.523-3.825-25.935,0c-1.42,0.643-3.016-0.187-3.595-2.008
+       c-2-6.518-3.999-13.035-6-19.552c-0.577-1.816,0.696-4.296,2.894-5.293c12.758-5.803,26.58-5.803,39.338,0
+       c2.197,0.997,3.471,3.477,2.894,5.293C780.191,706.706,778.192,713.224,776.192,719.741z"/>
+<path display="none" fill="#31ABFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path display="none" fill="#31ABFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path display="none" fill="#31ABFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<path display="none" fill="none" stroke="#00507F" stroke-miterlimit="10" d="M968.129,664.752
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>
+</svg>
diff --git a/css/user/blue/images/hvac/defrost_rear_off.svg b/css/user/blue/images/hvac/defrost_rear_off.svg
new file mode 100644 (file)
index 0000000..3caad5f
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 763 123 88" overflow="visible" enable-background="new 574 763 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="575" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="575" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<path fill="#31ABFF" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path fill="#31ABFF" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65V785.46z"/>
+<path fill="#31ABFF" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H639.404z
+        M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347
+       H644.458z"/>
+<path fill="#31ABFF" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path fill="#31ABFF" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66h35.68
+       c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>
+<path fill="#31ABFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.393,19.226,0.442,30.322
+       c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>
+<path fill="#31ABFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322
+       c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>
+<path fill="#31ABFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322
+       c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="765.6836" x2="635.5" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="574.5" y="763.5" display="none" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<path display="none" fill="#FFFFFF" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path display="none" fill="#FFFFFF" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65
+       V785.46z"/>
+<path display="none" fill="#FFFFFF" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001
+       H639.404z M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299
+       l-1.361,4.347H644.458z"/>
+<path display="none" fill="#FFFFFF" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path display="none" fill="#FFFFFF" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66
+       h35.68c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>
+<path display="none" fill="#FFFFFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>
+<path display="none" fill="#FFFFFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>
+<path display="none" fill="#FFFFFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>
+<text transform="matrix(1 0 0 1 605.627 793.2891)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="26.1844">REAR</text>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="3" stroke-miterlimit="10" d="M658.5,826.34
+       c0,2.298-1.862,4.16-4.16,4.16h-35.68c-2.298,0-4.16-1.862-4.16-4.16v-19.68c0-2.298,1.862-4.16,4.16-4.16h35.68
+       c2.298,0,4.16,1.862,4.16,4.16V826.34z"/>
+<path display="none" fill="#31ABFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>
+<path display="none" fill="#31ABFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>
+<path display="none" fill="#31ABFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/defrost_rear_on.svg b/css/user/blue/images/hvac/defrost_rear_on.svg
new file mode 100644 (file)
index 0000000..7cac322
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 763 123 88" overflow="visible" enable-background="new 574 763 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="575" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="575" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<path display="none" fill="#31ABFF" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path display="none" fill="#31ABFF" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65
+       V785.46z"/>
+<path display="none" fill="#31ABFF" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001
+       H639.404z M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299
+       l-1.361,4.347H644.458z"/>
+<path display="none" fill="#31ABFF" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path display="none" fill="#31ABFF" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66
+       h35.68c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>
+<path display="none" fill="#31ABFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>
+<path display="none" fill="#31ABFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>
+<path display="none" fill="#31ABFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="765.6836" x2="635.5" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="574.5" y="763.5" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<path fill="#FFFFFF" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path fill="#FFFFFF" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65V785.46z"/>
+<path fill="#FFFFFF" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H639.404z
+        M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347
+       H644.458z"/>
+<path fill="#FFFFFF" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>
+<path fill="#FFFFFF" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66h35.68
+       c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>
+<path fill="#FFFFFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.393,19.226,0.442,30.322
+       c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>
+<path fill="#FFFFFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322
+       c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>
+<path fill="#FFFFFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322
+       c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>
+<text transform="matrix(1 0 0 1 605.627 793.2891)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="26.1844">REAR</text>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="3" stroke-miterlimit="10" d="M658.5,826.34
+       c0,2.298-1.862,4.16-4.16,4.16h-35.68c-2.298,0-4.16-1.862-4.16-4.16v-19.68c0-2.298,1.862-4.16,4.16-4.16h35.68
+       c2.298,0,4.16,1.862,4.16,4.16V826.34z"/>
+<path display="none" fill="#31ABFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>
+<path display="none" fill="#31ABFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>
+<path display="none" fill="#31ABFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/drag_knob.svg b/css/user/blue/images/hvac/drag_knob.svg
new file mode 100644 (file)
index 0000000..8066c26
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="22px" height="22px" viewBox="92.589 507.285 22 22"
+        overflow="visible" enable-background="new 92.589 507.285 22 22" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<circle fill="#31ABFF" stroke="#31ABFF" stroke-width="0.5936" stroke-miterlimit="10" cx="103.502" cy="518.197" r="6.141"/>
+<circle fill="#31ABFF" fill-opacity="0.45" cx="103.502" cy="518.197" r="10.912"/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_bar_on.svg b/css/user/blue/images/hvac/fan_bar_on.svg
new file mode 100644 (file)
index 0000000..42505c5
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="303px" height="94px" viewBox="362.629 633 303 94"
+        overflow="visible" enable-background="new 362.629 633 303 94" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect x="123.129" display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="275.129" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 283.4937 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 283.4937 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 283.4937 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 283.4937 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 283.4937 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+               <text transform="matrix(1 0 0 1 283.4937 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>
+       </g>
+</g>
+<circle display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.5936" stroke-miterlimit="10" cx="494.93" cy="726.5" r="6.141"/>
+<circle display="none" fill="#31ABFF" fill-opacity="0.45" cx="494.93" cy="726.5" r="10.912"/>
+<path display="none" fill="none" stroke="#00507F" stroke-miterlimit="10" d="M968.129,664.752
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-miterlimit="10" x1="667.129" y1="719.5" x2="363.129" y2="719.5"/>
+<line fill="#31ABFF" stroke="#31ABFF" stroke-width="3" stroke-miterlimit="10" x1="667.129" y1="726.5" x2="363.129" y2="726.5"/>
+<path fill="#31ABFF" d="M362.629,703.5h29v-68.552c-9.608,0.396-19.279,0.849-29,1.366V703.5z"/>
+<path fill="#31ABFF" d="M401.629,703.5h29v-69.834c-9.582,0.234-19.253,0.529-29,0.89V703.5z"/>
+<path fill="#31ABFF" d="M440.629,703.5h28v-70.443c-9.225,0.067-18.564,0.196-28,0.386V703.5z"/>
+<path fill="#31ABFF" d="M479.629,633.008V703.5h29v-70.351c-8.34-0.098-16.598-0.149-24.75-0.149
+       C482.468,633,481.047,633.005,479.629,633.008z"/>
+<path fill="#31ABFF" d="M519.629,703.5h28v-69.553c-9.42-0.273-18.76-0.488-28-0.643V703.5z"/>
+<path fill="#31ABFF" d="M558.629,703.5h29v-68.051c-9.73-0.447-19.404-0.835-29-1.159V703.5z"/>
+<path fill="#31ABFF" d="M597.629,703.5h28v-66.005c-9.371-0.578-18.71-1.103-28-1.567V703.5z"/>
+<path fill="#31ABFF" d="M636.629,703.5h29v-63.205c-9.684-0.759-19.356-1.46-29-2.099V703.5z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_control_ac_off.svg b/css/user/blue/images/hvac/fan_control_ac_off.svg
new file mode 100644 (file)
index 0000000..dbc1b9f
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="112px" height="88px" viewBox="174 763 112 88" overflow="visible" enable-background="new 174 763 112 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>
+<rect x="174.5" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>
+       </g>
+</g>
+<rect x="174.5" y="763.5" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>
+<g>
+       <g>
+               <path fill="#31ABFF" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H212.333z
+                        M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898
+                       H218.028z"/>
+               <path fill="#31ABFF" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>
+               <path fill="#31ABFF" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885c-6.315,0-10.151-3.954-10.151-10.004
+                       c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892c-0.944-0.413-2.243-0.768-3.896-0.768
+                       c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>
+       </g>
+</g>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="230" y1="765.6836" x2="230" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="174.5" y="763.5" display="none" fill="url(#SVGID_6_)" stroke="#31ABFF" stroke-miterlimit="10" width="111" height="87"/>
+<g display="none">
+       <g display="inline">
+               <path display="none" fill="#FFFFFF" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637
+                       H212.333z M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719
+                       l-1.535,4.898H218.028z"/>
+               <path display="none" fill="#FFFFFF" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>
+               <path display="none" fill="#FFFFFF" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885
+                       c-6.315,0-10.151-3.954-10.151-10.004c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892
+                       c-0.944-0.413-2.243-0.768-3.896-0.768c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171
+                       c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>
+       </g>
+</g>
+<g display="none">
+       
+               <text transform="matrix(1 0 0 1 206.2534 816.5)" display="inline" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="29.5171">A/C</text>
+</g>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_control_ac_on.svg b/css/user/blue/images/hvac/fan_control_ac_on.svg
new file mode 100644 (file)
index 0000000..d890aab
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="112px" height="88px" viewBox="174 763 112 88" overflow="visible" enable-background="new 174 763 112 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>
+<rect x="174.5" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>
+       </g>
+</g>
+<rect x="174.5" y="763.5" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>
+<g display="none">
+       <g display="inline">
+               <path display="none" fill="#31ABFF" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637
+                       H212.333z M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719
+                       l-1.535,4.898H218.028z"/>
+               <path display="none" fill="#31ABFF" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>
+               <path display="none" fill="#31ABFF" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885
+                       c-6.315,0-10.151-3.954-10.151-10.004c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892
+                       c-0.944-0.413-2.243-0.768-3.896-0.768c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171
+                       c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>
+       </g>
+</g>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="230" y1="765.6836" x2="230" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="174.5" y="763.5" fill="url(#SVGID_6_)" stroke="#31ABFF" stroke-miterlimit="10" width="111" height="87"/>
+<g>
+       <g>
+               <path fill="#FFFFFF" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H212.333z
+                        M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898
+                       H218.028z"/>
+               <path fill="#FFFFFF" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>
+               <path fill="#FFFFFF" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885c-6.315,0-10.151-3.954-10.151-10.004
+                       c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892c-0.944-0.413-2.243-0.768-3.896-0.768
+                       c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>
+       </g>
+</g>
+<g display="none">
+       
+               <text transform="matrix(1 0 0 1 206.2534 816.5)" display="inline" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="29.5171">A/C</text>
+</g>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_control_auto_off.svg b/css/user/blue/images/hvac/fan_control_auto_off.svg
new file mode 100644 (file)
index 0000000..26368f6
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="111px" height="88px" viewBox="305 763 111 88" overflow="visible" enable-background="new 305 763 111 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>
+<rect x="305.25" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>
+       </g>
+</g>
+<rect x="305.25" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<path fill="#31ABFF" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H330.526z
+        M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898
+       H336.222z"/>
+<path fill="#31ABFF" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695V796.61h3.63v11.361
+       c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>
+<path fill="#31ABFF" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>
+<path fill="#31ABFF" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="360.4995" y1="765.6836" x2="360.4995" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="305.5" y="763.5" display="none" fill="url(#SVGID_6_)" stroke="#31ABFF" stroke-miterlimit="10" width="110" height="87"/>
+<path display="none" fill="#FFFFFF" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637
+       H330.526z M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719
+       l-1.535,4.898H336.222z"/>
+<path display="none" fill="#FFFFFF" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695
+       V796.61h3.63v11.361c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>
+<path display="none" fill="#FFFFFF" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>
+<path display="none" fill="#FFFFFF" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>
+<text transform="matrix(1 0 0 1 324.4473 816.5)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="29.5171">AUTO</text>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_control_auto_on.svg b/css/user/blue/images/hvac/fan_control_auto_on.svg
new file mode 100644 (file)
index 0000000..c07ba0c
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="111px" height="88px" viewBox="305 763 111 88" overflow="visible" enable-background="new 305 763 111 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>
+<rect x="305.25" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>
+       </g>
+</g>
+<rect x="305.25" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<path display="none" fill="#31ABFF" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637
+       H330.526z M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719
+       l-1.535,4.898H336.222z"/>
+<path display="none" fill="#31ABFF" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695
+       V796.61h3.63v11.361c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>
+<path display="none" fill="#31ABFF" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>
+<path display="none" fill="#31ABFF" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="360.4995" y1="765.6836" x2="360.4995" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="305.5" y="763.5" fill="url(#SVGID_6_)" stroke="#31ABFF" stroke-miterlimit="10" width="110" height="87"/>
+<path fill="#FFFFFF" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H330.526z
+        M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898
+       H336.222z"/>
+<path fill="#FFFFFF" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695V796.61h3.63v11.361
+       c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>
+<path fill="#FFFFFF" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>
+<path fill="#FFFFFF" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>
+<text transform="matrix(1 0 0 1 324.4473 816.5)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="29.5171">AUTO</text>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_control_circ_off.svg b/css/user/blue/images/hvac/fan_control_circ_off.svg
new file mode 100644 (file)
index 0000000..6db3659
--- /dev/null
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="112px" height="88px" viewBox="435 763 112 88" overflow="visible" enable-background="new 435 763 112 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="436" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<rect x="436" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<path fill="#31ABFF" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>
+<path fill="#31ABFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="491" y1="765.6836" x2="491" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="435.5" y="763.5" display="none" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="111" height="87"/>
+<path display="none" fill="#FFFFFF" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>
+<path display="none" fill="#FFFFFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="2" stroke-miterlimit="10" d="M532,808.908v-8.2
+       c0,0,0.497-1.502-0.987-2.283c-2.894-3.552-5.243-7.45-5.243-7.45s0.663-1.12,0.029-1.553c-0.634-0.434-9.878-1.422-9.878-1.422
+       h-25.943c-3.783,0-6.69,1.356-7.506,2.224c-0.816,0.867-10.616,8.302-10.616,8.302s-16.104,1.728-18.255,2.766
+       c-2.152,1.04-2.896,1.86-3.34,3.332c-0.445,1.474-1.115,2.401-1.337,4.308c-0.223,1.906-0.148,7.267,1.187,7.96
+       c1.336,0.692,2.746,1.118,2.895,1.64c0.148,0.52,1.631,0.775,2.076,0.775c0.021,0,0.074-0.007,0.156-0.015
+       c0.824,3.188,3.357,5.511,6.356,5.511c3.494,0,6.354-2.351,6.615-6.354c1.175-0.152,1.934,0.552,1.934,0.552h35.02h2.332
+       c0,0-0.003-0.743-0.003-0.713c0,4.284,2.972,7.355,6.64,7.355c3.669,0,6.642-3.674,6.642-7.957c0-0.019-0.002-0.135-0.002-0.151
+       c1.686-0.15,3.226-0.454,4.32-0.865c4.378-1.646,7.909-3.257,7.909-3.257v-3.922L532,808.908z"/>
+<path display="none" fill="#31ABFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_control_circ_on.svg b/css/user/blue/images/hvac/fan_control_circ_on.svg
new file mode 100644 (file)
index 0000000..cc25315
--- /dev/null
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="112px" height="88px" viewBox="435 763 112 88" overflow="visible" enable-background="new 435 763 112 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="436" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<rect x="436" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>
+<path display="none" fill="#31ABFF" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>
+<path display="none" fill="#31ABFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="491" y1="765.6836" x2="491" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="435.5" y="763.5" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="111" height="87"/>
+<path fill="#FFFFFF" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>
+<path fill="#FFFFFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="2" stroke-miterlimit="10" d="M532,808.908v-8.2
+       c0,0,0.497-1.502-0.987-2.283c-2.894-3.552-5.243-7.45-5.243-7.45s0.663-1.12,0.029-1.553c-0.634-0.434-9.878-1.422-9.878-1.422
+       h-25.943c-3.783,0-6.69,1.356-7.506,2.224c-0.816,0.867-10.616,8.302-10.616,8.302s-16.104,1.728-18.255,2.766
+       c-2.152,1.04-2.896,1.86-3.34,3.332c-0.445,1.474-1.115,2.401-1.337,4.308c-0.223,1.906-0.148,7.267,1.187,7.96
+       c1.336,0.692,2.746,1.118,2.895,1.64c0.148,0.52,1.631,0.775,2.076,0.775c0.021,0,0.074-0.007,0.156-0.015
+       c0.824,3.188,3.357,5.511,6.356,5.511c3.494,0,6.354-2.351,6.615-6.354c1.175-0.152,1.934,0.552,1.934,0.552h35.02h2.332
+       c0,0-0.003-0.743-0.003-0.713c0,4.284,2.972,7.355,6.64,7.355c3.669,0,6.642-3.674,6.642-7.957c0-0.019-0.002-0.135-0.002-0.151
+       c1.686-0.15,3.226-0.454,4.32-0.865c4.378-1.646,7.909-3.257,7.909-3.257v-3.922L532,808.908z"/>
+<path display="none" fill="#31ABFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_dir_down_off.svg b/css/user/blue/images/hvac/fan_dir_down_off.svg
new file mode 100644 (file)
index 0000000..0e51bb3
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="97px" viewBox="146.129 642.49 123 97"
+        overflow="visible" enable-background="new 146.129 642.49 123 97" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<g>
+       <g>
+               <g>
+                       <circle fill="#31ABFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#31ABFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon fill="#31ABFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>
+       </g>
+</g>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="207.6294" y1="643.626" x2="207.6294" y2="737.4362">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<path display="none" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" d="M268.629,643.039V738.5h-122v-80.76
+       C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<g display="none">
+       <g display="inline">
+               <g>
+                       <circle fill="#FFFFFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#FFFFFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon fill="#FFFFFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>
+       </g>
+</g>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle fill="#31ABFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#31ABFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon display="none" fill="#31ABFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 
+                       172.129,682             "/>
+       </g>
+</g>
+<path display="none" fill="none" stroke="#00507F" stroke-miterlimit="10" d="M968.129,664.752
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_dir_down_on.svg b/css/user/blue/images/hvac/fan_dir_down_on.svg
new file mode 100644 (file)
index 0000000..89af0d9
--- /dev/null
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="97px" viewBox="146.129 642.49 123 97"
+        overflow="visible" enable-background="new 146.129 642.49 123 97" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle fill="#31ABFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#31ABFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon display="none" fill="#31ABFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 
+                       172.129,682             "/>
+       </g>
+</g>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="207.6294" y1="643.626" x2="207.6294" y2="737.4362">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<path fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" d="M268.629,643.039V738.5h-122v-80.76
+       C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<g>
+       <g>
+               <g>
+                       <circle fill="#FFFFFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#FFFFFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon fill="#FFFFFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>
+       </g>
+</g>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle fill="#31ABFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#31ABFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon display="none" fill="#31ABFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 
+                       172.129,682             "/>
+       </g>
+</g>
+<path display="none" fill="none" stroke="#00507F" stroke-miterlimit="10" d="M968.129,664.752
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_dir_right_off.svg b/css/user/blue/images/hvac/fan_dir_right_off.svg
new file mode 100644 (file)
index 0000000..df0e04c
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 763 123 88" overflow="visible" enable-background="new 23 763 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="24" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="24" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<g>
+       <g>
+               <g>
+                       <circle fill="#31ABFF" cx="113.861" cy="789.944" r="8.235"/>
+               </g>
+               <g>
+                       <path fill="#31ABFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>
+               </g>
+       </g>
+</g>
+<polygon fill="#31ABFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="765.6836" x2="84.5" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="23.5" y="763.5" display="none" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<g display="none">
+       <g display="inline">
+               <g>
+                       <circle fill="#FFFFFF" cx="113.861" cy="789.944" r="8.235"/>
+               </g>
+               <g>
+                       <path fill="#FFFFFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#FFFFFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle display="inline" fill="#31ABFF" cx="113.861" cy="789.944" r="8.235"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#31ABFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_dir_right_on.svg b/css/user/blue/images/hvac/fan_dir_right_on.svg
new file mode 100644 (file)
index 0000000..d458a48
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 763 123 88" overflow="visible" enable-background="new 23 763 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="24" y="763.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="24" y="763.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle display="inline" fill="#31ABFF" cx="113.861" cy="789.944" r="8.235"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#31ABFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="765.6836" x2="84.5" y2="849.0061">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="23.5" y="763.5" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<g>
+       <g>
+               <g>
+                       <circle fill="#FFFFFF" cx="113.861" cy="789.944" r="8.235"/>
+               </g>
+               <g>
+                       <path fill="#FFFFFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>
+               </g>
+       </g>
+</g>
+<polygon fill="#FFFFFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle display="inline" fill="#31ABFF" cx="113.861" cy="789.944" r="8.235"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#31ABFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_dir_up_off.svg b/css/user/blue/images/hvac/fan_dir_up_off.svg
new file mode 100644 (file)
index 0000000..26c4848
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 876 123 88" overflow="visible" enable-background="new 23 876 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="24" y="876.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="24" y="876.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<g>
+       <g>
+               <g>
+                       <circle fill="#31ABFF" cx="113.861" cy="901.636" r="8.235"/>
+               </g>
+               <g>
+                       <path fill="#31ABFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>
+               </g>
+       </g>
+</g>
+<polygon fill="#31ABFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="877.6396" x2="84.5" y2="962.9438">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="23.5" y="876.5" display="none" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<g display="none">
+       <g display="inline">
+               <g>
+                       <circle fill="#FFFFFF" cx="113.861" cy="901.636" r="8.235"/>
+               </g>
+               <g>
+                       <path fill="#FFFFFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#FFFFFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle display="inline" fill="#31ABFF" cx="113.861" cy="901.636" r="8.235"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#31ABFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/fan_dir_up_on.svg b/css/user/blue/images/hvac/fan_dir_up_on.svg
new file mode 100644 (file)
index 0000000..7609d5d
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 876 123 88" overflow="visible" enable-background="new 23 876 123 88"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="24" y="876.898" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<rect x="24" y="876.898" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle display="inline" fill="#31ABFF" cx="113.861" cy="901.636" r="8.235"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#31ABFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="877.6396" x2="84.5" y2="962.9438">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="23.5" y="876.5" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="122" height="87"/>
+<g>
+       <g>
+               <g>
+                       <circle fill="#FFFFFF" cx="113.861" cy="901.636" r="8.235"/>
+               </g>
+               <g>
+                       <path fill="#FFFFFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>
+               </g>
+       </g>
+</g>
+<polygon fill="#FFFFFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle display="inline" fill="#31ABFF" cx="113.861" cy="901.636" r="8.235"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>
+               </g>
+       </g>
+</g>
+<polygon display="none" fill="#31ABFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/hazard_blink.svg b/css/user/blue/images/hvac/hazard_blink.svg
new file mode 100644 (file)
index 0000000..d19415c
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="416px" height="81px" viewBox="152 17 416 81" overflow="visible" enable-background="new 152 17 416 81"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="152.053" y="17.5" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.6866" stroke-miterlimit="10" stroke-opacity="0.64" width="415.947" height="79.5"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="359.9995" y1="17.9375" x2="359.9995" y2="96.6573">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="152.5" y="17.5" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="415" height="80"/>
+<path fill="none" stroke="#FF382D" stroke-width="6" stroke-miterlimit="10" d="M388.906,87h-57.737c-1.891,0-3.421-1.535-4.2-2.883
+       s-0.683-3.441,0.263-5.079l28.869-50.193c0.945-1.638,2.38-2.671,3.937-2.671s2.992,0.892,3.937,2.529l28.869,49.978
+       c0.945,1.637,1.041,4.1,0.263,5.447C392.327,85.478,390.798,87,388.906,87z"/>
+<polygon fill="none" stroke="#FF382D" stroke-width="6" stroke-miterlimit="10" points="338.375,78 359.958,40.616 381.541,78 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/hazard_off.svg b/css/user/blue/images/hvac/hazard_off.svg
new file mode 100644 (file)
index 0000000..8848782
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="416px" height="81px" viewBox="152 17 416 81" overflow="visible" enable-background="new 152 17 416 81"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="152.053" y="17.5" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.6866" stroke-miterlimit="10" stroke-opacity="0.64" width="415.947" height="79.5"/>
+<path fill="none" stroke="#31ABFF" stroke-width="6" stroke-miterlimit="10" d="M388.906,87h-57.737c-1.891,0-3.421-1.535-4.2-2.883
+       s-0.683-3.441,0.263-5.079l28.869-50.193c0.945-1.638,2.38-2.671,3.937-2.671s2.992,0.892,3.937,2.529l28.869,49.978
+       c0.945,1.637,1.041,4.1,0.263,5.447C392.327,85.478,390.798,87,388.906,87z"/>
+<polygon fill="none" stroke="#31ABFF" stroke-width="6" stroke-miterlimit="10" points="338.375,78 359.958,40.616 381.541,78 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/hazard_on.svg b/css/user/blue/images/hvac/hazard_on.svg
new file mode 100644 (file)
index 0000000..ce67d90
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="416px" height="81px" viewBox="152 17 416 81" overflow="visible" enable-background="new 152 17 416 81"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="152.053" y="17.5" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.6866" stroke-miterlimit="10" stroke-opacity="0.64" width="415.947" height="79.5"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="359.9995" y1="17.9375" x2="359.9995" y2="96.6573">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<rect x="152.5" y="17.5" fill="url(#SVGID_3_)" stroke="#31ABFF" stroke-miterlimit="10" width="415" height="80"/>
+<path fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" d="M388.906,87h-57.737c-1.891,0-3.421-1.535-4.2-2.883
+       s-0.683-3.441,0.263-5.079l28.869-50.193c0.945-1.638,2.38-2.671,3.937-2.671s2.992,0.892,3.937,2.529l28.869,49.978
+       c0.945,1.637,1.041,4.1,0.263,5.447C392.327,85.478,390.798,87,388.906,87z"/>
+<polygon fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" points="338.375,78 359.958,40.616 381.541,78 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/left_heat_seat_off.svg b/css/user/blue/images/hvac/left_heat_seat_off.svg
new file mode 100644 (file)
index 0000000..50f3c26
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="159px" height="129px" viewBox="151 175 159 129"
+        overflow="visible" enable-background="new 151 175 159 129" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="151.573" y="175.708" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-miterlimit="10" stroke-opacity="0.64" width="157.956" height="127.534"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M214.667,255.953l-51.053-3.023c-3.593-0.142-5.474,3.107-4.104,7.17l2.857,10.824c1.528,4.532,5.986,9.041,9.909,9.041h62.589
+       c5.253,0,6.745-6.561,6.745-11.152c-0.12-25.828,4.735-52.385,14.563-78.246c0.954-2.52-0.953-5.045-4.298-5.702
+       c-1.817-0.356-3.633-0.713-5.449-1.069c-3.336-0.655-7.05,0.767-8.259,3.236c-11.038,22.564-18.271,43.783-21.696,66.559
+       C216.47,253.589,215.807,256.021,214.667,255.953z"/>
+<path fill="#31ABFF" d="M181.5,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0
+       C171.316,253,191.684,275,181.5,298z"/>
+<polygon fill="#31ABFF" points="173.511,231.288 181.012,223.451 184.048,233.866 "/>
+<path fill="#31ABFF" d="M194.359,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0
+       C184.175,253,204.543,275,194.359,298z"/>
+<polygon fill="#31ABFF" points="186.37,231.288 193.871,223.451 196.907,233.866 "/>
+<path fill="#31ABFF" d="M207.86,298c-18.859,0,15.646,0-3.214,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.214,0
+       C197.676,253,218.045,275,207.86,298z"/>
+<polygon fill="#31ABFF" points="199.872,231.288 207.373,223.451 210.409,233.866 "/>
+<g>
+       <g>
+               <g>
+                       <path opacity="0.29" fill="#31ABFF" d="M302,219v-22h-40.44c-2.568,7-4.733,14-6.516,22H302z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M302.5,218.5v-22h-40.94
+                               c-2.568,8-4.733,15-6.516,22H302.5z"/>
+               </g>
+               <g>
+                       <path opacity="0.29" fill="#31ABFF" d="M302,244v-21h-47.87c-1.63,7-2.88,14-3.73,21H302z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M302.5,244.5v-22h-48.37c-1.63,7-2.88,15-3.73,22
+                               H302.5z"/>
+               </g>
+               <g>
+                       <path opacity="0.29" fill="#31ABFF" d="M248.987,270H302v-22h-52.009c-0.671,7-1.003,13.871-0.971,20.759
+                               C249.02,269.155,249.002,270,248.987,270z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M248.987,270.5H302.5v-22h-52.509
+                               c-0.671,7-1.003,13.871-0.971,20.759C249.02,269.655,249.002,269.5,248.987,270.5z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/css/user/blue/images/hvac/left_heat_seat_on.svg b/css/user/blue/images/hvac/left_heat_seat_on.svg
new file mode 100644 (file)
index 0000000..677b04b
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="159px" height="129px" viewBox="151 175 159 129"
+        overflow="visible" enable-background="new 151 175 159 129" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="151.573" y="175.708" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-miterlimit="10" stroke-opacity="0.64" width="157.956" height="127.534"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M214.667,255.953l-51.053-3.023c-3.593-0.142-5.474,3.107-4.104,7.17l2.857,10.824c1.528,4.532,5.986,9.041,9.909,9.041h62.589
+       c5.253,0,6.745-6.561,6.745-11.152c-0.12-25.828,4.735-52.385,14.563-78.246c0.954-2.52-0.953-5.045-4.298-5.702
+       c-1.817-0.356-3.633-0.713-5.449-1.069c-3.336-0.655-7.05,0.767-8.259,3.236c-11.038,22.564-18.271,43.783-21.696,66.559
+       C216.47,253.589,215.807,256.021,214.667,255.953z"/>
+<path fill="#31ABFF" d="M181.5,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0
+       C171.316,253,191.684,275,181.5,298z"/>
+<polygon fill="#31ABFF" points="173.511,231.288 181.012,223.451 184.048,233.866 "/>
+<path fill="#31ABFF" d="M194.359,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0
+       C184.175,253,204.543,275,194.359,298z"/>
+<polygon fill="#31ABFF" points="186.37,231.288 193.871,223.451 196.907,233.866 "/>
+<path fill="#31ABFF" d="M207.86,298c-18.859,0,15.646,0-3.214,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.214,0
+       C197.676,253,218.045,275,207.86,298z"/>
+<polygon fill="#31ABFF" points="199.872,231.288 207.373,223.451 210.409,233.866 "/>
+<g>
+       <g>
+               <g>
+                       <path fill="#31ABFF" d="M302,219v-22h-40.44c-2.568,7-4.733,14-6.516,22H302z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M302.5,218.5v-22h-40.94
+                               c-2.568,8-4.733,15-6.516,22H302.5z"/>
+               </g>
+               <g>
+                       <path fill="#31ABFF" d="M302,244v-21h-47.87c-1.63,7-2.88,14-3.73,21H302z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M302.5,244.5v-22h-48.37c-1.63,7-2.88,15-3.73,22
+                               H302.5z"/>
+               </g>
+               <g>
+                       <path fill="#31ABFF" d="M248.987,270H302v-22h-52.009c-0.671,7-1.003,13.871-0.971,20.759
+                               C249.02,269.155,249.002,270,248.987,270z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M248.987,270.5H302.5v-22h-52.509
+                               c-0.671,7-1.003,13.871-0.971,20.759C249.02,269.655,249.002,269.5,248.987,270.5z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/css/user/blue/images/hvac/left_number_bg.svg b/css/user/blue/images/hvac/left_number_bg.svg
new file mode 100644 (file)
index 0000000..1d99dbb
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="158px" height="231px" viewBox="152 346 158 231"
+        overflow="visible" enable-background="new 152 346 158 231" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>
+<polygon fill="#31ABFF" fill-opacity="0.29" points="309.918,435.516 309.918,345.813 152.353,345.813 152.353,577.48 
+       309.918,577.48 309.918,486.998 284.178,461.257 "/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>
+       </g>
+</g>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="231" y1="349.6602" x2="231" y2="574.0174">
+       <stop  offset="0" style="stop-color:#2175AD"/>
+       <stop  offset="0.2822" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="0.7055" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="1" style="stop-color:#2175AD"/>
+</linearGradient>
+<polygon display="none" fill="url(#SVGID_6_)" stroke="#31ABFF" stroke-miterlimit="10" points="309.5,435.516 309.5,345.5 
+       152.5,345.5 152.5,577.5 309.5,577.5 309.5,486.998 283.759,461.257 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/left_number_cover.svg b/css/user/blue/images/hvac/left_number_cover.svg
new file mode 100644 (file)
index 0000000..31a9881
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="158px" height="233px" viewBox="152 345 158 233"
+        overflow="visible" enable-background="new 152 345 158 233" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="231" y1="349.6602" x2="231" y2="574.0174">
+       <stop  offset="0" style="stop-color:#2175AD"/>
+       <stop  offset="0.2822" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="0.7055" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="1" style="stop-color:#2175AD"/>
+</linearGradient>
+<polygon fill="url(#SVGID_2_)" stroke="#31ABFF" stroke-miterlimit="10" points="309.5,435.516 309.5,345.5 152.5,345.5 
+       152.5,577.5 309.5,577.5 309.5,486.998 283.759,461.257 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/right_heat_seat_off.svg b/css/user/blue/images/hvac/right_heat_seat_off.svg
new file mode 100644 (file)
index 0000000..7b58a6d
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="159px" height="129px" viewBox="410 175 159 129"
+        overflow="visible" enable-background="new 410 175 159 129" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+       </g>
+</g>
+<rect x="410.472" y="175.708" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-miterlimit="10" stroke-opacity="0.64" width="157.955" height="127.534"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M505.333,255.953l51.054-3.023c3.593-0.142,5.475,3.107,4.104,7.17l-2.858,10.824c-1.527,4.532-5.985,9.041-9.908,9.041h-62.589
+       c-5.254,0-6.745-6.561-6.745-11.152c0.12-25.828-4.735-52.385-14.563-78.246c-0.953-2.52,0.953-5.045,4.299-5.702
+       c1.817-0.356,3.634-0.713,5.448-1.069c3.337-0.655,7.051,0.767,8.26,3.236c11.037,22.564,18.271,43.783,21.695,66.559
+       C503.529,253.589,504.193,256.021,505.333,255.953z"/>
+<path fill="#31ABFF" d="M538.5,298c18.86,0-15.645,0,3.215,0c-10.184-23,10.184-45,0-67c-18.859,0,15.646,0-3.215,0
+       C548.685,253,528.316,275,538.5,298z"/>
+<polygon fill="#31ABFF" points="546.489,231.288 538.988,223.451 535.952,233.866 "/>
+<path fill="#31ABFF" d="M525.642,298c18.859,0-15.646,0,3.214,0c-10.184-23,10.186-45,0-67c-18.86,0,15.646,0-3.214,0
+       C535.825,253,515.457,275,525.642,298z"/>
+<polygon fill="#31ABFF" points="533.63,231.288 526.129,223.451 523.093,233.866 "/>
+<path fill="#31ABFF" d="M512.14,298c18.86,0-15.646,0,3.214,0c-10.184-23,10.185-45,0-67c-18.859,0,15.646,0-3.214,0
+       C522.323,253,501.955,275,512.14,298z"/>
+<polygon fill="#31ABFF" points="520.128,231.288 512.627,223.451 509.592,233.866 "/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M417.882,218.609v-21.841h40.559c2.568,7.243,4.733,14.529,6.516,21.841H417.882z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M417.882,244.35v-21.841h47.987c1.63,7.263,2.881,14.548,3.73,21.841H417.882z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M471.014,270.091h-53.132V248.25h52.128c0.67,6.894,1.002,13.792,0.971,20.679C470.98,269.325,470.998,269.707,471.014,270.091z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/right_heat_seat_on.svg b/css/user/blue/images/hvac/right_heat_seat_on.svg
new file mode 100644 (file)
index 0000000..e214745
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="159px" height="129px" viewBox="410 175 159 129"
+        overflow="visible" enable-background="new 410 175 159 129" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+       </g>
+</g>
+<rect x="410.472" y="175.708" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-miterlimit="10" stroke-opacity="0.64" width="157.955" height="127.534"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M505.333,255.953l51.054-3.023c3.593-0.142,5.475,3.107,4.104,7.17l-2.858,10.824c-1.527,4.532-5.985,9.041-9.908,9.041h-62.589
+       c-5.254,0-6.745-6.561-6.745-11.152c0.12-25.828-4.735-52.385-14.563-78.246c-0.953-2.52,0.953-5.045,4.299-5.702
+       c1.817-0.356,3.634-0.713,5.448-1.069c3.337-0.655,7.051,0.767,8.26,3.236c11.037,22.564,18.271,43.783,21.695,66.559
+       C503.529,253.589,504.193,256.021,505.333,255.953z"/>
+<path fill="#31ABFF" d="M538.5,298c18.86,0-15.645,0,3.215,0c-10.184-23,10.184-45,0-67c-18.859,0,15.646,0-3.215,0
+       C548.685,253,528.316,275,538.5,298z"/>
+<polygon fill="#31ABFF" points="546.489,231.288 538.988,223.451 535.952,233.866 "/>
+<path fill="#31ABFF" d="M525.642,298c18.859,0-15.646,0,3.214,0c-10.184-23,10.186-45,0-67c-18.86,0,15.646,0-3.214,0
+       C535.825,253,515.457,275,525.642,298z"/>
+<polygon fill="#31ABFF" points="533.63,231.288 526.129,223.451 523.093,233.866 "/>
+<path fill="#31ABFF" d="M512.14,298c18.86,0-15.646,0,3.214,0c-10.184-23,10.185-45,0-67c-18.859,0,15.646,0-3.214,0
+       C522.323,253,501.955,275,512.14,298z"/>
+<polygon fill="#31ABFF" points="520.128,231.288 512.627,223.451 509.592,233.866 "/>
+<path fill="#31ABFF" stroke="#31ABFF" stroke-width="0.7906" stroke-miterlimit="10" stroke-opacity="0.64" d="M417.882,218.609
+       v-21.841h40.559c2.568,7.243,4.733,14.529,6.516,21.841H417.882z"/>
+<path fill="#31ABFF" stroke="#31ABFF" stroke-width="0.7906" stroke-miterlimit="10" stroke-opacity="0.64" d="M417.882,244.35
+       v-21.841h47.987c1.63,7.263,2.881,14.548,3.73,21.841H417.882z"/>
+<path fill="#31ABFF" stroke="#31ABFF" stroke-width="0.7906" stroke-miterlimit="10" stroke-opacity="0.64" d="M471.014,270.091
+       h-53.132V248.25h52.128c0.67,6.894,1.002,13.792,0.971,20.679C470.98,269.325,470.998,269.707,471.014,270.091z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/right_number_bg.svg b/css/user/blue/images/hvac/right_number_bg.svg
new file mode 100644 (file)
index 0000000..c2142ca
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="159px" height="232px" viewBox="410 345.813 159 232"
+        overflow="visible" enable-background="new 410 345.813 159 232" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>
+<polygon fill="#31ABFF" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       410.861,435.516 410.861,345.813 568.427,345.813 568.427,577.48 410.861,577.48 410.861,486.998 436.603,461.257 "/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+       </g>
+</g>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="229.4995" y1="349.6606" x2="229.4995" y2="574.0165" gradientTransform="matrix(-1 0 0 1 719 0)">
+       <stop  offset="0" style="stop-color:#2175AD"/>
+       <stop  offset="0.2822" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="0.7055" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="1" style="stop-color:#2175AD"/>
+</linearGradient>
+<polygon display="none" fill="url(#SVGID_6_)" stroke="#31ABFF" stroke-miterlimit="10" points="410.5,435.516 410.5,345.5 
+       568.5,345.5 568.5,577.5 410.5,577.5 410.5,486.998 436.241,461.257 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/right_number_cover.svg b/css/user/blue/images/hvac/right_number_cover.svg
new file mode 100644 (file)
index 0000000..71da7a6
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="159px" height="233px" viewBox="410 345 159 233"
+        overflow="visible" enable-background="new 410 345 159 233" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>
+<polygon display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       410.861,435.516 410.861,345.813 568.427,345.813 568.427,577.48 410.861,577.48 410.861,486.998 436.603,461.257 "/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_4_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_4_)">
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+       </g>
+</g>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="229.4995" y1="349.6606" x2="229.4995" y2="574.0165" gradientTransform="matrix(-1 0 0 1 719 0)">
+       <stop  offset="0" style="stop-color:#2175AD"/>
+       <stop  offset="0.2822" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="0.7055" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="1" style="stop-color:#2175AD"/>
+</linearGradient>
+<polygon fill="url(#SVGID_6_)" stroke="#31ABFF" stroke-miterlimit="10" points="410.5,435.516 410.5,345.5 568.5,345.5 
+       568.5,577.5 410.5,577.5 410.5,486.998 436.241,461.257 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/static_parts_bg.svg b/css/user/blue/images/hvac/static_parts_bg.svg
new file mode 100644 (file)
index 0000000..b56cca8
--- /dev/null
@@ -0,0 +1,471 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="720px" height="601px" viewBox="123.129 125.388 720 601"
+        overflow="visible" enable-background="new 123.129 125.388 720 601" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect x="123.129" display="none" fill="url(#SVGID_4_)" width="720" height="1001"/>
+<polygon display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       533.991,435.516 533.991,345.813 691.556,345.813 691.556,577.48 533.991,577.48 533.991,486.998 559.732,461.257 "/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<polygon display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       433.048,435.516 433.048,345.813 275.482,345.813 275.482,577.48 433.048,577.48 433.048,486.998 407.307,461.257 "/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_3_" x="275.129" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_6_" display="inline">
+               <use xlink:href="#SVGID_3_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_6_)">
+               <text transform="matrix(1 0 0 1 283.4937 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 283.4937 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 283.4937 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 283.4937 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 283.4937 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+               <text transform="matrix(1 0 0 1 283.4937 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>
+       </g>
+</g>
+<line display="none" fill="none" stroke="#00507F" stroke-miterlimit="10" x1="483.629" y1="98" x2="483.629" y2="610"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="354.1294" y1="349.6602" x2="354.1294" y2="574.0174">
+       <stop  offset="0" style="stop-color:#2175AD"/>
+       <stop  offset="0.2822" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="0.7055" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="1" style="stop-color:#2175AD"/>
+</linearGradient>
+<polygon display="none" fill="url(#SVGID_7_)" stroke="#31ABFF" stroke-miterlimit="10" points="432.629,435.516 432.629,345.5 
+       275.629,345.5 275.629,577.5 432.629,577.5 432.629,486.998 406.889,461.257 "/>
+<g display="none">
+       <defs>
+               <rect id="SVGID_1_" x="533.129" y="346" width="158" height="232"/>
+       </defs>
+       <clipPath id="SVGID_9_" display="inline">
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>
+       </clipPath>
+       <g clip-path="url(#SVGID_9_)">
+               <text transform="matrix(1 0 0 1 550.7231 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>
+               <text transform="matrix(1 0 0 1 550.7231 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>
+               <text transform="matrix(1 0 0 1 550.7231 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>
+               <text transform="matrix(1 0 0 1 550.7231 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>
+               <text transform="matrix(1 0 0 1 550.7231 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>
+       </g>
+</g>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>
+<circle display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.5936" stroke-miterlimit="10" cx="756.627" cy="420.198" r="6.141"/>
+<circle display="none" fill="#31ABFF" fill-opacity="0.45" cx="756.627" cy="420.198" r="10.912"/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="2" stroke-miterlimit="10" x1="756.129" y1="419" x2="756.129" y2="607"/>
+<circle display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.5936" stroke-miterlimit="10" cx="494.93" cy="726.5" r="6.141"/>
+<circle display="none" fill="#31ABFF" fill-opacity="0.45" cx="494.93" cy="726.5" r="10.912"/>
+<circle display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.5936" stroke-miterlimit="10" cx="210.631" cy="524.197" r="6.141"/>
+<circle display="none" fill="#31ABFF" fill-opacity="0.45" cx="210.631" cy="524.197" r="10.912"/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="2" stroke-miterlimit="10" x1="211.129" y1="529" x2="211.129" y2="607"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle fill="#31ABFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#31ABFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon display="none" fill="#31ABFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 
+                       172.129,682             "/>
+       </g>
+</g>
+<path display="none" fill="#31ABFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>
+<path display="none" fill="#31ABFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299
+       l-1.361,4.347H762.701z"/>
+<path display="none" fill="#31ABFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"
+       />
+<path display="none" fill="#31ABFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>
+<path display="none" fill="#31ABFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path display="none" fill="#31ABFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path display="none" fill="#31ABFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="207.6294" y1="643.626" x2="207.6294" y2="737.4362">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<path display="none" fill="url(#SVGID_10_)" stroke="#31ABFF" stroke-miterlimit="10" d="M268.629,643.039V738.5h-122v-80.76
+       C186.629,651.722,227.629,646.832,268.629,643.039z"/>
+<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="758.6294" y1="643.626" x2="758.6294" y2="737.4362">
+       <stop  offset="0.5092" style="stop-color:#31ABFF;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#31ABFF"/>
+       <stop  offset="1" style="stop-color:#63E6FF"/>
+</linearGradient>
+<path display="none" fill="url(#SVGID_11_)" stroke="#31ABFF" stroke-miterlimit="10" d="M697.629,643.039V738.5h122v-80.76
+       C780.629,651.722,739.629,646.832,697.629,643.039z"/>
+<g display="none">
+       <g display="inline">
+               <g>
+                       <circle fill="#FFFFFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#FFFFFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon fill="#FFFFFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>
+       </g>
+</g>
+<path display="none" fill="#FFFFFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>
+<path display="none" fill="#FFFFFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299
+       l-1.361,4.347H762.701z"/>
+<path display="none" fill="#FFFFFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"
+       />
+<path display="none" fill="#FFFFFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>
+<path display="none" fill="#FFFFFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path display="none" fill="#FFFFFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path display="none" fill="#FFFFFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <circle fill="#31ABFF" cx="236.991" cy="676.459" r="8.235"/>
+                       <path fill="#31ABFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>
+               </g>
+               <polygon display="none" fill="#31ABFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 
+                       172.129,682             "/>
+       </g>
+</g>
+<text transform="matrix(1 0 0 1 730.7563 682.6807)" display="none" fill="#31ABFF" font-family="'MyriadPro-Semibold'" font-size="26.1844">MAX</text>
+<path display="none" fill="none" stroke="#31ABFF" stroke-width="2.4433" stroke-miterlimit="10" d="M776.192,719.741
+       c-0.579,1.821-2.173,2.65-3.596,2.008c-8.41-3.825-17.523-3.825-25.935,0c-1.42,0.643-3.016-0.187-3.595-2.008
+       c-2-6.518-3.999-13.035-6-19.552c-0.577-1.816,0.696-4.296,2.894-5.293c12.758-5.803,26.58-5.803,39.338,0
+       c2.197,0.997,3.471,3.477,2.894,5.293C780.191,706.706,778.192,713.224,776.192,719.741z"/>
+<path display="none" fill="#31ABFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>
+<path display="none" fill="#31ABFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>
+<path display="none" fill="#31ABFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>
+<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="352.6289" y1="349.6606" x2="352.6289" y2="574.0165" gradientTransform="matrix(-1 0 0 1 965.2588 0)">
+       <stop  offset="0" style="stop-color:#2175AD"/>
+       <stop  offset="0.2822" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="0.7055" style="stop-color:#2175AD;stop-opacity:0"/>
+       <stop  offset="1" style="stop-color:#2175AD"/>
+</linearGradient>
+<polygon display="none" fill="url(#SVGID_12_)" stroke="#31ABFF" stroke-miterlimit="10" points="533.629,435.516 533.629,345.5 
+       691.629,345.5 691.629,577.5 533.629,577.5 533.629,486.998 559.371,461.257 "/>
+<path fill="none" stroke="#00507F" stroke-miterlimit="10" d="M968.129,664.752C828.971,627.465,638.581,610,484.129,610
+       s-344.841,17.465-484,54.752"/>
+<path fill="#31ABFF" d="M583.971,125.855c1.144-0.187,2.848-0.327,4.739-0.327c2.334,0,3.969,0.351,5.089,1.237
+       c0.935,0.747,1.448,1.845,1.448,3.292c0,2.008-1.425,3.385-2.778,3.875v0.07c1.097,0.444,1.704,1.494,2.101,2.942
+       c0.49,1.774,0.98,3.829,1.284,4.436h-3.642c-0.257-0.443-0.631-1.728-1.098-3.666c-0.42-1.961-1.097-2.498-2.545-2.521h-1.073v6.187
+       h-3.525V125.855z M587.497,132.625h1.4c1.774,0,2.825-0.887,2.825-2.264c0-1.448-0.98-2.171-2.615-2.195
+       c-0.863,0-1.354,0.07-1.61,0.117V132.625z"/>
+<path fill="#31ABFF" d="M614.083,140.937c-0.653,0.327-2.124,0.677-4.038,0.677c-5.44,0-8.241-3.385-8.241-7.868
+       c0-5.37,3.828-8.358,8.591-8.358c1.845,0,3.245,0.374,3.876,0.701l-0.724,2.825c-0.725-0.303-1.729-0.583-2.988-0.583
+       c-2.825,0-5.02,1.704-5.02,5.206c0,3.152,1.867,5.136,5.042,5.136c1.074,0,2.265-0.233,2.966-0.514L614.083,140.937z"/>
+<path fill="#31ABFF" d="M616.417,125.645h3.571v12.747h6.257v2.988h-9.828V125.645z"/>
+<path fill="#31ABFF" d="M631.916,125.645v15.735h-3.571v-15.735H631.916z"/>
+<path fill="#31ABFF" d="M648.303,135.357c-0.069-1.891-0.14-4.179-0.14-6.467h-0.07c-0.49,2.008-1.144,4.249-1.751,6.093
+       l-1.914,6.14h-2.778l-1.681-6.093c-0.514-1.844-1.051-4.085-1.424-6.14h-0.047c-0.094,2.125-0.164,4.553-0.28,6.514l-0.28,5.977
+       h-3.292l1.004-15.735h4.739l1.541,5.253c0.49,1.821,0.98,3.782,1.331,5.626h0.069c0.444-1.821,0.98-3.899,1.494-5.65l1.682-5.229
+       h4.646l0.863,15.735h-3.479L648.303,135.357z"/>
+<path fill="#31ABFF" d="M658.339,137.341l-1.12,4.039h-3.689l4.81-15.735h4.669l4.88,15.735h-3.829l-1.214-4.039H658.339z
+        M662.332,134.68l-0.98-3.338c-0.28-0.934-0.561-2.102-0.794-3.035h-0.047c-0.233,0.934-0.467,2.125-0.724,3.035l-0.934,3.338
+       H662.332z"/>
+<path fill="#31ABFF" d="M671.084,128.633h-4.226v-2.988h12.093v2.988h-4.296v12.747h-3.571V128.633z"/>
+<path fill="#31ABFF" d="M690.202,134.727h-5.79v3.735h6.468v2.918H680.84v-15.735h9.712v2.918h-6.141v3.269h5.79V134.727z"/>
+<path fill="#31ABFF" d="M326.542,125.645h3.572v12.747h6.257v2.988h-9.829V125.645z"/>
+<path fill="#31ABFF" d="M354.74,140.937c-0.654,0.327-2.125,0.677-4.039,0.677c-5.439,0-8.241-3.385-8.241-7.868
+       c0-5.37,3.829-8.358,8.591-8.358c1.845,0,3.245,0.374,3.875,0.701l-0.724,2.825c-0.724-0.303-1.728-0.583-2.988-0.583
+       c-2.825,0-5.02,1.704-5.02,5.206c0,3.152,1.868,5.136,5.043,5.136c1.074,0,2.265-0.233,2.965-0.514L354.74,140.937z"/>
+<path fill="#31ABFF" d="M357.072,125.645h3.572v12.747h6.257v2.988h-9.829V125.645z"/>
+<path fill="#31ABFF" d="M372.571,125.645v15.735H369v-15.735H372.571z"/>
+<path fill="#31ABFF" d="M388.959,135.357c-0.07-1.891-0.14-4.179-0.14-6.467h-0.07c-0.49,2.008-1.144,4.249-1.751,6.093l-1.914,6.14
+       h-2.778l-1.681-6.093c-0.514-1.844-1.051-4.085-1.424-6.14h-0.046c-0.094,2.125-0.164,4.553-0.28,6.514l-0.28,5.977h-3.292
+       l1.004-15.735h4.739l1.541,5.253c0.49,1.821,0.98,3.782,1.331,5.626h0.07c0.443-1.821,0.98-3.899,1.494-5.65l1.681-5.229h4.646
+       l0.864,15.735h-3.479L388.959,135.357z"/>
+<path fill="#31ABFF" d="M398.994,137.341l-1.121,4.039h-3.688l4.809-15.735h4.669l4.879,15.735h-3.829l-1.214-4.039H398.994z
+        M402.986,134.68l-0.98-3.338c-0.28-0.934-0.56-2.102-0.794-3.035h-0.046c-0.233,0.934-0.467,2.125-0.724,3.035l-0.934,3.338
+       H402.986z"/>
+<path fill="#31ABFF" d="M411.739,128.633h-4.226v-2.988h12.093v2.988h-4.295v12.747h-3.572V128.633z"/>
+<path fill="#31ABFF" d="M430.856,134.727h-5.79v3.735h6.467v2.918h-10.039v-15.735h9.712v2.918h-6.14v3.269h5.79V134.727z"/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,596.969 187.129,606.938 144.129,606.938 144.129,581.018 187.129,581.018 187.129,596.969 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,561.967 187.129,571.937 144.129,571.937 144.129,546.016 187.129,546.016 187.129,561.967 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,526.966 187.129,536.935 144.129,536.935 144.129,511.015 187.129,511.015 187.129,526.966 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,491.964 187.129,501.934 144.129,501.934 144.129,476.014 187.129,476.014 187.129,491.964 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,456.963 187.129,466.932 144.129,466.932 144.129,441.012 187.129,441.012 187.129,456.963 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,421.961 187.129,431.931 144.129,431.931 144.129,406.01 187.129,406.01 187.129,421.961 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,386.96 187.129,396.929 144.129,396.929 144.129,371.009 187.129,371.009 187.129,386.96 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,351.959 187.129,361.928 144.129,361.928 144.129,336.008 187.129,336.008 187.129,351.959 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,316.958 187.129,326.927 144.129,326.927 144.129,301.007 187.129,301.007 187.129,316.958 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,281.956 187.129,291.925 144.129,291.925 144.129,266.005 187.129,266.005 187.129,281.956 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,246.955 187.129,256.924 144.129,256.924 144.129,231.004 187.129,231.004 187.129,246.955 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,211.954 187.129,221.923 144.129,221.923 144.129,196.003 187.129,196.003 187.129,211.954 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,176.952 187.129,186.921 144.129,186.921 144.129,161.001 187.129,161.001 187.129,176.952 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,141.951 187.129,151.92 144.129,151.92 144.129,126 187.129,126 187.129,141.951 "/>
+<rect x="275.129" y="126" fill="#31ABFF" width="45" height="15"/>
+<rect x="533.129" y="126" fill="#31ABFF" width="45" height="15"/>
+<line fill="#31ABFF" stroke="#31ABFF" stroke-miterlimit="10" x1="203.629" y1="126" x2="203.629" y2="607"/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,596.969 780.129,606.938 823.129,606.938 823.129,581.018 780.129,581.018 780.129,596.969 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,561.967 780.129,571.937 823.129,571.937 823.129,546.016 780.129,546.016 780.129,561.967 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,526.966 780.129,536.935 823.129,536.935 823.129,511.015 780.129,511.015 780.129,526.966 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,491.964 780.129,501.934 823.129,501.934 823.129,476.014 780.129,476.014 780.129,491.964 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,456.963 780.129,466.932 823.129,466.932 823.129,441.012 780.129,441.012 780.129,456.963 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,421.961 780.129,431.931 823.129,431.931 823.129,406.01 780.129,406.01 780.129,421.961 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,386.96 780.129,396.929 823.129,396.929 823.129,371.009 780.129,371.009 780.129,386.96 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,351.959 780.129,361.928 823.129,361.928 823.129,336.008 780.129,336.008 780.129,351.959 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,316.958 780.129,326.927 823.129,326.927 823.129,301.007 780.129,301.007 780.129,316.958 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,281.956 780.129,291.925 823.129,291.925 823.129,266.005 780.129,266.005 780.129,281.956 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,246.955 780.129,256.924 823.129,256.924 823.129,231.004 780.129,231.004 780.129,246.955 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,211.954 780.129,221.923 823.129,221.923 823.129,196.003 780.129,196.003 780.129,211.954 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,176.952 780.129,186.921 823.129,186.921 823.129,161.001 780.129,161.001 780.129,176.952 "/>
+<polyline fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,141.951 780.129,151.92 823.129,151.92 823.129,126 780.129,126 780.129,141.951 "/>
+<line fill="#31ABFF" stroke="#31ABFF" stroke-miterlimit="10" x1="763.629" y1="126" x2="763.629" y2="607"/>
+<line fill="#31ABFF" stroke="#31ABFF" stroke-miterlimit="10" x1="667.129" y1="719.5" x2="363.129" y2="719.5"/>
+<g>
+       <g>
+               <g>
+                       <path fill="#31ABFF" d="M332.218,659.1c-2.009-2.359-5.185-3.606-8.528-3.606c-1.786-0.001-3.477,0.394-4.998,1.096
+                               c0,0-1.44,0.746-3.202-1.096s-5.605-8.78-1.644-10.731c15.362-7.283,32.982,0.008,37.59,10.775
+                               C353.868,660.111,336.481,664.104,332.218,659.1z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-width="0.9923" stroke-miterlimit="10" d="M332.218,659.1
+                               c-2.009-2.359-5.185-3.606-8.528-3.606c-1.786-0.001-3.477,0.394-4.998,1.096c0,0-1.44,0.746-3.202-1.096
+                               s-5.605-8.78-1.644-10.731c15.362-7.283,32.982,0.008,37.59,10.775C353.868,660.111,336.481,664.104,332.218,659.1z"/>
+               </g>
+               <g>
+                       <path fill="#31ABFF" d="M312.857,664.641c-1.04,2.921-0.532,6.294,1.14,9.189c0.891,1.547,2.078,2.814,3.448,3.779
+                               c0,0,1.364,0.875,0.652,3.322c-0.715,2.446-4.801,9.245-8.473,6.791c-13.987-9.664-16.484-28.569-9.462-37.944
+                               C302.907,645.386,315.058,658.446,312.857,664.641z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-width="0.9923" stroke-miterlimit="10" d="M312.857,664.641
+                               c-1.04,2.921-0.532,6.294,1.14,9.189c0.891,1.547,2.078,2.814,3.448,3.779c0,0,1.364,0.875,0.652,3.322
+                               c-0.715,2.446-4.801,9.245-8.473,6.791c-13.987-9.664-16.484-28.569-9.462-37.944
+                               C302.907,645.386,315.058,658.446,312.857,664.641z"/>
+               </g>
+               <g>
+                       <path fill="#31ABFF" d="M327.336,678.637c3.049-0.561,5.715-2.686,7.388-5.581c0.893-1.547,1.397-3.208,1.547-4.876
+                               c0,0,0.077-1.618,2.552-2.226c2.474-0.604,10.406-0.465,10.116,3.942c-1.375,16.944-16.498,28.562-28.128,27.167
+                               C315.636,696.882,320.872,679.828,327.336,678.637z"/>
+                       <path opacity="0.64" fill="none" stroke="#31ABFF" stroke-width="0.9923" stroke-miterlimit="10" d="M327.336,678.637
+                               c3.049-0.561,5.715-2.686,7.388-5.581c0.893-1.547,1.397-3.208,1.547-4.876c0,0,0.077-1.618,2.552-2.226
+                               c2.474-0.604,10.406-0.465,10.116,3.942c-1.375,16.944-16.498,28.562-28.128,27.167
+                               C315.636,696.882,320.872,679.828,327.336,678.637z"/>
+               </g>
+               <g>
+                       <circle fill="#31ABFF" cx="323.689" cy="667.522" r="7.302"/>
+                       
+                               <circle opacity="0.64" fill="none" stroke="#31ABFF" stroke-width="0.9923" stroke-miterlimit="10" cx="323.689" cy="667.522" r="7.302"/>
+               </g>
+       </g>
+</g>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M362.629,703.5h29v-68.552c-9.608,0.396-19.279,0.849-29,1.366V703.5z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M401.629,703.5h29v-69.834c-9.582,0.234-19.253,0.529-29,0.89V703.5z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M440.629,703.5h28v-70.443c-9.225,0.067-18.564,0.196-28,0.386V703.5z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M479.629,633.008V703.5h29v-70.351c-8.34-0.098-16.598-0.149-24.75-0.149C482.468,633,481.047,633.005,479.629,633.008z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M519.629,703.5h28v-69.553c-9.42-0.273-18.76-0.488-28-0.643V703.5z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M558.629,703.5h29v-68.051c-9.73-0.447-19.404-0.835-29-1.159V703.5z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M597.629,703.5h28v-66.005c-9.371-0.578-18.71-1.103-28-1.567V703.5z"/>
+<path fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M636.629,703.5h29v-63.205c-9.684-0.759-19.356-1.46-29-2.099V703.5z"/>
+<rect x="210.129" y="127" display="none" fill="#31ABFF" width="2" height="482"/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,596.969 187.129,606.938 144.129,606.938 144.129,581.018 187.129,581.018 187.129,596.969 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,561.967 187.129,571.937 144.129,571.937 144.129,546.016 187.129,546.016 187.129,561.967 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,526.966 187.129,536.935 144.129,536.935 144.129,511.015 187.129,511.015 187.129,526.966 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,491.964 187.129,501.934 144.129,501.934 144.129,476.014 187.129,476.014 187.129,491.964 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,456.963 187.129,466.932 144.129,466.932 144.129,441.012 187.129,441.012 187.129,456.963 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,421.961 187.129,431.931 144.129,431.931 144.129,406.01 187.129,406.01 187.129,421.961 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,386.96 187.129,396.929 144.129,396.929 144.129,371.009 187.129,371.009 187.129,386.96 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,351.959 187.129,361.928 144.129,361.928 144.129,336.008 187.129,336.008 187.129,351.959 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,316.958 187.129,326.927 144.129,326.927 144.129,301.007 187.129,301.007 187.129,316.958 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,281.956 187.129,291.925 144.129,291.925 144.129,266.005 187.129,266.005 187.129,281.956 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,246.955 187.129,256.924 144.129,256.924 144.129,231.004 187.129,231.004 187.129,246.955 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,211.954 187.129,221.923 144.129,221.923 144.129,196.003 187.129,196.003 187.129,211.954 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,176.952 187.129,186.921 144.129,186.921 144.129,161.001 187.129,161.001 187.129,176.952 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       187.129,141.951 187.129,151.92 144.129,151.92 144.129,126 187.129,126 187.129,141.951 "/>
+<rect x="755.129" y="127" display="none" fill="#31ABFF" width="2" height="482"/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,596.969 780.129,606.938 823.129,606.938 823.129,581.018 780.129,581.018 780.129,596.969 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,561.967 780.129,571.937 823.129,571.937 823.129,546.016 780.129,546.016 780.129,561.967 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,526.966 780.129,536.935 823.129,536.935 823.129,511.015 780.129,511.015 780.129,526.966 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,491.964 780.129,501.934 823.129,501.934 823.129,476.014 780.129,476.014 780.129,491.964 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,456.963 780.129,466.932 823.129,466.932 823.129,441.012 780.129,441.012 780.129,456.963 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,421.961 780.129,431.931 823.129,431.931 823.129,406.01 780.129,406.01 780.129,421.961 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,386.96 780.129,396.929 823.129,396.929 823.129,371.009 780.129,371.009 780.129,386.96 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,351.959 780.129,361.928 823.129,361.928 823.129,336.008 780.129,336.008 780.129,351.959 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,316.958 780.129,326.927 823.129,326.927 823.129,301.007 780.129,301.007 780.129,316.958 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,281.956 780.129,291.925 823.129,291.925 823.129,266.005 780.129,266.005 780.129,281.956 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,246.955 780.129,256.924 823.129,256.924 823.129,231.004 780.129,231.004 780.129,246.955 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,211.954 780.129,221.923 823.129,221.923 823.129,196.003 780.129,196.003 780.129,211.954 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,176.952 780.129,186.921 823.129,186.921 823.129,161.001 780.129,161.001 780.129,176.952 "/>
+<polyline display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       780.129,141.951 780.129,151.92 823.129,151.92 823.129,126 780.129,126 780.129,141.951 "/>
+<rect x="274.702" y="175.708" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-miterlimit="10" stroke-opacity="0.64" width="157.956" height="127.534"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M337.796,255.953l-51.053-3.023c-3.593-0.142-5.474,3.107-4.104,7.17l2.857,10.824c1.528,4.532,5.986,9.041,9.909,9.041h62.589
+       c5.253,0,6.745-6.561,6.745-11.152c-0.12-25.828,4.735-52.385,14.563-78.246c0.954-2.52-0.953-5.045-4.298-5.702
+       c-1.817-0.356-3.633-0.713-5.449-1.069c-3.336-0.655-7.05,0.767-8.259,3.236c-11.038,22.564-18.271,43.783-21.696,66.559
+       C339.6,253.589,338.936,256.021,337.796,255.953z"/>
+<path display="none" fill="#31ABFF" d="M304.629,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0
+       C294.445,253,314.813,275,304.629,298z"/>
+<polygon display="none" fill="#31ABFF" points="296.641,231.288 304.142,223.451 307.177,233.866 "/>
+<path display="none" fill="#31ABFF" d="M317.488,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0
+       C307.304,253,327.672,275,317.488,298z"/>
+<polygon display="none" fill="#31ABFF" points="309.5,231.288 317,223.451 320.037,233.866 "/>
+<path display="none" fill="#31ABFF" d="M330.99,298c-18.859,0,15.646,0-3.214,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.214,0
+       C320.806,253,341.174,275,330.99,298z"/>
+<polygon display="none" fill="#31ABFF" points="323.001,231.288 330.502,223.451 333.538,233.866 "/>
+<g display="none">
+       <g display="inline">
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M425.129,219v-22h-40.44c-2.568,7-4.733,14-6.516,22H425.129z"/>
+                       <path display="inline" opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M425.629,218.5v-22h-40.94
+                               c-2.568,8-4.733,15-6.516,22H425.629z"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M425.129,244v-21h-47.87c-1.63,7-2.88,14-3.73,21H425.129z"/>
+                       <path display="inline" opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M425.629,244.5v-22h-48.37
+                               c-1.63,7-2.88,15-3.73,22H425.629z"/>
+               </g>
+               <g display="none">
+                       <path display="inline" fill="#31ABFF" d="M372.116,270h53.013v-22H373.12c-0.671,7-1.003,13.871-0.971,20.759
+                               C372.149,269.155,372.131,270,372.116,270z"/>
+                       <path display="inline" opacity="0.64" fill="none" stroke="#31ABFF" stroke-miterlimit="10" d="M372.116,270.5h53.513v-22H373.12
+                               c-0.671,7-1.003,13.871-0.971,20.759C372.149,269.655,372.131,269.5,372.116,270.5z"/>
+               </g>
+       </g>
+</g>
+<rect x="533.601" y="175.708" display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-miterlimit="10" stroke-opacity="0.64" width="157.955" height="127.534"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M628.462,255.953l51.054-3.023c3.593-0.142,5.475,3.107,4.104,7.17l-2.858,10.824c-1.527,4.532-5.985,9.041-9.908,9.041h-62.589
+       c-5.254,0-6.745-6.561-6.745-11.152c0.12-25.828-4.735-52.385-14.563-78.246c-0.953-2.52,0.953-5.045,4.299-5.702
+       c1.817-0.356,3.634-0.713,5.448-1.069c3.337-0.655,7.051,0.767,8.26,3.236c11.037,22.564,18.271,43.783,21.695,66.559
+       C626.659,253.589,627.323,256.021,628.462,255.953z"/>
+<path display="none" fill="#31ABFF" d="M661.629,298c18.86,0-15.645,0,3.215,0c-10.184-23,10.184-45,0-67
+       c-18.859,0,15.646,0-3.215,0C671.814,253,651.446,275,661.629,298z"/>
+<polygon display="none" fill="#31ABFF" points="669.619,231.288 662.118,223.451 659.082,233.866 "/>
+<path display="none" fill="#31ABFF" d="M648.771,298c18.859,0-15.646,0,3.214,0c-10.184-23,10.186-45,0-67
+       c-18.86,0,15.646,0-3.214,0C658.955,253,638.586,275,648.771,298z"/>
+<polygon display="none" fill="#31ABFF" points="656.759,231.288 649.258,223.451 646.222,233.866 "/>
+<path display="none" fill="#31ABFF" d="M635.269,298c18.86,0-15.646,0,3.214,0c-10.184-23,10.185-45,0-67
+       c-18.859,0,15.646,0-3.214,0C645.453,253,625.084,275,635.269,298z"/>
+<polygon display="none" fill="#31ABFF" points="643.257,231.288 635.756,223.451 632.721,233.866 "/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M541.011,218.609v-21.841h40.559c2.568,7.243,4.733,14.529,6.516,21.841H541.011z"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M541.011,244.35v-21.841h47.987c1.63,7.263,2.881,14.548,3.73,21.841H541.011z"/>
+<path display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="
+       M594.143,270.091h-53.132V248.25h52.128c0.67,6.894,1.002,13.792,0.971,20.679C594.11,269.325,594.127,269.707,594.143,270.091z"/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="3" stroke-miterlimit="10" x1="667.129" y1="726.5" x2="363.129" y2="726.5"/>
+<path display="none" fill="#31ABFF" d="M362.629,703.5h29v-68.552c-9.608,0.396-19.279,0.849-29,1.366V703.5z"/>
+<path display="none" fill="#31ABFF" d="M401.629,703.5h29v-69.834c-9.582,0.234-19.253,0.529-29,0.89V703.5z"/>
+<path display="none" fill="#31ABFF" d="M440.629,703.5h28v-70.443c-9.225,0.067-18.564,0.196-28,0.386V703.5z"/>
+<path display="none" fill="#31ABFF" d="M479.629,633.008V703.5h29v-70.351c-8.34-0.098-16.598-0.149-24.75-0.149
+       C482.468,633,481.047,633.005,479.629,633.008z"/>
+<path display="none" fill="#31ABFF" d="M519.629,703.5h28v-69.553c-9.42-0.273-18.76-0.488-28-0.643V703.5z"/>
+<path display="none" fill="#31ABFF" d="M558.629,703.5h29v-68.051c-9.73-0.447-19.404-0.835-29-1.159V703.5z"/>
+<path display="none" fill="#31ABFF" d="M597.629,703.5h28v-66.005c-9.371-0.578-18.71-1.103-28-1.567V703.5z"/>
+<path display="none" fill="#31ABFF" d="M636.629,703.5h29v-63.205c-9.684-0.759-19.356-1.46-29-2.099V703.5z"/>
+</svg>
diff --git a/css/user/blue/images/hvac/temp_bar_on_left.svg b/css/user/blue/images/hvac/temp_bar_on_left.svg
new file mode 100644 (file)
index 0000000..2926a6c
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="68px" height="482px" viewBox="21 125.388 68 482"
+        overflow="visible" enable-background="new 21 125.388 68 482" xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<circle display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.5936" stroke-miterlimit="10" cx="87.502" cy="524.197" r="6.141"/>
+<circle display="none" fill="#31ABFF" fill-opacity="0.45" cx="87.502" cy="524.197" r="10.912"/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="2" stroke-miterlimit="10" x1="88" y1="529" x2="88" y2="607"/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,596.969 64,606.938 21,606.938 21,581.018 64,581.018 64,596.969 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,561.967 64,571.937 21,571.937 21,546.016 64,546.016 64,561.967 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,526.966 64,536.935 21,536.935 21,511.015 64,511.015 64,526.966 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,491.964 64,501.934 21,501.934 21,476.014 64,476.014 64,491.964 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,456.963 64,466.932 21,466.932 21,441.012 64,441.012 64,456.963 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,421.961 64,431.931 21,431.931 21,406.01 64,406.01 64,421.961 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,386.96 64,396.929 21,396.929 21,371.009 64,371.009 64,386.96 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,351.959 64,361.928 21,361.928 21,336.008 64,336.008 64,351.959 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,316.958 64,326.927 21,326.927 21,301.007 64,301.007 64,316.958 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,281.956 64,291.925 21,291.925 21,266.005 64,266.005 64,281.956 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,246.955 64,256.924 21,256.924 21,231.004 64,231.004 64,246.955 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,211.954 64,221.923 21,221.923 21,196.003 64,196.003 64,211.954 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,176.952 64,186.921 21,186.921 21,161.001 64,161.001 64,176.952 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       64,141.951 64,151.92 21,151.92 21,126 64,126 64,141.951 "/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-miterlimit="10" x1="80.5" y1="126" x2="80.5" y2="607"/>
+<rect x="87" y="127" fill="#31ABFF" width="2" height="482"/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,596.969 
+       64,606.938 21,606.938 21,581.018 64,581.018 64,596.969 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,561.967 
+       64,571.937 21,571.937 21,546.016 64,546.016 64,561.967 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,526.966 
+       64,536.935 21,536.935 21,511.015 64,511.015 64,526.966 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,491.964 
+       64,501.934 21,501.934 21,476.014 64,476.014 64,491.964 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,456.963 
+       64,466.932 21,466.932 21,441.012 64,441.012 64,456.963 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,421.961 
+       64,431.931 21,431.931 21,406.01 64,406.01 64,421.961 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,386.96 
+       64,396.929 21,396.929 21,371.009 64,371.009 64,386.96 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,351.959 
+       64,361.928 21,361.928 21,336.008 64,336.008 64,351.959 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,316.958 
+       64,326.927 21,326.927 21,301.007 64,301.007 64,316.958 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,281.956 
+       64,291.925 21,291.925 21,266.005 64,266.005 64,281.956 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,246.955 
+       64,256.924 21,256.924 21,231.004 64,231.004 64,246.955 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,211.954 
+       64,221.923 21,221.923 21,196.003 64,196.003 64,211.954 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,176.952 
+       64,186.921 21,186.921 21,161.001 64,161.001 64,176.952 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,141.951 
+       64,151.92 21,151.92 21,126 64,126 64,141.951 "/>
+</svg>
diff --git a/css/user/blue/images/hvac/temp_bar_on_right.svg b/css/user/blue/images/hvac/temp_bar_on_right.svg
new file mode 100644 (file)
index 0000000..0fc2fb5
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="68px" height="481px" viewBox="632 126 68 481" overflow="visible" enable-background="new 632 126 68 481"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">
+       <stop  offset="0" style="stop-color:#041724"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>
+<circle display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="0.5936" stroke-miterlimit="10" cx="633.498" cy="420.198" r="6.141"/>
+<circle display="none" fill="#31ABFF" fill-opacity="0.45" cx="633.498" cy="420.198" r="10.912"/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-width="2" stroke-miterlimit="10" x1="633" y1="419" x2="633" y2="607"/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,596.969 657,606.938 700,606.938 700,581.018 657,581.018 657,596.969 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,561.967 657,571.937 700,571.937 700,546.016 657,546.016 657,561.967 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,526.966 657,536.935 700,536.935 700,511.015 657,511.015 657,526.966 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,491.964 657,501.934 700,501.934 700,476.014 657,476.014 657,491.964 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,456.963 657,466.932 700,466.932 700,441.012 657,441.012 657,456.963 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,421.961 657,431.931 700,431.931 700,406.01 657,406.01 657,421.961 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,386.96 657,396.929 700,396.929 700,371.009 657,371.009 657,386.96 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,351.959 657,361.928 700,361.928 700,336.008 657,336.008 657,351.959 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,316.958 657,326.927 700,326.927 700,301.007 657,301.007 657,316.958 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,281.956 657,291.925 700,291.925 700,266.005 657,266.005 657,281.956 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,246.955 657,256.924 700,256.924 700,231.004 657,231.004 657,246.955 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,211.954 657,221.923 700,221.923 700,196.003 657,196.003 657,211.954 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,176.952 657,186.921 700,186.921 700,161.001 657,161.001 657,176.952 "/>
+<polyline display="none" fill="#31ABFF" fill-opacity="0.29" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,141.951 657,151.92 700,151.92 700,126 657,126 657,141.951 "/>
+<line display="none" fill="#31ABFF" stroke="#31ABFF" stroke-miterlimit="10" x1="640.5" y1="126" x2="640.5" y2="607"/>
+<rect x="632" y="127" fill="#31ABFF" width="2" height="482"/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,596.969 657,606.938 700,606.938 700,581.018 657,581.018 657,596.969 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,561.967 657,571.937 700,571.937 700,546.016 657,546.016 657,561.967 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,526.966 657,536.935 700,536.935 700,511.015 657,511.015 657,526.966 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,491.964 657,501.934 700,501.934 700,476.014 657,476.014 657,491.964 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,456.963 657,466.932 700,466.932 700,441.012 657,441.012 657,456.963 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,421.961 657,431.931 700,431.931 700,406.01 657,406.01 657,421.961 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="657,386.96 
+       657,396.929 700,396.929 700,371.009 657,371.009 657,386.96 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,351.959 657,361.928 700,361.928 700,336.008 657,336.008 657,351.959 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,316.958 657,326.927 700,326.927 700,301.007 657,301.007 657,316.958 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,281.956 657,291.925 700,291.925 700,266.005 657,266.005 657,281.956 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,246.955 657,256.924 700,256.924 700,231.004 657,231.004 657,246.955 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,211.954 657,221.923 700,221.923 700,196.003 657,196.003 657,211.954 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,176.952 657,186.921 700,186.921 700,161.001 657,161.001 657,176.952 "/>
+<polyline fill="#31ABFF" stroke="#31ABFF" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="
+       657,141.951 657,151.92 700,151.92 700,126 657,126 657,141.951 "/>
+</svg>
diff --git a/css/user/blue/images/library/bg_left_panel_blue.png b/css/user/blue/images/library/bg_left_panel_blue.png
new file mode 100644 (file)
index 0000000..427c931
Binary files /dev/null and b/css/user/blue/images/library/bg_left_panel_blue.png differ
diff --git a/css/user/blue/images/library/bg_top_navi_blue.png b/css/user/blue/images/library/bg_top_navi_blue.png
new file mode 100644 (file)
index 0000000..b989e55
Binary files /dev/null and b/css/user/blue/images/library/bg_top_navi_blue.png differ
diff --git a/css/user/blue/images/library/bg_top_navi_select_blue.png b/css/user/blue/images/library/bg_top_navi_select_blue.png
new file mode 100644 (file)
index 0000000..d4da471
Binary files /dev/null and b/css/user/blue/images/library/bg_top_navi_select_blue.png differ
diff --git a/css/user/blue/images/library/bg_top_navi_unselect1px_blue.png b/css/user/blue/images/library/bg_top_navi_unselect1px_blue.png
new file mode 100644 (file)
index 0000000..5706932
Binary files /dev/null and b/css/user/blue/images/library/bg_top_navi_unselect1px_blue.png differ
diff --git a/css/user/blue/images/library/bg_top_navi_unselect_blue.png b/css/user/blue/images/library/bg_top_navi_unselect_blue.png
new file mode 100644 (file)
index 0000000..08dc6ba
Binary files /dev/null and b/css/user/blue/images/library/bg_top_navi_unselect_blue.png differ
diff --git a/css/user/blue/images/library/bt_back_blue.png b/css/user/blue/images/library/bt_back_blue.png
new file mode 100644 (file)
index 0000000..8653731
Binary files /dev/null and b/css/user/blue/images/library/bt_back_blue.png differ
diff --git a/css/user/blue/images/library/bt_close_blue.png b/css/user/blue/images/library/bt_close_blue.png
new file mode 100644 (file)
index 0000000..51ace79
Binary files /dev/null and b/css/user/blue/images/library/bt_close_blue.png differ
diff --git a/css/user/blue/images/library/bt_grid_act_blue.png b/css/user/blue/images/library/bt_grid_act_blue.png
new file mode 100644 (file)
index 0000000..f3cb38a
Binary files /dev/null and b/css/user/blue/images/library/bt_grid_act_blue.png differ
diff --git a/css/user/blue/images/library/bt_grid_act_blue_test.png b/css/user/blue/images/library/bt_grid_act_blue_test.png
new file mode 100644 (file)
index 0000000..7c5053e
Binary files /dev/null and b/css/user/blue/images/library/bt_grid_act_blue_test.png differ
diff --git a/css/user/blue/images/library/bt_grid_blue.png b/css/user/blue/images/library/bt_grid_blue.png
new file mode 100644 (file)
index 0000000..e2bb227
Binary files /dev/null and b/css/user/blue/images/library/bt_grid_blue.png differ
diff --git a/css/user/blue/images/library/bt_grid_blue_disabled.png b/css/user/blue/images/library/bt_grid_blue_disabled.png
new file mode 100644 (file)
index 0000000..383b4af
Binary files /dev/null and b/css/user/blue/images/library/bt_grid_blue_disabled.png differ
diff --git a/css/user/blue/images/library/bt_list_act_blue.png b/css/user/blue/images/library/bt_list_act_blue.png
new file mode 100644 (file)
index 0000000..998da45
Binary files /dev/null and b/css/user/blue/images/library/bt_list_act_blue.png differ
diff --git a/css/user/blue/images/library/bt_list_act_blue_test.png b/css/user/blue/images/library/bt_list_act_blue_test.png
new file mode 100644 (file)
index 0000000..a0f0c55
Binary files /dev/null and b/css/user/blue/images/library/bt_list_act_blue_test.png differ
diff --git a/css/user/blue/images/library/bt_list_blue.png b/css/user/blue/images/library/bt_list_blue.png
new file mode 100644 (file)
index 0000000..2876137
Binary files /dev/null and b/css/user/blue/images/library/bt_list_blue.png differ
diff --git a/css/user/blue/images/library/bt_list_blue_disabled.png b/css/user/blue/images/library/bt_list_blue_disabled.png
new file mode 100644 (file)
index 0000000..9f0dbe9
Binary files /dev/null and b/css/user/blue/images/library/bt_list_blue_disabled.png differ
diff --git a/css/user/blue/images/library/bt_search_act_blue.png b/css/user/blue/images/library/bt_search_act_blue.png
new file mode 100644 (file)
index 0000000..c959fda
Binary files /dev/null and b/css/user/blue/images/library/bt_search_act_blue.png differ
diff --git a/css/user/blue/images/library/bt_search_act_blue_test.png b/css/user/blue/images/library/bt_search_act_blue_test.png
new file mode 100644 (file)
index 0000000..57ade1e
Binary files /dev/null and b/css/user/blue/images/library/bt_search_act_blue_test.png differ
diff --git a/css/user/blue/images/library/bt_search_blue.png b/css/user/blue/images/library/bt_search_blue.png
new file mode 100644 (file)
index 0000000..32a632e
Binary files /dev/null and b/css/user/blue/images/library/bt_search_blue.png differ
diff --git a/css/user/blue/images/library/bt_search_blue_disabled.png b/css/user/blue/images/library/bt_search_blue_disabled.png
new file mode 100644 (file)
index 0000000..e9aa976
Binary files /dev/null and b/css/user/blue/images/library/bt_search_blue_disabled.png differ
diff --git a/css/user/blue/images/library/bt_shad_bottom_blue.png b/css/user/blue/images/library/bt_shad_bottom_blue.png
new file mode 100644 (file)
index 0000000..688b310
Binary files /dev/null and b/css/user/blue/images/library/bt_shad_bottom_blue.png differ
diff --git a/css/user/blue/images/library/bt_shad_top_blue.png b/css/user/blue/images/library/bt_shad_top_blue.png
new file mode 100644 (file)
index 0000000..d65516e
Binary files /dev/null and b/css/user/blue/images/library/bt_shad_top_blue.png differ
diff --git a/css/user/blue/images/musicplayer/bg_blue.png b/css/user/blue/images/musicplayer/bg_blue.png
new file mode 100644 (file)
index 0000000..e2ec959
Binary files /dev/null and b/css/user/blue/images/musicplayer/bg_blue.png differ
diff --git a/css/user/blue/images/musicplayer/cover_album_blue.png b/css/user/blue/images/musicplayer/cover_album_blue.png
new file mode 100644 (file)
index 0000000..520e867
Binary files /dev/null and b/css/user/blue/images/musicplayer/cover_album_blue.png differ
diff --git a/css/user/blue/images/musicplayer/grey_rectangle_blue.png b/css/user/blue/images/musicplayer/grey_rectangle_blue.png
new file mode 100644 (file)
index 0000000..66feafa
Binary files /dev/null and b/css/user/blue/images/musicplayer/grey_rectangle_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_next_blue.png b/css/user/blue/images/musicplayer/icon_next_blue.png
new file mode 100644 (file)
index 0000000..9664772
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_next_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_next_enabled_blue.png b/css/user/blue/images/musicplayer/icon_next_enabled_blue.png
new file mode 100644 (file)
index 0000000..01970c8
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_next_enabled_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_pause_blue.png b/css/user/blue/images/musicplayer/icon_pause_blue.png
new file mode 100644 (file)
index 0000000..1a3cf08
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_pause_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_play_blue.png b/css/user/blue/images/musicplayer/icon_play_blue.png
new file mode 100644 (file)
index 0000000..dbc4c78
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_play_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_previous_blue.png b/css/user/blue/images/musicplayer/icon_previous_blue.png
new file mode 100644 (file)
index 0000000..175c2ee
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_previous_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_previous_enabled_blue.png b/css/user/blue/images/musicplayer/icon_previous_enabled_blue.png
new file mode 100644 (file)
index 0000000..133c51e
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_previous_enabled_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_repeat_blue.png b/css/user/blue/images/musicplayer/icon_repeat_blue.png
new file mode 100644 (file)
index 0000000..26db00e
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_repeat_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_repeat_enabled_blue.png b/css/user/blue/images/musicplayer/icon_repeat_enabled_blue.png
new file mode 100644 (file)
index 0000000..f4d1625
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_repeat_enabled_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_shuffle_blue.png b/css/user/blue/images/musicplayer/icon_shuffle_blue.png
new file mode 100644 (file)
index 0000000..d0e6858
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_shuffle_blue.png differ
diff --git a/css/user/blue/images/musicplayer/icon_shuffle_enabled_blue.png b/css/user/blue/images/musicplayer/icon_shuffle_enabled_blue.png
new file mode 100644 (file)
index 0000000..2e51bb3
Binary files /dev/null and b/css/user/blue/images/musicplayer/icon_shuffle_enabled_blue.png differ
diff --git a/css/user/blue/images/navigation/icon_map_blue.png b/css/user/blue/images/navigation/icon_map_blue.png
new file mode 100644 (file)
index 0000000..7c5d1ed
Binary files /dev/null and b/css/user/blue/images/navigation/icon_map_blue.png differ
diff --git a/css/user/blue/images/navigation/icon_satellite_blue.png b/css/user/blue/images/navigation/icon_satellite_blue.png
new file mode 100644 (file)
index 0000000..e5d05ef
Binary files /dev/null and b/css/user/blue/images/navigation/icon_satellite_blue.png differ
diff --git a/css/user/blue/images/phone/bg_with_glow_blue.png b/css/user/blue/images/phone/bg_with_glow_blue.png
new file mode 100644 (file)
index 0000000..7c2357b
Binary files /dev/null and b/css/user/blue/images/phone/bg_with_glow_blue.png differ
diff --git a/css/user/blue/images/phone/bt_delete_blue.png b/css/user/blue/images/phone/bt_delete_blue.png
new file mode 100644 (file)
index 0000000..f92f4b7
Binary files /dev/null and b/css/user/blue/images/phone/bt_delete_blue.png differ
diff --git a/css/user/blue/images/phone/contact_picture_blue.png b/css/user/blue/images/phone/contact_picture_blue.png
new file mode 100644 (file)
index 0000000..5666e59
Binary files /dev/null and b/css/user/blue/images/phone/contact_picture_blue.png differ
diff --git a/css/user/blue/images/phone/icon_addcall_blue.png b/css/user/blue/images/phone/icon_addcall_blue.png
new file mode 100644 (file)
index 0000000..bd8336e
Binary files /dev/null and b/css/user/blue/images/phone/icon_addcall_blue.png differ
diff --git a/css/user/blue/images/phone/icon_address_blue.png b/css/user/blue/images/phone/icon_address_blue.png
new file mode 100644 (file)
index 0000000..bcef57b
Binary files /dev/null and b/css/user/blue/images/phone/icon_address_blue.png differ
diff --git a/css/user/blue/images/phone/icon_call_blue.png b/css/user/blue/images/phone/icon_call_blue.png
new file mode 100644 (file)
index 0000000..32b8964
Binary files /dev/null and b/css/user/blue/images/phone/icon_call_blue.png differ
diff --git a/css/user/blue/images/phone/icon_contact_blue.png b/css/user/blue/images/phone/icon_contact_blue.png
new file mode 100644 (file)
index 0000000..9673691
Binary files /dev/null and b/css/user/blue/images/phone/icon_contact_blue.png differ
diff --git a/css/user/blue/images/phone/icon_dialed_blue.png b/css/user/blue/images/phone/icon_dialed_blue.png
new file mode 100644 (file)
index 0000000..d1a38d4
Binary files /dev/null and b/css/user/blue/images/phone/icon_dialed_blue.png differ
diff --git a/css/user/blue/images/phone/icon_email_blue.png b/css/user/blue/images/phone/icon_email_blue.png
new file mode 100644 (file)
index 0000000..70a3031
Binary files /dev/null and b/css/user/blue/images/phone/icon_email_blue.png differ
diff --git a/css/user/blue/images/phone/icon_endcall_blue.png b/css/user/blue/images/phone/icon_endcall_blue.png
new file mode 100644 (file)
index 0000000..3897fc1
Binary files /dev/null and b/css/user/blue/images/phone/icon_endcall_blue.png differ
diff --git a/css/user/blue/images/phone/icon_favorite_false_blue.png b/css/user/blue/images/phone/icon_favorite_false_blue.png
new file mode 100644 (file)
index 0000000..c86831c
Binary files /dev/null and b/css/user/blue/images/phone/icon_favorite_false_blue.png differ
diff --git a/css/user/blue/images/phone/icon_favorite_true_blue.png b/css/user/blue/images/phone/icon_favorite_true_blue.png
new file mode 100644 (file)
index 0000000..ecbaa25
Binary files /dev/null and b/css/user/blue/images/phone/icon_favorite_true_blue.png differ
diff --git a/css/user/blue/images/phone/icon_hold_blue.png b/css/user/blue/images/phone/icon_hold_blue.png
new file mode 100644 (file)
index 0000000..7af6d55
Binary files /dev/null and b/css/user/blue/images/phone/icon_hold_blue.png differ
diff --git a/css/user/blue/images/phone/icon_missed_blue.png b/css/user/blue/images/phone/icon_missed_blue.png
new file mode 100644 (file)
index 0000000..c793cdb
Binary files /dev/null and b/css/user/blue/images/phone/icon_missed_blue.png differ
diff --git a/css/user/blue/images/phone/icon_missed_new_blue.png b/css/user/blue/images/phone/icon_missed_new_blue.png
new file mode 100644 (file)
index 0000000..c793cdb
Binary files /dev/null and b/css/user/blue/images/phone/icon_missed_new_blue.png differ
diff --git a/css/user/blue/images/phone/icon_mobile_blue.png b/css/user/blue/images/phone/icon_mobile_blue.png
new file mode 100644 (file)
index 0000000..8e7a56c
Binary files /dev/null and b/css/user/blue/images/phone/icon_mobile_blue.png differ
diff --git a/css/user/blue/images/phone/icon_mobile_blue_hover.png b/css/user/blue/images/phone/icon_mobile_blue_hover.png
new file mode 100644 (file)
index 0000000..ce925e2
Binary files /dev/null and b/css/user/blue/images/phone/icon_mobile_blue_hover.png differ
diff --git a/css/user/blue/images/phone/icon_mute_blue.png b/css/user/blue/images/phone/icon_mute_blue.png
new file mode 100644 (file)
index 0000000..c11e370
Binary files /dev/null and b/css/user/blue/images/phone/icon_mute_blue.png differ
diff --git a/css/user/blue/images/phone/icon_number_blue.png b/css/user/blue/images/phone/icon_number_blue.png
new file mode 100644 (file)
index 0000000..d48f8b1
Binary files /dev/null and b/css/user/blue/images/phone/icon_number_blue.png differ
diff --git a/css/user/blue/images/phone/icon_received_blue.png b/css/user/blue/images/phone/icon_received_blue.png
new file mode 100644 (file)
index 0000000..c793cdb
Binary files /dev/null and b/css/user/blue/images/phone/icon_received_blue.png differ
diff --git a/css/user/blue/images/phone/icon_speaker_blue.png b/css/user/blue/images/phone/icon_speaker_blue.png
new file mode 100644 (file)
index 0000000..f6b1591
Binary files /dev/null and b/css/user/blue/images/phone/icon_speaker_blue.png differ
diff --git a/css/user/blue/images/progressBar/VCcircle_blue.png b/css/user/blue/images/progressBar/VCcircle_blue.png
new file mode 100644 (file)
index 0000000..c1f7ef5
Binary files /dev/null and b/css/user/blue/images/progressBar/VCcircle_blue.png differ
diff --git a/css/user/blue/images/progressBar/handle_blue.png b/css/user/blue/images/progressBar/handle_blue.png
new file mode 100644 (file)
index 0000000..61b30fb
Binary files /dev/null and b/css/user/blue/images/progressBar/handle_blue.png differ
diff --git a/css/user/blue/images/progressBar/icon_volume_blue.png b/css/user/blue/images/progressBar/icon_volume_blue.png
new file mode 100644 (file)
index 0000000..98444d7
Binary files /dev/null and b/css/user/blue/images/progressBar/icon_volume_blue.png differ
diff --git a/css/user/blue/images/progressBar/progresbarbg.png b/css/user/blue/images/progressBar/progresbarbg.png
new file mode 100644 (file)
index 0000000..9be3eab
Binary files /dev/null and b/css/user/blue/images/progressBar/progresbarbg.png differ
diff --git a/css/user/blue/images/progressBar/progresbarbgstart.png b/css/user/blue/images/progressBar/progresbarbgstart.png
new file mode 100644 (file)
index 0000000..b92b89f
Binary files /dev/null and b/css/user/blue/images/progressBar/progresbarbgstart.png differ
diff --git a/css/user/blue/images/settings/screenshot_theme_blue.png b/css/user/blue/images/settings/screenshot_theme_blue.png
new file mode 100644 (file)
index 0000000..d7886d8
Binary files /dev/null and b/css/user/blue/images/settings/screenshot_theme_blue.png differ
diff --git a/css/user/blue/images/settings/screenshot_theme_green.png b/css/user/blue/images/settings/screenshot_theme_green.png
new file mode 100644 (file)
index 0000000..2a954f5
Binary files /dev/null and b/css/user/blue/images/settings/screenshot_theme_green.png differ
diff --git a/css/user/blue/images/store/bg_all.png b/css/user/blue/images/store/bg_all.png
new file mode 100644 (file)
index 0000000..17d8e56
Binary files /dev/null and b/css/user/blue/images/store/bg_all.png differ
diff --git a/css/user/blue/images/store/bg_grid.png b/css/user/blue/images/store/bg_grid.png
new file mode 100644 (file)
index 0000000..ea0272e
Binary files /dev/null and b/css/user/blue/images/store/bg_grid.png differ
diff --git a/css/user/blue/images/store/rectangle.png b/css/user/blue/images/store/rectangle.png
new file mode 100644 (file)
index 0000000..6f5527c
Binary files /dev/null and b/css/user/blue/images/store/rectangle.png differ
diff --git a/css/user/blue/images/store/square_03.png b/css/user/blue/images/store/square_03.png
new file mode 100644 (file)
index 0000000..a68806a
Binary files /dev/null and b/css/user/blue/images/store/square_03.png differ
diff --git a/css/user/blue/images/store/star_grey.png b/css/user/blue/images/store/star_grey.png
new file mode 100644 (file)
index 0000000..35f29b3
Binary files /dev/null and b/css/user/blue/images/store/star_grey.png differ
diff --git a/css/user/blue/images/store/star_white.png b/css/user/blue/images/store/star_white.png
new file mode 100644 (file)
index 0000000..4f3599e
Binary files /dev/null and b/css/user/blue/images/store/star_white.png differ
diff --git a/css/user/blue/images/tabs/bg_top_navi_blue.png b/css/user/blue/images/tabs/bg_top_navi_blue.png
new file mode 100644 (file)
index 0000000..7eca081
Binary files /dev/null and b/css/user/blue/images/tabs/bg_top_navi_blue.png differ
diff --git a/css/user/blue/images/tabs/bg_top_navi_select_blue.png b/css/user/blue/images/tabs/bg_top_navi_select_blue.png
new file mode 100644 (file)
index 0000000..d4da471
Binary files /dev/null and b/css/user/blue/images/tabs/bg_top_navi_select_blue.png differ
diff --git a/css/user/blue/images/tabs/bg_top_navi_unselect1px_blue.png b/css/user/blue/images/tabs/bg_top_navi_unselect1px_blue.png
new file mode 100644 (file)
index 0000000..5706932
Binary files /dev/null and b/css/user/blue/images/tabs/bg_top_navi_unselect1px_blue.png differ
diff --git a/css/user/blue/images/tabs/bt_back_blue.png b/css/user/blue/images/tabs/bt_back_blue.png
new file mode 100644 (file)
index 0000000..8653731
Binary files /dev/null and b/css/user/blue/images/tabs/bt_back_blue.png differ
diff --git a/css/user/blue/images/tabs/bt_close_blue.png b/css/user/blue/images/tabs/bt_close_blue.png
new file mode 100644 (file)
index 0000000..51ace79
Binary files /dev/null and b/css/user/blue/images/tabs/bt_close_blue.png differ
diff --git a/css/user/blue/images/topbaricons/top_bar_icons_bg_blue.png b/css/user/blue/images/topbaricons/top_bar_icons_bg_blue.png
new file mode 100644 (file)
index 0000000..acb153a
Binary files /dev/null and b/css/user/blue/images/topbaricons/top_bar_icons_bg_blue.png differ
diff --git a/css/user/blue/library.css b/css/user/blue/library.css
new file mode 100644 (file)
index 0000000..a360389
--- /dev/null
@@ -0,0 +1,59 @@
+.libraryLeftPanel {
+       background-image: url('images/library/bg_left_panel_blue.png');
+}
+
+.gridIcon {
+       background-image: url('images/library/bt_grid_blue.png');
+}
+
+.gridIconActive {
+       background-image: url('images/library/bt_grid_act_blue.png');
+}
+
+.gridIconDisabled {
+       background-image: url('images/library/bt_grid_blue_disabled.png');
+}
+
+.listIcon {
+       background-image: url('images/library/bt_list_blue.png');
+}
+
+.listIconActive {
+       background-image: url('images/library/bt_list_act_blue.png');
+}
+
+.listIconDisabled {
+       background-image: url('images/library/bt_list_blue_disabled.png');
+}
+
+.searchIcon {
+       background-image: url('images/library/bt_search_blue.png');
+}
+
+.searchIconActive {
+       background-image: url('images/library/bt_search_act_blue.png');
+}
+
+.searchIconDisabled {
+       background-image: url('images/library/bt_search_blue_disabled.png');
+}
+
+.closeLibraryButton {
+       background-image: url('images/library/bt_close_blue.png');
+}
+
+.libraryTopPanel {
+       background-image: url('images/library/bg_top_navi_blue.png');
+}
+
+.libraryTab, .libraryTabClear, .libraryTabInlineClear {
+       background-image: url('images/library/bg_top_navi_unselect1px_blue.png');
+}
+
+.libraryTabSelected {
+       background-image: url('images/library/bg_top_navi_select_blue.png');
+}
+
+.closeLibrarySubPanelButton {
+       background-image: url('images/library/bt_back_blue.png');
+}
diff --git a/css/user/blue/musicplayer.css b/css/user/blue/musicplayer.css
new file mode 100644 (file)
index 0000000..99e3221
--- /dev/null
@@ -0,0 +1,54 @@
+#backgroundAudio {
+       background-image: url('images/musicplayer/bg_blue.png');
+}
+
+.previousBtn {
+       background-image: url('images/musicplayer/icon_previous_blue.png');
+}
+
+.previousBtnActive {
+       background-image:
+               url('images/musicplayer/icon_previous_enabled_blue.png');
+}
+
+.pauseBtn {
+       background-image: url('images/musicplayer/icon_pause_blue.png');
+}
+
+.nextBtn {
+       background-image: url('images/musicplayer/icon_next_blue.png');
+}
+
+.nextBtnActive {
+       background-image: url('images/musicplayer/icon_next_enabled_blue.png');
+}
+
+.shuffleBtn {
+       background-image: url('images/musicplayer/icon_shuffle_blue.png');
+}
+
+.repeatBtn {
+       background-image: url('images/musicplayer/icon_repeat_blue.png');
+}
+
+.playBtn {
+       background-image: url('images/musicplayer/icon_play_blue.png');
+}
+
+.shuffleBtnActive {
+       background-image:
+               url('images/musicplayer/icon_shuffle_enabled_blue.png');
+}
+
+.repeatBtnActive {
+       background-image: url('images/musicplayer/icon_repeat_enabled_blue.png');
+}
+
+.albumCarouselDescription {
+       background-image: url('images/musicplayer/grey_rectangle_blue.png');
+}
+
+.albumThumbnail {
+       background-image: url('images/musicplayer/cover_album_blue.png');
+       background-size: 100% 100%;
+}
diff --git a/css/user/blue/navigation.css b/css/user/blue/navigation.css
new file mode 100644 (file)
index 0000000..2c11e71
--- /dev/null
@@ -0,0 +1,7 @@
+.satelitteIcon {
+       background-image: url('images/navigation/icon_satellite_blue.png');
+}
+
+.mapIcon {
+       background-image: url('images/navigation/icon_map_blue.png');
+}
diff --git a/css/user/blue/nouislider.fox.css b/css/user/blue/nouislider.fox.css
new file mode 100644 (file)
index 0000000..ca8c622
--- /dev/null
@@ -0,0 +1,277 @@
+.noUiSliderLeft,
+       .noUiSliderLeft * {
+-webkit-box-sizing: border-box;
+   -moz-box-sizing: border-box;
+               box-sizing: border-box;
+-webkit-user-select: none;
+   -moz-user-select: none;
+       -ms-user-select: none;
+               display: block;
+               cursor: default;
+       }
+       .noUiSliderLeft {
+               position: relative;
+       }
+       .noUiSliderLeft a {
+               position: absolute;
+               z-index: 1;
+       }
+       .noUiSliderLeft a:nth-child(2) {
+               background: inherit !important;
+       }
+       .noUiSliderLeft.vertical a {
+               width: 100%;
+               bottom: 0;
+       }
+
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+       .noUiSliderLeft:before,
+       body.TOUCH,
+       .noUiSliderLeft div {
+               -ms-touch-action: none;
+       }
+       .noUiSliderLeft:before {
+               display: block;
+               position: absolute;
+               width: 150%;
+               left: -25%;
+               height: 400%;
+               top: -150%;
+               content: "";
+               z-index: -1;
+       }
+       .noUiSliderLeft.vertical:before {
+               width: 400%;
+               left: -150%;
+               height: 150%;
+               top: -25%;
+       }
+}
+       .noUiSliderLeft {
+               /*border: 1px solid #908d84;*/
+               border-radius: 3px;
+       }
+       .noUiSliderLeft.connect a,
+       .noUiSliderLeft.connect.lower {
+
+               background:url("images/hvac/temp_bar_on_left.svg") no-repeat left bottom;
+               /*background-size:85.9%;        */
+               /*background: #b2a98f;*/
+       }
+       .noUiSliderLeft.disabled,
+       .noUiSliderLeft.disabled.connect.lower a {
+               background: #ccc;
+               box-shadow: none;
+       }
+       .noUiSliderLeft div {
+               height: 100px;
+
+               border-radius: 3px;
+               background: #efefe7;
+               background:url("images/hvac/drag_knob.svg") no-repeat center center;
+               background-size:15%;
+
+       }
+       .noUiSliderLeft.disabled div {
+               background: transparent;
+       }
+       .noUiSliderLeft.vertical {
+               width: 11%;
+               height: 37.6%;
+       }
+       .noUiSliderLeft.vertical div {
+               margin: -50px -60px 0 -5px;
+       }
+       .noUiSliderLeft{
+               left:3%;
+               top:18%;
+               height:40%;
+       }
+
+
+       /*********RIGHT*******/
+
+       .noUiSliderRight,
+       .noUiSliderRight * {
+-webkit-box-sizing: border-box;
+   -moz-box-sizing: border-box;
+               box-sizing: border-box;
+-webkit-user-select: none;
+   -moz-user-select: none;
+       -ms-user-select: none;
+               display: block;
+               cursor: default;
+       }
+       .noUiSliderRight {
+               position: relative;
+       }
+       .noUiSliderRight a {
+               position: absolute;
+               z-index: 1;
+       }
+       .noUiSliderRight a:nth-child(2) {
+               background: inherit !important;
+       }
+       .noUiSliderRight.vertical a {
+               width: 100%;
+               bottom: 0;
+       }
+       .noUiSliderRight.horizontal a {
+               height: 100%;
+               right: 0;
+       }
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+       .noUiSliderRight:before,
+       body.TOUCH,
+       .noUiSliderRight div {
+               -ms-touch-action: none;
+       }
+       .noUiSliderRight:before {
+               display: block;
+               position: absolute;
+               width: 150%;
+               left: -25%;
+               height: 400%;
+               top: -150%;
+               content: "";
+               z-index: -1;
+       }
+       .noUiSliderRight.vertical:before {
+               width: 400%;
+               left: -150%;
+               height: 150%;
+               top: -25%;
+       }
+}
+       .noUiSliderRight {
+               /*border: 1px solid #908d84;*/
+               border-radius: 3px;
+       }
+       .noUiSliderRight.connect a,
+       .noUiSliderRight.connect.lower {
+               /*background: #b2a98f;*/
+               background:url("images/hvac/temp_bar_on_right.svg") no-repeat right bottom;
+               /*background-size:85.9%;*/
+       }
+       .noUiSliderRight.disabled,
+       .noUiSliderRight.disabled.connect.lower a {
+               background: #ccc;
+               box-shadow: none;
+       }
+       .noUiSliderRight div {
+               height: 100px;
+               border-radius: 3px;
+               background: #efefe7;
+               background:url("images/hvac/drag_knob.svg") no-repeat center center;
+               background-size:15%;
+       }
+       .noUiSliderRight.disabled div {
+               background: transparent;
+       }
+       .noUiSliderRight.vertical {
+               width: 11%;
+               height: 37.6%;
+       }
+       .noUiSliderRight.vertical div {
+               margin: -50px -5px 0 -60px;
+       }
+       .noUiSliderRight{
+               position:absolute;
+               left:86.25%;
+               top:18%;
+               height:40%;
+       }
+
+/*********FAN*******/
+
+       .noUiSliderFan,
+       .noUiSliderFan * {
+-webkit-box-sizing: border-box;
+   -moz-box-sizing: border-box;
+               box-sizing: border-box;
+-webkit-user-select: none;
+   -moz-user-select: none;
+       -ms-user-select: none;
+               display: block;
+               cursor: default;
+       }
+       .noUiSliderFan {
+               position: relative;
+       }
+       .noUiSliderFan a {
+               position: absolute;
+               z-index: 1;
+       }
+       .noUiSliderFan a:nth-child(2) {
+               background: inherit !important;
+       }
+       .noUiSliderFan.vertical a {
+               width: 100%;
+               bottom: 0;
+       }
+       .noUiSliderFan.horizontal a {
+               height: 100%;
+               right: 0;
+       }
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+       .noUiSliderFan:before,
+       body.TOUCH,
+       .noUiSliderFan div {
+               -ms-touch-action: none;
+       }
+       .noUiSliderFan:before {
+               display: block;
+               position: absolute;
+               width: 150%;
+               left: -25%;
+               height: 400%;
+               top: -150%;
+               content: "";
+               z-index: -1;
+       }
+       .noUiSliderFan.vertical:before {
+               width: 400%;
+               left: -150%;
+               height: 150%;
+               top: -25%;
+       }
+}
+       .noUiSliderFan {
+               /*border: 1px solid #908d84;*/
+               border-radius: 3px;
+       }
+       .noUiSliderFan.connect a,
+       .noUiSliderFan.connect.lower {
+               /*background: #b2a98f;*/
+               /*background:url("images/hvac/temp_bar_on_right.svg") no-repeat right bottom;   */
+               background-size:85.9%;
+       }
+       .noUiSliderFan.disabled,
+       .noUiSliderFan.disabled.connect.lower a {
+               background: #ccc;
+               box-shadow: none;
+       }
+       .noUiSliderFan div {
+               width:80px;
+               height: 100%;
+               border-radius: 3px;
+               background: #efefe7;
+               background:url("images/hvac/drag_knob.svg") no-repeat center bottom;
+               background-size:26%;
+       }
+       .noUiSliderFan.disabled div {
+               background: transparent;
+       }
+       .noUiSliderFan.horizontal {
+               width: 42.5%;
+               height: 10.75%;
+       }
+       .noUiSliderFan.horizontal div {
+               margin: 0 0 0 -40px;
+       }
+       .noUiSliderFan{
+               position:absolute;
+               left:33%;
+               top:55%;
+               height:12%;
+       }
\ No newline at end of file
diff --git a/css/user/blue/phone.css b/css/user/blue/phone.css
new file mode 100644 (file)
index 0000000..0dfc0d9
--- /dev/null
@@ -0,0 +1,82 @@
+.phoneBody {
+       background-image: url("images/phone/bg_with_glow_blue.png");
+}
+
+.deleteButton {
+       background-image: url("images/phone/bt_delete_blue.png");
+}
+
+.callingTrue {
+       background-image: url("images/phone/icon_endcall_blue.png");
+}
+
+.callingFalse {
+       background-image: url("images/phone/icon_call_blue.png");
+}
+
+.carouselNumber {
+       background-image: url("images/phone/icon_number_blue.png");
+}
+
+.speakerButton {
+       background-image: url("images/phone/icon_speaker_blue.png");
+}
+
+.muteButton {
+       background-image: url("images/phone/icon_mute_blue.png");
+}
+
+.holdButton {
+       background-image: url("images/phone/icon_hold_blue.png");
+}
+
+.addCallButton {
+       background-image: url("images/phone/icon_addcall_blue.png");
+}
+
+.isFavoriteTrue {
+       background-image: url("images/phone/icon_favorite_true_blue.png");
+}
+
+.isFavoriteFalse {
+       background-image: url("images/phone/icon_favorite_false_blue.png");
+}
+
+.phoneIcon {
+       background-image: url("images/phone/icon_mobile_blue.png");
+}
+
+.emailIcon {
+       background-image: url("images/phone/icon_email_blue.png");
+}
+
+.addressIcon {
+       background-image: url("images/phone/icon_address_blue.png");
+}
+
+.missedCallIcon {
+       background-image: url("images/phone/icon_missed_blue.png");
+}
+
+.missedNewCallIcon {
+       background-image: url("images/phone/icon_missed_new_blue.png");
+}
+
+.receivedCallIcon {
+       background-image: url("images/phone/icon_received_blue.png");
+}
+
+.dialedCallIcon {
+       background-image: url("images/phone/icon_dialed_blue.png");
+}
+
+.noContactPhoto {
+       background-image: url("images/phone/contact_picture_blue.png");
+}
+.contactDetailBox3:hover .phoneIcon {
+       background-image: url("images/phone/icon_mobile_blue_hover.png");
+}
+
+.contactDetailBox3 .phoneIcon:hover {
+       background-image: url("images/phone/icon_mobile_blue_hover.png");
+}
diff --git a/css/user/blue/progressBarImg.css b/css/user/blue/progressBarImg.css
new file mode 100644 (file)
index 0000000..686221c
--- /dev/null
@@ -0,0 +1,21 @@
+/* Do not remove this comment, causes crashes on IVI */
+
+#VCicon {
+   background-image: url(./images/progressBar/icon_volume_blue.png);
+}
+
+#VCcircle {
+   background-image: url(./images/progressBar/handle_blue.png);
+}
+
+.noVolumeSlider div {
+       background:url("images/progressBar/handle_blue.png") no-repeat center center;
+}
+
+.noVolumeSlider.connect.lower a {
+       background:url("images/progressBar/progresbarbg.png") repeat-x left center;
+}
+
+.sliderStart{
+       background-image: url(./images/progressBar/progresbarbgstart.png);
+}
\ No newline at end of file
diff --git a/css/user/blue/settings.css b/css/user/blue/settings.css
new file mode 100644 (file)
index 0000000..e87e89b
--- /dev/null
@@ -0,0 +1 @@
+/* styling for settings screens*/
diff --git a/css/user/blue/store.css b/css/user/blue/store.css
new file mode 100644 (file)
index 0000000..b990be3
--- /dev/null
@@ -0,0 +1,16 @@
+/* application store style*/
+.storeBackground {
+       background-image: url('images/store/bg_all.png');
+}
+
+.iconStarActive{
+       background-image: url('images/store/star_white.png');
+}
+
+.iconStarInActive{
+       background-image: url('images/store/star_grey.png');
+}
+
+.storePopAppInfo {
+       background-image: url('images/musicplayer/grey_rectangle_blue.png');
+}
diff --git a/css/user/blue/tabs.css b/css/user/blue/tabs.css
new file mode 100644 (file)
index 0000000..9500dcc
--- /dev/null
@@ -0,0 +1,19 @@
+.tabsCloseButton {
+       background-image: url('images/tabs/bt_close_blue.png');
+}
+
+.tabsTopPanel {
+       background-image: url('images/tabs/bg_top_navi_blue.png');
+}
+
+.tabsTab, .tabsTabClear {
+       background-image: url('images/tabs/bg_top_navi_unselect1px_blue.png');
+}
+
+.tabsTabSelected {
+       background-image: url('images/tabs/bg_top_navi_select_blue.png');
+}
+
+.tabsCloseSubPanelButton {
+       background-image: url('images/tabs/bt_back_blue.png');
+}
diff --git a/css/user/blue/theme.json b/css/user/blue/theme.json
new file mode 100644 (file)
index 0000000..ccff47f
--- /dev/null
@@ -0,0 +1 @@
+{"id":"http://com.intel.tizen/blue","name":"Blue theme","type":"user","version":"0.5.1354227499444","selected":"true","icon":"icon.png"}
\ No newline at end of file
diff --git a/css/user/blue/topbariconsimages.css b/css/user/blue/topbariconsimages.css
new file mode 100644 (file)
index 0000000..c09078b
--- /dev/null
@@ -0,0 +1,3 @@
+.topBarIcons {
+       background-image: url('images/topbaricons/top_bar_icons_bg_blue.png');
+}
diff --git a/css/user/blue/user.css b/css/user/blue/user.css
new file mode 100644 (file)
index 0000000..a50b13b
--- /dev/null
@@ -0,0 +1,36 @@
+/* Do not remove this comment, causes crashes on IVI */
+
+/* APPLICATIONS */
+@import url("./musicplayer.css");
+@import url("./store.css");
+@import url("./homescreen.css");
+@import url("./dashboard.css");
+@import url("./phone.css");
+@import url("./settings.css");
+@import url("./hvac.css");
+@import url("./nouislider.fox.css");
+@import url("./navigation.css");
+
+/* COMPONENTS */
+@import url("./common.css");
+@import url("./topbariconsimages.css");
+@import url("./bottombaricons.css");
+@import url("./progressBarImg.css");
+@import url("./library.css");
+@import url("./tabs.css");
+
+.libraryButton {
+       background-image: url("images/common/bt_library_blue.png");
+}
+
+.backButton {
+       background-image: url("images/common/bt_back_blue.png");
+}
+
+.previousButton {
+       background-image: url("images/common/bt_previous_blue.png");
+}
+
+.nextButton {
+       background-image: url("images/common/bt_next_blue.png");
+}
diff --git a/css/user/blue/user.js b/css/user/blue/user.js
new file mode 100644 (file)
index 0000000..ebbbe32
--- /dev/null
@@ -0,0 +1,4 @@
+/* Do not remove this comment, causes crashes on IVI */
+
+var ThemeKeyColor = "#1476AE";
+var ThemeKeyColorSelected = "#00abff";
diff --git a/css/user/green/bottombaricons.css b/css/user/green/bottombaricons.css
new file mode 100644 (file)
index 0000000..498cd6a
--- /dev/null
@@ -0,0 +1,44 @@
+.bottomPanelImg {
+       background-image: url('./images/bottombaricons/panel_bottom_green.png');
+}
+
+.bottomPanelLogoImg {
+       background-image: url('./images/bottombaricons/logo_icon_green.png');
+}
+
+.bottomBackButtonBackgroundImg {
+       background-image: url('./images/bottombaricons/icon_back.png');
+}
+
+.bottomBackButton {
+       position: absolute;
+       left: 58px;
+       top: 95px;
+       width: 57px;
+       height: 63px;
+       cursor: pointer;
+}
+
+.bottomBackButton:active {
+       position: absolute;
+       left: 58px;
+       top: 97px;
+       width: 57px;
+       height: 63px;
+}
+
+.bottomPanelLogo {
+       position: absolute;
+       left: 250px;
+       top: 49px;
+       width: 200px;
+       height: 150px;
+}
+
+.bottomPanel {
+       position: absolute;
+       left: 0;
+       top: 1080px;
+       width: 720px;
+       height: 200px;
+}
\ No newline at end of file
diff --git a/css/user/green/common.css b/css/user/green/common.css
new file mode 100644 (file)
index 0000000..3bab506
--- /dev/null
@@ -0,0 +1,407 @@
+/* FONT SIZE */
+.fontSizeXXSmall {
+       font-size: 14px;
+       line-height: 14px;
+}
+
+.fontSizeXSmall {
+       font-size: 18px;
+       line-height: 18px;
+}
+
+.fontSizeSmaller {
+       font-size: 20px;
+       line-height: 20px;
+}
+
+.fontSizeSmall {
+       font-size: 24px;
+       line-height: 24px;
+}
+
+.fontSizeMedium {
+       font-size: 28px;
+       line-height: 28px;
+}
+
+.fontSizeLarge {
+       font-size: 30px;
+       line-height: 30px;
+}
+
+.fontSizeLarger {
+       font-size: 34px;
+       line-height: 34px;
+}
+
+.fontSizeXLarge {
+       font-size: 40px;
+       line-height: 40px;
+}
+
+.fontSizeXXLarge {
+       font-size: 48px;
+       line-height: 48px;
+}
+
+.fontSizeXXXLarge {
+       font-size: 62px;
+       line-height: 62px;
+}
+
+.fontSizeXXXXLarge {
+       font-size: 80px;
+       line-height: 80px;
+}
+
+.fontWeightNormal {
+       font-weight: normal;
+}
+
+.fontWeightBold {
+       font-weight: bold;
+}
+
+.fontWeightBolder {
+       font-weight: bolder;
+}
+
+.fontWeightLighter {
+       font-weight: lighter;
+}
+
+/* FONT COLOR */
+.fontColorNormal {
+       color: rgb(255, 255, 255); /*#ffffff*/
+       color: rgba(255, 255, 255, 1.0);
+}
+
+.fontColorTheme {
+       color: rgb(102, 210, 45);
+       color: rgba(102, 210, 45, 1.0); /*#57b229*/
+}
+
+.fontColorLight {
+       color: rgb(141, 222, 99);
+       color: rgba(141, 222, 99, 1.0); /*#8dde63*/
+}
+
+.fontColorDark {
+       color: rgb(102, 210, 45);
+       color: rgba(102, 210, 45, 1.0); /*#4c9d22*/
+}
+
+.fontColorSelected {
+       color: rgb(102, 210, 45);
+       color: rgba(102, 210, 45, 1.0); /*#66d22d*/
+}
+
+.fontColorDimmed {
+       color: rgb(145, 149, 153);
+       color: rgba(145, 149, 153, 1.0); /*#919599*/
+}
+
+.fontColorDimmedLight {
+       color: rgb(199, 199, 199);
+       color: rgba(199, 199, 199, 1.0); /*#c7c7c7*/
+}
+
+.fontColorLightRed {
+       color: rgb(255, 3, 3);
+       color: rgba(255, 3, 3, 0.8);
+}
+
+/* PAGE BACKGROUND COLOR */
+.pageBgColorNormal {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 1.0);
+}
+
+.pageBgColorNormalTransparent {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 0.8);
+}
+
+.pageBgColorTheme {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.pageBgColorThemeTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.8);
+}
+
+.pageBgColorLight {
+       background-color: rgb(141, 222, 99);
+       background-color: rgba(141, 222, 99, 1.0);
+}
+
+.pageBgColorLightTransparent {
+       background-color: rgb(141, 222, 99);
+       background-color: rgba(141, 222, 99, 0.8);
+}
+
+.pageBgColorDark {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.pageBgColorDarkTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.8);
+}
+
+.pageBgColorSelected {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.pageBgColorSelectedTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.8);
+}
+
+.pageBgColorDimmed {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 1.0);
+}
+
+.pageBgColorDimmedTransparent {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 0.8);
+}
+
+/* BACKGROUND COLOR */
+.bgColorNormal {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 1.0);
+}
+
+.bgColorNormalTransparent {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 0.5);
+}
+
+.bgColorTheme {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.bgColorThemeTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.5);
+}
+
+.bgColorLight {
+       background-color: rgb(141, 222, 99);
+       background-color: rgba(141, 222, 99, 1.0);
+}
+
+.bgColorLightTransparent {
+       background-color: rgb(141, 222, 99);
+       background-color: rgba(141, 222, 99, 0.5);
+}
+
+.bgColorDark {
+       background-color: rgb(24, 49, 11);
+       background-color: rgba(24, 49, 11, 1.0);
+}
+
+.bgColorDarkTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.5);
+}
+
+.bgColorSelected {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.bgColorSelectedTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.5);
+}
+
+.bgColorDimmed {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 1.0);
+}
+
+.bgColorDimmedTransparent {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 0.5);
+}
+
+/* BOX SHADOW */
+.boxShadow1 {
+       box-shadow: 0 0 10px 2px rgba(102, 210, 45, 0.8);
+}
+
+.boxShadow1Active:active,.boxShadow1Active:focus {
+       box-shadow: 0 0 10px 2px rgba(102, 210, 45, 1.0);
+}
+
+.boxShadow2 {
+       box-shadow: 0 0 50px 5px rgba(102, 210, 45, 0.8);
+}
+
+.boxShadow2Active:active,.boxShadow2Active:focus {
+       box-shadow: 0 0 50px 5px rgba(102, 210, 45, 1.0);
+}
+
+.boxShadow3 {
+       box-shadow: 0 0 30px 2px rgba(102, 210, 45, 0.8);
+}
+
+.boxShadow3Active:active,.boxShadow3Active:focus {
+       box-shadow: 0 0 30px 2px rgba(102, 210, 45, 1.0);
+}
+
+.boxShadow4 {
+       box-shadow: 0 0 70px 2px rgba(102, 210, 45, 0.4);
+}
+
+.boxShadow4Active:active,.boxShadow4Active:focus {
+       box-shadow: 0 0 70px 2px rgba(102, 210, 45, 1.0);
+}
+
+.boxShadowInset {
+       box-shadow: 0 0 2px 2px rgba(102, 210, 45, 1.0) inset;
+}
+
+.boxShadowInset:active,.boxShadowInset:hover {
+       box-shadow: 0 0 2px 2px rgba(59, 122, 26, 1.0) inset;
+}
+
+/* BORDER COLOR */
+.borderColorNormal {
+       border-color: rgb(0, 0, 0);
+       border-color: rgba(0, 0, 0, 1.0);
+}
+
+.borderColorTheme {
+       border-color: rgb(102, 210, 45);
+       border-color: rgba(102, 210, 45, 1.0);
+}
+
+.borderColorLight {
+       border-color: rgb(141, 222, 99);
+       border-color: rgba(141, 222, 99, 1.0);
+}
+
+.borderColorDark {
+       border-color: rgb(102, 210, 45);
+       border-color: rgba(102, 210, 45, 1.0);
+}
+
+.borderColorSelected {
+       border-color: rgb(102, 210, 45);
+       border-color: rgba(102, 210, 45, 1.0);
+}
+
+.borderColorDimmed {
+       border-color: rgb(199, 199, 199);
+       border-color: rgba(199, 199, 199, 1.0);
+}
+
+/* TEXT BACKGROUND COLOR */
+.textBgColorNormal {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 1.0);
+}
+
+.textBgColorNormalTransparent {
+       background-color: rgb(0, 0, 0);
+       background-color: rgba(0, 0, 0, 0.8);
+}
+
+.textBgColorTheme {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.textBgColorThemeTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.4);
+}
+
+.textBgColorLight {
+       background-color: rgb(141, 222, 99);
+       background-color: rgba(141, 222, 99, 1.0);
+}
+
+.textBgColorLightTransparent {
+       background-color: rgb(141, 222, 99);
+       background-color: rgba(141, 222, 99, 0.4);
+}
+
+.textBgColorDark {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.textBgColorDarkTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.4);
+}
+
+.textBgColorSelected {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 1.0);
+}
+
+.textBgColorSelectedTransparent {
+       background-color: rgb(102, 210, 45);
+       background-color: rgba(102, 210, 45, 0.4);
+}
+
+.textBgColorDimmed {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 1.0);
+}
+
+.textBgColorDimmedTransparent {
+       background-color: rgb(199, 199, 199);
+       background-color: rgba(199, 199, 199, 0.4);
+}
+
+/* OPACITY */
+.opacityFull {
+       opacity: 1.0;
+}
+
+.opacityHeavy {
+       opacity: 0.8;
+}
+
+.opacityMedium {
+       opacity: 0.65;
+}
+
+.opacityLight {
+       opacity: 0.5;
+}
+/* phone button */
+.callButton {
+       vertical-align: top;
+       display: inline-block;
+       margin-left: 108px;
+       border: none;
+       width: 72px;
+       height: 157px;
+       margin-right: 7px;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.callingTrue {
+       margin-top: 279px;
+       background-color: rgb(255, 3, 3);
+       background-color: rgba(255, 3, 3, 0.8);
+}
+
+.callingFalse {
+       margin-top: 117px;
+       background-color: rgb(138, 255, 0);
+       background-color: rgba(138, 255, 0, 0.54);
+}
\ No newline at end of file
diff --git a/css/user/green/dashboard.css b/css/user/green/dashboard.css
new file mode 100644 (file)
index 0000000..d39587a
--- /dev/null
@@ -0,0 +1,74 @@
+.dashboardBackGround {
+       background-image: url('images/dashboard/bg_green.png');
+}
+
+.carImage {
+       background-image:
+               url('images/dashboard/car_with__inactive_lights_green.png');
+}
+.whelImage{
+       background-image:
+               url('images/dashboard/wheel_green.png');
+}
+.dashboardSunElement{
+       background-image:
+               url('images/dashboard/sun_green.png');
+}
+.dashboardMoonElement{
+       background-image:
+               url('images/dashboard/moon_green.png');
+}
+.batteryImage {
+       background-image: url('images/dashboard/icon_battery_green.png');
+}
+
+.dashboardLineLong {
+       background-image:
+               url('images/dashboard/line_with_pointer_long_green.png')
+}
+.dashboardLineShort {
+       background-image:
+               url('images/dashboard/line_with_pointer_short_green.png')
+}
+
+.corner {
+       background-image:
+               url('images/dashboard/corner_green.png')
+}
+.dashboardCircle{
+       background-image:
+               url('images/dashboard/circle_green.png')
+}
+
+.padlocInactive{
+       background-image:
+               url('images/dashboard/icon_padlock_inactive_green.png')
+}
+.padlocActive{
+       background-image:
+               url('images/dashboard/icon_padlock_active_green.png')
+}
+.dashboardFrontLightsActive{
+       background-image:
+               url('images/dashboard/lights_front_active_green.png')
+}
+.dashboardRearLightsActive{
+       background-image:
+               url('images/dashboard/lights_rear_active_green.png');
+}
+.dashboardBreakLightsActive{
+       background-image:
+               url('images/dashboard/lights_break_active.png');
+}
+.dashBoardWeatherSun{
+       background-image:
+               url('images/dashboard/icon_sun.png')
+}
+.dashBoardWeatherCloudy{
+       background-image:
+               url('images/dashboard/icon_cloudy.png')
+}
+.dashBoardWeatherThunder{
+       background-image:
+               url('images/dashboard/icon_thunder.png')
+}
diff --git a/css/user/green/homescreen.css b/css/user/green/homescreen.css
new file mode 100644 (file)
index 0000000..fa7416d
--- /dev/null
@@ -0,0 +1,75 @@
+/* homescreen user style*/
+
+.wrapper {
+       background-color: #0D1906;
+}
+.backGround{
+       background: url('./images/homescreen/bg_green_01.png') no-repeat black;
+}
+.wrapper .step1{
+       background: url('./images/homescreen/bg_green_02.png') no-repeat black;
+}
+.wrapper .step2{
+       background: url('./images/homescreen/bg_green_03.png') no-repeat black;
+}
+.wrapper .step3{
+       background: url('./images/homescreen/bg_green_04.png') no-repeat black;
+}
+.wrapper .step4{
+       background: url('./images/homescreen/bg_green_05.png') no-repeat black;
+}
+.wrapper .step5{
+       background: url('./images/homescreen/bg_green_06.png') no-repeat black;
+}
+.wrapper .step6{
+       background: url('./images/homescreen/bg_green_07.png') no-repeat black;
+}
+.wrapper .step7{
+       background: url('./images/homescreen/bg_green_08.png') no-repeat black;
+}
+.wrapper .step8{
+       background: url('./images/homescreen/bg_green_09.png') no-repeat black;
+}
+.wrapper .step9{
+       background: url('./images/homescreen/bg_green_10.png') no-repeat black;
+}
+
+.sector1{
+       background: url('./images/homescreen/navigation_bg_green.png') no-repeat transparent;
+}
+.sector2{
+       background: url('./images/homescreen/music_bg_green.png') no-repeat transparent;
+}
+.sector3{
+       background: url('./images/homescreen/radio_bg_green.png') no-repeat transparent;
+}
+.sector4{
+       background: url('./images/homescreen/smart_bg_green.png') no-repeat transparent;
+}
+.sector5{
+       background: url('./images/homescreen/social_bg_green.png') no-repeat transparent;
+}
+.sector6{
+       background: url('./images/homescreen/store_bg_green.png') no-repeat transparent;
+}
+.sector7{
+       background: url('./images/homescreen/dashboard_bg_green.png') no-repeat transparent;
+}
+
+.indicator {
+       background-image: url('./images/homescreen/center_green.png');
+}
+.centerIco {
+       background-image: url('./images/homescreen/center_ico_green.png');
+}
+.outerRing {
+       background-image: url('./images/homescreen/center_outer_move_green.png');
+}
+.innerRing {
+       background-image: url('./images/homescreen/center_inner_move_green.png');
+}
+
+.homeScrAppGridView {
+       background-color: #2110b;
+       background-color: rgba(2, 17, 11,0.85);
+}
\ No newline at end of file
diff --git a/css/user/green/hvac.css b/css/user/green/hvac.css
new file mode 100644 (file)
index 0000000..25bcb20
--- /dev/null
@@ -0,0 +1,382 @@
+html {
+
+       font-family:Sans-Serif;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+       -khtml-user-select: none;
+       -moz-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+
+}
+
+body{
+       width:720px;/*720/1080*/
+       height:1000px;/*/1000/1500*/
+       margin:0;
+       font-size:.775em;/*.775em/1.1625em*/
+}
+.wrapper{
+       width:100%;
+       height:100%;
+       margin:0;
+       position:relative;
+
+       background: rgb(0,0,0); /* Old browsers */
+/* IE9 SVG, needs conditional override of 'filter' to 'none' */
+background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwNDE3MjQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+background: -moz-linear-gradient(top,  rgba(0,0,0,1) 0%, rgba(4,23,36,1) 100%); /* FF3.6+ */
+background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(0,0,0,1)), color-stop(100%,rgba(4,23,36,1))); /* Chrome,Safari4+ */
+background: -webkit-linear-gradient(top,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* Chrome10+,Safari5.1+ */
+background: -o-linear-gradient(top,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* Opera 11.10+ */
+background: -ms-linear-gradient(top,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* IE10+ */
+background: linear-gradient(to bottom,  rgba(0,0,0,1) 0%,rgba(4,23,36,1) 100%); /* W3C */
+filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#000000', endColorstr='#041724',GradientType=0 ); /* IE6-8 */
+
+}
+.static_parts_bg{
+       background:url("images/hvac/static_parts_bg.svg") no-repeat;
+       height:60.1%;/*601/1000*/
+       width:100%;/*720/720*/
+       position:absolute;
+       top:18%;
+       /*left:9.861111%;((720-578)/2)/720*/
+       background-size:100%;
+}
+/*********HAZARD BUTTON************/
+.hazard_btn{
+       width:57.777778%;/*416/720*/
+       height:8.1%;/*81/1000*/
+       background:url("images/hvac/hazard_off.svg") no-repeat;
+       top:115px;
+       left:21.1111%; /*152/720*/
+       position:absolute;
+       background-size:100%;
+}
+.hazard_btn.on{
+       background:url("images/hvac/hazard_on.svg") no-repeat;
+}
+
+.hazard_btn.blink{
+       background:url("images/hvac/hazard_blink.svg") no-repeat;
+}
+
+/*********LEFT HEAT SEAT BUTTON************/
+.left_seat_btn{
+       width:22.08333333%;/*159/720*/
+       height:12.9%;/*129/1000*/
+       position:absolute;
+       left:21.1111%; /*152/720*/
+       top:22%;
+}
+
+.left_heat_seat_off{
+       background:url("images/hvac/left_heat_seat_off.svg") no-repeat;
+       background-size:100%;
+       z-index:4;
+       width:100%;
+       height:100%;
+       position:absolute;
+}
+
+.left_heat_seat_on{
+       margin: 0 0 36px 0;
+       background:url("images/hvac/left_heat_seat_on.svg") no-repeat bottom;
+       z-index:4;
+       width:100%;
+       position:absolute;
+       bottom:0;
+       background-size:100%;
+}
+.left_heat_seat_on.stage1{
+       height:0;
+}
+.left_heat_seat_on.stage2{
+       height:34%;
+}
+.left_heat_seat_on.stage3{
+       height:50%;
+}
+.left_heat_seat_on.stage4{
+       height:100%;
+}
+
+/*********RIGHT HEAT SEAT BUTTON************/
+.right_seat_btn{
+       width:22.08333333%;/*159/720*/
+       height:12.9%;/*129/1000*/
+       position:absolute;
+       right:21.1111%; /*152/720*/
+       top:22%;
+}
+
+.right_heat_seat_off{
+       background:url("images/hvac/right_heat_seat_off.svg") no-repeat;
+       z-index:4;
+       width:100%;
+       height:100%;
+       position:absolute;
+       background-size:100%;
+}
+
+.right_heat_seat_on{
+       margin: 0 0 36px 0;
+       background:url("images/hvac/right_heat_seat_on.svg") no-repeat bottom;
+       z-index:4;
+       width:100%;
+       position:absolute;
+       bottom:0;
+       background-size:100%;
+}
+
+.right_heat_seat_on.stage1{
+       height:0;
+}
+.right_heat_seat_on.stage2{
+       height:34%;
+}
+.right_heat_seat_on.stage3{
+       height:50%;
+}
+.right_heat_seat_on.stage4{
+       height:100%;
+}
+
+/*********LEFT NUM SLIDER************/
+
+.left_num_bg{
+       background:url("images/hvac/left_number_bg.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height: 18.1%;
+       position:absolute;
+       left:21.1111%; /*152/720*/
+       top:35%;
+       overflow:hidden;
+       z-index:4;
+       background-size:100%;
+}
+
+.left_num_cover{
+       background:url("images/hvac/left_number_cover.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height:23.1%;/*231/1000*/
+       position:absolute;
+       left:21.1111%; /*152/720*/
+       top:35%;
+       z-index:5;
+    pointer-events:none;
+       background-size:100%;
+}
+
+.scrollable.left{
+       height: 100%;
+       position:absolute;
+       width:100%;
+       top:25%;
+}
+
+.scrollable.left ul{
+       list-style-type:none;
+       font-size:7em;
+       padding:0;
+       margin:0;
+       position: relative; /* Enables positionning of elements inside viewport */
+       height:100%;
+}
+
+.scrollable.left li{
+       width:100%;
+       margin:0;
+       padding:0;
+       color:#fff;
+       line-height:130%;
+       text-align:left;
+       padding-left:5%;
+       position:relative;
+}
+/*********RIGHT NUM SLIDER************/
+
+.right_num_bg{
+       background:url("images/hvac/right_number_bg.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height: 18.1%;
+       position:absolute;
+       right:21.1111%; /*152/720*/
+       top:35%;
+       overflow:hidden;
+       z-index:4;
+       background-size:100%;
+}
+
+.right_num_cover{
+       background:url("images/hvac/right_number_cover.svg") no-repeat;
+       width:21.9444444%;/*158/720*/
+       height:23.1%;/*231/1000*/
+       position:absolute;
+       right:21.1111%; /*152/720*/
+       top:35%;
+       z-index:5;
+    pointer-events:none;
+       background-size:100%;
+}
+
+.scrollable.right{
+       height: 100%;
+       position:absolute;
+       width:100%;
+       top:25%;
+}
+
+.scrollable.right ul{
+       list-style-type:none;
+       font-size:7em;
+       padding:0;
+       margin:0;
+       position: relative; /* Enables positionning of elements inside viewport */
+       height:100%;
+}
+
+.scrollable.right li{
+       width:100%;
+       margin:0;
+       padding:0;
+       color:#fff;
+       line-height:130%;
+       text-align:left;
+       padding-left:16%;
+       position:relative;
+}
+
+/*************lower half******************/
+.fanSpeedOn{
+       width:0;/*42.083333%; 303/720*/
+       height:9.4%; /*94/1000*/
+       background:url("images/hvac/fan_bar_on.svg") no-repeat;
+       position:absolute;
+       left:33.3%;
+       top:57.7%;
+       z-index:0;
+}
+
+
+/********FAN DIRECTION***********/
+.fan_dir_down_btn{
+       background:url("images/hvac/fan_dir_down_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:58.75%;/*20/1000*/
+       left:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_dir_down_btn.on{
+       background:url("images/hvac/fan_dir_down_on.svg") no-repeat;
+}
+.fan_dir_right_btn{
+       background:url("images/hvac/fan_dir_right_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:67.75%;/*20/1000*/
+       left:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+
+.fan_dir_right_btn.on{
+       background:url("images/hvac/fan_dir_right_on.svg") no-repeat;
+}
+
+.fan_dir_up_btn{
+       background:url("images/hvac/fan_dir_up_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:8.8%;/*88/1000*/
+       top:76.1%;/*20/1000*/
+       left:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_dir_up_btn.on{
+       background:url("images/hvac/fan_dir_up_on.svg") no-repeat;
+}
+
+
+
+.fan_control_ac{
+       background:url("images/hvac/fan_control_ac_off.svg") no-repeat;
+       width:15.555556%;/*112/720*/
+       height:8.8%;/*88/1000*/
+       top:67.75%;
+       left:24.333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_control_ac.on{
+       background:url("images/hvac/fan_control_ac_on.svg") no-repeat;
+}
+
+.fan_control_auto{
+       background:url("images/hvac/fan_control_auto_off.svg") no-repeat;
+       width:15.416667%;/*111/720*/
+       height:8.8%;/*88/1000*/
+       top:67.75%;
+       left:42.333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_control_auto.on{
+       background:url("images/hvac/fan_control_auto_on.svg") no-repeat;
+}
+
+.fan_control_circ{
+       background:url("images/hvac/fan_control_circ_off.svg") no-repeat;
+       width:15.555556%;/*112/720*/
+       height:8.8%;/*88/1000*/
+       top:67.75%;
+       left:60.333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.fan_control_circ.on{
+       background:url("images/hvac/fan_control_circ_on.svg") no-repeat;
+}
+
+/***DEFROST****/
+
+.defrost_max_btn{
+       background:url("images/hvac/defrost_max_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:58.75%;/*20/1000*/
+       right:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.defrost_max_btn.on{
+       background:url("images/hvac/defrost_max_on.svg") no-repeat;
+}
+.defrost_rear_btn{
+       background:url("images/hvac/defrost_rear_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:9.7%;/*97/1000*/
+       top:67.75%;/*20/1000*/
+       right:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+
+.defrost_rear_btn.on{
+       background:url("images/hvac/defrost_rear_on.svg") no-repeat;
+}
+
+.defrost_front_btn{
+       background:url("images/hvac/defrost_front_off.svg") no-repeat;
+       width:17.08333333%;/*123/720*/
+       height:8.8%;/*88/1000*/
+       top:76.1%;/*20/1000*/
+       right:3.333333%; /*24/720*/
+       position:absolute;
+       background-size:100%;
+}
+.defrost_front_btn.on{
+       background:url("images/hvac/defrost_front_on.svg") no-repeat;
+}
diff --git a/css/user/green/icon.png b/css/user/green/icon.png
new file mode 100644 (file)
index 0000000..399f463
Binary files /dev/null and b/css/user/green/icon.png differ
diff --git a/css/user/green/images/bottombaricons/icon_back.png b/css/user/green/images/bottombaricons/icon_back.png
new file mode 100644 (file)
index 0000000..ef85b81
Binary files /dev/null and b/css/user/green/images/bottombaricons/icon_back.png differ
diff --git a/css/user/green/images/bottombaricons/logo_icon_green.png b/css/user/green/images/bottombaricons/logo_icon_green.png
new file mode 100644 (file)
index 0000000..af8a1e7
Binary files /dev/null and b/css/user/green/images/bottombaricons/logo_icon_green.png differ
diff --git a/css/user/green/images/bottombaricons/panel_bottom_green.png b/css/user/green/images/bottombaricons/panel_bottom_green.png
new file mode 100644 (file)
index 0000000..7ab7876
Binary files /dev/null and b/css/user/green/images/bottombaricons/panel_bottom_green.png differ
diff --git a/css/user/green/images/common/bt_back_green.png b/css/user/green/images/common/bt_back_green.png
new file mode 100644 (file)
index 0000000..7c1f73d
Binary files /dev/null and b/css/user/green/images/common/bt_back_green.png differ
diff --git a/css/user/green/images/common/bt_library_green.png b/css/user/green/images/common/bt_library_green.png
new file mode 100644 (file)
index 0000000..ceec292
Binary files /dev/null and b/css/user/green/images/common/bt_library_green.png differ
diff --git a/css/user/green/images/common/bt_next_green.png b/css/user/green/images/common/bt_next_green.png
new file mode 100644 (file)
index 0000000..ee3d1ae
Binary files /dev/null and b/css/user/green/images/common/bt_next_green.png differ
diff --git a/css/user/green/images/common/bt_previous_green.png b/css/user/green/images/common/bt_previous_green.png
new file mode 100644 (file)
index 0000000..dc7725b
Binary files /dev/null and b/css/user/green/images/common/bt_previous_green.png differ
diff --git a/css/user/green/images/dashboard/bg_green.png b/css/user/green/images/dashboard/bg_green.png
new file mode 100644 (file)
index 0000000..71a11b1
Binary files /dev/null and b/css/user/green/images/dashboard/bg_green.png differ
diff --git a/css/user/green/images/dashboard/car_with__inactive_lights_green.png b/css/user/green/images/dashboard/car_with__inactive_lights_green.png
new file mode 100644 (file)
index 0000000..aad87b5
Binary files /dev/null and b/css/user/green/images/dashboard/car_with__inactive_lights_green.png differ
diff --git a/css/user/green/images/dashboard/circle_green.png b/css/user/green/images/dashboard/circle_green.png
new file mode 100644 (file)
index 0000000..5d94604
Binary files /dev/null and b/css/user/green/images/dashboard/circle_green.png differ
diff --git a/css/user/green/images/dashboard/corner_green.png b/css/user/green/images/dashboard/corner_green.png
new file mode 100644 (file)
index 0000000..88e367b
Binary files /dev/null and b/css/user/green/images/dashboard/corner_green.png differ
diff --git a/css/user/green/images/dashboard/icon_battery_green.png b/css/user/green/images/dashboard/icon_battery_green.png
new file mode 100644 (file)
index 0000000..0368763
Binary files /dev/null and b/css/user/green/images/dashboard/icon_battery_green.png differ
diff --git a/css/user/green/images/dashboard/icon_cloudy.png b/css/user/green/images/dashboard/icon_cloudy.png
new file mode 100644 (file)
index 0000000..e1d80ee
Binary files /dev/null and b/css/user/green/images/dashboard/icon_cloudy.png differ
diff --git a/css/user/green/images/dashboard/icon_padlock_active_green.png b/css/user/green/images/dashboard/icon_padlock_active_green.png
new file mode 100644 (file)
index 0000000..376a2c9
Binary files /dev/null and b/css/user/green/images/dashboard/icon_padlock_active_green.png differ
diff --git a/css/user/green/images/dashboard/icon_padlock_inactive_green.png b/css/user/green/images/dashboard/icon_padlock_inactive_green.png
new file mode 100644 (file)
index 0000000..a41a4ef
Binary files /dev/null and b/css/user/green/images/dashboard/icon_padlock_inactive_green.png differ
diff --git a/css/user/green/images/dashboard/icon_sun.png b/css/user/green/images/dashboard/icon_sun.png
new file mode 100644 (file)
index 0000000..def85f1
Binary files /dev/null and b/css/user/green/images/dashboard/icon_sun.png differ
diff --git a/css/user/green/images/dashboard/icon_thunder.png b/css/user/green/images/dashboard/icon_thunder.png
new file mode 100644 (file)
index 0000000..1de2181
Binary files /dev/null and b/css/user/green/images/dashboard/icon_thunder.png differ
diff --git a/css/user/green/images/dashboard/lights_break_active.png b/css/user/green/images/dashboard/lights_break_active.png
new file mode 100644 (file)
index 0000000..80d4ac1
Binary files /dev/null and b/css/user/green/images/dashboard/lights_break_active.png differ
diff --git a/css/user/green/images/dashboard/lights_front_active_green.png b/css/user/green/images/dashboard/lights_front_active_green.png
new file mode 100644 (file)
index 0000000..5118593
Binary files /dev/null and b/css/user/green/images/dashboard/lights_front_active_green.png differ
diff --git a/css/user/green/images/dashboard/lights_rear_active_green.png b/css/user/green/images/dashboard/lights_rear_active_green.png
new file mode 100644 (file)
index 0000000..d0abede
Binary files /dev/null and b/css/user/green/images/dashboard/lights_rear_active_green.png differ
diff --git a/css/user/green/images/dashboard/line_with_pointer_long_green.png b/css/user/green/images/dashboard/line_with_pointer_long_green.png
new file mode 100644 (file)
index 0000000..f51f103
Binary files /dev/null and b/css/user/green/images/dashboard/line_with_pointer_long_green.png differ
diff --git a/css/user/green/images/dashboard/line_with_pointer_short_green.png b/css/user/green/images/dashboard/line_with_pointer_short_green.png
new file mode 100644 (file)
index 0000000..9bdd5d9
Binary files /dev/null and b/css/user/green/images/dashboard/line_with_pointer_short_green.png differ
diff --git a/css/user/green/images/dashboard/moon_green.png b/css/user/green/images/dashboard/moon_green.png
new file mode 100644 (file)
index 0000000..18f1c29
Binary files /dev/null and b/css/user/green/images/dashboard/moon_green.png differ
diff --git a/css/user/green/images/dashboard/sun_green.png b/css/user/green/images/dashboard/sun_green.png
new file mode 100644 (file)
index 0000000..20a7981
Binary files /dev/null and b/css/user/green/images/dashboard/sun_green.png differ
diff --git a/css/user/green/images/dashboard/wheel_green.png b/css/user/green/images/dashboard/wheel_green.png
new file mode 100644 (file)
index 0000000..3969c15
Binary files /dev/null and b/css/user/green/images/dashboard/wheel_green.png differ
diff --git a/css/user/green/images/homescreen/bg_green_01.png b/css/user/green/images/homescreen/bg_green_01.png
new file mode 100644 (file)
index 0000000..f9554df
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_01.png differ
diff --git a/css/user/green/images/homescreen/bg_green_02.png b/css/user/green/images/homescreen/bg_green_02.png
new file mode 100644 (file)
index 0000000..f7673ef
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_02.png differ
diff --git a/css/user/green/images/homescreen/bg_green_03.png b/css/user/green/images/homescreen/bg_green_03.png
new file mode 100644 (file)
index 0000000..9083c8a
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_03.png differ
diff --git a/css/user/green/images/homescreen/bg_green_04.png b/css/user/green/images/homescreen/bg_green_04.png
new file mode 100644 (file)
index 0000000..42e3a69
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_04.png differ
diff --git a/css/user/green/images/homescreen/bg_green_05.png b/css/user/green/images/homescreen/bg_green_05.png
new file mode 100644 (file)
index 0000000..16204c4
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_05.png differ
diff --git a/css/user/green/images/homescreen/bg_green_06.png b/css/user/green/images/homescreen/bg_green_06.png
new file mode 100644 (file)
index 0000000..bfa77ff
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_06.png differ
diff --git a/css/user/green/images/homescreen/bg_green_07.png b/css/user/green/images/homescreen/bg_green_07.png
new file mode 100644 (file)
index 0000000..b7e69de
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_07.png differ
diff --git a/css/user/green/images/homescreen/bg_green_08.png b/css/user/green/images/homescreen/bg_green_08.png
new file mode 100644 (file)
index 0000000..740cd8b
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_08.png differ
diff --git a/css/user/green/images/homescreen/bg_green_09.png b/css/user/green/images/homescreen/bg_green_09.png
new file mode 100644 (file)
index 0000000..2d3592d
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_09.png differ
diff --git a/css/user/green/images/homescreen/bg_green_10.png b/css/user/green/images/homescreen/bg_green_10.png
new file mode 100644 (file)
index 0000000..3820d2e
Binary files /dev/null and b/css/user/green/images/homescreen/bg_green_10.png differ
diff --git a/css/user/green/images/homescreen/bottom_panel_bg_green.png b/css/user/green/images/homescreen/bottom_panel_bg_green.png
new file mode 100644 (file)
index 0000000..8d5c5e9
Binary files /dev/null and b/css/user/green/images/homescreen/bottom_panel_bg_green.png differ
diff --git a/css/user/green/images/homescreen/center_green.png b/css/user/green/images/homescreen/center_green.png
new file mode 100644 (file)
index 0000000..eb6801d
Binary files /dev/null and b/css/user/green/images/homescreen/center_green.png differ
diff --git a/css/user/green/images/homescreen/center_ico_green.png b/css/user/green/images/homescreen/center_ico_green.png
new file mode 100644 (file)
index 0000000..35755b4
Binary files /dev/null and b/css/user/green/images/homescreen/center_ico_green.png differ
diff --git a/css/user/green/images/homescreen/center_inner_move_green.png b/css/user/green/images/homescreen/center_inner_move_green.png
new file mode 100644 (file)
index 0000000..efa27e4
Binary files /dev/null and b/css/user/green/images/homescreen/center_inner_move_green.png differ
diff --git a/css/user/green/images/homescreen/center_outer_move_green.png b/css/user/green/images/homescreen/center_outer_move_green.png
new file mode 100644 (file)
index 0000000..e8214c1
Binary files /dev/null and b/css/user/green/images/homescreen/center_outer_move_green.png differ
diff --git a/css/user/green/images/homescreen/dashboard_bg_green.png b/css/user/green/images/homescreen/dashboard_bg_green.png
new file mode 100644 (file)
index 0000000..d956f0a
Binary files /dev/null and b/css/user/green/images/homescreen/dashboard_bg_green.png differ
diff --git a/css/user/green/images/homescreen/music_bg_green.png b/css/user/green/images/homescreen/music_bg_green.png
new file mode 100644 (file)
index 0000000..950954b
Binary files /dev/null and b/css/user/green/images/homescreen/music_bg_green.png differ
diff --git a/css/user/green/images/homescreen/navigation_bg_green.png b/css/user/green/images/homescreen/navigation_bg_green.png
new file mode 100644 (file)
index 0000000..afba886
Binary files /dev/null and b/css/user/green/images/homescreen/navigation_bg_green.png differ
diff --git a/css/user/green/images/homescreen/phone_bg_green.png b/css/user/green/images/homescreen/phone_bg_green.png
new file mode 100644 (file)
index 0000000..2a4fb59
Binary files /dev/null and b/css/user/green/images/homescreen/phone_bg_green.png differ
diff --git a/css/user/green/images/homescreen/radio_bg_green.png b/css/user/green/images/homescreen/radio_bg_green.png
new file mode 100644 (file)
index 0000000..bf2ecf3
Binary files /dev/null and b/css/user/green/images/homescreen/radio_bg_green.png differ
diff --git a/css/user/green/images/homescreen/smart_bg_green.png b/css/user/green/images/homescreen/smart_bg_green.png
new file mode 100644 (file)
index 0000000..db4f7a0
Binary files /dev/null and b/css/user/green/images/homescreen/smart_bg_green.png differ
diff --git a/css/user/green/images/homescreen/social_bg_green.png b/css/user/green/images/homescreen/social_bg_green.png
new file mode 100644 (file)
index 0000000..d2ee6b8
Binary files /dev/null and b/css/user/green/images/homescreen/social_bg_green.png differ
diff --git a/css/user/green/images/homescreen/store_bg_green.png b/css/user/green/images/homescreen/store_bg_green.png
new file mode 100644 (file)
index 0000000..16232b8
Binary files /dev/null and b/css/user/green/images/homescreen/store_bg_green.png differ
diff --git a/css/user/green/images/homescreen/video_bg_green.png b/css/user/green/images/homescreen/video_bg_green.png
new file mode 100644 (file)
index 0000000..dc70d08
Binary files /dev/null and b/css/user/green/images/homescreen/video_bg_green.png differ
diff --git a/css/user/green/images/hvac/defrost_front_off.svg b/css/user/green/images/hvac/defrost_front_off.svg
new file mode 100644 (file)
index 0000000..e02bd51
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 876 123 88" overflow="visible" enable-background="new 574 876 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="575" y="876.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="575" y="876.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<path fill="#6DD436" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>\r
+<path fill="#6DD436" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>\r
+<path fill="#6DD436" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981\r
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143\r
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468\r
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>\r
+<path fill="#6DD436" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053\r
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026\r
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>\r
+<path fill="#6DD436" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>\r
+<path fill="#6DD436" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001\r
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738\r
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986\r
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005\r
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317\r
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181\r
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816\r
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509\r
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>\r
+<path fill="#6DD436" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686\r
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734\r
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104\r
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607\r
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748\r
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12\r
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665\r
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712\r
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="877.6396" x2="635.5" y2="962.9438">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#63E6FF"/>\r
+</linearGradient>\r
+<rect x="574.5" y="876.5" display="none" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<path display="none" fill="#FFFFFF" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>\r
+<path display="none" fill="#FFFFFF" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>\r
+<path display="none" fill="#FFFFFF" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981\r
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143\r
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468\r
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>\r
+<path display="none" fill="#FFFFFF" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053\r
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026\r
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>\r
+<path display="none" fill="#FFFFFF" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>\r
+<path display="none" fill="#FFFFFF" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001\r
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738\r
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986\r
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005\r
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317\r
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181\r
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816\r
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509\r
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>\r
+<path display="none" fill="#FFFFFF" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686\r
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734\r
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104\r
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607\r
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748\r
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12\r
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665\r
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712\r
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>\r
+<text transform="matrix(1 0 0 1 595.9609 904.8877)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="26.1844">FRONT</text>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="3.2325" stroke-miterlimit="10" d="M661.351,946.355\r
+       c-0.881,2.053-3.306,2.986-5.466,2.263c-12.79-4.31-26.646-4.31-39.437,0c-2.16,0.724-4.586-0.21-5.466-2.263\r
+       c-3.042-7.342-6.082-14.684-9.123-22.025c-0.88-2.047,1.056-4.84,4.398-5.963c19.399-6.535,40.417-6.535,59.816,0\r
+       c3.342,1.123,5.279,3.916,4.399,5.963C667.432,931.672,664.392,939.014,661.351,946.355z"/>\r
+<polyline display="none" fill="none" stroke="#6DD436" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="\r
+       665,933.5 660.568,933.5 655.295,924.5 655.302,924.5 646.162,940.466 637.021,924.5 637.028,924.5 627.889,940.466 618.748,924.5 \r
+       618.755,924.5 613.417,933.5 607,933.5 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/defrost_front_on.svg b/css/user/green/images/hvac/defrost_front_on.svg
new file mode 100644 (file)
index 0000000..c0f618a
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 876 123 88" overflow="visible" enable-background="new 574 876 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="575" y="876.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="575" y="876.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<path display="none" fill="#6DD436" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>\r
+<path display="none" fill="#6DD436" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>\r
+<path display="none" fill="#6DD436" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981\r
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143\r
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468\r
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>\r
+<path display="none" fill="#6DD436" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053\r
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026\r
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>\r
+<path display="none" fill="#6DD436" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>\r
+<path display="none" fill="#6DD436" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001\r
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738\r
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986\r
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005\r
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317\r
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181\r
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816\r
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509\r
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>\r
+<path display="none" fill="#6DD436" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686\r
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734\r
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104\r
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607\r
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748\r
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12\r
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665\r
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712\r
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="877.6396" x2="635.5" y2="962.9438">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65D02D"/>\r
+</linearGradient>\r
+<rect x="574.5" y="876.5" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<path fill="#FFFFFF" d="M597.82,887.239h10.186v2.645h-6.965v4.871h6.493v2.645h-6.493v7.488h-3.221V887.239z"/>\r
+<path fill="#FFFFFF" d="M611.147,887.476c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V887.476z M614.342,895.278h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V895.278z"/>\r
+<path fill="#FFFFFF" d="M641.704,895.881c0,5.917-3.588,9.295-8.458,9.295c-4.975,0-8.117-3.797-8.117-8.981\r
+       c0-5.42,3.404-9.243,8.379-9.243C638.666,886.951,641.704,890.854,641.704,895.881z M628.533,896.143\r
+       c0,3.587,1.807,6.441,4.896,6.441c3.115,0,4.87-2.881,4.87-6.572c0-3.326-1.649-6.468-4.87-6.468\r
+       C630.235,889.544,628.533,892.503,628.533,896.143z"/>\r
+<path fill="#FFFFFF" d="M644.48,904.888v-17.648h3.665l4.557,7.567c1.178,1.964,2.199,4.006,3.011,5.918h0.053\r
+       c-0.21-2.356-0.288-4.635-0.288-7.332v-6.153h2.985v17.648h-3.326l-4.608-7.751c-1.126-1.938-2.304-4.11-3.168-6.101l-0.078,0.026\r
+       c0.131,2.278,0.157,4.608,0.157,7.515v6.311H644.48z"/>\r
+<path fill="#FFFFFF" d="M665.559,889.937h-5.027v-2.697h13.327v2.697h-5.08v14.951h-3.22V889.937z"/>\r
+<path fill="#FFFFFF" d="M657.373,950.478c-0.681,0-1.354-0.11-2.002-0.327c-12.401-4.178-26.008-4.177-38.407-0.001\r
+       c-0.649,0.218-1.322,0.328-2.004,0.328c-2.411,0-4.556-1.368-5.463-3.485l-9.131-22.044c-0.485-1.127-0.442-2.462,0.128-3.738\r
+       c0.86-1.924,2.822-3.56,5.249-4.375c9.819-3.308,20.056-4.985,30.423-4.985s20.604,1.678,30.424,4.986\r
+       c2.427,0.814,4.389,2.451,5.249,4.375c0.57,1.276,0.612,2.61,0.12,3.758l-9.115,22.005\r
+       C661.928,949.109,659.783,950.478,657.373,950.478z M636.166,943.77c6.896,0,13.703,1.116,20.234,3.317\r
+       c0.313,0.104,0.642,0.158,0.973,0.158c1.116,0,2.095-0.6,2.492-1.527l9.115-22.007c0.178-0.413,0.047-0.868-0.093-1.181\r
+       c-0.385-0.86-1.461-2.004-3.328-2.631c-9.489-3.196-19.378-4.817-29.394-4.817s-19.904,1.621-29.393,4.816\r
+       c-1.868,0.628-2.943,1.771-3.328,2.631c-0.14,0.312-0.271,0.768-0.101,1.162l9.131,22.045c0.39,0.909,1.368,1.509,2.483,1.509\r
+       c0.332,0,0.66-0.054,0.976-0.159C622.464,944.886,629.271,943.77,636.166,943.77z"/>\r
+<path fill="#FFFFFF" d="M646.162,941.966c-0.538,0-1.034-0.288-1.302-0.755l-7.835-13.686l-7.835,13.686\r
+       c-0.268,0.467-0.764,0.755-1.302,0.755s-1.034-0.288-1.302-0.755l-7.858-13.726l-4.021,6.78c-0.271,0.455-0.761,0.734-1.29,0.734\r
+       H607c-0.828,0-1.5-0.672-1.5-1.5s0.672-1.5,1.5-1.5h5.562l4.833-8.148c0.017-0.035,0.035-0.069,0.055-0.104\r
+       c0.269-0.463,0.763-0.748,1.298-0.748c0.539,0,1.04,0.289,1.307,0.758c0.016,0.026,0.029,0.054,0.043,0.081l7.791,13.607\r
+       l7.77-13.572c0.02-0.043,0.042-0.085,0.065-0.126c0.269-0.463,0.763-0.748,1.298-0.748s1.033,0.285,1.301,0.748\r
+       c0.018,0.029,0.034,0.06,0.049,0.091l7.791,13.607l7.77-13.572c0.019-0.041,0.039-0.081,0.062-0.12\r
+       c0.268-0.466,0.764-0.754,1.302-0.754c0.535,0,1.033,0.285,1.301,0.748c0.015,0.025,0.029,0.051,0.042,0.077l4.79,8.175H665\r
+       c0.828,0,1.5,0.672,1.5,1.5s-0.672,1.5-1.5,1.5h-4.432c-0.532,0-1.025-0.282-1.294-0.741l-3.961-6.76l-7.85,13.712\r
+       C647.196,941.678,646.7,941.966,646.162,941.966z"/>\r
+<text transform="matrix(1 0 0 1 595.9609 904.8877)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="26.1844">FRONT</text>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="3.2325" stroke-miterlimit="10" d="M661.351,946.355\r
+       c-0.881,2.053-3.306,2.986-5.466,2.263c-12.79-4.31-26.646-4.31-39.437,0c-2.16,0.724-4.586-0.21-5.466-2.263\r
+       c-3.042-7.342-6.082-14.684-9.123-22.025c-0.88-2.047,1.056-4.84,4.398-5.963c19.399-6.535,40.417-6.535,59.816,0\r
+       c3.342,1.123,5.279,3.916,4.399,5.963C667.432,931.672,664.392,939.014,661.351,946.355z"/>\r
+<polyline display="none" fill="none" stroke="#6DD436" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="\r
+       665,933.5 660.568,933.5 655.295,924.5 655.302,924.5 646.162,940.466 637.021,924.5 637.028,924.5 627.889,940.466 618.748,924.5 \r
+       618.755,924.5 613.417,933.5 607,933.5 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/defrost_max_off.svg b/css/user/green/images/hvac/defrost_max_off.svg
new file mode 100644 (file)
index 0000000..1499a1a
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="97px" viewBox="697.129 642.492 123 97"\r
+        overflow="visible" enable-background="new 697.129 642.492 123 97" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>\r
+<path fill="#6DD436" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079c-0.576,2.146-1.31,4.529-2.095,6.755\r
+       l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096\r
+       h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07\r
+       h4.189l1.021,17.648h-3.142L747.514,675.48z"/>\r
+<path fill="#6DD436" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H757.647z\r
+        M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347\r
+       H762.701z"/>\r
+<path fill="#6DD436" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078\r
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64\r
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"\r
+       />\r
+<path fill="#6DD436" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001\r
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764\r
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54\r
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979\r
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0\r
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253\r
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>\r
+<path fill="#6DD436" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903c-6.05,8.577,7.235,16.625,0.38,26.625\r
+       c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path fill="#6DD436" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903c-6.049,8.577,7.235,16.625,0.382,26.625\r
+       c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path fill="#6DD436" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903c-6.05,8.577,7.235,16.625,0.38,26.625\r
+       c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="758.6294" y1="643.626" x2="758.6294" y2="737.4362">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#63E6FF"/>\r
+</linearGradient>\r
+<path display="none" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" d="M697.629,643.039V738.5h122v-80.76\r
+       C780.629,651.722,739.629,646.832,697.629,643.039z"/>\r
+<path display="none" fill="#FFFFFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079\r
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053\r
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127\r
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>\r
+<path display="none" fill="#FFFFFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001\r
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299\r
+       l-1.361,4.347H762.701z"/>\r
+<path display="none" fill="#FFFFFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078\r
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64\r
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"\r
+       />\r
+<path display="none" fill="#FFFFFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001\r
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764\r
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54\r
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979\r
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0\r
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253\r
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>\r
+<path display="none" fill="#FFFFFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path display="none" fill="#FFFFFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903\r
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path display="none" fill="#FFFFFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<text transform="matrix(1 0 0 1 730.7563 682.6807)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="26.1844">MAX</text>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="2.4433" stroke-miterlimit="10" d="M776.192,719.741\r
+       c-0.579,1.821-2.173,2.65-3.596,2.008c-8.41-3.825-17.523-3.825-25.935,0c-1.42,0.643-3.016-0.187-3.595-2.008\r
+       c-2-6.518-3.999-13.035-6-19.552c-0.577-1.816,0.696-4.296,2.894-5.293c12.758-5.803,26.58-5.803,39.338,0\r
+       c2.197,0.997,3.471,3.477,2.894,5.293C780.191,706.706,778.192,713.224,776.192,719.741z"/>\r
+<path display="none" fill="#6DD436" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903\r
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<path display="none" fill="none" stroke="#007F50" stroke-miterlimit="10" d="M968.129,664.752\r
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/defrost_max_on.svg b/css/user/green/images/hvac/defrost_max_on.svg
new file mode 100644 (file)
index 0000000..a9641e3
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="97px" viewBox="697.129 642.492 123 97"\r
+        overflow="visible" enable-background="new 697.129 642.492 123 97" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>\r
+<path display="none" fill="#6DD436" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079\r
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053\r
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127\r
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>\r
+<path display="none" fill="#6DD436" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001\r
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299\r
+       l-1.361,4.347H762.701z"/>\r
+<path display="none" fill="#6DD436" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078\r
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64\r
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"\r
+       />\r
+<path display="none" fill="#6DD436" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001\r
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764\r
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54\r
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979\r
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0\r
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253\r
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>\r
+<path display="none" fill="#6DD436" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903\r
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="758.6294" y1="643.626" x2="758.6294" y2="737.4362">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65D02D"/>\r
+</linearGradient>\r
+<path fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" d="M697.629,643.039V738.5h122v-80.76\r
+       C780.629,651.722,739.629,646.832,697.629,643.039z"/>\r
+<path fill="#FFFFFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079c-0.576,2.146-1.31,4.529-2.095,6.755\r
+       l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096\r
+       h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07\r
+       h4.189l1.021,17.648h-3.142L747.514,675.48z"/>\r
+<path fill="#FFFFFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H757.647z\r
+        M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347\r
+       H762.701z"/>\r
+<path fill="#FFFFFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078\r
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64\r
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"\r
+       />\r
+<path fill="#FFFFFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001\r
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764\r
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54\r
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979\r
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0\r
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253\r
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>\r
+<path fill="#FFFFFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903c-6.05,8.577,7.235,16.625,0.38,26.625\r
+       c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path fill="#FFFFFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903c-6.049,8.577,7.235,16.625,0.382,26.625\r
+       c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path fill="#FFFFFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903c-6.05,8.577,7.235,16.625,0.38,26.625\r
+       c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<text transform="matrix(1 0 0 1 730.7563 682.6807)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="26.1844">MAX</text>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="2.4433" stroke-miterlimit="10" d="M776.192,719.741\r
+       c-0.579,1.821-2.173,2.65-3.596,2.008c-8.41-3.825-17.523-3.825-25.935,0c-1.42,0.643-3.016-0.187-3.595-2.008\r
+       c-2-6.518-3.999-13.035-6-19.552c-0.577-1.816,0.696-4.296,2.894-5.293c12.758-5.803,26.58-5.803,39.338,0\r
+       c2.197,0.997,3.471,3.477,2.894,5.293C780.191,706.706,778.192,713.224,776.192,719.741z"/>\r
+<path display="none" fill="#6DD436" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903\r
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<path display="none" fill="none" stroke="#007F50" stroke-miterlimit="10" d="M968.129,664.752\r
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/defrost_rear_off.svg b/css/user/green/images/hvac/defrost_rear_off.svg
new file mode 100644 (file)
index 0000000..9a81309
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 763 123 88" overflow="visible" enable-background="new 574 763 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="575" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="575" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<path fill="#6DD436" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623\r
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path fill="#6DD436" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65V785.46z"/>\r
+<path fill="#6DD436" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H639.404z\r
+        M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347\r
+       H644.458z"/>\r
+<path fill="#6DD436" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path fill="#6DD436" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66h35.68\r
+       c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68\r
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>\r
+<path fill="#6DD436" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.393,19.226,0.442,30.322\r
+       c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>\r
+<path fill="#6DD436" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322\r
+       c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>\r
+<path fill="#6DD436" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322\r
+       c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="765.6836" x2="635.5" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="574.5" y="763.5" display="none" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<path display="none" fill="#FFFFFF" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623\r
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path display="none" fill="#FFFFFF" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65\r
+       V785.46z"/>\r
+<path display="none" fill="#FFFFFF" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001\r
+       H639.404z M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299\r
+       l-1.361,4.347H644.458z"/>\r
+<path display="none" fill="#FFFFFF" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path display="none" fill="#FFFFFF" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66\r
+       h35.68c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68\r
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>\r
+<path display="none" fill="#FFFFFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>\r
+<path display="none" fill="#FFFFFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>\r
+<path display="none" fill="#FFFFFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>\r
+<text transform="matrix(1 0 0 1 605.627 793.2891)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="26.1844">REAR</text>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="3" stroke-miterlimit="10" d="M658.5,826.34\r
+       c0,2.298-1.862,4.16-4.16,4.16h-35.68c-2.298,0-4.16-1.862-4.16-4.16v-19.68c0-2.298,1.862-4.16,4.16-4.16h35.68\r
+       c2.298,0,4.16,1.862,4.16,4.16V826.34z"/>\r
+<path display="none" fill="#6DD436" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>\r
+<path display="none" fill="#6DD436" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>\r
+<path display="none" fill="#6DD436" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/defrost_rear_on.svg b/css/user/green/images/hvac/defrost_rear_on.svg
new file mode 100644 (file)
index 0000000..a41dfe4
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="574 763 123 88" overflow="visible" enable-background="new 574 763 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#041724"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="575" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="575" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<path display="none" fill="#6DD436" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623\r
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path display="none" fill="#6DD436" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65\r
+       V785.46z"/>\r
+<path display="none" fill="#6DD436" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001\r
+       H639.404z M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299\r
+       l-1.361,4.347H644.458z"/>\r
+<path display="none" fill="#6DD436" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path display="none" fill="#6DD436" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66\r
+       h35.68c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68\r
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>\r
+<path display="none" fill="#6DD436" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>\r
+<path display="none" fill="#6DD436" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>\r
+<path display="none" fill="#6DD436" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="635.5" y1="765.6836" x2="635.5" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="574.5" y="763.5" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<path fill="#FFFFFF" d="M607.486,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.178-4.163c-0.498-2.305-1.336-3.037-3.169-3.09h-1.623\r
+       v7.253h-3.194V775.877z M610.681,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path fill="#FFFFFF" d="M632.256,785.46h-6.65v5.185h7.436v2.645h-10.656v-17.648h10.264v2.645h-7.043v4.557h6.65V785.46z"/>\r
+<path fill="#FFFFFF" d="M639.404,788.288l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001H639.404z\r
+        M644.458,785.853l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299l-1.361,4.347\r
+       H644.458z"/>\r
+<path fill="#FFFFFF" d="M652.522,775.877c1.204-0.21,3.011-0.367,4.87-0.367c2.54,0,4.268,0.419,5.446,1.414\r
+       c0.969,0.812,1.519,2.043,1.519,3.535c0,2.278-1.545,3.823-3.194,4.425v0.079c1.257,0.471,2.016,1.701,2.461,3.403\r
+       c0.55,2.199,1.021,4.242,1.388,4.923h-3.325c-0.262-0.523-0.681-1.964-1.179-4.163c-0.497-2.305-1.335-3.037-3.168-3.09h-1.623\r
+       v7.253h-3.194V775.877z M655.717,783.68h1.911c2.174,0,3.535-1.152,3.535-2.906c0-1.938-1.361-2.828-3.456-2.828\r
+       c-1.021,0-1.676,0.078-1.99,0.157V783.68z"/>\r
+<path fill="#FFFFFF" d="M654.34,832h-35.68c-3.121,0-5.66-2.539-5.66-5.66v-19.68c0-3.121,2.539-5.66,5.66-5.66h35.68\r
+       c3.121,0,5.66,2.539,5.66,5.66v19.68C660,829.461,657.461,832,654.34,832z M618.66,804c-1.467,0-2.66,1.193-2.66,2.66v19.68\r
+       c0,1.467,1.193,2.66,2.66,2.66h35.68c1.467,0,2.66-1.193,2.66-2.66v-19.68c0-1.467-1.193-2.66-2.66-2.66H618.66z"/>\r
+<path fill="#FFFFFF" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.393,19.226,0.442,30.322\r
+       c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>\r
+<path fill="#FFFFFF" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322\r
+       c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>\r
+<path fill="#FFFFFF" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484c-7.017,9.952,8.394,19.226,0.442,30.322\r
+       c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>\r
+<text transform="matrix(1 0 0 1 605.627 793.2891)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="26.1844">REAR</text>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="3" stroke-miterlimit="10" d="M658.5,826.34\r
+       c0,2.298-1.862,4.16-4.16,4.16h-35.68c-2.298,0-4.16-1.862-4.16-4.16v-19.68c0-2.298,1.862-4.16,4.16-4.16h35.68\r
+       c2.298,0,4.16,1.862,4.16,4.16V826.34z"/>\r
+<path display="none" fill="#6DD436" d="M626.822,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.393,19.226,0.442,30.322c0.664,0,1.504,0,2.561,0C635.366,833.696,620.365,823.848,626.822,814.006z"/>\r
+<path display="none" fill="#6DD436" d="M636.807,814.006l3.49,0.505l-2.149-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C645.351,833.696,630.352,823.848,636.807,814.006z"/>\r
+<path display="none" fill="#6DD436" d="M646.793,814.006l3.49,0.505l-2.15-6.703l-7.024,5.386l3.361,0.484\r
+       c-7.017,9.952,8.394,19.226,0.442,30.322c0.665,0,1.505,0,2.562,0C655.337,833.696,640.337,823.848,646.793,814.006z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/drag_knob.svg b/css/user/green/images/hvac/drag_knob.svg
new file mode 100644 (file)
index 0000000..ea00f14
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="22px" height="22px" viewBox="92.589 507.285 22 22"\r
+        overflow="visible" enable-background="new 92.589 507.285 22 22" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<circle fill="#6DD436" stroke="#6DD436" stroke-width="0.5936" stroke-miterlimit="10" cx="103.502" cy="518.197" r="6.141"/>\r
+<circle fill="#6DD436" fill-opacity="0.45" cx="103.502" cy="518.197" r="10.912"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_bar_on.svg b/css/user/green/images/hvac/fan_bar_on.svg
new file mode 100644 (file)
index 0000000..17580b6
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="303px" height="94px" viewBox="362.629 633 303 94"\r
+        overflow="visible" enable-background="new 362.629 633 303 94" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect x="123.129" display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="275.129" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 283.4937 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>\r
+       </g>\r
+</g>\r
+<circle display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.5936" stroke-miterlimit="10" cx="494.93" cy="726.5" r="6.141"/>\r
+<circle display="none" fill="#6DD436" fill-opacity="0.45" cx="494.93" cy="726.5" r="10.912"/>\r
+<path display="none" fill="none" stroke="#00507F" stroke-miterlimit="10" d="M968.129,664.752\r
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-miterlimit="10" x1="667.129" y1="719.5" x2="363.129" y2="719.5"/>\r
+<line fill="#6DD436" stroke="#6DD436" stroke-width="3" stroke-miterlimit="10" x1="667.129" y1="726.5" x2="363.129" y2="726.5"/>\r
+<path fill="#6DD436" d="M362.629,703.5h29v-68.552c-9.608,0.396-19.279,0.849-29,1.366V703.5z"/>\r
+<path fill="#6DD436" d="M401.629,703.5h29v-69.834c-9.582,0.234-19.253,0.529-29,0.89V703.5z"/>\r
+<path fill="#6DD436" d="M440.629,703.5h28v-70.443c-9.225,0.067-18.564,0.196-28,0.386V703.5z"/>\r
+<path fill="#6DD436" d="M479.629,633.008V703.5h29v-70.351c-8.34-0.098-16.598-0.149-24.75-0.149\r
+       C482.468,633,481.047,633.005,479.629,633.008z"/>\r
+<path fill="#6DD436" d="M519.629,703.5h28v-69.553c-9.42-0.273-18.76-0.488-28-0.643V703.5z"/>\r
+<path fill="#6DD436" d="M558.629,703.5h29v-68.051c-9.73-0.447-19.404-0.835-29-1.159V703.5z"/>\r
+<path fill="#6DD436" d="M597.629,703.5h28v-66.005c-9.371-0.578-18.71-1.103-28-1.567V703.5z"/>\r
+<path fill="#6DD436" d="M636.629,703.5h29v-63.205c-9.684-0.759-19.356-1.46-29-2.099V703.5z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_control_ac_off.svg b/css/user/green/images/hvac/fan_control_ac_off.svg
new file mode 100644 (file)
index 0000000..ca595d1
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="112px" height="88px" viewBox="174 763 112 88" overflow="visible" enable-background="new 174 763 112 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<rect x="174.5" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>\r
+       </g>\r
+</g>\r
+<rect x="174.5" y="763.5" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>\r
+<g>\r
+       <g>\r
+               <path fill="#6DD436" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H212.333z\r
+                        M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898\r
+                       H218.028z"/>\r
+               <path fill="#6DD436" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>\r
+               <path fill="#6DD436" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885c-6.315,0-10.151-3.954-10.151-10.004\r
+                       c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892c-0.944-0.413-2.243-0.768-3.896-0.768\r
+                       c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>\r
+       </g>\r
+</g>\r
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="230" y1="765.6836" x2="230" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#63E6FF"/>\r
+</linearGradient>\r
+<rect x="174.5" y="763.5" display="none" fill="url(#SVGID_6_)" stroke="#6DD436" stroke-miterlimit="10" width="111" height="87"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <path display="none" fill="#FFFFFF" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637\r
+                       H212.333z M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719\r
+                       l-1.535,4.898H218.028z"/>\r
+               <path display="none" fill="#FFFFFF" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>\r
+               <path display="none" fill="#FFFFFF" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885\r
+                       c-6.315,0-10.151-3.954-10.151-10.004c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892\r
+                       c-0.944-0.413-2.243-0.768-3.896-0.768c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171\r
+                       c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>\r
+       </g>\r
+</g>\r
+<g display="none">\r
+       \r
+               <text transform="matrix(1 0 0 1 206.2534 816.5)" display="inline" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="29.5171">A/C</text>\r
+</g>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_control_ac_on.svg b/css/user/green/images/hvac/fan_control_ac_on.svg
new file mode 100644 (file)
index 0000000..3956313
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="112px" height="88px" viewBox="174 763 112 88" overflow="visible" enable-background="new 174 763 112 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<rect x="174.5" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>\r
+       </g>\r
+</g>\r
+<rect x="174.5" y="763.5" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="111" height="87"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <path display="none" fill="#6DD436" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637\r
+                       H212.333z M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719\r
+                       l-1.535,4.898H218.028z"/>\r
+               <path display="none" fill="#6DD436" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>\r
+               <path display="none" fill="#6DD436" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885\r
+                       c-6.315,0-10.151-3.954-10.151-10.004c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892\r
+                       c-0.944-0.413-2.243-0.768-3.896-0.768c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171\r
+                       c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>\r
+       </g>\r
+</g>\r
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="230" y1="765.6836" x2="230" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="174.5" y="763.5" fill="url(#SVGID_6_)" stroke="#6DD436" stroke-miterlimit="10" width="111" height="87"/>\r
+<g>\r
+       <g>\r
+               <path fill="#FFFFFF" d="M212.333,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H212.333z\r
+                        M218.028,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898\r
+                       H218.028z"/>\r
+               <path fill="#FFFFFF" d="M225.262,817.681l7.2-21.396H235l-7.201,21.396H225.262z"/>\r
+               <path fill="#FFFFFF" d="M251.321,815.91c-0.855,0.442-2.744,0.885-5.135,0.885c-6.315,0-10.151-3.954-10.151-10.004\r
+                       c0-6.552,4.544-10.506,10.624-10.506c2.391,0,4.102,0.502,4.84,0.886l-0.797,2.892c-0.944-0.413-2.243-0.768-3.896-0.768\r
+                       c-4.043,0-6.964,2.538-6.964,7.319c0,4.367,2.567,7.171,6.935,7.171c1.476,0,3.01-0.295,3.955-0.738L251.321,815.91z"/>\r
+       </g>\r
+</g>\r
+<g display="none">\r
+       \r
+               <text transform="matrix(1 0 0 1 206.2534 816.5)" display="inline" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="29.5171">A/C</text>\r
+</g>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_control_auto_off.svg b/css/user/green/images/hvac/fan_control_auto_off.svg
new file mode 100644 (file)
index 0000000..8a78291
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="111px" height="88px" viewBox="305 763 111 88" overflow="visible" enable-background="new 305 763 111 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<rect x="305.25" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>\r
+       </g>\r
+</g>\r
+<rect x="305.25" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<path fill="#6DD436" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H330.526z\r
+        M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898\r
+       H336.222z"/>\r
+<path fill="#6DD436" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695V796.61h3.63v11.361\r
+       c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>\r
+<path fill="#6DD436" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>\r
+<path fill="#6DD436" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122\r
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644\r
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289\r
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>\r
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="360.4995" y1="765.6836" x2="360.4995" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="305.5" y="763.5" display="none" fill="url(#SVGID_6_)" stroke="#6DD436" stroke-miterlimit="10" width="110" height="87"/>\r
+<path display="none" fill="#FFFFFF" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637\r
+       H330.526z M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719\r
+       l-1.535,4.898H336.222z"/>\r
+<path display="none" fill="#FFFFFF" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695\r
+       V796.61h3.63v11.361c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>\r
+<path display="none" fill="#FFFFFF" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>\r
+<path display="none" fill="#FFFFFF" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122\r
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644\r
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289\r
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>\r
+<text transform="matrix(1 0 0 1 324.4473 816.5)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="29.5171">AUTO</text>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_control_auto_on.svg b/css/user/green/images/hvac/fan_control_auto_on.svg
new file mode 100644 (file)
index 0000000..847bcca
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="111px" height="88px" viewBox="305 763 111 88" overflow="visible" enable-background="new 305 763 111 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<rect x="305.25" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>\r
+       </g>\r
+</g>\r
+<rect x="305.25" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<path display="none" fill="#6DD436" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637\r
+       H330.526z M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719\r
+       l-1.535,4.898H336.222z"/>\r
+<path display="none" fill="#6DD436" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695\r
+       V796.61h3.63v11.361c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>\r
+<path display="none" fill="#6DD436" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>\r
+<path display="none" fill="#6DD436" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122\r
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644\r
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289\r
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>\r
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="360.4995" y1="765.6836" x2="360.4995" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="305.5" y="763.5" fill="url(#SVGID_6_)" stroke="#6DD436" stroke-miterlimit="10" width="110" height="87"/>\r
+<path fill="#FFFFFF" d="M330.526,810.863l-1.711,5.637h-3.748l6.375-19.89h4.633l6.463,19.89h-3.896l-1.8-5.637H330.526z\r
+        M336.222,808.119l-1.564-4.898c-0.383-1.21-0.708-2.567-1.003-3.719h-0.059c-0.295,1.151-0.59,2.538-0.944,3.719l-1.535,4.898\r
+       H336.222z"/>\r
+<path fill="#FFFFFF" d="M347.971,796.61v11.598c0,3.895,1.623,5.695,4.073,5.695c2.626,0,4.19-1.801,4.19-5.695V796.61h3.63v11.361\r
+       c0,6.138-3.158,8.853-7.938,8.853c-4.604,0-7.584-2.567-7.584-8.823V796.61H347.971z"/>\r
+<path fill="#FFFFFF" d="M367.835,799.649h-5.666v-3.039h15.021v3.039h-5.725V816.5h-3.63V799.649z"/>\r
+<path fill="#FFFFFF" d="M396.346,806.349c0,6.669-4.043,10.476-9.532,10.476c-5.606,0-9.147-4.278-9.147-10.122\r
+       c0-6.108,3.836-10.417,9.443-10.417C392.922,796.285,396.346,800.683,396.346,806.349z M381.502,806.644\r
+       c0,4.043,2.036,7.26,5.518,7.26c3.513,0,5.49-3.246,5.49-7.407c0-3.748-1.859-7.289-5.49-7.289\r
+       C383.42,799.207,381.502,802.542,381.502,806.644z"/>\r
+<text transform="matrix(1 0 0 1 324.4473 816.5)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="29.5171">AUTO</text>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_control_circ_off.svg b/css/user/green/images/hvac/fan_control_circ_off.svg
new file mode 100644 (file)
index 0000000..11a205e
--- /dev/null
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="112px" height="88px" viewBox="435 763 112 88" overflow="visible" enable-background="new 435 763 112 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="436" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<rect x="436" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<path fill="#6DD436" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267\r
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55\r
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606\r
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307\r
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022\r
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311\r
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268\r
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z\r
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915\r
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153\r
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515\r
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908\r
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672\r
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651\r
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477\r
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419\r
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>\r
+<path fill="#6DD436" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112\r
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="491" y1="765.6836" x2="491" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="435.5" y="763.5" display="none" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="111" height="87"/>\r
+<path display="none" fill="#FFFFFF" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267\r
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55\r
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606\r
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307\r
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022\r
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311\r
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268\r
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z\r
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915\r
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153\r
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515\r
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908\r
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672\r
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651\r
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477\r
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419\r
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>\r
+<path display="none" fill="#FFFFFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112\r
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="2" stroke-miterlimit="10" d="M532,808.908v-8.2\r
+       c0,0,0.497-1.502-0.987-2.283c-2.894-3.552-5.243-7.45-5.243-7.45s0.663-1.12,0.029-1.553c-0.634-0.434-9.878-1.422-9.878-1.422\r
+       h-25.943c-3.783,0-6.69,1.356-7.506,2.224c-0.816,0.867-10.616,8.302-10.616,8.302s-16.104,1.728-18.255,2.766\r
+       c-2.152,1.04-2.896,1.86-3.34,3.332c-0.445,1.474-1.115,2.401-1.337,4.308c-0.223,1.906-0.148,7.267,1.187,7.96\r
+       c1.336,0.692,2.746,1.118,2.895,1.64c0.148,0.52,1.631,0.775,2.076,0.775c0.021,0,0.074-0.007,0.156-0.015\r
+       c0.824,3.188,3.357,5.511,6.356,5.511c3.494,0,6.354-2.351,6.615-6.354c1.175-0.152,1.934,0.552,1.934,0.552h35.02h2.332\r
+       c0,0-0.003-0.743-0.003-0.713c0,4.284,2.972,7.355,6.64,7.355c3.669,0,6.642-3.674,6.642-7.957c0-0.019-0.002-0.135-0.002-0.151\r
+       c1.686-0.15,3.226-0.454,4.32-0.865c4.378-1.646,7.909-3.257,7.909-3.257v-3.922L532,808.908z"/>\r
+<path display="none" fill="#6DD436" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112\r
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_control_circ_on.svg b/css/user/green/images/hvac/fan_control_circ_on.svg
new file mode 100644 (file)
index 0000000..0c5ae77
--- /dev/null
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="112px" height="88px" viewBox="435 763 112 88" overflow="visible" enable-background="new 435 763 112 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="436" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<rect x="436" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" width="110.5" height="86.564"/>\r
+<path display="none" fill="#6DD436" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267\r
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55\r
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606\r
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307\r
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022\r
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311\r
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268\r
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z\r
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915\r
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153\r
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515\r
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908\r
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672\r
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651\r
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477\r
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419\r
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>\r
+<path display="none" fill="#6DD436" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112\r
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="491" y1="765.6836" x2="491" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="435.5" y="763.5" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="111" height="87"/>\r
+<path fill="#FFFFFF" d="M514.131,826.643c-3.802,0-6.805-2.762-7.491-6.643h-36.89l-0.288-0.267\r
+       c-0.001-0.001-0.14-0.118-0.378-0.207c-0.67,3.742-3.627,6.275-7.49,6.275c-3.139,0-5.975-2.248-7.111-5.55\r
+       c-0.756-0.104-2.004-0.408-2.382-1.285c-0.201-0.149-0.754-0.397-1.168-0.582c-0.407-0.183-0.849-0.381-1.282-0.606\r
+       c-2.414-1.254-1.729-8.888-1.72-8.964c0.161-1.382,0.531-2.293,0.89-3.174c0.177-0.433,0.343-0.843,0.483-1.307\r
+       c0.549-1.818,1.523-2.813,3.861-3.943c2.149-1.037,15.707-2.548,18.307-2.83c3.779-2.869,9.729-7.446,10.271-8.022\r
+       c1.157-1.23,4.437-2.538,8.234-2.538l26.05,0.006c9.494,1.015,10.105,1.434,10.336,1.591c0.786,0.536,0.847,1.467,0.54,2.311\r
+       c0.687,1.097,2.569,4.021,4.767,6.741c1.461,0.885,1.531,2.373,1.33,3.196v7.488l1,0.582v5.14l-0.585,0.268\r
+       c-0.036,0.016-3.613,1.644-7.973,3.282c-0.968,0.364-2.258,0.652-3.696,0.831C521.42,823.025,518.129,826.643,514.131,826.643z\r
+        M507.505,817.287l0.982,0.014l0.004,1.069c0.034,3.573,2.571,6.272,5.753,6.272c3.059,0,5.756-3.186,5.756-6.957v-0.915\r
+       l0.795-0.232c1.619-0.145,3.003-0.431,4.001-0.806c3.269-1.229,6.028-2.448,7.204-2.969v-2.698l-1-0.582v-8.937l0.051-0.153\r
+       c0.059-0.202,0.137-0.747-0.504-1.084l-0.181-0.095l-0.129-0.158c-2.904-3.565-5.227-7.404-5.324-7.565l-0.309-0.512l0.305-0.515\r
+       c0.04-0.07,0.08-0.161,0.111-0.246c-1.274-0.287-5.417-0.818-9.153-1.219h-25.89c-3.521,0-6.151,1.243-6.777,1.908\r
+       c-0.832,0.884-9.093,7.164-10.74,8.414l-0.222,0.168l-0.276,0.029c-6.159,0.661-16.474,1.971-17.927,2.672\r
+       c-1.999,0.966-2.484,1.62-2.817,2.721c-0.167,0.554-0.359,1.026-0.545,1.482c-0.322,0.792-0.626,1.539-0.756,2.651\r
+       c-0.272,2.331,0.044,6.406,0.688,6.979c0.364,0.186,0.771,0.367,1.146,0.535c1.043,0.467,1.824,0.817,2.134,1.477\r
+       c0.271,0.135,0.93,0.27,1.196,0.27l0.85-0.081l0.274,0.816c0.726,2.803,2.941,4.761,5.389,4.761c3.197,0,5.402-2.127,5.617-5.419\r
+       l0.054-0.82l0.815-0.106c1.108-0.142,1.945,0.255,2.391,0.544h36.02l-0.003-0.64L507.505,817.287z"/>\r
+<path fill="#FFFFFF" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112\r
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="2" stroke-miterlimit="10" d="M532,808.908v-8.2\r
+       c0,0,0.497-1.502-0.987-2.283c-2.894-3.552-5.243-7.45-5.243-7.45s0.663-1.12,0.029-1.553c-0.634-0.434-9.878-1.422-9.878-1.422\r
+       h-25.943c-3.783,0-6.69,1.356-7.506,2.224c-0.816,0.867-10.616,8.302-10.616,8.302s-16.104,1.728-18.255,2.766\r
+       c-2.152,1.04-2.896,1.86-3.34,3.332c-0.445,1.474-1.115,2.401-1.337,4.308c-0.223,1.906-0.148,7.267,1.187,7.96\r
+       c1.336,0.692,2.746,1.118,2.895,1.64c0.148,0.52,1.631,0.775,2.076,0.775c0.021,0,0.074-0.007,0.156-0.015\r
+       c0.824,3.188,3.357,5.511,6.356,5.511c3.494,0,6.354-2.351,6.615-6.354c1.175-0.152,1.934,0.552,1.934,0.552h35.02h2.332\r
+       c0,0-0.003-0.743-0.003-0.713c0,4.284,2.972,7.355,6.64,7.355c3.669,0,6.642-3.674,6.642-7.957c0-0.019-0.002-0.135-0.002-0.151\r
+       c1.686-0.15,3.226-0.454,4.32-0.865c4.378-1.646,7.909-3.257,7.909-3.257v-3.922L532,808.908z"/>\r
+<path display="none" fill="#6DD436" d="M516.809,806.604L507,799.77V804h-15.43c-2.553,0-3.57-1.224-3.57-2v-6h-5v6.131l0.354,0.112\r
+       c0.197,2.366,2.441,6.757,8.217,6.757H507v4.439L516.809,806.604z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_dir_down_off.svg b/css/user/green/images/hvac/fan_dir_down_off.svg
new file mode 100644 (file)
index 0000000..d97a48b
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="97px" viewBox="146.129 642.49 123 97"\r
+        overflow="visible" enable-background="new 146.129 642.49 123 97" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <circle fill="#6DD436" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#6DD436" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon fill="#6DD436" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>\r
+       </g>\r
+</g>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="207.6294" y1="643.626" x2="207.6294" y2="737.4362">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<path display="none" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" d="M268.629,643.039V738.5h-122v-80.76\r
+       C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g>\r
+                       <circle fill="#FFFFFF" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#FFFFFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon fill="#FFFFFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>\r
+       </g>\r
+</g>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle fill="#6DD436" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#6DD436" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon display="none" fill="#6DD436" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 \r
+                       172.129,682             "/>\r
+       </g>\r
+</g>\r
+<path display="none" fill="none" stroke="#007F50" stroke-miterlimit="10" d="M968.129,664.752\r
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_dir_down_on.svg b/css/user/green/images/hvac/fan_dir_down_on.svg
new file mode 100644 (file)
index 0000000..8d4df22
--- /dev/null
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="97px" viewBox="146.129 642.49 123 97"\r
+        overflow="visible" enable-background="new 146.129 642.49 123 97" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect x="123.129" display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle fill="#6DD436" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#6DD436" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon display="none" fill="#6DD436" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 \r
+                       172.129,682             "/>\r
+       </g>\r
+</g>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="207.6294" y1="643.626" x2="207.6294" y2="737.4362">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<path fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" d="M268.629,643.039V738.5h-122v-80.76\r
+       C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <circle fill="#FFFFFF" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#FFFFFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon fill="#FFFFFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>\r
+       </g>\r
+</g>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle fill="#6DD436" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#6DD436" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon display="none" fill="#6DD436" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 \r
+                       172.129,682             "/>\r
+       </g>\r
+</g>\r
+<path display="none" fill="none" stroke="#007F50" stroke-miterlimit="10" d="M968.129,664.752\r
+       C828.971,627.465,638.581,610,484.129,610s-344.841,17.465-484,54.752"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_dir_right_off.svg b/css/user/green/images/hvac/fan_dir_right_off.svg
new file mode 100644 (file)
index 0000000..c31332a
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 763 123 88" overflow="visible" enable-background="new 23 763 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="24" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="24" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <circle fill="#6DD436" cx="113.861" cy="789.944" r="8.235"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056\r
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon fill="#6DD436" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="765.6836" x2="84.5" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="23.5" y="763.5" display="none" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g>\r
+                       <circle fill="#FFFFFF" cx="113.861" cy="789.944" r="8.235"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#FFFFFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056\r
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#FFFFFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle display="inline" fill="#6DD436" cx="113.861" cy="789.944" r="8.235"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053\r
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056\r
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#6DD436" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_dir_right_on.svg b/css/user/green/images/hvac/fan_dir_right_on.svg
new file mode 100644 (file)
index 0000000..1577cc6
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 763 123 88" overflow="visible" enable-background="new 23 763 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="24" y="763.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="24" y="763.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle display="inline" fill="#6DD436" cx="113.861" cy="789.944" r="8.235"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053\r
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056\r
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#6DD436" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="765.6836" x2="84.5" y2="849.0061">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65D02D"/>\r
+</linearGradient>\r
+<rect x="23.5" y="763.5" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <circle fill="#FFFFFF" cx="113.861" cy="789.944" r="8.235"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#FFFFFF" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056\r
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon fill="#FFFFFF" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle display="inline" fill="#6DD436" cx="113.861" cy="789.944" r="8.235"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M116.139,801.373l-1.035-0.57c-2.861-1.577-6.458-0.535-8.035,2.323l-6.644,12.053\r
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.874-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.019l8.852-16.056\r
+                               C120.039,806.548,118.999,802.951,116.139,801.373z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#6DD436" points="56,812.11 73.699,797.85 56,783.59 56,790 40,790 40,805 56,805 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_dir_up_off.svg b/css/user/green/images/hvac/fan_dir_up_off.svg
new file mode 100644 (file)
index 0000000..86d92e3
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 876 123 88" overflow="visible" enable-background="new 23 876 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="24" y="876.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="24" y="876.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <circle fill="#6DD436" cx="113.861" cy="901.636" r="8.235"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055\r
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon fill="#6DD436" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="877.6396" x2="84.5" y2="962.9438">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="23.5" y="876.5" display="none" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g>\r
+                       <circle fill="#FFFFFF" cx="113.861" cy="901.636" r="8.235"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#FFFFFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055\r
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#FFFFFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle display="inline" fill="#6DD436" cx="113.861" cy="901.636" r="8.235"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053\r
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055\r
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#6DD436" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/fan_dir_up_on.svg b/css/user/green/images/hvac/fan_dir_up_on.svg
new file mode 100644 (file)
index 0000000..4fcfe1d
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="123px" height="88px" viewBox="23 876 123 88" overflow="visible" enable-background="new 23 876 123 88"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="24" y="876.898" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<rect x="24" y="876.898" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" width="122" height="86.564"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle display="inline" fill="#6DD436" cx="113.861" cy="901.636" r="8.235"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053\r
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055\r
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#6DD436" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="84.5" y1="877.6396" x2="84.5" y2="962.9438">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="23.5" y="876.5" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="122" height="87"/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <circle fill="#FFFFFF" cx="113.861" cy="901.636" r="8.235"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#FFFFFF" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055\r
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon fill="#FFFFFF" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle display="inline" fill="#6DD436" cx="113.861" cy="901.636" r="8.235"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M116.139,913.065l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053\r
+                               l-13.158-4.315c-3.009-0.986-6.571,0.181-9.142,3.181l0.004,0.002c-0.451,0.41-0.877,0.873-1.263,1.396l-10.894,14.743\r
+                               c-1.678,2.271-1.606,5.139,0.098,6.486l0.618,0.486c1.706,1.349,4.512,0.756,6.334-1.401l11.504-13.622l15.161,5.822\r
+                               c1.32,0.507,2.731,0.665,4.069,0.525c2.312,0.265,4.661-0.854,5.854-3.02l8.852-16.055\r
+                               C120.039,918.24,118.999,914.644,116.139,913.065z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<polygon display="none" fill="#6DD436" points="70.738,911 56.478,893.301 42.218,911 49,911 49,927 64,927 64,911 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/hazard_blink.svg b/css/user/green/images/hvac/hazard_blink.svg
new file mode 100644 (file)
index 0000000..c4537ba
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+]>
+<svg version="1.1"
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
+        x="0px" y="0px" width="416px" height="81px" viewBox="152 17 416 81" overflow="visible" enable-background="new 152 17 416 81"
+        xml:space="preserve">
+<defs>
+</defs>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">
+       <stop  offset="0" style="stop-color:#042417"/>
+       <stop  offset="1" style="stop-color:#000000"/>
+</linearGradient>
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>
+<rect x="152.053" y="17.5" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.6866" stroke-miterlimit="10" stroke-opacity="0.64" width="415.947" height="79.5"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="359.9995" y1="17.9375" x2="359.9995" y2="96.6573">
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>
+       <stop  offset="1" style="stop-color:#65d02D"/>
+</linearGradient>
+<rect x="152.5" y="17.5" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="415" height="80"/>
+<path fill="none" stroke="#FF382D" stroke-width="6" stroke-miterlimit="10" d="M388.906,87h-57.737c-1.891,0-3.421-1.535-4.2-2.883
+       s-0.683-3.441,0.263-5.079l28.869-50.193c0.945-1.638,2.38-2.671,3.937-2.671s2.992,0.892,3.937,2.529l28.869,49.978
+       c0.945,1.637,1.041,4.1,0.263,5.447C392.327,85.478,390.798,87,388.906,87z"/>
+<polygon fill="none" stroke="#FF382D" stroke-width="6" stroke-miterlimit="10" points="338.375,78 359.958,40.616 381.541,78 "/>
+</svg>
diff --git a/css/user/green/images/hvac/hazard_off.svg b/css/user/green/images/hvac/hazard_off.svg
new file mode 100644 (file)
index 0000000..7b3a2f1
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="416px" height="81px" viewBox="152 17 416 81" overflow="visible" enable-background="new 152 17 416 81"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="152.053" y="17.5" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.6866" stroke-miterlimit="10" stroke-opacity="0.64" width="415.947" height="79.5"/>\r
+<path fill="none" stroke="#6DD436" stroke-width="6" stroke-miterlimit="10" d="M388.906,87h-57.737c-1.891,0-3.421-1.535-4.2-2.883\r
+       s-0.683-3.441,0.263-5.079l28.869-50.193c0.945-1.638,2.38-2.671,3.937-2.671s2.992,0.892,3.937,2.529l28.869,49.978\r
+       c0.945,1.637,1.041,4.1,0.263,5.447C392.327,85.478,390.798,87,388.906,87z"/>\r
+<polygon fill="none" stroke="#6DD436" stroke-width="6" stroke-miterlimit="10" points="338.375,78 359.958,40.616 381.541,78 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/hazard_on.svg b/css/user/green/images/hvac/hazard_on.svg
new file mode 100644 (file)
index 0000000..9108104
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="416px" height="81px" viewBox="152 17 416 81" overflow="visible" enable-background="new 152 17 416 81"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="152.053" y="17.5" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.6866" stroke-miterlimit="10" stroke-opacity="0.64" width="415.947" height="79.5"/>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="359.9995" y1="17.9375" x2="359.9995" y2="96.6573">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#65d02D"/>\r
+</linearGradient>\r
+<rect x="152.5" y="17.5" fill="url(#SVGID_3_)" stroke="#6DD436" stroke-miterlimit="10" width="415" height="80"/>\r
+<path fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" d="M388.906,87h-57.737c-1.891,0-3.421-1.535-4.2-2.883\r
+       s-0.683-3.441,0.263-5.079l28.869-50.193c0.945-1.638,2.38-2.671,3.937-2.671s2.992,0.892,3.937,2.529l28.869,49.978\r
+       c0.945,1.637,1.041,4.1,0.263,5.447C392.327,85.478,390.798,87,388.906,87z"/>\r
+<polygon fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" points="338.375,78 359.958,40.616 381.541,78 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/left_heat_seat_off.svg b/css/user/green/images/hvac/left_heat_seat_off.svg
new file mode 100644 (file)
index 0000000..abbc56a
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="159px" height="129px" viewBox="151 175 159 129"\r
+        overflow="visible" enable-background="new 151 175 159 129" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="151.573" y="175.708" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-miterlimit="10" stroke-opacity="0.64" width="157.956" height="127.534"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M214.667,255.953l-51.053-3.023c-3.593-0.142-5.474,3.107-4.104,7.17l2.857,10.824c1.528,4.532,5.986,9.041,9.909,9.041h62.589\r
+       c5.253,0,6.745-6.561,6.745-11.152c-0.12-25.828,4.735-52.385,14.563-78.246c0.954-2.52-0.953-5.045-4.298-5.702\r
+       c-1.817-0.356-3.633-0.713-5.449-1.069c-3.336-0.655-7.05,0.767-8.259,3.236c-11.038,22.564-18.271,43.783-21.696,66.559\r
+       C216.47,253.589,215.807,256.021,214.667,255.953z"/>\r
+<path fill="#6DD436" d="M181.5,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0\r
+       C171.316,253,191.684,275,181.5,298z"/>\r
+<polygon fill="#6DD436" points="173.511,231.288 181.012,223.451 184.048,233.866 "/>\r
+<path fill="#6DD436" d="M194.359,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0\r
+       C184.175,253,204.543,275,194.359,298z"/>\r
+<polygon fill="#6DD436" points="186.37,231.288 193.871,223.451 196.907,233.866 "/>\r
+<path fill="#6DD436" d="M207.86,298c-18.859,0,15.646,0-3.214,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.214,0\r
+       C197.676,253,218.045,275,207.86,298z"/>\r
+<polygon fill="#6DD436" points="199.872,231.288 207.373,223.451 210.409,233.866 "/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <path opacity="0.29" fill="#6DD436" d="M302,219v-22h-40.44c-2.568,7-4.733,14-6.516,22H302z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M302.5,218.5v-22h-40.94\r
+                               c-2.568,8-4.733,15-6.516,22H302.5z"/>\r
+               </g>\r
+               <g>\r
+                       <path opacity="0.29" fill="#6DD436" d="M302,244v-21h-47.87c-1.63,7-2.88,14-3.73,21H302z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M302.5,244.5v-22h-48.37c-1.63,7-2.88,15-3.73,22\r
+                               H302.5z"/>\r
+               </g>\r
+               <g>\r
+                       <path opacity="0.29" fill="#6DD436" d="M248.987,270H302v-22h-52.009c-0.671,7-1.003,13.871-0.971,20.759\r
+                               C249.02,269.155,249.002,270,248.987,270z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M248.987,270.5H302.5v-22h-52.509\r
+                               c-0.671,7-1.003,13.871-0.971,20.759C249.02,269.655,249.002,269.5,248.987,270.5z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/left_heat_seat_on.svg b/css/user/green/images/hvac/left_heat_seat_on.svg
new file mode 100644 (file)
index 0000000..a472b0b
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="159px" height="129px" viewBox="151 175 159 129"\r
+        overflow="visible" enable-background="new 151 175 159 129" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<rect x="151.573" y="175.708" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-miterlimit="10" stroke-opacity="0.64" width="157.956" height="127.534"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M214.667,255.953l-51.053-3.023c-3.593-0.142-5.474,3.107-4.104,7.17l2.857,10.824c1.528,4.532,5.986,9.041,9.909,9.041h62.589\r
+       c5.253,0,6.745-6.561,6.745-11.152c-0.12-25.828,4.735-52.385,14.563-78.246c0.954-2.52-0.953-5.045-4.298-5.702\r
+       c-1.817-0.356-3.633-0.713-5.449-1.069c-3.336-0.655-7.05,0.767-8.259,3.236c-11.038,22.564-18.271,43.783-21.696,66.559\r
+       C216.47,253.589,215.807,256.021,214.667,255.953z"/>\r
+<path fill="#6DD436" d="M181.5,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0\r
+       C171.316,253,191.684,275,181.5,298z"/>\r
+<polygon fill="#6DD436" points="173.511,231.288 181.012,223.451 184.048,233.866 "/>\r
+<path fill="#6DD436" d="M194.359,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0\r
+       C184.175,253,204.543,275,194.359,298z"/>\r
+<polygon fill="#6DD436" points="186.37,231.288 193.871,223.451 196.907,233.866 "/>\r
+<path fill="#6DD436" d="M207.86,298c-18.859,0,15.646,0-3.214,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.214,0\r
+       C197.676,253,218.045,275,207.86,298z"/>\r
+<polygon fill="#6DD436" points="199.872,231.288 207.373,223.451 210.409,233.866 "/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M302,219v-22h-40.44c-2.568,7-4.733,14-6.516,22H302z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M302.5,218.5v-22h-40.94\r
+                               c-2.568,8-4.733,15-6.516,22H302.5z"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M302,244v-21h-47.87c-1.63,7-2.88,14-3.73,21H302z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M302.5,244.5v-22h-48.37c-1.63,7-2.88,15-3.73,22\r
+                               H302.5z"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M248.987,270H302v-22h-52.009c-0.671,7-1.003,13.871-0.971,20.759\r
+                               C249.02,269.155,249.002,270,248.987,270z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M248.987,270.5H302.5v-22h-52.509\r
+                               c-0.671,7-1.003,13.871-0.971,20.759C249.02,269.655,249.002,269.5,248.987,270.5z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/left_number_bg.svg b/css/user/green/images/hvac/left_number_bg.svg
new file mode 100644 (file)
index 0000000..ae74373
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="158px" height="231px" viewBox="152 346 158 231"\r
+        overflow="visible" enable-background="new 152 346 158 231" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<polygon fill="#6DD436" fill-opacity="0.29" points="309.918,435.516 309.918,345.813 152.353,345.813 152.353,577.48 \r
+       309.918,577.48 309.918,486.998 284.178,461.257 "/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="152" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 160.3643 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+               <text transform="matrix(1 0 0 1 160.3643 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>\r
+       </g>\r
+</g>\r
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="231" y1="349.6602" x2="231" y2="574.0174">\r
+       <stop  offset="0" style="stop-color:#2175AD"/>\r
+       <stop  offset="0.2822" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="0.7055" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="1" style="stop-color:#2175AD"/>\r
+</linearGradient>\r
+<polygon display="none" fill="url(#SVGID_6_)" stroke="#6DD436" stroke-miterlimit="10" points="309.5,435.516 309.5,345.5 \r
+       152.5,345.5 152.5,577.5 309.5,577.5 309.5,486.998 283.759,461.257 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/left_number_cover.svg b/css/user/green/images/hvac/left_number_cover.svg
new file mode 100644 (file)
index 0000000..c53641c
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="158px" height="233px" viewBox="152 345 158 233"\r
+        overflow="visible" enable-background="new 152 345 158 233" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="231" y1="349.6602" x2="231" y2="574.0174">\r
+       <stop  offset="0" style="stop-color:#64CE2C"/>\r
+       <stop  offset="0.2822" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="0.7055" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="1" style="stop-color:#64CE2C"/>\r
+</linearGradient>\r
+<polygon fill="url(#SVGID_2_)" stroke="#6DD436" stroke-miterlimit="10" points="309.5,435.516 309.5,345.5 152.5,345.5 \r
+       152.5,577.5 309.5,577.5 309.5,486.998 283.759,461.257 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/right_heat_seat_off.svg b/css/user/green/images/hvac/right_heat_seat_off.svg
new file mode 100644 (file)
index 0000000..a1443ec
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="159px" height="129px" viewBox="410 175 159 129"\r
+        overflow="visible" enable-background="new 410 175 159 129" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+       </g>\r
+</g>\r
+<rect x="410.472" y="175.708" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-miterlimit="10" stroke-opacity="0.64" width="157.955" height="127.534"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M505.333,255.953l51.054-3.023c3.593-0.142,5.475,3.107,4.104,7.17l-2.858,10.824c-1.527,4.532-5.985,9.041-9.908,9.041h-62.589\r
+       c-5.254,0-6.745-6.561-6.745-11.152c0.12-25.828-4.735-52.385-14.563-78.246c-0.953-2.52,0.953-5.045,4.299-5.702\r
+       c1.817-0.356,3.634-0.713,5.448-1.069c3.337-0.655,7.051,0.767,8.26,3.236c11.037,22.564,18.271,43.783,21.695,66.559\r
+       C503.529,253.589,504.193,256.021,505.333,255.953z"/>\r
+<path fill="#6DD436" d="M538.5,298c18.86,0-15.645,0,3.215,0c-10.184-23,10.184-45,0-67c-18.859,0,15.646,0-3.215,0\r
+       C548.685,253,528.316,275,538.5,298z"/>\r
+<polygon fill="#6DD436" points="546.489,231.288 538.988,223.451 535.952,233.866 "/>\r
+<path fill="#6DD436" d="M525.642,298c18.859,0-15.646,0,3.214,0c-10.184-23,10.186-45,0-67c-18.86,0,15.646,0-3.214,0\r
+       C535.825,253,515.457,275,525.642,298z"/>\r
+<polygon fill="#6DD436" points="533.63,231.288 526.129,223.451 523.093,233.866 "/>\r
+<path fill="#6DD436" d="M512.14,298c18.86,0-15.646,0,3.214,0c-10.184-23,10.185-45,0-67c-18.859,0,15.646,0-3.214,0\r
+       C522.323,253,501.955,275,512.14,298z"/>\r
+<polygon fill="#6DD436" points="520.128,231.288 512.627,223.451 509.592,233.866 "/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M417.882,218.609v-21.841h40.559c2.568,7.243,4.733,14.529,6.516,21.841H417.882z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M417.882,244.35v-21.841h47.987c1.63,7.263,2.881,14.548,3.73,21.841H417.882z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M471.014,270.091h-53.132V248.25h52.128c0.67,6.894,1.002,13.792,0.971,20.679C470.98,269.325,470.998,269.707,471.014,270.091z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/right_heat_seat_on.svg b/css/user/green/images/hvac/right_heat_seat_on.svg
new file mode 100644 (file)
index 0000000..097273e
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="159px" height="129px" viewBox="410 175 159 129"\r
+        overflow="visible" enable-background="new 410 175 159 129" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.891">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+       </g>\r
+</g>\r
+<rect x="410.472" y="175.708" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-miterlimit="10" stroke-opacity="0.64" width="157.955" height="127.534"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M505.333,255.953l51.054-3.023c3.593-0.142,5.475,3.107,4.104,7.17l-2.858,10.824c-1.527,4.532-5.985,9.041-9.908,9.041h-62.589\r
+       c-5.254,0-6.745-6.561-6.745-11.152c0.12-25.828-4.735-52.385-14.563-78.246c-0.953-2.52,0.953-5.045,4.299-5.702\r
+       c1.817-0.356,3.634-0.713,5.448-1.069c3.337-0.655,7.051,0.767,8.26,3.236c11.037,22.564,18.271,43.783,21.695,66.559\r
+       C503.529,253.589,504.193,256.021,505.333,255.953z"/>\r
+<path fill="#6DD436" d="M538.5,298c18.86,0-15.645,0,3.215,0c-10.184-23,10.184-45,0-67c-18.859,0,15.646,0-3.215,0\r
+       C548.685,253,528.316,275,538.5,298z"/>\r
+<polygon fill="#6DD436" points="546.489,231.288 538.988,223.451 535.952,233.866 "/>\r
+<path fill="#6DD436" d="M525.642,298c18.859,0-15.646,0,3.214,0c-10.184-23,10.186-45,0-67c-18.86,0,15.646,0-3.214,0\r
+       C535.825,253,515.457,275,525.642,298z"/>\r
+<polygon fill="#6DD436" points="533.63,231.288 526.129,223.451 523.093,233.866 "/>\r
+<path fill="#6DD436" d="M512.14,298c18.86,0-15.646,0,3.214,0c-10.184-23,10.185-45,0-67c-18.859,0,15.646,0-3.214,0\r
+       C522.323,253,501.955,275,512.14,298z"/>\r
+<polygon fill="#6DD436" points="520.128,231.288 512.627,223.451 509.592,233.866 "/>\r
+<path fill="#6DD436" stroke="#6DD436" stroke-width="0.7906" stroke-miterlimit="10" stroke-opacity="0.64" d="M417.882,218.609\r
+       v-21.841h40.559c2.568,7.243,4.733,14.529,6.516,21.841H417.882z"/>\r
+<path fill="#6DD436" stroke="#6DD436" stroke-width="0.7906" stroke-miterlimit="10" stroke-opacity="0.64" d="M417.882,244.35\r
+       v-21.841h47.987c1.63,7.263,2.881,14.548,3.73,21.841H417.882z"/>\r
+<path fill="#6DD436" stroke="#6DD436" stroke-width="0.7906" stroke-miterlimit="10" stroke-opacity="0.64" d="M471.014,270.091\r
+       h-53.132V248.25h52.128c0.67,6.894,1.002,13.792,0.971,20.679C470.98,269.325,470.998,269.707,471.014,270.091z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/right_number_bg.svg b/css/user/green/images/hvac/right_number_bg.svg
new file mode 100644 (file)
index 0000000..7130f77
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="159px" height="232px" viewBox="410 345.813 159 232"\r
+        overflow="visible" enable-background="new 410 345.813 159 232" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<polygon fill="#6DD436" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       410.861,435.516 410.861,345.813 568.427,345.813 568.427,577.48 410.861,577.48 410.861,486.998 436.603,461.257 "/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+       </g>\r
+</g>\r
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="229.4995" y1="349.6606" x2="229.4995" y2="574.0165" gradientTransform="matrix(-1 0 0 1 719 0)">\r
+       <stop  offset="0" style="stop-color:#64CE2C"/>\r
+       <stop  offset="0.2822" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="0.7055" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="1" style="stop-color:#64CE2C"/>\r
+</linearGradient>\r
+<polygon display="none" fill="url(#SVGID_6_)" stroke="#6DD436" stroke-miterlimit="10" points="410.5,435.516 410.5,345.5 \r
+       568.5,345.5 568.5,577.5 410.5,577.5 410.5,486.998 436.241,461.257 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/right_number_cover.svg b/css/user/green/images/hvac/right_number_cover.svg
new file mode 100644 (file)
index 0000000..a906ade
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="159px" height="233px" viewBox="410 345 159 233"\r
+        overflow="visible" enable-background="new 410 345 159 233" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_3_)" width="720" height="1001"/>\r
+<polygon display="none" fill="#6DD436" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       410.861,435.516 410.861,345.813 568.427,345.813 568.427,577.48 410.861,577.48 410.861,486.998 436.603,461.257 "/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="410" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_4_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_4_)">\r
+               <text transform="matrix(1 0 0 1 427.5938 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 427.5938 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+       </g>\r
+</g>\r
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="229.4995" y1="349.6606" x2="229.4995" y2="574.0165" gradientTransform="matrix(-1 0 0 1 719 0)">\r
+       <stop  offset="0" style="stop-color:#64CE2C"/>\r
+       <stop  offset="0.2822" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="0.7055" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="1" style="stop-color:#64CE2C"/>\r
+</linearGradient>\r
+<polygon fill="url(#SVGID_6_)" stroke="#6DD436" stroke-miterlimit="10" points="410.5,435.516 410.5,345.5 568.5,345.5 \r
+       568.5,577.5 410.5,577.5 410.5,486.998 436.241,461.257 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/static_parts_bg.svg b/css/user/green/images/hvac/static_parts_bg.svg
new file mode 100644 (file)
index 0000000..441f8d4
--- /dev/null
@@ -0,0 +1,471 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="720px" height="601px" viewBox="123.129 125.388 720 601"\r
+        overflow="visible" enable-background="new 123.129 125.388 720 601" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="483.1299" y1="946" x2="483.1299" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect x="123.129" display="none" fill="url(#SVGID_4_)" width="720" height="1001"/>\r
+<polygon display="none" fill="#6DD436" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       533.991,435.516 533.991,345.813 691.556,345.813 691.556,577.48 533.991,577.48 533.991,486.998 559.732,461.257 "/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<polygon display="none" fill="#6DD436" fill-opacity="0.29" stroke="#FFFFFF" stroke-width="1.3481" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       433.048,435.516 433.048,345.813 275.482,345.813 275.482,577.48 433.048,577.48 433.048,486.998 407.307,461.257 "/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_3_" x="275.129" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_6_" display="inline">\r
+               <use xlink:href="#SVGID_3_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_6_)">\r
+               <text transform="matrix(1 0 0 1 283.4937 784.9795)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 888.7236)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 689.0361)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 591.3809)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 496.998)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+               <text transform="matrix(1 0 0 1 283.4937 403.3945)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">16°</text>\r
+       </g>\r
+</g>\r
+<line display="none" fill="none" stroke="#007F50" stroke-miterlimit="10" x1="483.629" y1="98" x2="483.629" y2="610"/>\r
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="354.1294" y1="349.6602" x2="354.1294" y2="574.0174">\r
+       <stop  offset="0" style="stop-color:#64CE2C"/>\r
+       <stop  offset="0.2822" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="0.7055" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="1" style="stop-color:#64CE2C"/>\r
+</linearGradient>\r
+<polygon display="none" fill="url(#SVGID_7_)" stroke="#6DD436" stroke-miterlimit="10" points="432.629,435.516 432.629,345.5 \r
+       275.629,345.5 275.629,577.5 432.629,577.5 432.629,486.998 406.889,461.257 "/>\r
+<g display="none">\r
+       <defs>\r
+               <rect id="SVGID_1_" x="533.129" y="346" width="158" height="232"/>\r
+       </defs>\r
+       <clipPath id="SVGID_9_" display="inline">\r
+               <use xlink:href="#SVGID_1_"  display="none" overflow="visible"/>\r
+       </clipPath>\r
+       <g clip-path="url(#SVGID_9_)">\r
+               <text transform="matrix(1 0 0 1 550.7231 489.4902)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">20°</text>\r
+               <text transform="matrix(1 0 0 1 550.7231 593.2334)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">21°</text>\r
+               <text transform="matrix(1 0 0 1 550.7231 393.5469)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">19°</text>\r
+               <text transform="matrix(1 0 0 1 550.7231 295.8911)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">18°</text>\r
+               <text transform="matrix(1 0 0 1 550.7231 201.5078)" fill="#FFFFFF" font-family="'MyriadPro-Regular'" font-size="93.6032">17°</text>\r
+       </g>\r
+</g>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>\r
+<circle display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.5936" stroke-miterlimit="10" cx="756.627" cy="420.198" r="6.141"/>\r
+<circle display="none" fill="#6DD436" fill-opacity="0.45" cx="756.627" cy="420.198" r="10.912"/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-width="2" stroke-miterlimit="10" x1="756.129" y1="419" x2="756.129" y2="607"/>\r
+<circle display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.5936" stroke-miterlimit="10" cx="494.93" cy="726.5" r="6.141"/>\r
+<circle display="none" fill="#6DD436" fill-opacity="0.45" cx="494.93" cy="726.5" r="10.912"/>\r
+<circle display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.5936" stroke-miterlimit="10" cx="210.631" cy="524.197" r="6.141"/>\r
+<circle display="none" fill="#6DD436" fill-opacity="0.45" cx="210.631" cy="524.197" r="10.912"/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-width="2" stroke-miterlimit="10" x1="211.129" y1="529" x2="211.129" y2="607"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8472" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M268.629,643.039V738.5h-122v-80.76C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8902" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M698.129,643.039v95.783h122V657.74C780.41,651.722,739.326,646.832,698.129,643.039z"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle fill="#6DD436" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#6DD436" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon display="none" fill="#6DD436" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 \r
+                       172.129,682             "/>\r
+       </g>\r
+</g>\r
+<path display="none" fill="#6DD436" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079\r
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053\r
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127\r
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>\r
+<path display="none" fill="#6DD436" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001\r
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299\r
+       l-1.361,4.347H762.701z"/>\r
+<path display="none" fill="#6DD436" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078\r
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64\r
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"\r
+       />\r
+<path display="none" fill="#6DD436" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001\r
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764\r
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54\r
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979\r
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0\r
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253\r
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>\r
+<path display="none" fill="#6DD436" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903\r
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="207.6294" y1="643.626" x2="207.6294" y2="737.4362">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#63E6FF"/>\r
+</linearGradient>\r
+<path display="none" fill="url(#SVGID_10_)" stroke="#6DD436" stroke-miterlimit="10" d="M268.629,643.039V738.5h-122v-80.76\r
+       C186.629,651.722,227.629,646.832,268.629,643.039z"/>\r
+<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="758.6294" y1="643.626" x2="758.6294" y2="737.4362">\r
+       <stop  offset="0.5092" style="stop-color:#6DD436;stop-opacity:0"/>\r
+       <stop  offset="0.9018" style="stop-color:#6DD436"/>\r
+       <stop  offset="1" style="stop-color:#63E6FF"/>\r
+</linearGradient>\r
+<path display="none" fill="url(#SVGID_11_)" stroke="#6DD436" stroke-miterlimit="10" d="M697.629,643.039V738.5h122v-80.76\r
+       C780.629,651.722,739.629,646.832,697.629,643.039z"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g>\r
+                       <circle fill="#FFFFFF" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#FFFFFF" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon fill="#FFFFFF" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 172.129,682                 "/>\r
+       </g>\r
+</g>\r
+<path display="none" fill="#FFFFFF" d="M747.514,675.48c-0.104-2.278-0.235-5.027-0.209-7.41h-0.079\r
+       c-0.576,2.146-1.31,4.529-2.095,6.755l-2.566,7.646h-2.487l-2.356-7.541c-0.681-2.251-1.309-4.66-1.78-6.859h-0.053\r
+       c-0.078,2.304-0.183,5.105-0.313,7.515l-0.394,7.096h-3.011l1.178-17.648h4.242l2.305,7.097c0.628,2.068,1.178,4.163,1.623,6.127\r
+       h0.078c0.472-1.912,1.074-4.085,1.755-6.153l2.435-7.07h4.189l1.021,17.648h-3.142L747.514,675.48z"/>\r
+<path display="none" fill="#FFFFFF" d="M757.647,677.68l-1.519,5.001h-3.325l5.656-17.648h4.11l5.734,17.648h-3.456l-1.598-5.001\r
+       H757.647z M762.701,675.244l-1.388-4.347c-0.34-1.073-0.628-2.277-0.891-3.299h-0.052c-0.262,1.021-0.523,2.252-0.838,3.299\r
+       l-1.361,4.347H762.701z"/>\r
+<path display="none" fill="#FFFFFF" d="M779.695,682.681l-1.911-3.509c-0.76-1.361-1.257-2.304-1.755-3.325h-0.078\r
+       c-0.419,1.021-0.891,1.964-1.598,3.325l-1.754,3.509h-3.692l5.237-8.929l-5.027-8.72h3.691l1.912,3.64\r
+       c0.575,1.1,0.995,1.964,1.466,2.959h0.053c0.471-1.1,0.838-1.885,1.388-2.959l1.885-3.64h3.692l-5.158,8.615l5.367,9.033H779.695z"\r
+       />\r
+<path display="none" fill="#FFFFFF" d="M773.577,723.187c-0.509,0-1.007-0.109-1.483-0.324c-8.057-3.664-16.873-3.663-24.926-0.001\r
+       c-0.478,0.216-0.977,0.325-1.484,0.325c-1.702,0-3.187-1.207-3.78-3.075l-6.004-19.563c-0.773-2.435,0.854-5.537,3.557-6.764\r
+       c13.016-5.92,27.331-5.92,40.349,0c2.702,1.227,4.329,4.329,3.552,6.775l-5.996,19.54\r
+       C776.762,721.979,775.279,723.187,773.577,723.187z M759.629,717.658c4.595,0,9.127,1.002,13.473,2.979\r
+       c0.756,0.343,1.592-0.218,1.926-1.266l5.996-19.54c0.37-1.165-0.507-3.04-2.23-3.822c-12.381-5.631-25.948-5.631-38.327,0\r
+       c-1.725,0.782-2.602,2.657-2.235,3.811l6.004,19.563c0.328,1.032,1.157,1.603,1.923,1.253\r
+       C750.501,718.66,755.035,717.658,759.629,717.658z"/>\r
+<path display="none" fill="#FFFFFF" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path display="none" fill="#FFFFFF" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903\r
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path display="none" fill="#FFFFFF" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <circle fill="#6DD436" cx="236.991" cy="676.459" r="8.235"/>\r
+                       <path fill="#6DD436" d="M239.268,687.889l-1.035-0.57c-2.861-1.577-6.458-0.536-8.035,2.323l-6.644,12.053l-13.158-4.315\r
+                               c-3.009-0.986-6.572,0.18-9.142,3.18l0.004,0.003c-0.45,0.409-0.876,0.873-1.262,1.395l-10.893,14.743\r
+                               c-1.679,2.271-1.607,5.14,0.098,6.486l0.618,0.487c1.706,1.349,4.512,0.756,6.334-1.402l11.504-13.622l15.161,5.823\r
+                               c1.32,0.507,2.731,0.665,4.069,0.524c2.312,0.265,4.662-0.854,5.854-3.019l8.852-16.056\r
+                               C243.169,693.063,242.128,689.466,239.268,687.889z"/>\r
+               </g>\r
+               <polygon display="none" fill="#6DD436" points="165.347,682 179.608,699.699 193.868,682 187.129,682 187.129,666 172.129,666 \r
+                       172.129,682             "/>\r
+       </g>\r
+</g>\r
+<text transform="matrix(1 0 0 1 730.7563 682.6807)" display="none" fill="#6DD436" font-family="'MyriadPro-Semibold'" font-size="26.1844">MAX</text>\r
+<path display="none" fill="none" stroke="#6DD436" stroke-width="2.4433" stroke-miterlimit="10" d="M776.192,719.741\r
+       c-0.579,1.821-2.173,2.65-3.596,2.008c-8.41-3.825-17.523-3.825-25.935,0c-1.42,0.643-3.016-0.187-3.595-2.008\r
+       c-2-6.518-3.999-13.035-6-19.552c-0.577-1.816,0.696-4.296,2.894-5.293c12.758-5.803,26.58-5.803,39.338,0\r
+       c2.197,0.997,3.471,3.477,2.894,5.293C780.191,706.706,778.192,713.224,776.192,719.741z"/>\r
+<path display="none" fill="#6DD436" d="M750.686,703.627l3.01,0.176l-1.854-5.907l-6.055,4.576l2.898,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C758.053,720,745.121,712.109,750.686,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M759.294,703.627l3.01,0.176l-1.854-5.907l-6.056,4.576l2.897,0.903\r
+       c-6.049,8.577,7.235,16.625,0.382,26.625c0.574,0,1.297,0,2.209,0C766.661,720,753.73,712.109,759.294,703.627z"/>\r
+<path display="none" fill="#6DD436" d="M767.904,703.627l3.008,0.176l-1.854-5.907l-6.055,4.576l2.897,0.903\r
+       c-6.05,8.577,7.235,16.625,0.38,26.625c0.573,0,1.298,0,2.209,0C775.269,720,762.336,712.109,767.904,703.627z"/>\r
+<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="352.6289" y1="349.6606" x2="352.6289" y2="574.0165" gradientTransform="matrix(-1 0 0 1 965.2588 0)">\r
+       <stop  offset="0" style="stop-color:#64CE2C"/>\r
+       <stop  offset="0.2822" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="0.7055" style="stop-color:#64CE2C;stop-opacity:0"/>\r
+       <stop  offset="1" style="stop-color:#64CE2C"/>\r
+</linearGradient>\r
+<polygon display="none" fill="url(#SVGID_12_)" stroke="#6DD436" stroke-miterlimit="10" points="533.629,435.516 533.629,345.5 \r
+       691.629,345.5 691.629,577.5 533.629,577.5 533.629,486.998 559.371,461.257 "/>\r
+<path fill="none" stroke="#007F50" stroke-miterlimit="10" d="M968.129,664.752C828.971,627.465,638.581,610,484.129,610\r
+       s-344.841,17.465-484,54.752"/>\r
+<path fill="#6DD436" d="M583.971,125.855c1.144-0.187,2.848-0.327,4.739-0.327c2.334,0,3.969,0.351,5.089,1.237\r
+       c0.935,0.747,1.448,1.845,1.448,3.292c0,2.008-1.425,3.385-2.778,3.875v0.07c1.097,0.444,1.704,1.494,2.101,2.942\r
+       c0.49,1.774,0.98,3.829,1.284,4.436h-3.642c-0.257-0.443-0.631-1.728-1.098-3.666c-0.42-1.961-1.097-2.498-2.545-2.521h-1.073v6.187\r
+       h-3.525V125.855z M587.497,132.625h1.4c1.774,0,2.825-0.887,2.825-2.264c0-1.448-0.98-2.171-2.615-2.195\r
+       c-0.863,0-1.354,0.07-1.61,0.117V132.625z"/>\r
+<path fill="#6DD436" d="M614.083,140.937c-0.653,0.327-2.124,0.677-4.038,0.677c-5.44,0-8.241-3.385-8.241-7.868\r
+       c0-5.37,3.828-8.358,8.591-8.358c1.845,0,3.245,0.374,3.876,0.701l-0.724,2.825c-0.725-0.303-1.729-0.583-2.988-0.583\r
+       c-2.825,0-5.02,1.704-5.02,5.206c0,3.152,1.867,5.136,5.042,5.136c1.074,0,2.265-0.233,2.966-0.514L614.083,140.937z"/>\r
+<path fill="#6DD436" d="M616.417,125.645h3.571v12.747h6.257v2.988h-9.828V125.645z"/>\r
+<path fill="#6DD436" d="M631.916,125.645v15.735h-3.571v-15.735H631.916z"/>\r
+<path fill="#6DD436" d="M648.303,135.357c-0.069-1.891-0.14-4.179-0.14-6.467h-0.07c-0.49,2.008-1.144,4.249-1.751,6.093\r
+       l-1.914,6.14h-2.778l-1.681-6.093c-0.514-1.844-1.051-4.085-1.424-6.14h-0.047c-0.094,2.125-0.164,4.553-0.28,6.514l-0.28,5.977\r
+       h-3.292l1.004-15.735h4.739l1.541,5.253c0.49,1.821,0.98,3.782,1.331,5.626h0.069c0.444-1.821,0.98-3.899,1.494-5.65l1.682-5.229\r
+       h4.646l0.863,15.735h-3.479L648.303,135.357z"/>\r
+<path fill="#6DD436" d="M658.339,137.341l-1.12,4.039h-3.689l4.81-15.735h4.669l4.88,15.735h-3.829l-1.214-4.039H658.339z\r
+        M662.332,134.68l-0.98-3.338c-0.28-0.934-0.561-2.102-0.794-3.035h-0.047c-0.233,0.934-0.467,2.125-0.724,3.035l-0.934,3.338\r
+       H662.332z"/>\r
+<path fill="#6DD436" d="M671.084,128.633h-4.226v-2.988h12.093v2.988h-4.296v12.747h-3.571V128.633z"/>\r
+<path fill="#6DD436" d="M690.202,134.727h-5.79v3.735h6.468v2.918H680.84v-15.735h9.712v2.918h-6.141v3.269h5.79V134.727z"/>\r
+<path fill="#6DD436" d="M326.542,125.645h3.572v12.747h6.257v2.988h-9.829V125.645z"/>\r
+<path fill="#6DD436" d="M354.74,140.937c-0.654,0.327-2.125,0.677-4.039,0.677c-5.439,0-8.241-3.385-8.241-7.868\r
+       c0-5.37,3.829-8.358,8.591-8.358c1.845,0,3.245,0.374,3.875,0.701l-0.724,2.825c-0.724-0.303-1.728-0.583-2.988-0.583\r
+       c-2.825,0-5.02,1.704-5.02,5.206c0,3.152,1.868,5.136,5.043,5.136c1.074,0,2.265-0.233,2.965-0.514L354.74,140.937z"/>\r
+<path fill="#6DD436" d="M357.072,125.645h3.572v12.747h6.257v2.988h-9.829V125.645z"/>\r
+<path fill="#6DD436" d="M372.571,125.645v15.735H369v-15.735H372.571z"/>\r
+<path fill="#6DD436" d="M388.959,135.357c-0.07-1.891-0.14-4.179-0.14-6.467h-0.07c-0.49,2.008-1.144,4.249-1.751,6.093l-1.914,6.14\r
+       h-2.778l-1.681-6.093c-0.514-1.844-1.051-4.085-1.424-6.14h-0.046c-0.094,2.125-0.164,4.553-0.28,6.514l-0.28,5.977h-3.292\r
+       l1.004-15.735h4.739l1.541,5.253c0.49,1.821,0.98,3.782,1.331,5.626h0.07c0.443-1.821,0.98-3.899,1.494-5.65l1.681-5.229h4.646\r
+       l0.864,15.735h-3.479L388.959,135.357z"/>\r
+<path fill="#6DD436" d="M398.994,137.341l-1.121,4.039h-3.688l4.809-15.735h4.669l4.879,15.735h-3.829l-1.214-4.039H398.994z\r
+        M402.986,134.68l-0.98-3.338c-0.28-0.934-0.56-2.102-0.794-3.035h-0.046c-0.233,0.934-0.467,2.125-0.724,3.035l-0.934,3.338\r
+       H402.986z"/>\r
+<path fill="#6DD436" d="M411.739,128.633h-4.226v-2.988h12.093v2.988h-4.295v12.747h-3.572V128.633z"/>\r
+<path fill="#6DD436" d="M430.856,134.727h-5.79v3.735h6.467v2.918h-10.039v-15.735h9.712v2.918h-6.14v3.269h5.79V134.727z"/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,596.969 187.129,606.938 144.129,606.938 144.129,581.018 187.129,581.018 187.129,596.969 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,561.967 187.129,571.937 144.129,571.937 144.129,546.016 187.129,546.016 187.129,561.967 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,526.966 187.129,536.935 144.129,536.935 144.129,511.015 187.129,511.015 187.129,526.966 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,491.964 187.129,501.934 144.129,501.934 144.129,476.014 187.129,476.014 187.129,491.964 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,456.963 187.129,466.932 144.129,466.932 144.129,441.012 187.129,441.012 187.129,456.963 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,421.961 187.129,431.931 144.129,431.931 144.129,406.01 187.129,406.01 187.129,421.961 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,386.96 187.129,396.929 144.129,396.929 144.129,371.009 187.129,371.009 187.129,386.96 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,351.959 187.129,361.928 144.129,361.928 144.129,336.008 187.129,336.008 187.129,351.959 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,316.958 187.129,326.927 144.129,326.927 144.129,301.007 187.129,301.007 187.129,316.958 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,281.956 187.129,291.925 144.129,291.925 144.129,266.005 187.129,266.005 187.129,281.956 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,246.955 187.129,256.924 144.129,256.924 144.129,231.004 187.129,231.004 187.129,246.955 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,211.954 187.129,221.923 144.129,221.923 144.129,196.003 187.129,196.003 187.129,211.954 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,176.952 187.129,186.921 144.129,186.921 144.129,161.001 187.129,161.001 187.129,176.952 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,141.951 187.129,151.92 144.129,151.92 144.129,126 187.129,126 187.129,141.951 "/>\r
+<rect x="275.129" y="126" fill="#6DD436" width="45" height="15"/>\r
+<rect x="533.129" y="126" fill="#6DD436" width="45" height="15"/>\r
+<line fill="#6DD436" stroke="#6DD436" stroke-miterlimit="10" x1="203.629" y1="126" x2="203.629" y2="607"/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,596.969 780.129,606.938 823.129,606.938 823.129,581.018 780.129,581.018 780.129,596.969 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,561.967 780.129,571.937 823.129,571.937 823.129,546.016 780.129,546.016 780.129,561.967 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,526.966 780.129,536.935 823.129,536.935 823.129,511.015 780.129,511.015 780.129,526.966 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,491.964 780.129,501.934 823.129,501.934 823.129,476.014 780.129,476.014 780.129,491.964 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,456.963 780.129,466.932 823.129,466.932 823.129,441.012 780.129,441.012 780.129,456.963 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,421.961 780.129,431.931 823.129,431.931 823.129,406.01 780.129,406.01 780.129,421.961 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,386.96 780.129,396.929 823.129,396.929 823.129,371.009 780.129,371.009 780.129,386.96 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,351.959 780.129,361.928 823.129,361.928 823.129,336.008 780.129,336.008 780.129,351.959 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,316.958 780.129,326.927 823.129,326.927 823.129,301.007 780.129,301.007 780.129,316.958 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,281.956 780.129,291.925 823.129,291.925 823.129,266.005 780.129,266.005 780.129,281.956 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,246.955 780.129,256.924 823.129,256.924 823.129,231.004 780.129,231.004 780.129,246.955 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,211.954 780.129,221.923 823.129,221.923 823.129,196.003 780.129,196.003 780.129,211.954 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,176.952 780.129,186.921 823.129,186.921 823.129,161.001 780.129,161.001 780.129,176.952 "/>\r
+<polyline fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,141.951 780.129,151.92 823.129,151.92 823.129,126 780.129,126 780.129,141.951 "/>\r
+<line fill="#6DD436" stroke="#6DD436" stroke-miterlimit="10" x1="763.629" y1="126" x2="763.629" y2="607"/>\r
+<line fill="#6DD436" stroke="#6DD436" stroke-miterlimit="10" x1="667.129" y1="719.5" x2="363.129" y2="719.5"/>\r
+<g>\r
+       <g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M332.218,659.1c-2.009-2.359-5.185-3.606-8.528-3.606c-1.786-0.001-3.477,0.394-4.998,1.096\r
+                               c0,0-1.44,0.746-3.202-1.096s-5.605-8.78-1.644-10.731c15.362-7.283,32.982,0.008,37.59,10.775\r
+                               C353.868,660.111,336.481,664.104,332.218,659.1z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-width="0.9923" stroke-miterlimit="10" d="M332.218,659.1\r
+                               c-2.009-2.359-5.185-3.606-8.528-3.606c-1.786-0.001-3.477,0.394-4.998,1.096c0,0-1.44,0.746-3.202-1.096\r
+                               s-5.605-8.78-1.644-10.731c15.362-7.283,32.982,0.008,37.59,10.775C353.868,660.111,336.481,664.104,332.218,659.1z"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M312.857,664.641c-1.04,2.921-0.532,6.294,1.14,9.189c0.891,1.547,2.078,2.814,3.448,3.779\r
+                               c0,0,1.364,0.875,0.652,3.322c-0.715,2.446-4.801,9.245-8.473,6.791c-13.987-9.664-16.484-28.569-9.462-37.944\r
+                               C302.907,645.386,315.058,658.446,312.857,664.641z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-width="0.9923" stroke-miterlimit="10" d="M312.857,664.641\r
+                               c-1.04,2.921-0.532,6.294,1.14,9.189c0.891,1.547,2.078,2.814,3.448,3.779c0,0,1.364,0.875,0.652,3.322\r
+                               c-0.715,2.446-4.801,9.245-8.473,6.791c-13.987-9.664-16.484-28.569-9.462-37.944\r
+                               C302.907,645.386,315.058,658.446,312.857,664.641z"/>\r
+               </g>\r
+               <g>\r
+                       <path fill="#6DD436" d="M327.336,678.637c3.049-0.561,5.715-2.686,7.388-5.581c0.893-1.547,1.397-3.208,1.547-4.876\r
+                               c0,0,0.077-1.618,2.552-2.226c2.474-0.604,10.406-0.465,10.116,3.942c-1.375,16.944-16.498,28.562-28.128,27.167\r
+                               C315.636,696.882,320.872,679.828,327.336,678.637z"/>\r
+                       <path opacity="0.64" fill="none" stroke="#6DD436" stroke-width="0.9923" stroke-miterlimit="10" d="M327.336,678.637\r
+                               c3.049-0.561,5.715-2.686,7.388-5.581c0.893-1.547,1.397-3.208,1.547-4.876c0,0,0.077-1.618,2.552-2.226\r
+                               c2.474-0.604,10.406-0.465,10.116,3.942c-1.375,16.944-16.498,28.562-28.128,27.167\r
+                               C315.636,696.882,320.872,679.828,327.336,678.637z"/>\r
+               </g>\r
+               <g>\r
+                       <circle fill="#6DD436" cx="323.689" cy="667.522" r="7.302"/>\r
+                       \r
+                               <circle opacity="0.64" fill="none" stroke="#6DD436" stroke-width="0.9923" stroke-miterlimit="10" cx="323.689" cy="667.522" r="7.302"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M362.629,703.5h29v-68.552c-9.608,0.396-19.279,0.849-29,1.366V703.5z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M401.629,703.5h29v-69.834c-9.582,0.234-19.253,0.529-29,0.89V703.5z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M440.629,703.5h28v-70.443c-9.225,0.067-18.564,0.196-28,0.386V703.5z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M479.629,633.008V703.5h29v-70.351c-8.34-0.098-16.598-0.149-24.75-0.149C482.468,633,481.047,633.005,479.629,633.008z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M519.629,703.5h28v-69.553c-9.42-0.273-18.76-0.488-28-0.643V703.5z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M558.629,703.5h29v-68.051c-9.73-0.447-19.404-0.835-29-1.159V703.5z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M597.629,703.5h28v-66.005c-9.371-0.578-18.71-1.103-28-1.567V703.5z"/>\r
+<path fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M636.629,703.5h29v-63.205c-9.684-0.759-19.356-1.46-29-2.099V703.5z"/>\r
+<rect x="210.129" y="127" display="none" fill="#6DD436" width="2" height="482"/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,596.969 187.129,606.938 144.129,606.938 144.129,581.018 187.129,581.018 187.129,596.969 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,561.967 187.129,571.937 144.129,571.937 144.129,546.016 187.129,546.016 187.129,561.967 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,526.966 187.129,536.935 144.129,536.935 144.129,511.015 187.129,511.015 187.129,526.966 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,491.964 187.129,501.934 144.129,501.934 144.129,476.014 187.129,476.014 187.129,491.964 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,456.963 187.129,466.932 144.129,466.932 144.129,441.012 187.129,441.012 187.129,456.963 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,421.961 187.129,431.931 144.129,431.931 144.129,406.01 187.129,406.01 187.129,421.961 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,386.96 187.129,396.929 144.129,396.929 144.129,371.009 187.129,371.009 187.129,386.96 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,351.959 187.129,361.928 144.129,361.928 144.129,336.008 187.129,336.008 187.129,351.959 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,316.958 187.129,326.927 144.129,326.927 144.129,301.007 187.129,301.007 187.129,316.958 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,281.956 187.129,291.925 144.129,291.925 144.129,266.005 187.129,266.005 187.129,281.956 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,246.955 187.129,256.924 144.129,256.924 144.129,231.004 187.129,231.004 187.129,246.955 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,211.954 187.129,221.923 144.129,221.923 144.129,196.003 187.129,196.003 187.129,211.954 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,176.952 187.129,186.921 144.129,186.921 144.129,161.001 187.129,161.001 187.129,176.952 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       187.129,141.951 187.129,151.92 144.129,151.92 144.129,126 187.129,126 187.129,141.951 "/>\r
+<rect x="755.129" y="127" display="none" fill="#6DD436" width="2" height="482"/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,596.969 780.129,606.938 823.129,606.938 823.129,581.018 780.129,581.018 780.129,596.969 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,561.967 780.129,571.937 823.129,571.937 823.129,546.016 780.129,546.016 780.129,561.967 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,526.966 780.129,536.935 823.129,536.935 823.129,511.015 780.129,511.015 780.129,526.966 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,491.964 780.129,501.934 823.129,501.934 823.129,476.014 780.129,476.014 780.129,491.964 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,456.963 780.129,466.932 823.129,466.932 823.129,441.012 780.129,441.012 780.129,456.963 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,421.961 780.129,431.931 823.129,431.931 823.129,406.01 780.129,406.01 780.129,421.961 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,386.96 780.129,396.929 823.129,396.929 823.129,371.009 780.129,371.009 780.129,386.96 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,351.959 780.129,361.928 823.129,361.928 823.129,336.008 780.129,336.008 780.129,351.959 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,316.958 780.129,326.927 823.129,326.927 823.129,301.007 780.129,301.007 780.129,316.958 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,281.956 780.129,291.925 823.129,291.925 823.129,266.005 780.129,266.005 780.129,281.956 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,246.955 780.129,256.924 823.129,256.924 823.129,231.004 780.129,231.004 780.129,246.955 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,211.954 780.129,221.923 823.129,221.923 823.129,196.003 780.129,196.003 780.129,211.954 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,176.952 780.129,186.921 823.129,186.921 823.129,161.001 780.129,161.001 780.129,176.952 "/>\r
+<polyline display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       780.129,141.951 780.129,151.92 823.129,151.92 823.129,126 780.129,126 780.129,141.951 "/>\r
+<rect x="274.702" y="175.708" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-miterlimit="10" stroke-opacity="0.64" width="157.956" height="127.534"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M337.796,255.953l-51.053-3.023c-3.593-0.142-5.474,3.107-4.104,7.17l2.857,10.824c1.528,4.532,5.986,9.041,9.909,9.041h62.589\r
+       c5.253,0,6.745-6.561,6.745-11.152c-0.12-25.828,4.735-52.385,14.563-78.246c0.954-2.52-0.953-5.045-4.298-5.702\r
+       c-1.817-0.356-3.633-0.713-5.449-1.069c-3.336-0.655-7.05,0.767-8.259,3.236c-11.038,22.564-18.271,43.783-21.696,66.559\r
+       C339.6,253.589,338.936,256.021,337.796,255.953z"/>\r
+<path display="none" fill="#6DD436" d="M304.629,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0\r
+       C294.445,253,314.813,275,304.629,298z"/>\r
+<polygon display="none" fill="#6DD436" points="296.641,231.288 304.142,223.451 307.177,233.866 "/>\r
+<path display="none" fill="#6DD436" d="M317.488,298c-18.86,0,15.646,0-3.215,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.215,0\r
+       C307.304,253,327.672,275,317.488,298z"/>\r
+<polygon display="none" fill="#6DD436" points="309.5,231.288 317,223.451 320.037,233.866 "/>\r
+<path display="none" fill="#6DD436" d="M330.99,298c-18.859,0,15.646,0-3.214,0c10.184-23-10.184-45,0-67c18.86,0-15.645,0,3.214,0\r
+       C320.806,253,341.174,275,330.99,298z"/>\r
+<polygon display="none" fill="#6DD436" points="323.001,231.288 330.502,223.451 333.538,233.866 "/>\r
+<g display="none">\r
+       <g display="inline">\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M425.129,219v-22h-40.44c-2.568,7-4.733,14-6.516,22H425.129z"/>\r
+                       <path display="inline" opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M425.629,218.5v-22h-40.94\r
+                               c-2.568,8-4.733,15-6.516,22H425.629z"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M425.129,244v-21h-47.87c-1.63,7-2.88,14-3.73,21H425.129z"/>\r
+                       <path display="inline" opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M425.629,244.5v-22h-48.37\r
+                               c-1.63,7-2.88,15-3.73,22H425.629z"/>\r
+               </g>\r
+               <g display="none">\r
+                       <path display="inline" fill="#6DD436" d="M372.116,270h53.013v-22H373.12c-0.671,7-1.003,13.871-0.971,20.759\r
+                               C372.149,269.155,372.131,270,372.116,270z"/>\r
+                       <path display="inline" opacity="0.64" fill="none" stroke="#6DD436" stroke-miterlimit="10" d="M372.116,270.5h53.513v-22H373.12\r
+                               c-0.671,7-1.003,13.871-0.971,20.759C372.149,269.655,372.131,269.5,372.116,270.5z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<rect x="533.601" y="175.708" display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-miterlimit="10" stroke-opacity="0.64" width="157.955" height="127.534"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M628.462,255.953l51.054-3.023c3.593-0.142,5.475,3.107,4.104,7.17l-2.858,10.824c-1.527,4.532-5.985,9.041-9.908,9.041h-62.589\r
+       c-5.254,0-6.745-6.561-6.745-11.152c0.12-25.828-4.735-52.385-14.563-78.246c-0.953-2.52,0.953-5.045,4.299-5.702\r
+       c1.817-0.356,3.634-0.713,5.448-1.069c3.337-0.655,7.051,0.767,8.26,3.236c11.037,22.564,18.271,43.783,21.695,66.559\r
+       C626.659,253.589,627.323,256.021,628.462,255.953z"/>\r
+<path display="none" fill="#6DD436" d="M661.629,298c18.86,0-15.645,0,3.215,0c-10.184-23,10.184-45,0-67\r
+       c-18.859,0,15.646,0-3.215,0C671.814,253,651.446,275,661.629,298z"/>\r
+<polygon display="none" fill="#6DD436" points="669.619,231.288 662.118,223.451 659.082,233.866 "/>\r
+<path display="none" fill="#6DD436" d="M648.771,298c18.859,0-15.646,0,3.214,0c-10.184-23,10.186-45,0-67\r
+       c-18.86,0,15.646,0-3.214,0C658.955,253,638.586,275,648.771,298z"/>\r
+<polygon display="none" fill="#6DD436" points="656.759,231.288 649.258,223.451 646.222,233.866 "/>\r
+<path display="none" fill="#6DD436" d="M635.269,298c18.86,0-15.646,0,3.214,0c-10.184-23,10.185-45,0-67\r
+       c-18.859,0,15.646,0-3.214,0C645.453,253,625.084,275,635.269,298z"/>\r
+<polygon display="none" fill="#6DD436" points="643.257,231.288 635.756,223.451 632.721,233.866 "/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M541.011,218.609v-21.841h40.559c2.568,7.243,4.733,14.529,6.516,21.841H541.011z"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M541.011,244.35v-21.841h47.987c1.63,7.263,2.881,14.548,3.73,21.841H541.011z"/>\r
+<path display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.8243" stroke-miterlimit="10" stroke-opacity="0.64" d="\r
+       M594.143,270.091h-53.132V248.25h52.128c0.67,6.894,1.002,13.792,0.971,20.679C594.11,269.325,594.127,269.707,594.143,270.091z"/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-width="3" stroke-miterlimit="10" x1="667.129" y1="726.5" x2="363.129" y2="726.5"/>\r
+<path display="none" fill="#6DD436" d="M362.629,703.5h29v-68.552c-9.608,0.396-19.279,0.849-29,1.366V703.5z"/>\r
+<path display="none" fill="#6DD436" d="M401.629,703.5h29v-69.834c-9.582,0.234-19.253,0.529-29,0.89V703.5z"/>\r
+<path display="none" fill="#6DD436" d="M440.629,703.5h28v-70.443c-9.225,0.067-18.564,0.196-28,0.386V703.5z"/>\r
+<path display="none" fill="#6DD436" d="M479.629,633.008V703.5h29v-70.351c-8.34-0.098-16.598-0.149-24.75-0.149\r
+       C482.468,633,481.047,633.005,479.629,633.008z"/>\r
+<path display="none" fill="#6DD436" d="M519.629,703.5h28v-69.553c-9.42-0.273-18.76-0.488-28-0.643V703.5z"/>\r
+<path display="none" fill="#6DD436" d="M558.629,703.5h29v-68.051c-9.73-0.447-19.404-0.835-29-1.159V703.5z"/>\r
+<path display="none" fill="#6DD436" d="M597.629,703.5h28v-66.005c-9.371-0.578-18.71-1.103-28-1.567V703.5z"/>\r
+<path display="none" fill="#6DD436" d="M636.629,703.5h29v-63.205c-9.684-0.759-19.356-1.46-29-2.099V703.5z"/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/temp_bar_on_left.svg b/css/user/green/images/hvac/temp_bar_on_left.svg
new file mode 100644 (file)
index 0000000..e06594d
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="68px" height="482px" viewBox="21 125.388 68 482"\r
+        overflow="visible" enable-background="new 21 125.388 68 482" xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#041724"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<circle display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.5936" stroke-miterlimit="10" cx="87.502" cy="524.197" r="6.141"/>\r
+<circle display="none" fill="#6DD436" fill-opacity="0.45" cx="87.502" cy="524.197" r="10.912"/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-width="2" stroke-miterlimit="10" x1="88" y1="529" x2="88" y2="607"/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,596.969 64,606.938 21,606.938 21,581.018 64,581.018 64,596.969 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,561.967 64,571.937 21,571.937 21,546.016 64,546.016 64,561.967 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,526.966 64,536.935 21,536.935 21,511.015 64,511.015 64,526.966 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,491.964 64,501.934 21,501.934 21,476.014 64,476.014 64,491.964 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,456.963 64,466.932 21,466.932 21,441.012 64,441.012 64,456.963 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,421.961 64,431.931 21,431.931 21,406.01 64,406.01 64,421.961 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,386.96 64,396.929 21,396.929 21,371.009 64,371.009 64,386.96 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,351.959 64,361.928 21,361.928 21,336.008 64,336.008 64,351.959 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,316.958 64,326.927 21,326.927 21,301.007 64,301.007 64,316.958 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,281.956 64,291.925 21,291.925 21,266.005 64,266.005 64,281.956 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,246.955 64,256.924 21,256.924 21,231.004 64,231.004 64,246.955 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,211.954 64,221.923 21,221.923 21,196.003 64,196.003 64,211.954 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,176.952 64,186.921 21,186.921 21,161.001 64,161.001 64,176.952 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       64,141.951 64,151.92 21,151.92 21,126 64,126 64,141.951 "/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-miterlimit="10" x1="80.5" y1="126" x2="80.5" y2="607"/>\r
+<rect x="87" y="127" fill="#6DD436" width="2" height="482"/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,596.969 \r
+       64,606.938 21,606.938 21,581.018 64,581.018 64,596.969 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,561.967 \r
+       64,571.937 21,571.937 21,546.016 64,546.016 64,561.967 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,526.966 \r
+       64,536.935 21,536.935 21,511.015 64,511.015 64,526.966 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,491.964 \r
+       64,501.934 21,501.934 21,476.014 64,476.014 64,491.964 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,456.963 \r
+       64,466.932 21,466.932 21,441.012 64,441.012 64,456.963 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,421.961 \r
+       64,431.931 21,431.931 21,406.01 64,406.01 64,421.961 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,386.96 \r
+       64,396.929 21,396.929 21,371.009 64,371.009 64,386.96 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,351.959 \r
+       64,361.928 21,361.928 21,336.008 64,336.008 64,351.959 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,316.958 \r
+       64,326.927 21,326.927 21,301.007 64,301.007 64,316.958 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,281.956 \r
+       64,291.925 21,291.925 21,266.005 64,266.005 64,281.956 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,246.955 \r
+       64,256.924 21,256.924 21,231.004 64,231.004 64,246.955 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,211.954 \r
+       64,221.923 21,221.923 21,196.003 64,196.003 64,211.954 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,176.952 \r
+       64,186.921 21,186.921 21,161.001 64,161.001 64,176.952 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="64,141.951 \r
+       64,151.92 21,151.92 21,126 64,126 64,141.951 "/>\r
+</svg>\r
diff --git a/css/user/green/images/hvac/temp_bar_on_right.svg b/css/user/green/images/hvac/temp_bar_on_right.svg
new file mode 100644 (file)
index 0000000..ff93fcb
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [\r
+       <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">\r
+]>\r
+<svg version="1.1"\r
+        xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"\r
+        x="0px" y="0px" width="68px" height="481px" viewBox="632 126 68 481" overflow="visible" enable-background="new 632 126 68 481"\r
+        xml:space="preserve">\r
+<defs>\r
+</defs>\r
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="360.0005" y1="946" x2="360.0005" y2="46.8912">\r
+       <stop  offset="0" style="stop-color:#042417"/>\r
+       <stop  offset="1" style="stop-color:#000000"/>\r
+</linearGradient>\r
+<rect display="none" fill="url(#SVGID_1_)" width="720" height="1001"/>\r
+<circle display="none" fill="#6DD436" stroke="#6DD436" stroke-width="0.5936" stroke-miterlimit="10" cx="633.498" cy="420.198" r="6.141"/>\r
+<circle display="none" fill="#6DD436" fill-opacity="0.45" cx="633.498" cy="420.198" r="10.912"/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-width="2" stroke-miterlimit="10" x1="633" y1="419" x2="633" y2="607"/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,596.969 657,606.938 700,606.938 700,581.018 657,581.018 657,596.969 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,561.967 657,571.937 700,571.937 700,546.016 657,546.016 657,561.967 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,526.966 657,536.935 700,536.935 700,511.015 657,511.015 657,526.966 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,491.964 657,501.934 700,501.934 700,476.014 657,476.014 657,491.964 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,456.963 657,466.932 700,466.932 700,441.012 657,441.012 657,456.963 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,421.961 657,431.931 700,431.931 700,406.01 657,406.01 657,421.961 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,386.96 657,396.929 700,396.929 700,371.009 657,371.009 657,386.96 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,351.959 657,361.928 700,361.928 700,336.008 657,336.008 657,351.959 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,316.958 657,326.927 700,326.927 700,301.007 657,301.007 657,316.958 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,281.956 657,291.925 700,291.925 700,266.005 657,266.005 657,281.956 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,246.955 657,256.924 700,256.924 700,231.004 657,231.004 657,246.955 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,211.954 657,221.923 700,221.923 700,196.003 657,196.003 657,211.954 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,176.952 657,186.921 700,186.921 700,161.001 657,161.001 657,176.952 "/>\r
+<polyline display="none" fill="#6DD436" fill-opacity="0.29" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,141.951 657,151.92 700,151.92 700,126 657,126 657,141.951 "/>\r
+<line display="none" fill="#6DD436" stroke="#6DD436" stroke-miterlimit="10" x1="640.5" y1="126" x2="640.5" y2="607"/>\r
+<rect x="632" y="127" fill="#6DD436" width="2" height="482"/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,596.969 657,606.938 700,606.938 700,581.018 657,581.018 657,596.969 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,561.967 657,571.937 700,571.937 700,546.016 657,546.016 657,561.967 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,526.966 657,536.935 700,536.935 700,511.015 657,511.015 657,526.966 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,491.964 657,501.934 700,501.934 700,476.014 657,476.014 657,491.964 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,456.963 657,466.932 700,466.932 700,441.012 657,441.012 657,456.963 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,421.961 657,431.931 700,431.931 700,406.01 657,406.01 657,421.961 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="657,386.96 \r
+       657,396.929 700,396.929 700,371.009 657,371.009 657,386.96 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,351.959 657,361.928 700,361.928 700,336.008 657,336.008 657,351.959 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,316.958 657,326.927 700,326.927 700,301.007 657,301.007 657,316.958 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,281.956 657,291.925 700,291.925 700,266.005 657,266.005 657,281.956 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,246.955 657,256.924 700,256.924 700,231.004 657,231.004 657,246.955 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,211.954 657,221.923 700,221.923 700,196.003 657,196.003 657,211.954 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,176.952 657,186.921 700,186.921 700,161.001 657,161.001 657,176.952 "/>\r
+<polyline fill="#6DD436" stroke="#6DD436" stroke-width="0.2319" stroke-miterlimit="10" stroke-opacity="0.64" points="\r
+       657,141.951 657,151.92 700,151.92 700,126 657,126 657,141.951 "/>\r
+</svg>\r
diff --git a/css/user/green/images/library/bg_left_panel_green.png b/css/user/green/images/library/bg_left_panel_green.png
new file mode 100644 (file)
index 0000000..eb3f723
Binary files /dev/null and b/css/user/green/images/library/bg_left_panel_green.png differ
diff --git a/css/user/green/images/library/bg_top_navi_green.png b/css/user/green/images/library/bg_top_navi_green.png
new file mode 100644 (file)
index 0000000..cabfd5e
Binary files /dev/null and b/css/user/green/images/library/bg_top_navi_green.png differ
diff --git a/css/user/green/images/library/bg_top_navi_select_green.png b/css/user/green/images/library/bg_top_navi_select_green.png
new file mode 100644 (file)
index 0000000..1082d6a
Binary files /dev/null and b/css/user/green/images/library/bg_top_navi_select_green.png differ
diff --git a/css/user/green/images/library/bg_top_navi_unselect1px_green.png b/css/user/green/images/library/bg_top_navi_unselect1px_green.png
new file mode 100644 (file)
index 0000000..41101e8
Binary files /dev/null and b/css/user/green/images/library/bg_top_navi_unselect1px_green.png differ
diff --git a/css/user/green/images/library/bg_top_navi_unselect_green.png b/css/user/green/images/library/bg_top_navi_unselect_green.png
new file mode 100644 (file)
index 0000000..ab8716d
Binary files /dev/null and b/css/user/green/images/library/bg_top_navi_unselect_green.png differ
diff --git a/css/user/green/images/library/bt_back_green.png b/css/user/green/images/library/bt_back_green.png
new file mode 100644 (file)
index 0000000..7c1f73d
Binary files /dev/null and b/css/user/green/images/library/bt_back_green.png differ
diff --git a/css/user/green/images/library/bt_close_green.png b/css/user/green/images/library/bt_close_green.png
new file mode 100644 (file)
index 0000000..51ace79
Binary files /dev/null and b/css/user/green/images/library/bt_close_green.png differ
diff --git a/css/user/green/images/library/bt_grid_act_green.png b/css/user/green/images/library/bt_grid_act_green.png
new file mode 100644 (file)
index 0000000..aed0632
Binary files /dev/null and b/css/user/green/images/library/bt_grid_act_green.png differ
diff --git a/css/user/green/images/library/bt_grid_act_green_test.png b/css/user/green/images/library/bt_grid_act_green_test.png
new file mode 100644 (file)
index 0000000..e777c8e
Binary files /dev/null and b/css/user/green/images/library/bt_grid_act_green_test.png differ
diff --git a/css/user/green/images/library/bt_grid_green.png b/css/user/green/images/library/bt_grid_green.png
new file mode 100644 (file)
index 0000000..4eec5db
Binary files /dev/null and b/css/user/green/images/library/bt_grid_green.png differ
diff --git a/css/user/green/images/library/bt_grid_green_disabled.png b/css/user/green/images/library/bt_grid_green_disabled.png
new file mode 100644 (file)
index 0000000..1836c84
Binary files /dev/null and b/css/user/green/images/library/bt_grid_green_disabled.png differ
diff --git a/css/user/green/images/library/bt_list_act_green.png b/css/user/green/images/library/bt_list_act_green.png
new file mode 100644 (file)
index 0000000..e9223b3
Binary files /dev/null and b/css/user/green/images/library/bt_list_act_green.png differ
diff --git a/css/user/green/images/library/bt_list_act_green_test.png b/css/user/green/images/library/bt_list_act_green_test.png
new file mode 100644 (file)
index 0000000..2888aa4
Binary files /dev/null and b/css/user/green/images/library/bt_list_act_green_test.png differ
diff --git a/css/user/green/images/library/bt_list_green.png b/css/user/green/images/library/bt_list_green.png
new file mode 100644 (file)
index 0000000..0c332ab
Binary files /dev/null and b/css/user/green/images/library/bt_list_green.png differ
diff --git a/css/user/green/images/library/bt_list_green_disabled.png b/css/user/green/images/library/bt_list_green_disabled.png
new file mode 100644 (file)
index 0000000..afcb219
Binary files /dev/null and b/css/user/green/images/library/bt_list_green_disabled.png differ
diff --git a/css/user/green/images/library/bt_search_act_green.png b/css/user/green/images/library/bt_search_act_green.png
new file mode 100644 (file)
index 0000000..df44ffa
Binary files /dev/null and b/css/user/green/images/library/bt_search_act_green.png differ
diff --git a/css/user/green/images/library/bt_search_act_green_test.png b/css/user/green/images/library/bt_search_act_green_test.png
new file mode 100644 (file)
index 0000000..ac79b3a
Binary files /dev/null and b/css/user/green/images/library/bt_search_act_green_test.png differ
diff --git a/css/user/green/images/library/bt_search_green.png b/css/user/green/images/library/bt_search_green.png
new file mode 100644 (file)
index 0000000..9e1734a
Binary files /dev/null and b/css/user/green/images/library/bt_search_green.png differ
diff --git a/css/user/green/images/library/bt_search_green_disabled.png b/css/user/green/images/library/bt_search_green_disabled.png
new file mode 100644 (file)
index 0000000..20bb952
Binary files /dev/null and b/css/user/green/images/library/bt_search_green_disabled.png differ
diff --git a/css/user/green/images/library/bt_shad_bottom_green.png b/css/user/green/images/library/bt_shad_bottom_green.png
new file mode 100644 (file)
index 0000000..95b50dc
Binary files /dev/null and b/css/user/green/images/library/bt_shad_bottom_green.png differ
diff --git a/css/user/green/images/library/bt_shad_top_green.png b/css/user/green/images/library/bt_shad_top_green.png
new file mode 100644 (file)
index 0000000..d91179e
Binary files /dev/null and b/css/user/green/images/library/bt_shad_top_green.png differ
diff --git a/css/user/green/images/musicplayer/bg_green.png b/css/user/green/images/musicplayer/bg_green.png
new file mode 100644 (file)
index 0000000..eab9fa0
Binary files /dev/null and b/css/user/green/images/musicplayer/bg_green.png differ
diff --git a/css/user/green/images/musicplayer/cover_album_green.png b/css/user/green/images/musicplayer/cover_album_green.png
new file mode 100644 (file)
index 0000000..42f873e
Binary files /dev/null and b/css/user/green/images/musicplayer/cover_album_green.png differ
diff --git a/css/user/green/images/musicplayer/grey_rectangle_green.png b/css/user/green/images/musicplayer/grey_rectangle_green.png
new file mode 100644 (file)
index 0000000..66feafa
Binary files /dev/null and b/css/user/green/images/musicplayer/grey_rectangle_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_next_enabled_green.png b/css/user/green/images/musicplayer/icon_next_enabled_green.png
new file mode 100644 (file)
index 0000000..01970c8
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_next_enabled_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_next_green.png b/css/user/green/images/musicplayer/icon_next_green.png
new file mode 100644 (file)
index 0000000..c8d3530
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_next_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_pause_green.png b/css/user/green/images/musicplayer/icon_pause_green.png
new file mode 100644 (file)
index 0000000..ee34ed2
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_pause_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_play_green.png b/css/user/green/images/musicplayer/icon_play_green.png
new file mode 100644 (file)
index 0000000..dbc4c78
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_play_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_previous_enabled_green.png b/css/user/green/images/musicplayer/icon_previous_enabled_green.png
new file mode 100644 (file)
index 0000000..133c51e
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_previous_enabled_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_previous_green.png b/css/user/green/images/musicplayer/icon_previous_green.png
new file mode 100644 (file)
index 0000000..a21ebb8
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_previous_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_repeat_enabled_green.png b/css/user/green/images/musicplayer/icon_repeat_enabled_green.png
new file mode 100644 (file)
index 0000000..ffe267f
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_repeat_enabled_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_repeat_green.png b/css/user/green/images/musicplayer/icon_repeat_green.png
new file mode 100644 (file)
index 0000000..2a1111d
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_repeat_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_shuffle_enabled_green.png b/css/user/green/images/musicplayer/icon_shuffle_enabled_green.png
new file mode 100644 (file)
index 0000000..2931bc5
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_shuffle_enabled_green.png differ
diff --git a/css/user/green/images/musicplayer/icon_shuffle_green.png b/css/user/green/images/musicplayer/icon_shuffle_green.png
new file mode 100644 (file)
index 0000000..3b80ef1
Binary files /dev/null and b/css/user/green/images/musicplayer/icon_shuffle_green.png differ
diff --git a/css/user/green/images/navigation/icon_map_green.png b/css/user/green/images/navigation/icon_map_green.png
new file mode 100644 (file)
index 0000000..3c773f9
Binary files /dev/null and b/css/user/green/images/navigation/icon_map_green.png differ
diff --git a/css/user/green/images/navigation/icon_satellite_green.png b/css/user/green/images/navigation/icon_satellite_green.png
new file mode 100644 (file)
index 0000000..17a09cf
Binary files /dev/null and b/css/user/green/images/navigation/icon_satellite_green.png differ
diff --git a/css/user/green/images/phone/bg_with_glow_green.png b/css/user/green/images/phone/bg_with_glow_green.png
new file mode 100644 (file)
index 0000000..a341337
Binary files /dev/null and b/css/user/green/images/phone/bg_with_glow_green.png differ
diff --git a/css/user/green/images/phone/bt_delete_green.png b/css/user/green/images/phone/bt_delete_green.png
new file mode 100644 (file)
index 0000000..d5b82f3
Binary files /dev/null and b/css/user/green/images/phone/bt_delete_green.png differ
diff --git a/css/user/green/images/phone/contact_picture_green.png b/css/user/green/images/phone/contact_picture_green.png
new file mode 100644 (file)
index 0000000..1b3eafc
Binary files /dev/null and b/css/user/green/images/phone/contact_picture_green.png differ
diff --git a/css/user/green/images/phone/icon_addcall_green.png b/css/user/green/images/phone/icon_addcall_green.png
new file mode 100644 (file)
index 0000000..bd8336e
Binary files /dev/null and b/css/user/green/images/phone/icon_addcall_green.png differ
diff --git a/css/user/green/images/phone/icon_address_green.png b/css/user/green/images/phone/icon_address_green.png
new file mode 100644 (file)
index 0000000..bcef57b
Binary files /dev/null and b/css/user/green/images/phone/icon_address_green.png differ
diff --git a/css/user/green/images/phone/icon_call_green.png b/css/user/green/images/phone/icon_call_green.png
new file mode 100644 (file)
index 0000000..32b8964
Binary files /dev/null and b/css/user/green/images/phone/icon_call_green.png differ
diff --git a/css/user/green/images/phone/icon_contact_green.png b/css/user/green/images/phone/icon_contact_green.png
new file mode 100644 (file)
index 0000000..b6d48e0
Binary files /dev/null and b/css/user/green/images/phone/icon_contact_green.png differ
diff --git a/css/user/green/images/phone/icon_dialed_green.png b/css/user/green/images/phone/icon_dialed_green.png
new file mode 100644 (file)
index 0000000..c793cdb
Binary files /dev/null and b/css/user/green/images/phone/icon_dialed_green.png differ
diff --git a/css/user/green/images/phone/icon_email_green.png b/css/user/green/images/phone/icon_email_green.png
new file mode 100644 (file)
index 0000000..70a3031
Binary files /dev/null and b/css/user/green/images/phone/icon_email_green.png differ
diff --git a/css/user/green/images/phone/icon_endcall_green.png b/css/user/green/images/phone/icon_endcall_green.png
new file mode 100644 (file)
index 0000000..3897fc1
Binary files /dev/null and b/css/user/green/images/phone/icon_endcall_green.png differ
diff --git a/css/user/green/images/phone/icon_favorite_false_green.png b/css/user/green/images/phone/icon_favorite_false_green.png
new file mode 100644 (file)
index 0000000..c86831c
Binary files /dev/null and b/css/user/green/images/phone/icon_favorite_false_green.png differ
diff --git a/css/user/green/images/phone/icon_favorite_true_green.png b/css/user/green/images/phone/icon_favorite_true_green.png
new file mode 100644 (file)
index 0000000..8d3b88a
Binary files /dev/null and b/css/user/green/images/phone/icon_favorite_true_green.png differ
diff --git a/css/user/green/images/phone/icon_hold_green.png b/css/user/green/images/phone/icon_hold_green.png
new file mode 100644 (file)
index 0000000..7af6d55
Binary files /dev/null and b/css/user/green/images/phone/icon_hold_green.png differ
diff --git a/css/user/green/images/phone/icon_missed_green.png b/css/user/green/images/phone/icon_missed_green.png
new file mode 100644 (file)
index 0000000..c793cdb
Binary files /dev/null and b/css/user/green/images/phone/icon_missed_green.png differ
diff --git a/css/user/green/images/phone/icon_missed_new_green.png b/css/user/green/images/phone/icon_missed_new_green.png
new file mode 100644 (file)
index 0000000..c793cdb
Binary files /dev/null and b/css/user/green/images/phone/icon_missed_new_green.png differ
diff --git a/css/user/green/images/phone/icon_mobile_green.png b/css/user/green/images/phone/icon_mobile_green.png
new file mode 100644 (file)
index 0000000..8e7a56c
Binary files /dev/null and b/css/user/green/images/phone/icon_mobile_green.png differ
diff --git a/css/user/green/images/phone/icon_mobile_green_hover.png b/css/user/green/images/phone/icon_mobile_green_hover.png
new file mode 100644 (file)
index 0000000..84c3674
Binary files /dev/null and b/css/user/green/images/phone/icon_mobile_green_hover.png differ
diff --git a/css/user/green/images/phone/icon_mute_green.png b/css/user/green/images/phone/icon_mute_green.png
new file mode 100644 (file)
index 0000000..c11e370
Binary files /dev/null and b/css/user/green/images/phone/icon_mute_green.png differ
diff --git a/css/user/green/images/phone/icon_number_green.png b/css/user/green/images/phone/icon_number_green.png
new file mode 100644 (file)
index 0000000..d48f8b1
Binary files /dev/null and b/css/user/green/images/phone/icon_number_green.png differ
diff --git a/css/user/green/images/phone/icon_received_green.png b/css/user/green/images/phone/icon_received_green.png
new file mode 100644 (file)
index 0000000..d1a38d4
Binary files /dev/null and b/css/user/green/images/phone/icon_received_green.png differ
diff --git a/css/user/green/images/phone/icon_speaker_green.png b/css/user/green/images/phone/icon_speaker_green.png
new file mode 100644 (file)
index 0000000..f6b1591
Binary files /dev/null and b/css/user/green/images/phone/icon_speaker_green.png differ
diff --git a/css/user/green/images/progressBar/VCcircle_green.png b/css/user/green/images/progressBar/VCcircle_green.png
new file mode 100644 (file)
index 0000000..c1f7ef5
Binary files /dev/null and b/css/user/green/images/progressBar/VCcircle_green.png differ
diff --git a/css/user/green/images/progressBar/handle_green.png b/css/user/green/images/progressBar/handle_green.png
new file mode 100644 (file)
index 0000000..8bebfcb
Binary files /dev/null and b/css/user/green/images/progressBar/handle_green.png differ
diff --git a/css/user/green/images/progressBar/icon_volume_green.png b/css/user/green/images/progressBar/icon_volume_green.png
new file mode 100644 (file)
index 0000000..1541080
Binary files /dev/null and b/css/user/green/images/progressBar/icon_volume_green.png differ
diff --git a/css/user/green/images/progressBar/progresbarbg.png b/css/user/green/images/progressBar/progresbarbg.png
new file mode 100644 (file)
index 0000000..c5cd05b
Binary files /dev/null and b/css/user/green/images/progressBar/progresbarbg.png differ
diff --git a/css/user/green/images/progressBar/progresbarbgstart.png b/css/user/green/images/progressBar/progresbarbgstart.png
new file mode 100644 (file)
index 0000000..62fac61
Binary files /dev/null and b/css/user/green/images/progressBar/progresbarbgstart.png differ
diff --git a/css/user/green/images/settings/screenshot_theme_blue.png b/css/user/green/images/settings/screenshot_theme_blue.png
new file mode 100644 (file)
index 0000000..d7886d8
Binary files /dev/null and b/css/user/green/images/settings/screenshot_theme_blue.png differ
diff --git a/css/user/green/images/settings/screenshot_theme_green.png b/css/user/green/images/settings/screenshot_theme_green.png
new file mode 100644 (file)
index 0000000..2a954f5
Binary files /dev/null and b/css/user/green/images/settings/screenshot_theme_green.png differ
diff --git a/css/user/green/images/store/bg_all_green.png b/css/user/green/images/store/bg_all_green.png
new file mode 100644 (file)
index 0000000..703a4e0
Binary files /dev/null and b/css/user/green/images/store/bg_all_green.png differ
diff --git a/css/user/green/images/store/bg_grid_green.png b/css/user/green/images/store/bg_grid_green.png
new file mode 100644 (file)
index 0000000..faa4d1d
Binary files /dev/null and b/css/user/green/images/store/bg_grid_green.png differ
diff --git a/css/user/green/images/store/rectangle.png b/css/user/green/images/store/rectangle.png
new file mode 100644 (file)
index 0000000..6f5527c
Binary files /dev/null and b/css/user/green/images/store/rectangle.png differ
diff --git a/css/user/green/images/store/square_03.png b/css/user/green/images/store/square_03.png
new file mode 100644 (file)
index 0000000..a68806a
Binary files /dev/null and b/css/user/green/images/store/square_03.png differ
diff --git a/css/user/green/images/store/star_grey.png b/css/user/green/images/store/star_grey.png
new file mode 100644 (file)
index 0000000..35f29b3
Binary files /dev/null and b/css/user/green/images/store/star_grey.png differ
diff --git a/css/user/green/images/store/star_white.png b/css/user/green/images/store/star_white.png
new file mode 100644 (file)
index 0000000..4f3599e
Binary files /dev/null and b/css/user/green/images/store/star_white.png differ
diff --git a/css/user/green/images/tabs/bg_top_navi_green.png b/css/user/green/images/tabs/bg_top_navi_green.png
new file mode 100644 (file)
index 0000000..4f3c63a
Binary files /dev/null and b/css/user/green/images/tabs/bg_top_navi_green.png differ
diff --git a/css/user/green/images/tabs/bg_top_navi_select_green.png b/css/user/green/images/tabs/bg_top_navi_select_green.png
new file mode 100644 (file)
index 0000000..1082d6a
Binary files /dev/null and b/css/user/green/images/tabs/bg_top_navi_select_green.png differ
diff --git a/css/user/green/images/tabs/bg_top_navi_unselect1px_green.png b/css/user/green/images/tabs/bg_top_navi_unselect1px_green.png
new file mode 100644 (file)
index 0000000..41101e8
Binary files /dev/null and b/css/user/green/images/tabs/bg_top_navi_unselect1px_green.png differ
diff --git a/css/user/green/images/tabs/bt_back_green.png b/css/user/green/images/tabs/bt_back_green.png
new file mode 100644 (file)
index 0000000..7c1f73d
Binary files /dev/null and b/css/user/green/images/tabs/bt_back_green.png differ
diff --git a/css/user/green/images/tabs/bt_close_green.png b/css/user/green/images/tabs/bt_close_green.png
new file mode 100644 (file)
index 0000000..51ace79
Binary files /dev/null and b/css/user/green/images/tabs/bt_close_green.png differ
diff --git a/css/user/green/images/topbaricons/top_bar_icons_bg_green.png b/css/user/green/images/topbaricons/top_bar_icons_bg_green.png
new file mode 100644 (file)
index 0000000..21f083a
Binary files /dev/null and b/css/user/green/images/topbaricons/top_bar_icons_bg_green.png differ
diff --git a/css/user/green/library.css b/css/user/green/library.css
new file mode 100644 (file)
index 0000000..797378c
--- /dev/null
@@ -0,0 +1,59 @@
+.libraryLeftPanel {
+       background-image: url('images/library/bg_left_panel_green.png');
+}
+
+.gridIcon {
+       background-image: url('images/library/bt_grid_green.png');
+}
+
+.gridIconActive {
+       background-image: url('images/library/bt_grid_act_green.png');
+}
+
+.gridIconDisabled {
+       background-image: url('images/library/bt_grid_green_disabled.png');
+}
+
+.listIcon {
+       background-image: url('images/library/bt_list_green.png');
+}
+
+.listIconActive {
+       background-image: url('images/library/bt_list_act_green.png');
+}
+
+.listIconDisabled {
+       background-image: url('images/library/bt_list_green_disabled.png');
+}
+
+.searchIcon {
+       background-image: url('images/library/bt_search_green.png');
+}
+
+.searchIconActive {
+       background-image: url('images/library/bt_search_act_green.png');
+}
+
+.searchIconDisabled {
+       background-image: url('images/library/bt_search_green_disabled.png');
+}
+
+.closeLibraryButton {
+       background-image: url('images/library/bt_close_green.png');
+}
+
+.libraryTopPanel {
+       background-image: url('images/library/bg_top_navi_green.png');
+}
+
+.libraryTab, .libraryTabClear, .libraryTabInlineClear {
+       background-image: url('images/library/bg_top_navi_unselect1px_green.png');
+}
+
+.libraryTabSelected {
+       background-image: url('images/library/bg_top_navi_select_green.png');
+}
+
+.closeLibrarySubPanelButton {
+       background-image: url('images/library/bt_back_green.png');
+}
\ No newline at end of file
diff --git a/css/user/green/musicplayer.css b/css/user/green/musicplayer.css
new file mode 100644 (file)
index 0000000..1c536e5
--- /dev/null
@@ -0,0 +1,55 @@
+#backgroundAudio {
+       background-image: url('images/musicplayer/bg_green.png');
+}
+
+.previousBtn {
+       background-image: url('images/musicplayer/icon_previous_green.png');
+}
+
+.previousBtnActive {
+       background-image:
+               url('images/musicplayer/icon_previous_enabled_green.png');
+}
+
+.pauseBtn {
+       background-image: url('images/musicplayer/icon_pause_green.png');
+}
+
+.nextBtn {
+       background-image: url('images/musicplayer/icon_next_green.png');
+}
+
+.nextBtnActive {
+       background-image: url('images/musicplayer/icon_next_enabled_green.png');
+}
+
+.shuffleBtn {
+       background-image: url('images/musicplayer/icon_shuffle_green.png');
+}
+
+.repeatBtn {
+       background-image: url('images/musicplayer/icon_repeat_green.png');
+}
+
+.playBtn {
+       background-image: url('images/musicplayer/icon_play_green.png');
+}
+
+.shuffleBtnActive {
+       background-image:
+               url('images/musicplayer/icon_shuffle_enabled_green.png');
+}
+
+.repeatBtnActive {
+       background-image:
+               url('images/musicplayer/icon_repeat_enabled_green.png');
+}
+
+.albumCarouselDescription {
+       background-image: url('images/musicplayer/grey_rectangle_green.png');
+}
+
+.albumThumbnail {
+       background-image: url('images/musicplayer/cover_album_green.png');
+       background-size: 100% 100%;
+}
\ No newline at end of file
diff --git a/css/user/green/navigation.css b/css/user/green/navigation.css
new file mode 100644 (file)
index 0000000..7d4d2c9
--- /dev/null
@@ -0,0 +1,7 @@
+.satelitteIcon {
+       background-image: url('images/navigation/icon_satellite_green.png');
+}
+
+.mapIcon {
+       background-image: url('images/navigation/icon_map_green.png');
+}
diff --git a/css/user/green/nouislider.fox.css b/css/user/green/nouislider.fox.css
new file mode 100644 (file)
index 0000000..ca8c622
--- /dev/null
@@ -0,0 +1,277 @@
+.noUiSliderLeft,
+       .noUiSliderLeft * {
+-webkit-box-sizing: border-box;
+   -moz-box-sizing: border-box;
+               box-sizing: border-box;
+-webkit-user-select: none;
+   -moz-user-select: none;
+       -ms-user-select: none;
+               display: block;
+               cursor: default;
+       }
+       .noUiSliderLeft {
+               position: relative;
+       }
+       .noUiSliderLeft a {
+               position: absolute;
+               z-index: 1;
+       }
+       .noUiSliderLeft a:nth-child(2) {
+               background: inherit !important;
+       }
+       .noUiSliderLeft.vertical a {
+               width: 100%;
+               bottom: 0;
+       }
+
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+       .noUiSliderLeft:before,
+       body.TOUCH,
+       .noUiSliderLeft div {
+               -ms-touch-action: none;
+       }
+       .noUiSliderLeft:before {
+               display: block;
+               position: absolute;
+               width: 150%;
+               left: -25%;
+               height: 400%;
+               top: -150%;
+               content: "";
+               z-index: -1;
+       }
+       .noUiSliderLeft.vertical:before {
+               width: 400%;
+               left: -150%;
+               height: 150%;
+               top: -25%;
+       }
+}
+       .noUiSliderLeft {
+               /*border: 1px solid #908d84;*/
+               border-radius: 3px;
+       }
+       .noUiSliderLeft.connect a,
+       .noUiSliderLeft.connect.lower {
+
+               background:url("images/hvac/temp_bar_on_left.svg") no-repeat left bottom;
+               /*background-size:85.9%;        */
+               /*background: #b2a98f;*/
+       }
+       .noUiSliderLeft.disabled,
+       .noUiSliderLeft.disabled.connect.lower a {
+               background: #ccc;
+               box-shadow: none;
+       }
+       .noUiSliderLeft div {
+               height: 100px;
+
+               border-radius: 3px;
+               background: #efefe7;
+               background:url("images/hvac/drag_knob.svg") no-repeat center center;
+               background-size:15%;
+
+       }
+       .noUiSliderLeft.disabled div {
+               background: transparent;
+       }
+       .noUiSliderLeft.vertical {
+               width: 11%;
+               height: 37.6%;
+       }
+       .noUiSliderLeft.vertical div {
+               margin: -50px -60px 0 -5px;
+       }
+       .noUiSliderLeft{
+               left:3%;
+               top:18%;
+               height:40%;
+       }
+
+
+       /*********RIGHT*******/
+
+       .noUiSliderRight,
+       .noUiSliderRight * {
+-webkit-box-sizing: border-box;
+   -moz-box-sizing: border-box;
+               box-sizing: border-box;
+-webkit-user-select: none;
+   -moz-user-select: none;
+       -ms-user-select: none;
+               display: block;
+               cursor: default;
+       }
+       .noUiSliderRight {
+               position: relative;
+       }
+       .noUiSliderRight a {
+               position: absolute;
+               z-index: 1;
+       }
+       .noUiSliderRight a:nth-child(2) {
+               background: inherit !important;
+       }
+       .noUiSliderRight.vertical a {
+               width: 100%;
+               bottom: 0;
+       }
+       .noUiSliderRight.horizontal a {
+               height: 100%;
+               right: 0;
+       }
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+       .noUiSliderRight:before,
+       body.TOUCH,
+       .noUiSliderRight div {
+               -ms-touch-action: none;
+       }
+       .noUiSliderRight:before {
+               display: block;
+               position: absolute;
+               width: 150%;
+               left: -25%;
+               height: 400%;
+               top: -150%;
+               content: "";
+               z-index: -1;
+       }
+       .noUiSliderRight.vertical:before {
+               width: 400%;
+               left: -150%;
+               height: 150%;
+               top: -25%;
+       }
+}
+       .noUiSliderRight {
+               /*border: 1px solid #908d84;*/
+               border-radius: 3px;
+       }
+       .noUiSliderRight.connect a,
+       .noUiSliderRight.connect.lower {
+               /*background: #b2a98f;*/
+               background:url("images/hvac/temp_bar_on_right.svg") no-repeat right bottom;
+               /*background-size:85.9%;*/
+       }
+       .noUiSliderRight.disabled,
+       .noUiSliderRight.disabled.connect.lower a {
+               background: #ccc;
+               box-shadow: none;
+       }
+       .noUiSliderRight div {
+               height: 100px;
+               border-radius: 3px;
+               background: #efefe7;
+               background:url("images/hvac/drag_knob.svg") no-repeat center center;
+               background-size:15%;
+       }
+       .noUiSliderRight.disabled div {
+               background: transparent;
+       }
+       .noUiSliderRight.vertical {
+               width: 11%;
+               height: 37.6%;
+       }
+       .noUiSliderRight.vertical div {
+               margin: -50px -5px 0 -60px;
+       }
+       .noUiSliderRight{
+               position:absolute;
+               left:86.25%;
+               top:18%;
+               height:40%;
+       }
+
+/*********FAN*******/
+
+       .noUiSliderFan,
+       .noUiSliderFan * {
+-webkit-box-sizing: border-box;
+   -moz-box-sizing: border-box;
+               box-sizing: border-box;
+-webkit-user-select: none;
+   -moz-user-select: none;
+       -ms-user-select: none;
+               display: block;
+               cursor: default;
+       }
+       .noUiSliderFan {
+               position: relative;
+       }
+       .noUiSliderFan a {
+               position: absolute;
+               z-index: 1;
+       }
+       .noUiSliderFan a:nth-child(2) {
+               background: inherit !important;
+       }
+       .noUiSliderFan.vertical a {
+               width: 100%;
+               bottom: 0;
+       }
+       .noUiSliderFan.horizontal a {
+               height: 100%;
+               right: 0;
+       }
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+       .noUiSliderFan:before,
+       body.TOUCH,
+       .noUiSliderFan div {
+               -ms-touch-action: none;
+       }
+       .noUiSliderFan:before {
+               display: block;
+               position: absolute;
+               width: 150%;
+               left: -25%;
+               height: 400%;
+               top: -150%;
+               content: "";
+               z-index: -1;
+       }
+       .noUiSliderFan.vertical:before {
+               width: 400%;
+               left: -150%;
+               height: 150%;
+               top: -25%;
+       }
+}
+       .noUiSliderFan {
+               /*border: 1px solid #908d84;*/
+               border-radius: 3px;
+       }
+       .noUiSliderFan.connect a,
+       .noUiSliderFan.connect.lower {
+               /*background: #b2a98f;*/
+               /*background:url("images/hvac/temp_bar_on_right.svg") no-repeat right bottom;   */
+               background-size:85.9%;
+       }
+       .noUiSliderFan.disabled,
+       .noUiSliderFan.disabled.connect.lower a {
+               background: #ccc;
+               box-shadow: none;
+       }
+       .noUiSliderFan div {
+               width:80px;
+               height: 100%;
+               border-radius: 3px;
+               background: #efefe7;
+               background:url("images/hvac/drag_knob.svg") no-repeat center bottom;
+               background-size:26%;
+       }
+       .noUiSliderFan.disabled div {
+               background: transparent;
+       }
+       .noUiSliderFan.horizontal {
+               width: 42.5%;
+               height: 10.75%;
+       }
+       .noUiSliderFan.horizontal div {
+               margin: 0 0 0 -40px;
+       }
+       .noUiSliderFan{
+               position:absolute;
+               left:33%;
+               top:55%;
+               height:12%;
+       }
\ No newline at end of file
diff --git a/css/user/green/phone.css b/css/user/green/phone.css
new file mode 100644 (file)
index 0000000..c7912dc
--- /dev/null
@@ -0,0 +1,83 @@
+.phoneBody {
+       background-image: url("images/phone/bg_with_glow_green.png");
+}
+
+.deleteButton {
+       background-image: url("images/phone/bt_delete_green.png");
+}
+
+.callingTrue {
+       background-image: url("images/phone/icon_endcall_green.png");
+}
+
+.callingFalse {
+       background-image: url("images/phone/icon_call_green.png");
+}
+
+.carouselNumber {
+       background-image: url("images/phone/icon_number_green.png");
+}
+
+.speakerButton {
+       background-image: url("images/phone/icon_speaker_green.png");
+}
+
+.muteButton {
+       background-image: url("images/phone/icon_mute_green.png");
+}
+
+.holdButton {
+       background-image: url("images/phone/icon_hold_green.png");
+}
+
+.addCallButton {
+       background-image: url("images/phone/icon_addcall_green.png");
+}
+
+.isFavoriteTrue {
+       background-image: url("images/phone/icon_favorite_true_green.png");
+}
+
+.isFavoriteFalse {
+       background-image: url("images/phone/icon_favorite_false_green.png");
+}
+
+.phoneIcon {
+       background-image: url("images/phone/icon_mobile_green.png");
+}
+
+.contactDetailBox3:hover .phoneIcon {
+       background-image: url("images/phone/icon_mobile_green_hover.png");
+}
+
+.contactDetailBox3 .phoneIcon:hover {
+       background-image: url("images/phone/icon_mobile_green_hover.png");
+}
+
+.emailIcon {
+       background-image: url("images/phone/icon_email_green.png");
+}
+
+.addressIcon {
+       background-image: url("images/phone/icon_address_green.png");
+}
+
+.missedCallIcon {
+       background-image: url("images/phone/icon_missed_green.png");
+}
+
+.missedNewCallIcon {
+       background-image: url("images/phone/icon_missed_new_green.png");
+}
+
+.receivedCallIcon {
+       background-image: url("images/phone/icon_received_green.png");
+}
+
+.dialedCallIcon {
+       background-image: url("images/phone/icon_dialed_green.png");
+}
+
+.noContactPhoto {
+       background-image: url("images/phone/contact_picture_green.png");
+}
\ No newline at end of file
diff --git a/css/user/green/progressBarImg.css b/css/user/green/progressBarImg.css
new file mode 100644 (file)
index 0000000..935e278
--- /dev/null
@@ -0,0 +1,19 @@
+#VCicon {
+    background-image: url(./images/progressBar/icon_volume_green.png);
+}
+
+#VCcircle {
+    background-image: url(./images/progressBar/handle_green.png);
+}
+
+.noVolumeSlider div {
+       background:url("images/progressBar/handle_green.png") no-repeat center center;
+}
+
+.noVolumeSlider.connect.lower a {
+       background:url("images/progressBar/progresbarbg.png") repeat-x left center;
+}
+
+.sliderStart{
+       background-image: url(./images/progressBar/progresbarbgstart.png);
+}
\ No newline at end of file
diff --git a/css/user/green/settings.css b/css/user/green/settings.css
new file mode 100644 (file)
index 0000000..6145106
--- /dev/null
@@ -0,0 +1 @@
+/* styling for settings screens*/
\ No newline at end of file
diff --git a/css/user/green/store.css b/css/user/green/store.css
new file mode 100644 (file)
index 0000000..befddc0
--- /dev/null
@@ -0,0 +1,16 @@
+/* application store style*/
+.storeBackground {
+       background-image: url('images/store/bg_all_green.png');
+}
+
+.iconStarActive{
+       background-image: url('images/store/star_white.png');
+}
+
+.iconStarInActive{
+       background-image: url('images/store/star_grey.png');
+}
+
+.storePopAppInfo {
+       background-image: url('images/musicplayer/grey_rectangle_green.png');
+}
\ No newline at end of file
diff --git a/css/user/green/tabs.css b/css/user/green/tabs.css
new file mode 100644 (file)
index 0000000..71a4336
--- /dev/null
@@ -0,0 +1,19 @@
+.tabsCloseButton {
+       background-image: url('images/tabs/bt_close_green.png');
+}
+
+.tabsTopPanel {
+       background-image: url('images/tabs/bg_top_navi_green.png');
+}
+
+.tabsTab, .tabsTabClear {
+       background-image: url('images/tabs/bg_top_navi_unselect1px_green.png');
+}
+
+.tabsTabSelected {
+       background-image: url('images/tabs/bg_top_navi_select_green.png');
+}
+
+.tabsCloseSubPanelButton {
+       background-image: url('images/tabs/bt_back_green.png');
+}
\ No newline at end of file
diff --git a/css/user/green/theme.json b/css/user/green/theme.json
new file mode 100644 (file)
index 0000000..e8b0c9a
--- /dev/null
@@ -0,0 +1,7 @@
+{
+       "id": "http://com.intel.tizen/green",
+       "name": "Green theme",
+       "type": "user",
+        "version": "0.5.0",
+       "icon": "icon.png"
+}
\ No newline at end of file
diff --git a/css/user/green/topbariconsimages.css b/css/user/green/topbariconsimages.css
new file mode 100644 (file)
index 0000000..e7a4454
--- /dev/null
@@ -0,0 +1,3 @@
+.topBarIcons {
+       background-image: url('images/topbaricons/top_bar_icons_bg_green.png');
+}
\ No newline at end of file
diff --git a/css/user/green/user.css b/css/user/green/user.css
new file mode 100644 (file)
index 0000000..58e4bb4
--- /dev/null
@@ -0,0 +1,34 @@
+/* APPLICATIONS */
+@import url("./musicplayer.css");
+@import url("./store.css");
+@import url("./homescreen.css");
+@import url("./dashboard.css");
+@import url("./phone.css");
+@import url("./settings.css");
+@import url("./hvac.css");
+@import url("./nouislider.fox.css");
+@import url("./navigation.css");
+
+/* COMPONENTS */
+@import url("./common.css");
+@import url("./topbariconsimages.css");
+@import url("./bottombaricons.css");
+@import url("./progressBarImg.css");
+@import url("./library.css");
+@import url("./tabs.css");
+
+.libraryButton {
+       background-image: url("images/common/bt_library_green.png");
+}
+
+.backButton {
+       background-image: url("images/common/bt_back_green.png");
+}
+
+.previousButton {
+       background-image: url("images/common/bt_previous_green.png");
+}
+
+.nextButton {
+       background-image: url("images/common/bt_next_green.png");
+}
\ No newline at end of file
diff --git a/css/user/green/user.js b/css/user/green/user.js
new file mode 100644 (file)
index 0000000..0bc981c
--- /dev/null
@@ -0,0 +1,2 @@
+var ThemeKeyColor = "#4DA022";
+var ThemeKeyColorSelected = "#66d22d";
diff --git a/js/services/bootstrap.js b/js/services/bootstrap.js
new file mode 100644 (file)
index 0000000..db47fb0
--- /dev/null
@@ -0,0 +1,236 @@
+/*global loadScript, ThemeEngine, Configuration, CarIndicator, IncomingCall, Speech */
+/**
+ * @module Services
+ */
+
+/**
+ * This class provides unified way to boot up the HTML applications by loading shared components in proper order:
+ *
+ * * {{#crossLink "Configuration"}}{{/crossLink}}
+ * * {{#crossLink "ThemeEngine"}}{{/crossLink}}
+ * * {{#crossLink "CarIndicator"}}{{/crossLink}}
+ * * {{#crossLink "Speech"}}{{/crossLink}}
+ * * {{#crossLink "IncomingCall"}}{{/crossLink}}
+ *
+ * To start bootstraping process in application include following snippet to your `index.html` page `<head>` section:
+ *
+ *     <script type='text/javascript' src='./js/services/bootstrap.js'></script>
+ *
+ * and include following script into `document.ready()` code:
+ *
+ *     $(document).ready(function() {
+ *        "use strict";
+ *        var bootstrap = new Bootstrap(function(status) {
+ *           // Perform any additional intialization
+ *        });
+ *     });
+ *
+ * @class Bootstrap
+ * @constructor
+ * @param callback {function(error)} Callback function called after whole boot up process is finished or if issue was detected during the process. Parameter `error` will contain any error that
+ * was intercepted.
+ */
+
+var Bootstrap = function(callback) {
+       "use strict";
+       var self = this;
+       callback = callback || function() {};
+
+       console.log("Loading Configuration object");
+
+       loadScript('./css/car/components/configuration/configuration.js', function(path, status) {
+               if (status === "ok") {
+                       Configuration.reload(function() {
+                               self.loadThemeEngine(callback);
+                       });
+               } else {
+                       console.log("Error occured during loading of Configuration", status);
+                       callback(status);
+               }
+       });
+};
+
+/**
+ * Theme engine object; available after bootstap process is finished.
+ * @property themeEngine
+ * @type ThemeEngine
+ */
+Bootstrap.prototype.themeEngine = null;
+
+/**
+ * Car indicators object; available after bootstap process is finished.
+ * @property carIndicator
+ * @type CarIndicator
+ */
+Bootstrap.prototype.carIndicator = null;
+
+/**
+ * Incoming call object; available after bootstap process is finished.
+ * @property incomingCall
+ * @type IncomingCall
+ */
+Bootstrap.prototype.incomingCall = null;
+
+/**
+ * This method initialize theme engine.
+ * @method loadThemeEngine
+ * @param callback {function(error)} Callback function called after method is finished. Parameter `error` will contain any error that was intercepted.
+ */
+Bootstrap.prototype.loadThemeEngine = function(callback) {
+       "use strict";
+       var self = this;
+
+       console.log("Loading ThemeEngine object");
+
+       loadScript('./js/services/themeengine.js', function(path, status) {
+               if (status === "ok") {
+                       self.themeEngine = ThemeEngine;
+                       self.themeEngine.init(function(themeStatus) {
+                               if (!themeStatus) {
+                                       self.initCarIndicators(callback);
+                               } else {
+                                       callback(themeStatus);
+                               }
+                       });
+               } else {
+                       console.log("Error occured during loading of Configuration", status);
+                       callback(status);
+               }
+       });
+};
+
+/**
+ * This method initialize car indicator component and attaches to AMB system.
+ * @method initCarIndicators
+ * @param callback {function(error)} Callback function called after method is finished. Parameter `error` will contain any error that was intercepted.
+ */
+Bootstrap.prototype.initCarIndicators = function(callback) {
+       "use strict";
+       var self = this;
+
+       console.log("Loading CarIndicators object");
+
+       loadScript('./js/services/carIndicator.js', function(path, status) {
+               if (status === "ok") {
+                       try {
+                               self.carIndicator = new CarIndicator();
+
+                               self.carIndicator.addListener({
+                                       onNightModeChanged: function(nightMode) {
+                                               self.themeEngine.setUserTheme("http://com.intel.tizen/" + (nightMode ? "blue" : "green"));
+                                       }
+                               });
+                               self.initSpeech(callback);
+                       } catch (ex) {
+                               console.error("Error occured during CarIndicator initialization", ex);
+                               callback(ex);
+                       }
+               } else {
+                       console.log("Error occured during loading of Configuration", status);
+                       callback(status);
+               }
+       });
+};
+/**
+ * This method initialize incoming call component and attaches to incoming call signal.
+ * @method initIncomingCall
+ * @param callback {function(error)} Callback function called after method is finished. Parameter `error` will contain any error that was intercepted.
+ */
+Bootstrap.prototype.initIncomingCall = function(callback) {
+       "use strict";
+       var self = this;
+
+       console.log("Loading IncomingCall object");
+       loadScript('./css/car/components/boxCaption/boxCaption.js', function(path, status) {
+               if (status === "ok") {
+
+                       loadScript('./css/car/components/incomingCall/incomingCall.js', function(path, status) {
+                               if (status === "ok") {
+                                       try {
+                                               self.incomingCall = new IncomingCall();
+                                               if (typeof(tizen) !== 'undefined' && tizen.phone) {
+                                                       tizen.phone.addCallChangedListener(function(result) {
+                                                               /* global getAppByID */
+                                                               var appId = getAppByID('intelPoc15.phone');
+
+                                                               var contact;
+                                                               if (!!result.contact.name) {
+                                                                       contact = result.contact;
+                                                               } else {
+                                                                       contact = {
+                                                                               phoneNumbers: [{
+                                                                                       /* jshint camelcase: false */
+                                                                                       number: tizen.phone.activeCall.line_id
+                                                                                       /* jshint camelcase: true */
+                                                                               }]
+
+                                                                       };
+                                                               }
+
+                                                               console.log("result.state " + result.state);
+                                                               switch (result.state.toLowerCase()) {
+                                                                       case "DISCONNECTED".toLowerCase():
+                                                                               self.incomingCall.denyCall();
+                                                                               Configuration.set("acceptedCall", "false");
+                                                                               break;
+                                                                       case "ACTIVE".toLowerCase():
+                                                                               if (Configuration._values.acceptedCall !== "true") {
+                                                                                       self.incomingCall.acceptIncommingCall();
+                                                                                       Configuration.set("acceptedCall", "true");
+                                                                               }
+                                                                               break;
+                                                                       case "DIALING".toLowerCase():
+                                                                               if (!appId.running) {
+                                                                                       /*global launchApplication*/
+                                                                                       launchApplication('intelPoc15.phone');
+                                                                               }
+                                                                               break;
+                                                                       case "INCOMING".toLowerCase():
+                                                                               self.incomingCall.show(contact);
+                                                                               break;
+                                                               }
+                                                       });
+                                               }
+                                               callback();
+                                       } catch (ex) {
+                                               console.error("Error occured during IncomingCall initialization", ex);
+                                               callback(ex);
+                                       }
+                               } else {
+                                       console.log("Error occured during loading of Configuration", status);
+                                       callback(status);
+                               }
+                       });
+               }
+       });
+};
+/**
+ * This method initialize speech functionality.
+ * @method initSpeech
+ * @param callback {function(error)} Callback function called after method is finished. Parameter `error` will contain any error that was intercepted.
+ */
+Bootstrap.prototype.initSpeech = function(callback) {
+       "use strict";
+       var self = this;
+       loadScript('./js/services/speech.js', function(path, status) {
+               Speech.readCurrentAppName();
+               self.reload();
+               self.initIncomingCall(callback);
+       });
+};
+
+/**
+ * This method reloads configuration.
+ * @method reload
+ */
+Bootstrap.prototype.reload = function() {
+       "use strict";
+       document.addEventListener("webkitvisibilitychange", function() {
+               Configuration.reload();
+               Speech.readCurrentAppName();
+       }, false);
+       // workaround for webkitvisibilitychange
+       setInterval(function() {
+               Configuration.reload();
+       }, 1000);
+};
\ No newline at end of file
diff --git a/js/services/carIndicator.js b/js/services/carIndicator.js
new file mode 100644 (file)
index 0000000..c4cfd4e
--- /dev/null
@@ -0,0 +1,718 @@
+/**
+ * @module Services
+ */
+
+/**
+ * Class provides AMB related functionality utilizing `tizen.vehicle` API for signals used in HTML applications. This component is usually initialized by {{#crossLink "Bootstrap"}}{{/crossLink}} class
+ * and can be later accessed using {{#crossLink "Bootstrap/carIndicator:property"}}{{/crossLink}} property. Signals recognized by this class needs to be registered in property
+ * {{#crossLink "CarIndicator/_mappingTable:property"}}{{/crossLink}}.
+ *
+ * To attach and detach to particular property register new callback object using {{#crossLink "Bootstrap/carIndicator:addListener"}}{{/crossLink}} method, e.g.:
+ *
+ *     var listenerId = bootstrap.carIndicator.addListener({
+ *        onSteeringWheelAngleChanged: function(newValue){
+ *           // Process new value
+ *        },
+ *        onWheelBrakeChanged : function(newValue){
+ *           // Process new value
+ *        }
+ *     });
+ *
+ *     // Unregister listener
+ *     bootstrap.carIndicator.removeListener(listenerId);
+ *
+ * Currently following signals are recognized:
+ *
+ * * SteeringWheelAngle
+ *   * SteeringWheelAngle
+ * * WheelBrake
+ *   * Engaged
+ * * TirePressure
+ *   * leftFront
+ *   * rightFront
+ *   * leftRear
+ *   * rightRear
+ * * DoorStatus
+ *   * ChildLockStatus
+ * * WindowStatus
+ *   * FrontDefrost
+ *   * RearDefrost
+ * * HVAC
+ *   * FanSpeed
+ *   * TargetTemperatureRight
+ *   * TargetTemperatureLeft
+ *   * SeatHeaterRight
+ *   * SeatHeaterLeft
+ *   * AirConditioning
+ *   * AirRecirculation
+ *   * AirflowDirection
+ * * LightStatus
+ *   * Hazard
+ *   * Head
+ *   * Parking
+ * * BatteryStatus
+ * * FullBatteryRange
+ * * ExteriorTemperature
+ *   * Exterior
+ * * InteriorTemperature
+ *   * Interior
+ * * WheelInformation
+ *   * FrontWheelRadius
+ * * AvgKW
+ *   * AvgKW
+ * * VehicleSpeed
+ * * Odometer
+ * * Transmission
+ *   * ShiftPosition
+ * * ExteriorBrightness
+ * * NightMode
+ * * DirectionIndicationINST
+ * * DirectionIndicationMS
+ * * ACCommand
+ * * RecircReq
+ * * FrontTSetRightCmd
+ * * FrontTSetLeftCmd
+ * * FrontBlwrSpeedCmd
+ * * HeatedSeatFRModeRequest
+ * * HeatedSeatFRRequest
+ * * HeatedSeatFLModeRequest
+ * * HeatedSeatFLRequest
+ * * FLHSDistrCmd
+ * * FRHSDistrCmd
+ *
+ * @class CarIndicator
+ * @constructor
+ */
+var CarIndicator = function() {
+       "use strict";
+       console.info("Starting up service CarIndicator");
+};
+
+function parseInteger(value) {
+       "use strict";
+       return parseInt(value, 10);
+}
+
+function parseTirePressure(value) {
+       "use strict";
+       var floatValue = parseFloat(value).toFixed(2);
+       if (floatValue > 180 && floatValue < 220) {
+               floatValue = "OK";
+       }
+       return floatValue;
+}
+
+/**
+ * Array of registered listeners
+ * @type Object
+ * @property _listeners
+ * @private
+ */
+CarIndicator.prototype._listeners = {};
+
+/**
+ * Array of registered listener IDs.
+ * @type Array
+ * @property _listenerIDs
+ * @private
+ */
+CarIndicator.prototype._listenerIDs = [];
+
+/**
+ * Signal mapping table.
+ * Each entry should form an object
+ * @property _mappingTable
+ * @private
+ * @type Object
+ */
+CarIndicator.prototype._mappingTable = {
+       /*
+       ZONE_None   = 000000;
+       ZONE_Front  = 000001;
+       ZONE_Middle = 000010;
+       ZONE_Right  = 000100;
+       ZONE_Left   = 001000;
+       ZONE_Rear   = 010000;
+       ZONE_Center = 100000;
+       */
+       /* this is for steeringWheel game controler */
+       "SteeringWheelAngle" : {
+               propertyName : "SteeringWheelAngle",
+               callBackPropertyName : "SteeringWheelAngle",
+               subscribeName : "SteeringWheelAngle",
+               conversionFunction : function(value) {
+                       "use strict";
+                       value = parseInt(value, 10);
+                       var returnValue = 0;
+                       if (value <= 180 && value > 0) {
+                               returnValue = (1 * (value / 6)) - 30;
+                       } else if (value <= 360 && value > 180) {
+                               returnValue = ((value - 179) / 6);
+                       } else if (value === 0) {
+                               returnValue = -30;
+                       }
+                       return returnValue;
+               },
+               zone : "000000"
+
+       },
+       "WheelBrake" : {
+               propertyName : "Engaged",
+               callBackPropertyName : "WheelBrake",
+               subscribeName : "WheelBrake",
+               zone : "000000"
+       },
+       /* end steeringWheel game controler*/
+       "TirePressureLeftFront" : {
+               propertyName : "leftFront",
+               callBackPropertyName : "tirePressureLeftFront",
+               subscribeName : "TirePressure",
+               conversionFunction : parseTirePressure,
+               zone : "000000"
+       },
+       "TirePressureRightFront" : {
+               propertyName : "rightFront",
+               callBackPropertyName : "tirePressureRightFront",
+               subscribeName : "TirePressure",
+               conversionFunction : parseTirePressure,
+               zone : "000000"
+       },
+       "TirePressureLeftRear" : {
+               propertyName : "leftRear",
+               callBackPropertyName : "tirePressureLeftRear",
+               subscribeName : "TirePressure",
+               conversionFunction : parseTirePressure,
+               zone : "000000"
+       },
+       "TirePressureRightRear" : {
+               propertyName : "rightRear",
+               callBackPropertyName : "tirePressureRightRear",
+               subscribeName : "TirePressure",
+               conversionFunction : parseTirePressure,
+               zone : "000000"
+       },
+       "ChildLock" : {
+               propertyName : "ChildLockStatus",
+               callBackPropertyName : "childLock",
+               subscribeName : "DoorStatus",
+               zone : "000000"
+       },
+       "FrontDefrost" : {
+               propertyName : "Defrost",
+               callBackPropertyName : "frontDefrost",
+               subscribeName : "WindowStatus",
+               zone : "000001"
+       },
+       "RearDefrost" : {
+               propertyName : "Defrost",
+               callBackPropertyName : "rearDefrost",
+               subscribeName : "WindowStatus",
+               zone : "010000"
+       },
+       "FanSpeed" : {
+               propertyName : "FanSpeed",
+               callBackPropertyName : "fanSpeed",
+               subscribeName : "HVAC",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "TargetTemperatureRight" : {
+               propertyName : "TargetTemperature",
+               callBackPropertyName : "targetTemperatureRight",
+               subscribeName : "HVAC",
+               conversionFunction : parseInteger,
+               zone : "000100"
+       },
+       "TargetTemperatureLeft" : {
+               propertyName : "TargetTemperature",
+               callBackPropertyName : "targetTemperatureLeft",
+               subscribeName : "HVAC",
+               conversionFunction : parseInteger,
+               zone : "001000"
+       },
+       "Hazard" : {
+               propertyName : "Hazard",
+               callBackPropertyName : "hazard",
+               subscribeName : "LightStatus",
+               zone : "000000"
+       },
+       "Head" : {
+               propertyName : "Head",
+               callBackPropertyName : "frontLights",
+               subscribeName : "LightStatus",
+               zone : "000000"
+       },
+       "SeatHeaterRight" : {
+               propertyName : "SeatHeater",
+               callBackPropertyName : "seatHeaterRight",
+               subscribeName : "HVAC",
+               zone : "000101"
+       },
+       "SeatHeaterLeft" : {
+               propertyName : "SeatHeater",
+               callBackPropertyName : "seatHeaterLeft",
+               subscribeName : "HVAC",
+               zone : "001001"
+       },
+       "Parking" : {
+               propertyName : "Parking",
+               callBackPropertyName : "rearLights",
+               subscribeName : "LightStatus",
+               zone : "000000"
+       },
+       "AirConditioning" : {
+               propertyName : "AirConditioning",
+               callBackPropertyName : "fan",
+               subscribeName : "HVAC",
+               zone : "000000"
+       },
+       "AirRecirculation" : {
+               propertyName : "AirRecirculation",
+               callBackPropertyName : "airRecirculation",
+               subscribeName : "HVAC",
+               zone : "000000"
+       },
+       "AirflowDirection" : {
+               propertyName : "AirflowDirection",
+               callBackPropertyName : "airflowDirection",
+               subscribeName : "HVAC",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "BatteryStatus" : {
+               propertyName : "BatteryStatus",
+               callBackPropertyName : "batteryStatus",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "FullBatteryRange" : {
+               propertyName : "FullBatteryRange",
+               callBackPropertyName : "fullBatteryRange",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "Exterior" : {
+               propertyName : "Exterior",
+               callBackPropertyName : "outsideTemp",
+               subscribeName : "ExteriorTemperature",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "Interior" : {
+               propertyName : "Interior",
+               callBackPropertyName : "insideTemp",
+               subscribeName : "InteriorTemperature",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "WheelAngle" : {
+               propertyName : "FrontWheelRadius",
+               callBackPropertyName : "wheelAngle",
+               subscribeName : "WheelInformation",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "Weather" : {
+               propertyName : "Weather",
+               callBackPropertyName : "weather",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "AvgKW" : {
+               propertyName : "AvgKW",
+               callBackPropertyName : "avgKW",
+               subscribeName : "AvgKW",
+               conversionFunction : function(newValue) {
+                       "use strict";
+                       return parseFloat(newValue).toFixed(2);
+               },
+               zone : "000000"
+       },
+       "VehicleSpeed" : {
+               propertyName : "VehicleSpeed",
+               callBackPropertyName : "speed",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "Odometer" : {
+               propertyName : "Odometer",
+               callBackPropertyName : "odoMeter",
+               conversionFunction : parseInteger,
+               zone : "000000"
+       },
+       "TransmissionShiftPosition" : {
+               propertyName : "ShiftPosition",
+               callBackPropertyName : "gear",
+               conversionFunction : function(value) {
+                       "use strict";
+                       switch (value) {
+                       case 0:
+                               value = "N";
+                               break;
+                       case 64:
+                               value = "C";
+                               break;
+                       case 96:
+                               value = "D";
+                               break;
+                       case 128:
+                               value = "R";
+                               break;
+                       case 255:
+                               value = "P";
+                               break;
+                       }
+                       return value;
+               },
+               subscribeName : "Transmission",
+               zone : "000000"
+       },
+       "Randomize" : {
+               propertyName : "Randomize",
+               callBackPropertyName : "randomize",
+               subscribeName : "Randomize",
+               zone : "000000"
+       },
+       "ExteriorBrightness" : {
+               propertyName : "ExteriorBrightness",
+               callBackPropertyName : "exteriorBrightness",
+               zone : "000000"
+       },
+       "NightMode" : {
+               propertyName : "NightMode",
+               callBackPropertyName : "nightMode",
+               zone : "000000"
+       },
+       "DirectionIndicationINST" : {
+               propertyName : "DirectionIndicationINST",
+               callBackPropertyName : "DirectionIndicationINST",
+               subscribeName : "DirectionIndicationINST",
+               zone : "000000"
+       },
+       "DirectionIndicationMS" : {
+               propertyName : "DirectionIndicationMS",
+               callBackPropertyName : "DirectionIndicationMS",
+               subscribeName : "DirectionIndicationMS",
+               zone : "000000"
+       },
+       "ACCommand" : {
+               propertyName : "ACCommand",
+               callBackPropertyName : "ACCommand",
+               subscribeName : "ACCommand",
+               zone : "000000"
+       },
+       "RecircReq" : {
+               propertyName : "RecircReq",
+               callBackPropertyName : "RecircReq",
+               subscribeName : "RecircReq",
+               zone : "000000"
+       },
+       "FrontTSetRightCmd" : {
+               propertyName : "FrontTSetRightCmd",
+               callBackPropertyName : "FrontTSetRightCmd",
+               subscribeName : "FrontTSetRightCmd",
+               zone : "000000"
+       },
+       "FrontTSetLeftCmd" : {
+               propertyName : "FrontTSetLeftCmd",
+               callBackPropertyName : "FrontTSetLeftCmd",
+               subscribeName : "FrontTSetLeftCmd",
+               zone : "000000"
+       },
+       "FrontBlwrSpeedCmd" : {
+               propertyName : "FrontBlwrSpeedCmd",
+               callBackPropertyName : "FrontBlwrSpeedCmd",
+               subscribeName : "FrontBlwrSpeedCmd",
+               zone : "000000"
+       },
+       "HeatedSeatFRModeRequest" : {
+               propertyName : "HeatedSeatFRModeRequest",
+               callBackPropertyName : "HeatedSeatFRModeRequest",
+               subscribeName : "HeatedSeatFRModeRequest",
+               zone : "000000"
+       },
+       "HeatedSeatFRRequest" : {
+               propertyName : "HeatedSeatFRRequest",
+               callBackPropertyName : "HeatedSeatFRRequest",
+               subscribeName : "HeatedSeatFRRequest",
+               zone : "000000"
+       },
+       "HeatedSeatFLModeRequest" : {
+               propertyName : "HeatedSeatFLModeRequest",
+               callBackPropertyName : "HeatedSeatFLModeRequest",
+               subscribeName : "HeatedSeatFLModeRequest",
+               zone : "000000"
+       },
+       "HeatedSeatFLRequest" : {
+               propertyName : "HeatedSeatFLRequest",
+               callBackPropertyName : "HeatedSeatFLRequest",
+               subscribeName : "HeatedSeatFLRequest",
+               zone : "000000"
+       },
+       "FLHSDistrCmd" : {
+               propertyName : "FLHSDistrCmd",
+               callBackPropertyName : "FLHSDistrCmd",
+               subscribeName : "FLHSDistrCmd",
+               zone : "000000"
+       },
+       "FRHSDistrCmd" : {
+               propertyName : "FRHSDistrCmd",
+               callBackPropertyName : "FRHSDistrCmd",
+               subscribeName : "FRHSDistrCmd",
+               zone : "000000"
+       }
+};
+
+/**
+ * This method adds listener object for car events. Object should define function callbacks taking signal names from mapping table, e.g.:
+ * @example
+ *     {
+ *        onBatteryChange: function(newValue, oldValue) {}
+ *     }
+ * Methods are called back with new and last known values.
+ * @method addListener
+ * @param callback {Object} object with callback functions.
+ * @return {Integer} WatchID for later removal of listener.
+ */
+CarIndicator.prototype.addListener = function(aCallbackObject) {
+       "use strict";
+       var id = Math.floor(Math.random() * 1000000);
+       var self = this;
+       this._listeners[id] = aCallbackObject;
+       this._listenerIDs.push(id);
+
+       var subscribeCallback = function(data) {
+               self.onDataUpdate(data, self);
+       };
+       for ( var i in aCallbackObject) {
+               if (aCallbackObject.hasOwnProperty(i)) {
+                       var prop = i.replace("on", "").replace("Changed", "");
+
+                       for ( var signal in this._mappingTable) {
+                               if (this._mappingTable.hasOwnProperty(signal)) {
+                                       var mapping = this._mappingTable[signal];
+                                       var zone = parseInt(mapping.zone, 2);
+                                       var subscribeName = signal;
+
+                                       if (mapping.subscribeName !== undefined) {
+                                               subscribeName = mapping.subscribeName;
+                                       }
+
+                                       if (mapping.callBackPropertyName.toLowerCase() === prop.toLowerCase() && !mapping.subscribeCount) {
+                                               mapping.subscribeCount = typeof (mapping.subscribeCount) === 'undefined' ? 0 : mapping.subscribeCount++;
+
+                                               if (typeof (tizen) !== 'undefined') {
+                                                       if (!(subscribeName.toString().trim().toLowerCase() === "nightmode" && id === this._listenerIDs[0])) {
+                                                               var setUpData = tizen.vehicle.get(subscribeName, zone);
+                                                               self.onDataUpdate(setUpData, self, id);
+                                                       }
+
+                                                       tizen.vehicle.subscribe(subscribeName, subscribeCallback, zone);
+                                               } else {
+                                                       console.warn("Tizen API is not available, cannot subscribe to signal", signal);
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return id;
+};
+/**
+ * This method is call as callback if data oon tizen.vehicle was change onDataUpdate
+ * @method onDataUpdate
+ * @param data {object} object whit new data.
+ * @param self {object} this carIndicator Object.
+ * @param lisenersID {int} id of listener.
+ */
+CarIndicator.prototype.onDataUpdate = function(data, self, lisenersID) {
+       "use strict";
+       if (data !== undefined) {
+               var zone = data.zone.toString(2);
+               var mapping;
+
+               for ( var property in data) {
+                       if (data.hasOwnProperty(property)) {
+                               mapping = undefined;
+                               if (property !== "time" && property !== "zone" && property.search("Sequence") === -1) {
+                                       for ( var element in self._mappingTable) {
+                                               if (self._mappingTable.hasOwnProperty(element)) {
+                                                       if (self._mappingTable[element].propertyName.toLowerCase() === property.toLowerCase()) {
+                                                               /* jshint bitwise: false */
+                                                               if (!(zone ^ self._mappingTable[element].zone)) {
+                                                                       /* jshint bitwise: true */
+                                                                       mapping = self._mappingTable[element];
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+
+                                       if (typeof (mapping) !== 'undefined') {
+                                               var value = data[property];
+                                               value = mapping.conversionFunction ? mapping.conversionFunction(value) : value;
+
+                                               var oldValue = self.status[mapping.callBackPropertyName];
+                                               if (oldValue !== value || property.toUpperCase() === "nightMode".toUpperCase()) {
+                                                       console.info("AMB property '" + property + "' has changed to new value:" + value);
+                                                       self.status[mapping.callBackPropertyName] = value;
+
+                                                       var callbackName = "on" + mapping.callBackPropertyName[0].toUpperCase() + mapping.callBackPropertyName.substring(1) + "Changed";
+                                                       var listener;
+
+                                                       if (lisenersID !== undefined) {
+                                                               listener = self._listeners[lisenersID];
+
+                                                               if (typeof (listener[callbackName]) === 'function') {
+                                                                       try {
+                                                                               listener[callbackName](value, oldValue);
+                                                                       } catch (ex) {
+                                                                               console.error("Error occured during executing listener", ex);
+                                                                       }
+                                                               }
+                                                       } else {
+                                                               for ( var i in self._listeners) {
+                                                                       if (self._listeners.hasOwnProperty(i)) {
+                                                                               listener = self._listeners[i];
+
+                                                                               if (typeof (listener[callbackName]) === 'function') {
+                                                                                       try {
+                                                                                               listener[callbackName](value, oldValue);
+                                                                                       } catch (ex) {
+                                                                                               console.error("Error occured during executing listener", ex);
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+
+                                       } else {
+                                               console.warn("Mapping for property '" + property + "' is not defined");
+                                       }
+                               }
+                       }
+               }
+       }
+};
+
+/**
+ * This method removes previosly added listener object. Use WatchID returned from addListener method.
+ * @method removeListener
+ * @param aId {Integer} WatchID.
+ */
+CarIndicator.prototype.removeListener = function(aId) {
+       "use strict";
+       var listener = this._listeners[aId];
+
+       for ( var i in listener) {
+               if (listener.hasOwnProperty(i)) {
+                       var prop = i.replace("on", "").replace("Changed", "");
+
+                       for ( var signal in this._mappingTable) {
+                               if (this._mappingTable.hasOwnProperty(signal)) {
+                                       var mapping = this._mappingTable[signal];
+
+                                       if (mapping.subscribeCount === 0) { // Last signal, unscubscribe
+                                               tizen.vehicle.unsubscribe(signal);
+                                               mapping.subscribeCount = undefined;
+                                       } else if (typeof (mapping.subscribeCount) !== 'undefined') {
+                                               mapping.subscribeCount--;
+                                       }
+                               }
+                       }
+               }
+       }
+
+       this._listeners[aId] = undefined;
+};
+
+/**
+ * status object
+ * @property status
+ * @type Object
+ * @private
+ */
+CarIndicator.prototype.status = {
+       fanSpeed : 0,
+       targetTemperatureRight : 0,
+       targetTemperatureLeft : 0,
+       hazard : false,
+       frontDefrost : false,
+       rearDefrost : false,
+       frontLeftwhell : "",
+       frontRightwhell : "",
+       rearLeftwhell : "",
+       rearRightwhell : "",
+       childLock : false,
+       frontLights : false,
+       rearLights : false,
+       fan : false,
+       seatHeaterRight : 0,
+       seatHeaterLeft : 0,
+       airRecirculation : false,
+       airflowDirection : 0,
+       batteryStatus : 58,
+       fullBatteryRange : 350,
+       outsideTemp : 74.2,
+       insideTemp : 68.2,
+       wheelAngle : 0,
+       weather : 1,
+       avgKW : 0.28,
+       speed : 65,
+       odoMeter : 75126,
+       gear : "D",
+       nightMode : false,
+       randomize : false,
+       exteriorBrightness : 1000
+};
+
+/**
+ * This method return status object in callback
+ * @method getStatus
+ * @param callback {function} callback function.
+ */
+CarIndicator.prototype.getStatus = function(callback) {
+       "use strict";
+       callback(this.status);
+};
+
+/**
+ * this method set status for property in tizen.vehicle and status object
+ * @method setStatus
+ * @param indicator {string} indicator name.
+ * @param status {??} ??.
+ * @param text_status {string} new status .
+ * @param callback {function} callback function.
+ */
+CarIndicator.prototype.setStatus = function(indicator, newValue, callback, zone) {
+       "use strict";
+       var mappingElement, mappingProperty;
+       for ( var element in this._mappingTable) {
+               if (this._mappingTable.hasOwnProperty(element)) {
+                       mappingProperty = undefined;
+                       if (this._mappingTable[element].callBackPropertyName.toLowerCase() === indicator.toLowerCase()) {
+                               mappingElement = this._mappingTable[element];
+                               mappingProperty = this._mappingTable[element].propertyName;
+                               break;
+                       }
+               }
+       }
+
+       // this.status[indicator] = status === "true";
+       if (mappingProperty !== undefined) {
+               var objectName = mappingElement.subscribeName;
+               var propertyZone = parseInt(mappingElement.zone, 2);
+               var propertyValue = {};
+               propertyValue[mappingProperty] = newValue;
+               propertyValue.zone = propertyZone;
+
+               tizen.vehicle.set(objectName, propertyValue, function(msg) {
+                       console.error("Set error: " + msg);
+               });
+       }
+       if (!!callback) {
+               callback();
+       }
+};
diff --git a/js/services/extends.js b/js/services/extends.js
new file mode 100644 (file)
index 0000000..4d904fb
--- /dev/null
@@ -0,0 +1,18 @@
+function _extends(d, b) {
+    "use strict";
+    if (Object.create) {
+        if (b.prototype === null) {
+            console.log(d);
+        }
+        d.prototype = Object.create(b.prototype);
+
+        d.prototype.constructor = d;
+        return;
+    }
+
+    function Extender() {
+        this.constructor = d;
+    }
+    Extender.prototype = b.prototype;
+    d.prototype = new Extender();
+}
diff --git a/js/services/speech.js b/js/services/speech.js
new file mode 100644 (file)
index 0000000..dd3fd49
--- /dev/null
@@ -0,0 +1,254 @@
+/**
+ * @module Services
+ */
+
+/**
+ * Speech class provides text to speech (TTS) and speech to text (STT) or speech recognition functionality utilizing
+ * [tizen.speech API](https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html).
+ * This component is usually initialized by {{#crossLink "Bootstrap"}}{{/crossLink}} class and can be
+ * later accessed using global {{#crossLink "Speech"}}{{/crossLink}} object.
+ *
+ * Due to limitation of [tizen.speech API](https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html) that allows to set
+ * only one listener, class implements custom event dispatcher that provides unified way for registering listener objects to
+ * receive notification when the speech recognizer returns a result.
+ *
+ * To attach to particular recognized speech commands register new callback object using {{#crossLink "Speech/addVoiceRecognitionListener:method"}}{{/crossLink}} method.
+ *
+ * To execute TTS for particular sentence use {{#crossLink "Speech/vocalizeString:method"}}{{/crossLink}} method.
+ *
+ * @class Speech
+ * @constructor
+ */
+var Speech = (function() {
+       "use strict";
+
+       function Speech() {
+               console.info("Starting up service Speech");
+
+               // workaround for TTS
+               this.vocalizeString("");
+
+               // workaround for STT
+               if (typeof (tizen) !== 'undefined' && typeof (tizen.content) !== 'undefined' && typeof (tizen.speech.find) !== 'undefined') {
+                       tizen.content.find(function(content) {
+                       }, function(error) {
+                       }, null);
+               }
+
+               this._initVoiceRecognition();
+       }
+/**
+* Array of registered listeners
+* @type Object
+* @property _listeners
+* @private
+*/
+       Speech.prototype._listeners = [];
+/**
+ * This method initialize voice recognition , for recognition use tizen.speech.setCBListener function from tizen api.
+ * @method _initVoiceRecognition
+ * @private
+ */
+       Speech.prototype._initVoiceRecognition = function() {
+               var self = this;
+               console.log("Speech init voice recognition called.");
+               if (typeof (tizen) !== 'undefined' && typeof (tizen.speech) !== 'undefined' && typeof (tizen.speech.setCBListener) !== 'undefined') {
+                       try {
+                               var speechEventListener = {
+                                       onaudiostart : function() {
+                                               console.log("Speech: onaudiostart received");
+                                       },
+                                       onsoundstart : function() {
+                                               console.log("Speech: onsoundstart received");
+                                       },
+                                       onspeechstart : function() {
+                                               console.log("Speech: onspeechstart received");
+                                       },
+                                       onspeechend : function() {
+                                               console.log("Speech: onspeechend received");
+                                       },
+                                       onsoundend : function() {
+                                               console.log("Speech: onsoundend received");
+                                       },
+                                       onaudioend : function() {
+                                               console.log("Speech: onaudioend received");
+                                       },
+                                       onresult : function(result) {
+                                               console.log("Speech: onresult received");
+                                               for ( var i = 0; i < result.length; i++) {
+                                                       console.log("Speech: forloop, command = " + result[i]);
+                                                       var commandFound = false;
+
+                                                       switch (result[i].toString().trim().toLowerCase()) {
+                                                       case "play":
+                                                               commandFound = true;
+                                                               self._callListener("onplay");
+                                                               break;
+                                                       case "next":
+                                                               self._callListener("onnext");
+                                                               commandFound = true;
+                                                               break;
+                                                       case "previous":
+                                                               self._callListener("onprevious");
+                                                               commandFound = true;
+                                                               break;
+                                                       case "stop":
+                                                       case "pause":
+                                                               self._callListener("onstop");
+                                                               commandFound = true;
+                                                               break;
+                                                       case "launch_homescreen":
+                                                       case "launch_navigation":
+                                                       case "launch_dashboard":
+                                                       case "launch_store":
+                                                       case "launch_multimediaplayer":
+                                                       case "launch_phone":
+                                                       case "launch_hvac":
+                                                       case "launch_sdl":
+                                                       case "launch_simulator":
+                                                               var appName = result[i].toString().trim().toLowerCase().substring(7);
+                                                               if (appName === "homescreen") {
+                                                                       appName = "home screen";
+                                                               } else if (appName === "multimediaplayer") {
+                                                                       appName = "multimedia player";
+                                                               } else if (appName === "simulator") {
+                                                                       appName = "amb simulator";
+                                                               } else if (appName === "sdl") {
+                                                                       appName = "smartdevicelink";
+                                                               }
+                                                               self._callListener("onapplicationlaunch", appName);
+                                                               commandFound = true;
+                                                               break;
+                                                       case "install":
+                                                               self._callListener("onapplicationinstall");
+                                                               commandFound = true;
+                                                               break;
+                                                       case "uninstall":
+                                                               self._callListener("onapplicationuninstall");
+                                                               commandFound = true;
+                                                               break;
+                                                       case "call":
+                                                               self._callListener("oncall");
+                                                               commandFound = true;
+                                                               break;
+                                                       default:
+                                                               break;
+                                                       }
+
+                                                       if (commandFound) {
+                                                               break;
+                                                       }
+                                               }
+                                       },
+                                       onnomatch : function(result) {
+                                               console.log("Speech: onnomatch received ");
+                                       },
+                                       onerror : function(error) {
+                                               console.log("Speech: onerror received");
+                                       },
+                                       onstart : function() {
+                                               console.log("Speech: onstart received");
+                                       },
+                                       onend : function() {
+                                               console.log("Speech: onend received");
+                                       }
+                               };
+                               tizen.speech.setCBListener(speechEventListener);
+                       } catch (err) {
+                               console.log("Speech set callback listener FAILED + " + err.message);
+                               console.log(err);
+                       }
+               } else {
+                       console.log("Speech set callback listener not supported.");
+               }
+       };
+
+       /**
+        * Adds the listener object to receive notifications when the speech recognizer returns a requested speech command.
+        * Following voice commands are recognized:
+        *
+        * * `play music` - invokes method `onplay`, used in {{#crossLinkModule "MultimediaPlayerApplication"}}{{/crossLinkModule}}
+     * * `pause music` - invokes method `onpause`, used in {{#crossLinkModule "MultimediaPlayerApplication"}}{{/crossLinkModule}}
+     * * `play next` - invokes method `onnext`, used in {{#crossLinkModule "MultimediaPlayerApplication"}}{{/crossLinkModule}}
+     * * `play previous`- invokes method `onprevious`, used in {{#crossLinkModule "MultimediaPlayerApplication"}}{{/crossLinkModule}}
+     * * `stop music` - invokes method `onstop`, used in {{#crossLinkModule "MultimediaPlayerApplication"}}{{/crossLinkModule}}
+     * * `install application` - invokes method `onapplicationinstall`, used in {{#crossLinkModule "StoreApplication"}}{{/crossLinkModule}}
+     * * `uninstall application` - invokes method `onapplicationuninstall`, used in {{#crossLinkModule "StoreApplication"}}{{/crossLinkModule}}
+     * * `call contact` - invokes method `oncall`, used in {{#crossLinkModule "PhoneApplication"}}{{/crossLinkModule}}
+        * * `launch` commands - invokes method `onapplicationlaunch` with parameter indicating application (used globally):
+        *   * `launch home screen` - Launches {{#crossLinkModule "HomeScreenApplication"}}{{/crossLinkModule}}
+        *   * `launch navigation` - Launches {{#crossLinkModule "NavigationGoogleApplication"}}{{/crossLinkModule}}
+        *   * `launch dashboard` - Launches {{#crossLinkModule "DashboardApplication"}}{{/crossLinkModule}}
+        *   * `launch store` - Launches {{#crossLinkModule "StoreApplication"}}{{/crossLinkModule}}
+        *   * `launch multimedia player` - Launches {{#crossLinkModule "MultimediaPlayerApplication"}}{{/crossLinkModule}}
+        *   * `launch phone`, `launch dialer` - Launches {{#crossLinkModule "PhoneApplication"}}{{/crossLinkModule}}
+        *   * `launch air conditioning` - Launches {{#crossLinkModule "HVACApplication"}}{{/crossLinkModule}}
+        *   * `launch smart device link` - Launches {{#crossLinkModule "SdlApplication"}}{{/crossLinkModule}}
+        *   * `launch simulator` - Launches {{#crossLinkModule "AMBSimulatorApplication"}}{{/crossLinkModule}}
+        *
+        * To attach to these commands provide listener object defining method name:
+        *
+        *     {
+        *        onplay : function() { }, // Called when play command was identified
+     *        onstop : function() { } // Called when stop command was identified
+     *        onapplicationinstall : function() { } // Called when install command was identified
+     *     }
+     *
+        *
+        * @method addVoiceRecognitionListener
+        * @param aCallbackObject Object with callback functions to be invoked.
+        */
+       Speech.prototype.addVoiceRecognitionListener = function(aCallbackObject) {
+               this._listeners.push(aCallbackObject);
+       };
+
+       Speech.prototype._callListener = function(listenerName, arg) {
+               for ( var i = 0; i < this._listeners.length; ++i) {
+                       for ( var name in this._listeners[i]) {
+                               if (name === listenerName) {
+                                       this._listeners[i][name](arg);
+                                       break;
+                               }
+                       }
+               }
+       };
+
+       /**
+        * Performs text to speech synthesis of a given text. This method use api function `tizen.speech.vocalizeString` and currently
+        * all strings are queued without option to cancel TTS before it's finalized.
+        *
+        * @method vocalizeString
+        * @param string {String} Text to be synthetized.
+        */
+       Speech.prototype.vocalizeString = function(string) {
+               console.log("Speech vocalize string called.");
+               if (typeof (tizen) !== 'undefined' && typeof (tizen.speech) !== 'undefined' && typeof (tizen.speech.vocalizeString) !== 'undefined') {
+                       try {
+                               tizen.speech.vocalizeString(string);
+                       } catch (err) {
+                               console.log("Speech vocalize string FAILED: " + err.message);
+                               console.log(err);
+                       }
+               } else {
+                       console.log("Speech vocalize string not supported.");
+               }
+       };
+
+       /**
+        * Performs text to speech synthesis of the current application name.
+        *
+        * @method readCurrentAppName
+        */
+       Speech.prototype.readCurrentAppName = function() {
+               if (typeof (tizen) !== 'undefined') {
+                       var appName = tizen.application.getCurrentApplication().appInfo.name.toString().trim().toLowerCase();
+                       if (appName === "hvac") {
+                               appName = "air conditioning";
+                       }
+                       this.vocalizeString(appName);
+               }
+       };
+
+       window.__speech = undefined === window.__speech ? new Speech() : window.__speech;
+       return window.__speech;
+})();
\ No newline at end of file
diff --git a/js/services/themeengine.js b/js/services/themeengine.js
new file mode 100644 (file)
index 0000000..a3159eb
--- /dev/null
@@ -0,0 +1,197 @@
+/*global loadScript, Configuration */
+
+/**
+ * @module Services
+ */
+
+ /**
+ * This class provides unified way to access available themes, detection of theme changes and method of updating selected theme. This component is usually initialized by
+ * {{#crossLink "Bootstrap"}}{{/crossLink}} class and can be later accessed using {{#crossLink "Bootstrap/themeEngine:property"}}{{/crossLink}} object. Component uses
+ * {{#crossLink "Configuration"}}{{/crossLink}} class to persist selected theme in key specified by {{#crossLink "ThemeEngine/selectedThemeKey:property"}}{{/crossLink}}.
+ *
+ * List of available themes is stored in {{#crossLink "ThemeEngine/_themes:property"}}{{/crossLink}} property; new theme can be set using
+ * {{#crossLink "ThemeEngine/setUserTheme:method"}}{{/crossLink}} method.
+ *
+ * To attach to signal indicating update of currencly selected theme use {{#crossLink "ThemeEngine/addStatusListener:method"}}{{/crossLink}} method, e.g.:
+ *
+ *     var listenerId = bootstrap.themeEngine.addStatusListener(function(themeId) {
+ *        // Process theme update
+ *     });
+ *
+ * @class ThemeEngine
+ * @constructor
+ */
+
+var ThemeEngine = (function() {
+    "use strict";
+    function ThemeEngine() {
+        console.info("Starting up service ThemeEngine");
+    }
+
+    /**
+     * Defines configuration property storing currently selected theme.
+     * @property selectedThemeKey
+     * @type String
+     */
+    ThemeEngine.prototype.selectedThemeKey = "selectedTheme";
+
+    /**
+     * Contains array of attached callbacks.
+     * @property _reloadCallbacks
+     * @private
+     * @type Array
+     */
+    ThemeEngine.prototype._reloadCallbacks = [];
+
+    /**
+     * Contains array of available themes.
+     * @property _themes
+     * @private
+     * @type Array
+     */
+    ThemeEngine.prototype._themes = [
+    {
+        "id": "http://com.intel.tizen/blue",
+        "name": "Blue theme",
+        "type": "user",
+        "version": "0.5.1354227499444",
+        "selected": true,
+        "icon": "icon.png",
+        "iconUrl": "./css/user/blue/icon.png",
+        "_dir": "blue"
+    }, {
+        "id": "http://com.intel.tizen/green",
+        "name": "Green theme",
+        "type": "user",
+        "version": "0.5.0",
+        "icon": "icon.png",
+        "iconUrl": "./css/user/green/icon.png",
+        "selected": false,
+        "_dir": "green"
+    }];
+
+    /**
+     * This method initialize theme engine from configuration object and loads default theme.
+     * @method init
+     * @param callback {function(error)} Callback function called after method is finished. Parameter `error` will contain any error that was intercepted.
+     */
+    ThemeEngine.prototype.init = function(aCallback) {
+        var self = this;
+
+        loadScript('./css/car/components/configuration/configuration.js', function (path, status) {
+            if (status === "ok") {
+                var storedTheme = Configuration.get("selectedTheme");
+                self._injectHeaders(storedTheme, function() {
+                    self._updateSelectedTheme();
+
+                    Configuration.addUpdateListener(function() {
+                        var id = Configuration.get("selectedTheme");
+                        var selectedTheme = self.getSelectedTheme();
+                        if (!selectedTheme || selectedTheme.id !== id) {
+                            self._injectHeaders(id, function() {
+                                self._updateSelectedTheme();
+
+                                $(self._reloadCallbacks).each(function() {
+                                    this(id);
+                                });
+                            });
+                        }
+                    });
+                    aCallback();
+                });
+            }
+            else {
+                aCallback(status);
+            }
+        });
+    };
+
+    /**
+     * Method adds update listener which is fired after theme is changed.
+     * @method addStatusListener
+     * @param callback {function()} Callback to be invoked after theme is changed.
+     * @return {Integer} ID that can be used for removal of status listener.
+     */
+    ThemeEngine.prototype.addStatusListener = function(callback) {
+        this._reloadCallbacks.push(callback);
+    };
+
+    ThemeEngine.prototype._updateSelectedTheme = function () {
+        var selectedTheme = Configuration.get(this.selectedThemeKey);
+
+        for(var i = 0; i < this._themes.length; i++) {
+            this._themes[i].selected = this._themes[i].id === Configuration.get(this.selectedThemeKey);
+        }
+    };
+
+    /**
+     * Method executes callback method with array of available themes as parameter.
+     * @method getUserThemes
+     * @param callback {function(themes)} Callback with array of available themes.
+     */
+    ThemeEngine.prototype.getUserThemes = function(callback) {
+        var self = this;
+        window.setTimeout(function() {
+            callback(self._themes);
+        }, 200);
+    };
+
+     /**
+     * Method sets new user theme identified by theme ID in case that this theme isn't currently selected.
+     * @method setUserTheme
+     * @param id {String} ID of theme that should be set.
+     */
+    ThemeEngine.prototype.setUserTheme = function(id) {
+        var prevTheme = Configuration.get("selectedTheme");
+        id = id || prevTheme;
+        id = id ||  "http://com.intel.tizen/blue";
+
+        if(prevTheme !== id) {
+            Configuration.set(this.selectedThemeKey, id);
+        }
+    };
+
+    /**
+     * Method returns information about one user theme identified by theme ID.
+     * @method getSelectedTheme
+     * @param id {String} ID of theme that should be set.
+     */
+    ThemeEngine.prototype.getSelectedTheme = function() {
+        for(var i = 0; i < this._themes.length; ++i) {
+            if (this._themes[i].selected) {
+                return this._themes[i];
+            }
+        }
+        return null;
+    };
+
+    ThemeEngine.prototype._injectHeaders = function(id, callback) {
+        callback = callback || function() {};
+        var self = this;
+
+        $(this._themes).each(function() {
+            var theme = this;
+            //remove all previous theme .js
+            $('script[src="./css/user/' + theme._dir + '/user.js"]').remove();
+
+            if (theme.id === id) {
+                $("head > *").each(function() {
+                    if ($(this).data("theme") === "user") {
+                        $(this).remove();
+                    }
+                });
+
+                $('<link data-theme="user" rel="stylesheet" href="./css/user/' + theme._dir + '/user.css" />').appendTo("head");
+
+                loadScript('./css/user/' + theme._dir + '/user.js', function(aPath, aStatus) {
+                    if (aStatus === "ok") {
+                       callback(id);
+                    }
+                },true);
+            }
+        });
+    };
+
+    window.__themeengine = undefined === window.__themeengine ? new ThemeEngine() : window.__themeengine;
+    return window.__themeengine;
+})();
\ No newline at end of file
diff --git a/packaging/html5-ui-common.changes b/packaging/html5-ui-common.changes
new file mode 100644 (file)
index 0000000..c5f158b
--- /dev/null
@@ -0,0 +1,3 @@
+* Thu Apr 03 2014 brianjjones <brian.j.jones@intel.com> 26c776b
+- Initial commit of the common code for the Modello UI
+
diff --git a/packaging/html5-ui-common.spec b/packaging/html5-ui-common.spec
new file mode 100644 (file)
index 0000000..e852a62
--- /dev/null
@@ -0,0 +1,36 @@
+Name:       html5_UI_Common
+Summary:    A proof of concept pure html5 UI
+Version:    0.0.1
+Release:    1
+Group:      Applications/System
+License:    Apache 2.0
+URL:        http://www.tizen.org
+Source0:    %{name}-%{version}.tar.bz2
+BuildRequires:  zip
+Requires:   wrt-installer
+Requires:   wrt-plugins-ivi
+
+%description
+A proof of concept pure html5 UI
+
+%prep
+%setup -q -n %{name}-%{version}
+
+%build
+
+#make wgtPkg
+
+%install
+rm -rf %{buildroot}
+%make_install
+
+%post
+    #wrt-installer -i /opt/usr/apps/.preinstallWidgets/html5_UI_Common.wgt;
+
+%postun
+    #TODO: Delete the common files
+    #wrt-installer -un html5POC01.html5_UI_Common
+
+%files
+%defattr(-,root,root,-)
+/opt/usr/apps/_common/*