From 89143f95bf42c57afda058a30e56d679ac92cfee Mon Sep 17 00:00:00 2001 From: F_X_Zhe <295363299@qq.com> Date: Mon, 3 Jun 2024 15:28:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BB=A3=E7=A0=81=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E6=A1=86=E6=9E=B6=EF=BC=88=E7=94=B1=E9=82=B1=E9=91=AB?= =?UTF-8?q?=E6=B6=9B=E5=AE=8C=E6=88=90=EF=BC=8C=E6=A8=8A=E7=A5=A5=E5=93=B2?= =?UTF-8?q?=E4=BB=A3=E4=BC=A0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/page/data/document.js | 7 + code/page/data/styles.css | 92 + code/page/files/供应商信息/data.js | 7 + code/page/files/供应商信息/styles.css | 2604 ++++++++++ code/page/files/入库信息/data.js | 7 + code/page/files/入库信息/styles.css | 2306 +++++++++ code/page/files/出库信息/data.js | 7 + code/page/files/出库信息/styles.css | 2306 +++++++++ code/page/files/药品保质期检查/data.js | 7 + .../files/药品保质期检查/styles.css | 2330 +++++++++ code/page/files/药品信息/data.js | 7 + code/page/files/药品信息/styles.css | 4419 +++++++++++++++++ code/page/files/账单信息/data.js | 7 + code/page/files/账单信息/styles.css | 2013 ++++++++ code/page/images/供应商信息/u224.png | Bin 0 -> 254 bytes .../images/供应商信息/u224_mouseOver.png | Bin 0 -> 252 bytes code/page/images/供应商信息/u228.png | Bin 0 -> 261 bytes .../images/供应商信息/u228_mouseOver.png | Bin 0 -> 255 bytes code/page/images/供应商信息/u229.png | Bin 0 -> 251 bytes .../images/供应商信息/u229_mouseOver.png | Bin 0 -> 253 bytes code/page/images/供应商信息/u233.png | Bin 0 -> 255 bytes .../images/供应商信息/u233_mouseOver.png | Bin 0 -> 257 bytes code/page/images/供应商信息/u264.png | Bin 0 -> 254 bytes .../images/供应商信息/u264_mouseOver.png | Bin 0 -> 255 bytes code/page/images/供应商信息/u268.png | Bin 0 -> 257 bytes .../images/供应商信息/u268_mouseOver.png | Bin 0 -> 260 bytes code/page/images/入库信息/u25.svg | 6 + code/page/images/入库信息/u30.png | Bin 0 -> 194 bytes .../images/入库信息/u30_mouseOver.png | Bin 0 -> 195 bytes code/page/images/入库信息/u35.png | Bin 0 -> 196 bytes .../images/入库信息/u35_mouseOver.png | Bin 0 -> 199 bytes code/page/images/入库信息/u60.png | Bin 0 -> 196 bytes .../images/入库信息/u60_mouseOver.png | Bin 0 -> 197 bytes code/page/images/入库信息/u65.png | Bin 0 -> 199 bytes .../images/入库信息/u65_mouseOver.png | Bin 0 -> 201 bytes .../images/药品保质期检查/u162.png | Bin 0 -> 201 bytes .../药品保质期检查/u162_mouseOver.png | Bin 0 -> 203 bytes .../images/药品保质期检查/u192.png | Bin 0 -> 204 bytes .../药品保质期检查/u192_mouseOver.png | Bin 0 -> 205 bytes code/page/images/药品信息/u303.png | Bin 0 -> 196 bytes .../images/药品信息/u303_mouseOver.png | Bin 0 -> 189 bytes code/page/images/药品信息/u309.png | Bin 0 -> 196 bytes .../images/药品信息/u309_mouseOver.png | Bin 0 -> 190 bytes code/page/images/药品信息/u310.png | Bin 0 -> 196 bytes .../images/药品信息/u310_mouseOver.png | Bin 0 -> 189 bytes code/page/images/药品信息/u312.png | Bin 0 -> 208 bytes .../images/药品信息/u312_mouseOver.png | Bin 0 -> 201 bytes code/page/images/药品信息/u319.png | Bin 0 -> 194 bytes code/page/images/药品信息/u320.png | Bin 0 -> 194 bytes code/page/images/药品信息/u322.png | Bin 0 -> 201 bytes .../images/药品信息/u393_mouseOver.png | Bin 0 -> 192 bytes code/page/images/药品信息/u399.png | Bin 0 -> 197 bytes .../images/药品信息/u399_mouseOver.png | Bin 0 -> 193 bytes code/page/images/药品信息/u400.png | Bin 0 -> 196 bytes .../images/药品信息/u400_mouseOver.png | Bin 0 -> 192 bytes code/page/images/药品信息/u402.png | Bin 0 -> 203 bytes .../images/药品信息/u402_mouseOver.png | Bin 0 -> 204 bytes code/page/index.html | 149 + code/page/plugins/debug/debug.js | 171 + code/page/plugins/debug/styles/debug.css | 265 + .../debug/styles/images/console_panel_off.svg | 3 + .../debug/styles/images/console_panel_on.svg | 3 + code/page/plugins/page_notes/page_notes.js | 474 ++ .../styles/images/notes_panel_off.svg | 3 + .../styles/images/notes_panel_on.svg | 3 + .../plugins/page_notes/styles/page_notes.css | 209 + code/page/plugins/recordplay/recordplay.js | 479 ++ .../plugins/recordplay/styles/recordplay.css | 90 + code/page/plugins/sitemap/sitemap.js | 553 +++ .../sitemap/styles/images/back_keys.svg | 7 + .../sitemap/styles/images/closed_item.svg | 14 + .../styles/images/folder_closed_blue.svg | 6 + .../sitemap/styles/images/forward_keys.svg | 10 + .../sitemap/styles/images/left_arrow.svg | 3 + .../sitemap/styles/images/open_item.svg | 12 + .../sitemap/styles/images/page_lt_grey.svg | 6 + .../sitemap/styles/images/right_arrow.svg | 3 + .../sitemap/styles/images/search_off.svg | 6 + .../sitemap/styles/images/search_on.svg | 6 + .../styles/images/sitemap_panel_off.svg | 3 + .../styles/images/sitemap_panel_on.svg | 3 + code/page/plugins/sitemap/styles/sitemap.css | 380 ++ code/page/resources/Other.html | 35 + code/page/resources/chrome/allow-access.png | Bin 0 -> 10061 bytes .../chrome/axure-chrome-extension.crx | Bin 0 -> 31290 bytes code/page/resources/chrome/axure_logo.png | Bin 0 -> 8872 bytes code/page/resources/chrome/chrome.html | 186 + code/page/resources/chrome/details.png | Bin 0 -> 21867 bytes code/page/resources/chrome/extensions.png | Bin 0 -> 38642 bytes code/page/resources/chrome/safari.html | 154 + .../page/resources/chrome/safari_advanced.png | Bin 0 -> 84670 bytes .../resources/chrome/safari_restrictions.png | Bin 0 -> 152746 bytes code/page/resources/chrome/splitter.gif | Bin 0 -> 1260 bytes code/page/resources/chrome/splitter.png | Bin 0 -> 251 bytes code/page/resources/css/axure_rp_page.css | 292 ++ code/page/resources/css/default.css | 1043 ++++ code/page/resources/css/images/images.html | 25 + code/page/resources/css/images/newwindow.gif | Bin 0 -> 112 bytes code/page/resources/css/images/note.gif | Bin 0 -> 98 bytes code/page/resources/css/images/touch.cur | Bin 0 -> 16958 bytes code/page/resources/css/images/touch.svg | 32 + .../css/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_75_ffffff_1x400.png | Bin 0 -> 107 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 0 -> 123 bytes .../css/images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes code/page/resources/css/jquery-ui-themes.css | 412 ++ code/page/resources/css/previewfonts.css | 12 + .../SourceSansPro-OpenFontLicense.txt | 93 + .../previewfonts/SourceSansPro-Regular.woff2 | Bin 0 -> 86844 bytes .../previewfonts/SourceSansPro-Semibold.woff2 | Bin 0 -> 86196 bytes code/page/resources/css/reset.css | 24 + code/page/resources/expand.html | 60 + code/page/resources/images/axure9_logo.svg | 1 + code/page/resources/images/axure_logo.png | Bin 0 -> 4494 bytes code/page/resources/images/axure_logo.svg | 18 + code/page/resources/images/caret_down.svg | 3 + code/page/resources/images/caret_down_off.svg | 3 + code/page/resources/images/close_x.svg | 6 + .../resources/images/close_x_minimize.svg | 6 + code/page/resources/images/divider.png | Bin 0 -> 110 bytes code/page/resources/images/divider.svg | 13 + code/page/resources/images/exit.svg | 6 + code/page/resources/images/favicon_play.ico | Bin 0 -> 5430 bytes code/page/resources/images/overflow-icon.svg | 7 + .../resources/images/overflow_checkmark.svg | 3 + .../resources/images/overflow_icon_off.svg | 7 + code/page/resources/images/refresh.svg | 5 + code/page/resources/images/resize.svg | 5 + code/page/resources/images/return.svg | 3 + code/page/resources/images/transparent.gif | Bin 0 -> 43 bytes code/page/resources/images/views-icon.svg | 6 + code/page/resources/reload.html | 24 + code/page/resources/scripts/axure/action.js | 2085 ++++++++ code/page/resources/scripts/axure/adaptive.js | 689 +++ .../resources/scripts/axure/annotation.js | 161 + code/page/resources/scripts/axure/axQuery.js | 404 ++ .../resources/scripts/axure/axQuery.std.js | 1806 +++++++ code/page/resources/scripts/axure/doc.js | 901 ++++ code/page/resources/scripts/axure/drag.js | 256 + code/page/resources/scripts/axure/events.js | 1975 ++++++++ code/page/resources/scripts/axure/expr.js | 579 +++ code/page/resources/scripts/axure/flyout.js | 286 ++ code/page/resources/scripts/axure/geometry.js | 301 ++ code/page/resources/scripts/axure/globals.js | 7 + code/page/resources/scripts/axure/ie.js | 344 ++ .../page/resources/scripts/axure/init.temp.js | 326 ++ code/page/resources/scripts/axure/ios.js | 91 + .../scripts/axure/jquery.nicescroll.min.js | 1 + code/page/resources/scripts/axure/legacy.js | 166 + code/page/resources/scripts/axure/math.js | 554 +++ code/page/resources/scripts/axure/model.js | 53 + code/page/resources/scripts/axure/move.js | 463 ++ .../page/resources/scripts/axure/recording.js | 94 + code/page/resources/scripts/axure/repeater.js | 2309 +++++++++ code/page/resources/scripts/axure/sto.js | 231 + code/page/resources/scripts/axure/style.js | 1363 +++++ code/page/resources/scripts/axure/tree.js | 189 + .../resources/scripts/axure/utils.temp.js | 99 + .../page/resources/scripts/axure/variables.js | 151 + code/page/resources/scripts/axure/viewer.js | 268 + .../resources/scripts/axure/visibility.js | 1291 +++++ code/page/resources/scripts/axutils.js | 231 + .../resources/scripts/jquery-1.7.1.min.js | 4 + .../resources/scripts/jquery-3.2.1.min.js | 14 + .../scripts/jquery-ui-1.8.10.custom.min.js | 233 + code/page/resources/scripts/messagecenter.js | 380 ++ .../page/resources/scripts/player/axplayer.js | 2611 ++++++++++ code/page/resources/scripts/player/init.js | 18 + .../page/resources/scripts/player/splitter.js | 219 + code/page/start.html | 149 + code/page/start_c_1.html | 12 + code/page/start_with_pages.html | 12 + code/page/供应商信息.html | 623 +++ code/page/入库信息.html | 551 ++ code/page/出库信息.html | 551 ++ code/page/药品保质期检查.html | 551 ++ code/page/药品信息.html | 1063 ++++ code/page/账单信息.html | 503 ++ 187 files changed, 46638 insertions(+) create mode 100644 code/page/data/document.js create mode 100644 code/page/data/styles.css create mode 100644 code/page/files/供应商信息/data.js create mode 100644 code/page/files/供应商信息/styles.css create mode 100644 code/page/files/入库信息/data.js create mode 100644 code/page/files/入库信息/styles.css create mode 100644 code/page/files/出库信息/data.js create mode 100644 code/page/files/出库信息/styles.css create mode 100644 code/page/files/药品保质期检查/data.js create mode 100644 code/page/files/药品保质期检查/styles.css create mode 100644 code/page/files/药品信息/data.js create mode 100644 code/page/files/药品信息/styles.css create mode 100644 code/page/files/账单信息/data.js create mode 100644 code/page/files/账单信息/styles.css create mode 100644 code/page/images/供应商信息/u224.png create mode 100644 code/page/images/供应商信息/u224_mouseOver.png create mode 100644 code/page/images/供应商信息/u228.png create mode 100644 code/page/images/供应商信息/u228_mouseOver.png create mode 100644 code/page/images/供应商信息/u229.png create mode 100644 code/page/images/供应商信息/u229_mouseOver.png create mode 100644 code/page/images/供应商信息/u233.png create mode 100644 code/page/images/供应商信息/u233_mouseOver.png create mode 100644 code/page/images/供应商信息/u264.png create mode 100644 code/page/images/供应商信息/u264_mouseOver.png create mode 100644 code/page/images/供应商信息/u268.png create mode 100644 code/page/images/供应商信息/u268_mouseOver.png create mode 100644 code/page/images/入库信息/u25.svg create mode 100644 code/page/images/入库信息/u30.png create mode 100644 code/page/images/入库信息/u30_mouseOver.png create mode 100644 code/page/images/入库信息/u35.png create mode 100644 code/page/images/入库信息/u35_mouseOver.png create mode 100644 code/page/images/入库信息/u60.png create mode 100644 code/page/images/入库信息/u60_mouseOver.png create mode 100644 code/page/images/入库信息/u65.png create mode 100644 code/page/images/入库信息/u65_mouseOver.png create mode 100644 code/page/images/药品保质期检查/u162.png create mode 100644 code/page/images/药品保质期检查/u162_mouseOver.png create mode 100644 code/page/images/药品保质期检查/u192.png create mode 100644 code/page/images/药品保质期检查/u192_mouseOver.png create mode 100644 code/page/images/药品信息/u303.png create mode 100644 code/page/images/药品信息/u303_mouseOver.png create mode 100644 code/page/images/药品信息/u309.png create mode 100644 code/page/images/药品信息/u309_mouseOver.png create mode 100644 code/page/images/药品信息/u310.png create mode 100644 code/page/images/药品信息/u310_mouseOver.png create mode 100644 code/page/images/药品信息/u312.png create mode 100644 code/page/images/药品信息/u312_mouseOver.png create mode 100644 code/page/images/药品信息/u319.png create mode 100644 code/page/images/药品信息/u320.png create mode 100644 code/page/images/药品信息/u322.png create mode 100644 code/page/images/药品信息/u393_mouseOver.png create mode 100644 code/page/images/药品信息/u399.png create mode 100644 code/page/images/药品信息/u399_mouseOver.png create mode 100644 code/page/images/药品信息/u400.png create mode 100644 code/page/images/药品信息/u400_mouseOver.png create mode 100644 code/page/images/药品信息/u402.png create mode 100644 code/page/images/药品信息/u402_mouseOver.png create mode 100644 code/page/index.html create mode 100644 code/page/plugins/debug/debug.js create mode 100644 code/page/plugins/debug/styles/debug.css create mode 100644 code/page/plugins/debug/styles/images/console_panel_off.svg create mode 100644 code/page/plugins/debug/styles/images/console_panel_on.svg create mode 100644 code/page/plugins/page_notes/page_notes.js create mode 100644 code/page/plugins/page_notes/styles/images/notes_panel_off.svg create mode 100644 code/page/plugins/page_notes/styles/images/notes_panel_on.svg create mode 100644 code/page/plugins/page_notes/styles/page_notes.css create mode 100644 code/page/plugins/recordplay/recordplay.js create mode 100644 code/page/plugins/recordplay/styles/recordplay.css create mode 100644 code/page/plugins/sitemap/sitemap.js create mode 100644 code/page/plugins/sitemap/styles/images/back_keys.svg create mode 100644 code/page/plugins/sitemap/styles/images/closed_item.svg create mode 100644 code/page/plugins/sitemap/styles/images/folder_closed_blue.svg create mode 100644 code/page/plugins/sitemap/styles/images/forward_keys.svg create mode 100644 code/page/plugins/sitemap/styles/images/left_arrow.svg create mode 100644 code/page/plugins/sitemap/styles/images/open_item.svg create mode 100644 code/page/plugins/sitemap/styles/images/page_lt_grey.svg create mode 100644 code/page/plugins/sitemap/styles/images/right_arrow.svg create mode 100644 code/page/plugins/sitemap/styles/images/search_off.svg create mode 100644 code/page/plugins/sitemap/styles/images/search_on.svg create mode 100644 code/page/plugins/sitemap/styles/images/sitemap_panel_off.svg create mode 100644 code/page/plugins/sitemap/styles/images/sitemap_panel_on.svg create mode 100644 code/page/plugins/sitemap/styles/sitemap.css create mode 100644 code/page/resources/Other.html create mode 100644 code/page/resources/chrome/allow-access.png create mode 100644 code/page/resources/chrome/axure-chrome-extension.crx create mode 100644 code/page/resources/chrome/axure_logo.png create mode 100644 code/page/resources/chrome/chrome.html create mode 100644 code/page/resources/chrome/details.png create mode 100644 code/page/resources/chrome/extensions.png create mode 100644 code/page/resources/chrome/safari.html create mode 100644 code/page/resources/chrome/safari_advanced.png create mode 100644 code/page/resources/chrome/safari_restrictions.png create mode 100644 code/page/resources/chrome/splitter.gif create mode 100644 code/page/resources/chrome/splitter.png create mode 100644 code/page/resources/css/axure_rp_page.css create mode 100644 code/page/resources/css/default.css create mode 100644 code/page/resources/css/images/images.html create mode 100644 code/page/resources/css/images/newwindow.gif create mode 100644 code/page/resources/css/images/note.gif create mode 100644 code/page/resources/css/images/touch.cur create mode 100644 code/page/resources/css/images/touch.svg create mode 100644 code/page/resources/css/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 code/page/resources/css/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 code/page/resources/css/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 code/page/resources/css/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 code/page/resources/css/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 code/page/resources/css/images/ui-bg_glass_75_ffffff_1x400.png create mode 100644 code/page/resources/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 code/page/resources/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png create mode 100644 code/page/resources/css/images/ui-icons_222222_256x240.png create mode 100644 code/page/resources/css/images/ui-icons_2e83ff_256x240.png create mode 100644 code/page/resources/css/images/ui-icons_454545_256x240.png create mode 100644 code/page/resources/css/images/ui-icons_888888_256x240.png create mode 100644 code/page/resources/css/images/ui-icons_cd0a0a_256x240.png create mode 100644 code/page/resources/css/jquery-ui-themes.css create mode 100644 code/page/resources/css/previewfonts.css create mode 100644 code/page/resources/css/previewfonts/SourceSansPro-OpenFontLicense.txt create mode 100644 code/page/resources/css/previewfonts/SourceSansPro-Regular.woff2 create mode 100644 code/page/resources/css/previewfonts/SourceSansPro-Semibold.woff2 create mode 100644 code/page/resources/css/reset.css create mode 100644 code/page/resources/expand.html create mode 100644 code/page/resources/images/axure9_logo.svg create mode 100644 code/page/resources/images/axure_logo.png create mode 100644 code/page/resources/images/axure_logo.svg create mode 100644 code/page/resources/images/caret_down.svg create mode 100644 code/page/resources/images/caret_down_off.svg create mode 100644 code/page/resources/images/close_x.svg create mode 100644 code/page/resources/images/close_x_minimize.svg create mode 100644 code/page/resources/images/divider.png create mode 100644 code/page/resources/images/divider.svg create mode 100644 code/page/resources/images/exit.svg create mode 100644 code/page/resources/images/favicon_play.ico create mode 100644 code/page/resources/images/overflow-icon.svg create mode 100644 code/page/resources/images/overflow_checkmark.svg create mode 100644 code/page/resources/images/overflow_icon_off.svg create mode 100644 code/page/resources/images/refresh.svg create mode 100644 code/page/resources/images/resize.svg create mode 100644 code/page/resources/images/return.svg create mode 100644 code/page/resources/images/transparent.gif create mode 100644 code/page/resources/images/views-icon.svg create mode 100644 code/page/resources/reload.html create mode 100644 code/page/resources/scripts/axure/action.js create mode 100644 code/page/resources/scripts/axure/adaptive.js create mode 100644 code/page/resources/scripts/axure/annotation.js create mode 100644 code/page/resources/scripts/axure/axQuery.js create mode 100644 code/page/resources/scripts/axure/axQuery.std.js create mode 100644 code/page/resources/scripts/axure/doc.js create mode 100644 code/page/resources/scripts/axure/drag.js create mode 100644 code/page/resources/scripts/axure/events.js create mode 100644 code/page/resources/scripts/axure/expr.js create mode 100644 code/page/resources/scripts/axure/flyout.js create mode 100644 code/page/resources/scripts/axure/geometry.js create mode 100644 code/page/resources/scripts/axure/globals.js create mode 100644 code/page/resources/scripts/axure/ie.js create mode 100644 code/page/resources/scripts/axure/init.temp.js create mode 100644 code/page/resources/scripts/axure/ios.js create mode 100644 code/page/resources/scripts/axure/jquery.nicescroll.min.js create mode 100644 code/page/resources/scripts/axure/legacy.js create mode 100644 code/page/resources/scripts/axure/math.js create mode 100644 code/page/resources/scripts/axure/model.js create mode 100644 code/page/resources/scripts/axure/move.js create mode 100644 code/page/resources/scripts/axure/recording.js create mode 100644 code/page/resources/scripts/axure/repeater.js create mode 100644 code/page/resources/scripts/axure/sto.js create mode 100644 code/page/resources/scripts/axure/style.js create mode 100644 code/page/resources/scripts/axure/tree.js create mode 100644 code/page/resources/scripts/axure/utils.temp.js create mode 100644 code/page/resources/scripts/axure/variables.js create mode 100644 code/page/resources/scripts/axure/viewer.js create mode 100644 code/page/resources/scripts/axure/visibility.js create mode 100644 code/page/resources/scripts/axutils.js create mode 100644 code/page/resources/scripts/jquery-1.7.1.min.js create mode 100644 code/page/resources/scripts/jquery-3.2.1.min.js create mode 100644 code/page/resources/scripts/jquery-ui-1.8.10.custom.min.js create mode 100644 code/page/resources/scripts/messagecenter.js create mode 100644 code/page/resources/scripts/player/axplayer.js create mode 100644 code/page/resources/scripts/player/init.js create mode 100644 code/page/resources/scripts/player/splitter.js create mode 100644 code/page/start.html create mode 100644 code/page/start_c_1.html create mode 100644 code/page/start_with_pages.html create mode 100644 code/page/供应商信息.html create mode 100644 code/page/入库信息.html create mode 100644 code/page/出库信息.html create mode 100644 code/page/药品保质期检查.html create mode 100644 code/page/药品信息.html create mode 100644 code/page/账单信息.html diff --git a/code/page/data/document.js b/code/page/data/document.js new file mode 100644 index 0000000..2fa39ea --- /dev/null +++ b/code/page/data/document.js @@ -0,0 +1,7 @@ +$axure.loadDocument( +(function() { + var _ = function() { var r={},a=arguments; for(var i=0; irs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`S9rQOhE&A8y|j_H!GMAJ;DH4rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`mwCE4hE&A8y|j_H!GMAJ;DKwA3O&3+r#ODTTetDff79nR>@wflzpmM; oKd110>*5wyrwA2#6A3;1dRy2|S%l6v2D+HR)78&qol`;+029Vf_5c6? literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u228.png b/code/page/images/供应商信息/u228.png new file mode 100644 index 0000000000000000000000000000000000000000..56b73ed6fcf692cb401a316d6d742cab61be9234 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`*L%7+hE&A8y<{kO*nok>(XxQY%f`ihfs^{Yk24%=?&f{He}Ch(U%VAJ yWv|Wo{JZAI?R&rf*ht5z>IfZDQlvA%lpIsW!D()7*bOujXKbLh*2~7ZslT7Xa literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u228_mouseOver.png b/code/page/images/供应商信息/u228_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..df553c5b099ff84fcee7010741ffc58a192caf73 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`S9-cQhE&A8y|j_H!GMAJ;DKu=84S!kI(Q%K-hJv_{p{j6=DKe!rErs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`mwLK5hE&A8y|j_{fC2-v#-3!@HX575F1?XS~Pgg&ebxsLQ0NgT3;Q#;t literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u229_mouseOver.png b/code/page/images/供应商信息/u229_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb2ec7e6ff62c82ddd9b63fd97181b1604f00be GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`mwUQ6hE&A8y|j_H!GMAJpu^!akqX((Ek;iJc4zB+uRm*fpRxUKqHXqD q?({p=4>b}e3W#yinGlqC%)HW%&FfV3ojE`!GkCiCxvXrs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`S9-cQhE&A8y|j_H!GMAJ;DKu=86u@sj<9{W8=LyQ{*2{%M*HeRx2pGx s?~Bgv{e1U>cH%?y#N3J literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u233_mouseOver.png b/code/page/images/供应商信息/u233_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4f7f6d5ea925cc7afd6df328b0527e96069941 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`S9`iRhE&A8y|j?G!GVG0AiMKff5tC8O)VD~*USzqubXc9-1I@Zf5h#= uJ>vVUzt^sL-xkl=-Lk=hgU-YO3G@Bd9OgFzGE9KZX7F_Nb6Mw<&;$U}(Ojbd literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u264.png b/code/page/images/供应商信息/u264.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f1c02dc38b540f49414f277d7f9a352f690ed8 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`S9rQOhE&A8y}Ob3fPw&vSEmRS`VuyWR1A*s$FAZulI*uz2y`=pr>mdKI;Vst0BbEz_y7O^ literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u264_mouseOver.png b/code/page/images/供应商信息/u264_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..af2c84283ab89e9e3c8dee3c25fe91159be8878f GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`S9-cQhE&A8y}OaO!9ak;(b?&2-htfamY62<*`9v$^Z#9+^I5jwhWxe7 u*X$nlRO`#A>IfZDQlu;KP*APW(9S!YV{?i#+d81589ZJ6T-G@yGywqU4oKSo literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u268.png b/code/page/images/供应商信息/u268.png new file mode 100644 index 0000000000000000000000000000000000000000..3dbfcf17c0eb1e8bb0681f9c5167651d087a2a62 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`S9`iRhE&A8y}OaO!9ak;(fN8AW1h5%3;TwfJ|*+>{~e$6S?a@P^)-9H wS05_RUR$_Nx=vL`=#Y{kU5ST+YK?|@?aW*Y_I=sE0O)K6Pgg&ebxsLQ0L*|(r2qf` literal 0 HcmV?d00001 diff --git a/code/page/images/供应商信息/u268_mouseOver.png b/code/page/images/供应商信息/u268_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..c4465edc468a6beda01d73d10a36b9f7f7fa70e7 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^(}38BgAGXT>rs*dQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`*Lk`)hE&A8y}MAb!9jrKAiMJ!e}*SLOcH%?UoWax8&t;ucLK6V~%t`S8 literal 0 HcmV?d00001 diff --git a/code/page/images/入库信息/u25.svg b/code/page/images/入库信息/u25.svg new file mode 100644 index 0000000..6734d01 --- /dev/null +++ b/code/page/images/入库信息/u25.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/code/page/images/入库信息/u30.png b/code/page/images/入库信息/u30.png new file mode 100644 index 0000000000000000000000000000000000000000..3db6da86956b39eb2c55accb7e27ecf59860aa74 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d8!3HF6MeqI$q!^2X+?^QKos)S9=Xkm}hGaOuy||IL!9ak;(fRuQhTCkMJK4=0OIH#I)5^q70ocf0BP s@1}POsJKm#a7<$96eOJybghc=X$z0hGaOuy||IL!GMAJpu^!akqX(uoT=>lc4X^ZuRm*f-|?9ElgQUG s|H|g8I!%ypOk(L2RB=Xts~hGaOuy||IL!GMAJ;DKu=86u@srpW$yv~JVu{mAT%@ u`?Xt-)tU)59pMmC_UKVCB!h8ELVx8^4*t`MMlL{`89ZJ6T-G@yGywp;kUnex literal 0 HcmV?d00001 diff --git a/code/page/images/入库信息/u35_mouseOver.png b/code/page/images/入库信息/u35_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..27cec8fd295b4b580b8fe8789b6d5da34cfb7580 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d8!3HF6MeqI$q!^2X+?^QKos)S97kaulhGaOuy||IL!GMAJpu^!ai40}Sm^f3}_w88y=GS)1=f)>~G|61w xs#m}3eDRxXVMUJ~1;eHz974*ZGnVvxWO{DL!GGj%QXkNA22WQ%mvv4FO#ny}K!*ST literal 0 HcmV?d00001 diff --git a/code/page/images/入库信息/u60.png b/code/page/images/入库信息/u60.png new file mode 100644 index 0000000000000000000000000000000000000000..60faa2198fbd38caaa80d6447299ce4f431ea279 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d8!3HF6MeqI$q!^2X+?^QKos)S9=Xts~hGaOuy|t0I!GVY6VEeke2e$JH{gS(ppk`@#@5=QvHr+k?C+_{8 v^XILdcZ-5y(-96KWse?`85P_7B44wvRpsOoQaD@o| literal 0 HcmV?d00001 diff --git a/code/page/images/入库信息/u60_mouseOver.png b/code/page/images/入库信息/u60_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..fa79868e8ac59f96eaa241a45536e94c5c14560b GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d8!3HF6MeqI$q!^2X+?^QKos)S9=X<(1hGaOuy|t0I!9ak;(b?&2-htd?&YkRLGd%s|^M75R^I0~f#&O=( vb0_b=+w8(2r0mh7VAynobVmB?DTZdM&K%w4yEi=nTFv0;>gTe~DWM4f5pzB% literal 0 HcmV?d00001 diff --git a/code/page/images/入库信息/u65.png b/code/page/images/入库信息/u65.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec8534eb919ab14432c91ad27807a9b0c2ac456 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d8!3HF6MeqI$q!^2X+?^QKos)S97kaulhGaOuy|t0I!9ak;(fN8AW1h6i6S*4+YPxGK0l>;*ZM!PC{xWt~$(699IBJ+S}) literal 0 HcmV?d00001 diff --git a/code/page/images/入库信息/u65_mouseOver.png b/code/page/images/入库信息/u65_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3b9d453b5f4e438d872082494b1e14c1438642 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d8!3HF6MeqI$q!^2X+?^QKos)S97kj!mhGaOuy|t0I!9ak;(b?(jGKMNOCeEGgW-~h9J@&1iU2NCfqkp0> z_VpA0@0ESExk@aZf+}tkBpj1SW*pmGdP+inxguA^!v!%yK#{w-_^_cn5F2U^eI>FVdQ&MBb@00b{RQ~&?~ literal 0 HcmV?d00001 diff --git a/code/page/images/药品保质期检查/u162_mouseOver.png b/code/page/images/药品保质期检查/u162_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e45e9fa42bf777caa1f54b587573e3d8c4f004 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^(|}lxgAGWYd-OaUNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%FZFbB45^5FdubzYg8>8cL5IU0R;gT$2aRT8@AmYKY4fLv~Rs; srGDq*yw=q%u1*muln^$oiU!B{4fk?#eVOGCbN~Z`r>mdKI;Vst0P$8qCjbBd literal 0 HcmV?d00001 diff --git a/code/page/images/药品保质期检查/u192_mouseOver.png b/code/page/images/药品保质期检查/u192_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..bd280ebb5f36621c55b3f2a710490e74dba889e6 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^(|}lxgAGWYd-OaUNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%FZXnD45^5FduJnWgMk2xqqEc5yaTz-Eip~zvpxOh=l{7r=d*0V4f$)E uuh~89sn(ZK)e$=Xts~hGaOuy||IL!GMAJ;DLFPD#pev69dW~bniY^^!IwyYuS_<$7gfS u|NQgD&bvjyu;~bgkg`V)>5NH6$JkD;U>Drr+d0MhGaOuy?BuGfC0~e16!i2tHiz9E?FKoJ!PC{xWt~$(69DUvK3f0) literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u309.png b/code/page/images/药品信息/u309.png new file mode 100644 index 0000000000000000000000000000000000000000..828419ffe3c6c867f9bf37aa80ccbf22d634af4d GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^SwJku!3HFcOzL(3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`^E_P~Lo%G-UOdRzV8Fm~Fk`-^ifMF9(~=IIGc|qH@3&s7Vn6=d`K;yq uzm`|_PCv{ksuNn{1`Gdx`!Lo%G-US#AvU?6bdK;F95`ni@Bbbx naC4OqO$=!X6eNRjC`#Uahux#_lSc}Hb~1Rn`njxgN@xNATz@+t literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u310.png b/code/page/images/药品信息/u310.png new file mode 100644 index 0000000000000000000000000000000000000000..d21345aa71cf1bd5438f2f973632440462005fe5 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^$v`Z}!3HEP+81;IDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(ehed7dtgAsNnZFK*;*FkoOlcwnBSim@@v#DKB~-Mfz!{k7Fi*AsNnZFCOGPV8C3rBeIlS@S?-mAQ mr!yRe%13$x$Y4C4!(YEs^Si^u1wBA389ZJ6T-G@yGywoZm^||U literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u312.png b/code/page/images/药品信息/u312.png new file mode 100644 index 0000000000000000000000000000000000000000..2485a5ef6cb4cb11a08bd142d42c69a41c127344 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^eLyV7!3HFM%~taUQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`t2|vCLn`9lUfRfe*nolA(bBrYhIdh=NnBe8)&f_`k%b^tMrFU zvghV}{$2AU`+aTQJl^#j?JgE7hZF_*Itx5noRwsR9!?-hNa8Wm^<|v=4JQ-qfv#Zi MboFyt=akR{0Q;jv>i_@% literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u312_mouseOver.png b/code/page/images/药品信息/u312_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..afc6942fe2373a3fe74b17d4e0ce786389dd4630 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^eLyV7!3HFM%~taUQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`i#=T&Ln`9lUfRgpV8Fn9@W8c`3HPeCCGkCiCxvXNn{1`b39!fLo%G-UOdQoK!Jh9aq_y{1KWfJx(gDY72m0zZ~5GO$34ES*Q};T s?@ix1CqU52l|xi9q=j_GRD)yuk2u&CD(}c}0ou#p>FVdQ&MBb@099W%*8l(j literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u320.png b/code/page/images/药品信息/u320.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9c151525d282b2f7cc804c1ee2157f3ae513d7 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^$v`Z}!3HEP+81;IDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheIi4<#AsNnZFK*;*Fc4sIbiRJS;WiuRPIj{yo_^x*O^wehJ?!52-EO-5 r-E>X?WtScSL#HDgf}}Hyu2nINn{1`i#=T&Ln`9lUfRgpV8Fn9@W8c`43W|*F8x1#t=sh5{@I-C4fE#}e7pC) zH9vc8;Xdg)LB7rcj}~Vo8KH+0INDt-R1PVUBxG=mci~qKem^OnN}%-&p00i_>zopr E09}zn2mk;8 literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u393_mouseOver.png b/code/page/images/药品信息/u393_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..7979d81eb354fa7767b8283aaa93ba649efc7b9d GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^DL^d8!3HF6MeqI$q!^2X+?^QKos)S9XL-6fhGaOuy|t0^fP(Nn{1`^F3W0Lo%G--rmT0z(9b-@n-C5#;v){0fJF8Jp201|D~V%$-8d5^V+TF wPOiPTImT}V$3mr+E&(kkk{LFfDm@>WZy)C5+P-0D5724`Pgg&ebxsLQ0KmpUApigX literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u399_mouseOver.png b/code/page/images/药品信息/u399_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ea7c2cbc0eb7bd47e51a95afa4fc129b73e149 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^SwJku!3HFcOzL(3QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`vproLLo%G--ag2Az(9c6Q9X8d6?;?nj#kM4*5B7Qf4A%Y`7hx4jSqXb riy!6`RSanf5Oi|oAek}Q;ZT&kW3i)mgos8D&{_shS3j3^P6gTe~DWM4fMg~8x literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u400_mouseOver.png b/code/page/images/药品信息/u400_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca4688561eb1a0d21696bb3bb7849aa10983523 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^$v`Z}!3HEP+81;IDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheS)MMAAsNnZZ*Al};2^-Var^Flug)jz>)=$m!KHRLJ?-0t565q8J#g=K r3xlE45e`9RmmUF<8HF|HES@u){?JLt+q0?-Xe)!KtDnm{r-UW|C2Ktr literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u402.png b/code/page/images/药品信息/u402.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab0cec0e96d86816a46c2d10c4eaaa64ae86749 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^eLyV7!3HFM%~taUQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`OFdm2Ln`9l-r308U?9Na=zP75F;7~>rSC?C+OG5F|B}yD^8R?qng0Io zybrl+P0y7d)<2{u$k$om(c-KmBlK_rN4txK3JF5XnOTzWd^^uoq50z6cc23pJYD@< J);T3K0RRzxLk|D| literal 0 HcmV?d00001 diff --git a/code/page/images/药品信息/u402_mouseOver.png b/code/page/images/药品信息/u402_mouseOver.png new file mode 100644 index 0000000000000000000000000000000000000000..bf679c0335840d3437013ec4e32e4f1625a5900a GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^eLyV7!3HFM%~taUQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`%RF5iLn`9l-r308U?9Na=zP75F~H2DLuTVgpOX3ce{RqDEcM~C@VQEv z_nh~iMJ3mp|51_=dN_fj-Ni!XkfI=8XMsnHGYLW!Rt^Tocz^uos<^oP(?XyN7(8A5 KT-G@yGywovn?u0> literal 0 HcmV?d00001 diff --git a/code/page/index.html b/code/page/index.html new file mode 100644 index 0000000..691f359 --- /dev/null +++ b/code/page/index.html @@ -0,0 +1,149 @@ + + + + Untitled Document + + + + + + + + + + + + + + +
+
+
+ +
+ CLOSE +
+ +
+
+
    +
    + +
    +
    +   +
    +
    +
    + + +
    +
     
    +
    +   +
    +
    +
    +
    + +
    +
    +
      +
      +
      +
      + Local Preview +
      +
      +
      + +
      + + +
      +
        +
      • + +
      • +
      +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      +
      +
      +
      +
      + +
      + + + + + + + + + + + + diff --git a/code/page/plugins/debug/debug.js b/code/page/plugins/debug/debug.js new file mode 100644 index 0000000..57d37c1 --- /dev/null +++ b/code/page/plugins/debug/debug.js @@ -0,0 +1,171 @@ +// use this to isolate the scope +(function () { + + if(!$axure.document.configuration.showConsole) { return; } + + $(document).ready(function () { + $axure.player.createPluginHost({ + id: 'debugHost', + context: 'inspect', + title: 'Console', + gid: 3 + }); + + generateDebug(); + + $('#variablesClearLink').click(clearvars_click); + $('#traceClear').click(cleartrace_click); + $('#traceToggle').click(stoptrace_click); + $('#traceStart').click(starttrace_click); + $('#traceClear').hide(); + $('#traceToggle').hide(); + + $('#closeConsole').click(close); + + var currentStack= []; + var finishedStack = []; + + $axure.messageCenter.addMessageListener(function (message, data) { + if(message == 'axCompositeEventMessage') { + for(var i = 0; i < data.length; i++) { + processMessages(data[i].message, data[i].data); + } + } else processMessages(message, data); + }); + + var processMessages = function(message, data) { + if(message == 'globalVariableValues') { + $('#variablesDiv').empty(); + for(var key in data) { + var value = data[key] == '' ? '(blank)' : data[key]; + $('#variablesDiv').append('
      ' + key + '
      ' + value + '
      '); + } + } else if(message == 'axEvent') { + var addToStack = "
      "; + addToStack += "
      "; + addToStack += "
      " + new Date().toLocaleTimeString() + "
      "; + addToStack += "
      " + data.event.description + ":
      "; + addToStack += "
      " + data.label + " (" + data.type + ")
      "; + addToStack += "
      "; + + currentStack.push(addToStack); + } else if (message == 'axEventComplete') { + currentStack[currentStack.length - 1] += "
      "; + finishedStack.push(currentStack.pop()); + if(currentStack.length == 0) { + $('#traceEmptyState').hide(); + $('#traceClear').show(); + $('#traceToggle').show(); + + for(var i = finishedStack.length - 1; i >= 0; i--) { + if($('#traceDiv').children().length > 99) $('#traceDiv').children().last().remove(); + $('#traceDiv').prepend(finishedStack[i]); + } + finishedStack = []; + } + } else if (message == 'axCase') { + //var addToStack = "
      "; + var addToStack = "
      "; + addToStack += "
      " + data.item + "
      "; + if (data.description) { addToStack += "
      " + data.description + "
      " }; + addToStack += "
      "; + + currentStack[currentStack.length - 1] += addToStack; + } else if (message == 'axAction') { + var addToStack = "
      "; + addToStack += "
      " + data.name + "
      "; + //addToStack += "
      " + data.item + "
      "; + //if (data.description) { addToStack += "
      " + data.description + "
      " }; + addToStack += "
      "; + + currentStack[currentStack.length - 1] += addToStack; + } else if (message == 'axInfo') { + var addToStack = "
      "; + addToStack += "
      " + data.item + "
      "; + if (data.description) { addToStack += "
      " + data.description + "
      " }; + addToStack += "
      "; + + currentStack[currentStack.length - 1] += addToStack; + } + } + + // bind to the page load + $axure.page.bind('load.debug', function () { + var traceStr = $axure.player.getHashStringVar(TRACE_VAR_NAME); + if (traceStr.length > 0) $axure.messageCenter.setState("isTracing", true); + else $axure.messageCenter.setState("isTracing", false); + $axure.messageCenter.postMessage('getGlobalVariables', ''); + + return false; + }); + + function clearvars_click(event) { + $axure.messageCenter.postMessage('resetGlobalVariables', ''); + } + + function close() { + $axure.player.pluginClose("debugHost"); + } + + function cleartrace_click(event) { + $('#traceDiv').html(''); + } + + function starttrace_click(event) { + $axure.messageCenter.setState("isTracing", true); + //$('#traceDiv').html(''); + $('#traceEmptyState').hide(); + $('#traceClear').show(); + $('#traceToggle').text('Stop Trace'); + $('#traceToggle').off("click"); + $('#traceToggle').click(stoptrace_click); + $('#traceToggle').show(); + console.log("starting trace"); + $axure.player.setVarInCurrentUrlHash(TRACE_VAR_NAME, 1); + } + + function stoptrace_click(event) { + $axure.messageCenter.setState("isTracing", false); + $('#traceDiv').prepend('
      Trace Paused
      '); + $('#traceToggle').text('Restart Trace'); + $('#traceToggle').off("click"); + $('#traceToggle').click(starttrace_click); + console.log("stopping trace"); + $axure.player.deleteVarFromCurrentUrlHash(TRACE_VAR_NAME); + } + }); + + function generateDebug() { + var pageNotesUi = "
      "; + pageNotesUi += "
      "; + pageNotesUi += "
      Console
      "; + + pageNotesUi += "
      "; + pageNotesUi += "
      "; + + pageNotesUi += "
      "; + pageNotesUi += "
      Variables
      "; + pageNotesUi += "Reset Variables"; + pageNotesUi += "
      "; + pageNotesUi += "
      "; + + pageNotesUi += "
      "; + pageNotesUi += "TraceClear TraceStop Trace"; + pageNotesUi += "
      "; + pageNotesUi += "
      "; + pageNotesUi += "
      "; + pageNotesUi += "
      "; + + + pageNotesUi += "
      "; + pageNotesUi += "
      Click the button below to start recording interactions as you click through the prototype.
      "; + pageNotesUi += "
      Start Trace
      "; + pageNotesUi += "
      "; + pageNotesUi += "
      "; + pageNotesUi += "
      "; + + $('#debugHost').html(pageNotesUi); + $('#traceEmptyState').show(); + } + +})(); \ No newline at end of file diff --git a/code/page/plugins/debug/styles/debug.css b/code/page/plugins/debug/styles/debug.css new file mode 100644 index 0000000..a478293 --- /dev/null +++ b/code/page/plugins/debug/styles/debug.css @@ -0,0 +1,265 @@ +#debugHost { + display: flex; + flex-direction: column; + font-size: 13px; + color: #4a4a4a; + height: 100%; +} + +#debugHostBtn { + order: 4; +} + +#debugHostBtn a { + background: url('images/console_panel_on.svg') no-repeat center center, linear-gradient(transparent, transparent); +} + +#debugHostBtn a.selected, #debugHostBtn a.selected:hover { + background: url('images/console_panel_off.svg') no-repeat center center, linear-gradient(transparent, transparent); +} + +#debugToolbar { + margin-left: 8px; +} + +#variablesClearLink { + display: inline-block; + margin-bottom: 15px; +} + +#variablesClearLink:hover { + color: #0a6cd6; +} + +#traceClearLink { + display: inline-block; + margin-bottom: 15px; +} + +#traceClearLink:hover { + color: #0a6cd6; +} + +#debugScrollContainer +{ + overflow: auto; + width: 100%; + -webkit-overflow-scrolling: touch; + flex: 1; +} + +#debugContainer { + padding: 10px 0px 10px 0px; +} + +#consoleTitle { + clear: right; + margin: 12px 0px; +} + +.variableName +{ + font-weight: bold; +} + +.variableDiv +{ + margin-bottom: 20px; + line-height: 16px; + +} + +#variablesDiv +{ + clear: right; +} + +#variablesContainer { + border-bottom: solid 1px #e7e7e7; + padding: 0px 10px 12px 10px; +} + +#traceContainer { + margin-bottom: 5px; + padding: 15px 10px 0px 10px; +} + +#variablesTitle { + margin-bottom: 9px; +} + +.sectionTitle { + font-size: 11px; + color: #2c2c2c; + display: inline-block; +} + +.debugToolbarButton +{ + font-size: 1em; + color: #069; +} + +.axEventBlock { + display: inline-block; + width: 100%; + margin: 5px 0px 5px 0px; + line-height: 21px; + border-bottom: solid 5px #e7e7e7; +} + +.axEventContainer { + background-color: #e7e7e7; + padding: 0px 10px 0px 10px; +} + +.axTime { + margin: 0px 0px 0px 5px; + font-size: 10px; + color: #575757; + display: inline-block; + float: right; +} + +.axLabel { + display: inline-block; +} + +.axEvent { + margin: 0px 0px 2px 0px; + font-size: 15px; + font-weight: bold; + overflow: hidden; + text-overflow: ellipsis; +} + +.axCaseContainer, .axActionContainer, .axInfoContainer { + justify-content: space-between; + padding: 0px 10px 0px 10px; +} + .axCaseContainer { + border-top: solid 2px #e7e7e7; + /*background-color: #47b6b5;*/ + background-color: #e7e7e7; + /*color: #ffffff;*/ + } + .axActionContainer { + border-top: solid 3px #e7e7e7; + } + .axInfoContainer { + border-top: solid 1px #e7e7e7; + } + +.axCaseItem, .axActionItem, .axInfoItem { + overflow: hidden; + text-overflow: ellipsis; +} + .axCaseItem { + font-size: 15px; + font-weight: bold; + } + .axActionItem { + font-weight: bold; + } + .axInfoItem { + color: #8c8c8c; + } + +.axCaseDescription { + flex: 5 0 33%; + margin-left: 10px; + text-align: right; +} +/*.axActionDescription, .axInfoDescription { + flex: 5 0 33%; + margin-left: 10px; + text-align: right; +}*/ + .axCaseDescription, .axActionDescription { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .axInfoDescription, .axActionDescription { + color: #8c8c8c; + font-size: 11px; + } + +.variableName { + width: 55%; + line-height: 0.92; + text-align: left; + color: #0891b3; + display: inline-block; + word-wrap: break-word; + vertical-align: top; +} + +.variableValue { + width: 45%; + line-height: 0.92; + text-align: right; + color: #373d48; + display: inline-block; + word-wrap: break-word; +} + +.traceEvent { + border-bottom: solid 1px #e7e7e7; +} + +.tracePausedNotification { + height: 25px; + /*background-color: #e7e7e7;*/ + border-radius: 5px; + line-height: 25px; + margin: 5px 10px; + text-align: center +} + +#traceEmptyState.emptyStateContainer { + margin-top: 0px; +} + +.variableList{ + width: 100%; + margin-bottom: 4px; +} + +.traceOption { + margin-left: 11px; + height: 16px; + float: right; + font-size: 12px; + font-style: italic; + line-height: 1.45; + text-align: right; + color: #8c8c8c; + text-decoration: underline; + display: inline-block; +} + +.startInstructions { + margin: auto; + width: 179px; + font-size: 11px; + text-align: center; + color: #666666; +} + +.startButton { + margin: auto; + margin-top: 10px; + width: 181px; + height: 24px; + border-radius: 2px; + border: solid 1px #008fe0; + text-align: center; + line-height: 24px; + color: #008fe0; + cursor: pointer; +} + +.debugLinksContainer { + text-align: right; +} \ No newline at end of file diff --git a/code/page/plugins/debug/styles/images/console_panel_off.svg b/code/page/plugins/debug/styles/images/console_panel_off.svg new file mode 100644 index 0000000..904e7b2 --- /dev/null +++ b/code/page/plugins/debug/styles/images/console_panel_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/debug/styles/images/console_panel_on.svg b/code/page/plugins/debug/styles/images/console_panel_on.svg new file mode 100644 index 0000000..1eeec2e --- /dev/null +++ b/code/page/plugins/debug/styles/images/console_panel_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/page_notes/page_notes.js b/code/page/plugins/page_notes/page_notes.js new file mode 100644 index 0000000..b0bee8c --- /dev/null +++ b/code/page/plugins/page_notes/page_notes.js @@ -0,0 +1,474 @@ +// use this to isolate the scope +(function () { + // No notes shown specified by generation config + if (!$axure.document.configuration.showPageNotes && !$axure.document.configuration.showAnnotationsSidebar && !$axure.document.configuration.showAnnotations) { return; } + + $(window.document).ready(function () { + // Load right panel for Page Notes + if ($axure.document.configuration.showPageNotes || $axure.document.configuration.showAnnotationsSidebar) { + $axure.player.createPluginHost({ + id: 'pageNotesHost', + context: 'inspect', + title: 'Documentation', + gid: 2, + }); + } + + // Load footnotes on widgets + if ($axure.document.configuration.showAnnotations) { + $('#overflowMenuContainer').prepend('
      Show Note Markers
      '); + } + + createNotesOverlay(); + generatePageNotes(); + + if ($axure.player.isMobileMode()) { + $('#showNotesOption').hide(); + } else { + $('#showNotesOption').click(footnotes_click); + $('#showNotesOption').find('.overflowOptionCheckbox').addClass('selected'); + } + + function populateNotes(pageForNotes) { + var hasNotes = false; + if ($axure.document.configuration.showPageNotes) { + var pageNoteUi = ''; + + function populatePageNotes(pageOrMaster) { + //populate the page notes + var notes = pageOrMaster.notes; + if (notes && !$.isEmptyObject(notes)) { + pageNoteUi += "
      " + pageOrMaster.pageName + "
      "; + + var showNames = $axure.document.configuration.showPageNoteNames; + for(var noteName in notes) { + pageNoteUi += "
      "; + if(showNames) { + pageNoteUi += "
      " + noteName + "
      "; + } + pageNoteUi += "
      " + linkify(notes[noteName]) + "
      "; + pageNoteUi += "
      "; + //$('#pageNotesContent').append(pageNoteUi); + + hasNotes = true; + } + } + } + + populatePageNotes(pageForNotes); + if (pageForNotes.masterNotes) { + for (var i = 0; i < pageForNotes.masterNotes.length; i++) { + populatePageNotes(pageForNotes.masterNotes[i]); + } + } + + if (pageNoteUi.length > 0) { + pageNoteUi += "
      "; + var pageNotesHeader = "
      Page Notes
      "; + $('#pageNotesContent').append(pageNotesHeader + pageNoteUi); + } + } + + if ($axure.document.configuration.showAnnotationsSidebar) { + var widgetNoteUi = ''; + //var widgetNotes = pageForNotes.widgetNotes; + function populateWidgetNotes(widgetNotes){ + if (widgetNotes) { + for (var i = 0; i < widgetNotes.length; i++) { + var widgetNote = widgetNotes[i]; + widgetNoteUi += "
      "; + widgetNoteUi += "
      " + widgetNote["fn"] + "
      "; + widgetNoteUi += "
      " + widgetNote["label"] + "
      "; + + for (var widgetNoteName in widgetNote) { + if (widgetNoteName != "label" && widgetNoteName != "fn" && widgetNoteName != "ownerId") { + widgetNoteUi += "
      " + widgetNoteName + "
      "; + widgetNoteUi += "
      " + linkify(widgetNote[widgetNoteName]) + "
      "; + //widgetNoteUi += "
      "; + } + } + widgetNoteUi += "
      "; + //widgetNoteUi += "
      "; + //$('#pageNotesContent').append(widgetNoteUi); + hasNotes = true; + } + } + } + + populateWidgetNotes(pageForNotes.widgetNotes); + if (pageForNotes.masterNotes) { + for (var i = 0; i < pageForNotes.masterNotes.length; i++) { + populateWidgetNotes(pageForNotes.masterNotes[i].widgetNotes); + } + } + + if (widgetNoteUi.length > 0) { + var widgetNotesHeader = "
      Widget Notes
      "; + $('#pageNotesContent').append(widgetNotesHeader + widgetNoteUi); + + //$('.widgetNoteContainer').children(':last-child').remove(); + //$('.widgetNoteFootnote').append("
      "); + $('.widgetNoteContainer').click(function () { + var wasSelected = $(this).hasClass('widgetNoteContainerSelected'); + $('.widgetNoteContainerSelected').removeClass('widgetNoteContainerSelected'); + if (!wasSelected) $(this).addClass('widgetNoteContainerSelected'); + + var dimStr = $('.currentAdaptiveView').attr('data-dim'); + var h = dimStr ? dimStr.split('x')[1] : '0'; + var $leftPanel = $('.leftPanel:visible'); + var leftPanelOffset = (!$axure.player.isMobileMode() && $leftPanel.length > 0) ? $leftPanel.width() : 0; + var $rightPanel = $('.rightPanel:visible'); + var rightPanelOffset = (!$axure.player.isMobileMode() && $rightPanel.length > 0) ? $rightPanel.width() : 0; + var viewDimensions = { + h: h != '0' ? h : '', + scaleVal: $('.vpScaleOption').find('.selectedRadioButton').parent().attr('val'), + height: $('.rightPanel').height(), + panelWidthOffset: leftPanelOffset + rightPanelOffset + }; + $axure.messageCenter.postMessage('toggleSelectWidgetNote', { id: this.getAttribute('data-id'), value: !wasSelected, view: viewDimensions}); + }); + } + + + //if (pageForNotes.masterNotes) { + // for (var i = 0; i < pageForNotes.masterNotes.length; i++) { + // var master = pageForNotes.masterNotes[i]; + // hasNotes = populateNotes(master) || hasNotes; + // } + //} + } + + return hasNotes; + } + + // bind to the page load + $axure.page.bind('load.page_notes', function () { + closeAllDialogs(); + + var hasNotes = false; + + $('#pageNotesContent').html(""); + hasNotes = populateNotes($axure.page); + + if(hasNotes) $('#pageNotesEmptyState').hide(); + else $('#pageNotesEmptyState').show(); + + //If footnotes enabled for this prototype... + if ($axure.player.isMobileMode()) { + $axure.messageCenter.postMessage('annotationToggle', false); + } else if($axure.document.configuration.showAnnotations == true) { + //If the fn var is defined and set to 0, hide footnotes + //else if hide-footnotes button selected, hide them + var fnVal = $axure.player.getHashStringVar(FOOTNOTES_VAR_NAME); + if(fnVal.length > 0 && fnVal == 0) { + $('#showNotesOption').find('.overflowOptionCheckbox').removeClass('selected'); + $axure.messageCenter.postMessage('annotationToggle', false); + } else if(!$('#showNotesOption').find('.overflowOptionCheckbox').hasClass('selected')) { + //If the footnotes button isn't selected, hide them on this loaded page + $axure.messageCenter.postMessage('annotationToggle', false); + } + } + + // Get multiple click call if not removing beforehand + $('#notesOverlay').off('click'); + $('#notesOverlay').on('click', '.closeNotesDialog', function () { + var ownerId = $(this).attr("data-ownerid"); + _toggleAnnDialog(ownerId); + }); + + $axure.player.updatePlugins(); + return false; + }); + + $axure.messageCenter.addMessageListener(function (message, data) { + //var messageData = { id: elementId, x: event.pageX, y: event.pageY } + if (message == 'toggleAnnDialog') { + _toggleAnnDialog(data.id, data.x, data.y, data.page); + } + }); + + }); + + function linkify(text) { + var urlRegex = /(\b(((https?|ftp|file):\/\/)|(www\.))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; + return text.replace(urlRegex, function (url, b, c) { + var url2 = (c == 'www.') ? 'http://' + url : url; + return '' + url + ''; + }); + } + + function getWidgetNotesHtml(ownerId, page) { + var pageForNotes = page || $axure.page; + var widgetNoteUi = ''; + + widgetNoteUi += "
      "; + widgetNoteUi += "
      "; + + function getNotesForPage(widgetNotes) { + for (var i = 0; i < widgetNotes.length; i++) { + var widgetNote = widgetNotes[i]; + if (widgetNote["ownerId"] == ownerId) { + widgetNoteUi += "
      "; + widgetNoteUi += "
      " + widgetNote["fn"] + "
      "; + widgetNoteUi += "
      " + widgetNote["label"] + "
      "; + + for (var widgetNoteName in widgetNote) { + if (widgetNoteName != "label" && widgetNoteName != "fn" && widgetNoteName != "ownerId") { + widgetNoteUi += "
      " + widgetNoteName + "
      "; + widgetNoteUi += "
      " + linkify(widgetNote[widgetNoteName]) + "
      "; + } + } + widgetNoteUi += "
      "; + } + } + } + + getNotesForPage(pageForNotes.widgetNotes); + if (pageForNotes.masterNotes) { + for (var i = 0; i < pageForNotes.masterNotes.length; i++) { + getNotesForPage(pageForNotes.masterNotes[i].widgetNotes); + } + } + + widgetNoteUi += "
      "; + widgetNoteUi += "
      "; + + return widgetNoteUi; + } + + var maxZIndex = 1; + var dialogs = {}; + var _toggleAnnDialog = function (id, srcLeft, srcTop, page) { + + if(dialogs[id]) { + var $dialog = dialogs[id]; + // reset the dialog + dialogs[id] = undefined; + $dialog.find('.notesDialogScroll').getNiceScroll().remove(); + $dialog.remove(); + return; + } + + var bufferH = 10; + var bufferV = 10; + var blnLeft = false; + var blnAbove = false; + var mfPos = $('#mainPanelContainer').position(); + var viewablePanelLeftMargin = parseInt($('#mainPanelContainer').css('margin-left')); + + var sourceTop = srcTop + mfPos.top; + var sourceLeft = srcLeft + viewablePanelLeftMargin; + + var width = 300; + var height = 300; + + if(sourceLeft > width + bufferH) { + blnLeft = true; + } + if(sourceTop > height + bufferV) { + blnAbove = true; + } + + var top = 0; + var left = 0; + if(blnAbove) top = sourceTop - height - 20; + else top = sourceTop + 10; + if(blnLeft) left = sourceLeft - width - 4; + else left = sourceLeft - 6; + + //need to set the zindex + maxZIndex = maxZIndex + 1; + + var $dialog = $('
      ') + .appendTo('#notesOverlay') + .html(getWidgetNotesHtml(id, page)); + + $dialog.css({ 'left': left, 'top': top, 'z-index': maxZIndex }); + + $dialog.find('.notesDialogScroll').niceScroll({ cursorcolor: "#8c8c8c", cursorborder: "0px solid #fff" }); + + $dialog.find('.notesDialogScroll').on($axure.eventNames.mouseDownName, function(event) { + event.stopPropagation(); + }); + + $dialog.find('.closeNotesDialog').on($axure.eventNames.mouseDownName, function (event) { + event.stopPropagation(); + }); + + $dialog.on($axure.eventNames.mouseDownName, startDialogMove); + var startMouseX; + var startMouseY; + var startDialogX; + var startDialogY; + function startDialogMove() { + startMouseX = window.event.pageX; + startMouseY = window.event.pageY; + var position = $dialog.position(); + startDialogX = position.left; + startDialogY = position.top; + + $dialog.addClass('active'); + $('
      ').insertAfter($('#notesOverlay')); + $(document).bind($axure.eventNames.mouseMoveName, doDialogMove).bind($axure.eventNames.mouseUpName, endDialogMove); + + $dialog.find('.notesDialogScroll').getNiceScroll().hide(); + } + + function doDialogMove() { + var currentX = window.event.pageX; + var currentY = window.event.pageY; + $dialog.css({ 'left': startDialogX + currentX - startMouseX, 'top': startDialogY + currentY - startMouseY }); + } + + function endDialogMove() { + $('div.splitterMask').remove(); + $dialog.removeClass('active'); + $(document).unbind($axure.eventNames.mouseMoveName, doDialogMove).unbind($axure.eventNames.mouseUpName, endDialogMove); + + $dialog.find('.notesDialogScroll').getNiceScroll().resize(); + $dialog.find('.notesDialogScroll').getNiceScroll().show(); + } + + $dialog.find('.resizeNotesDialog').on($axure.eventNames.mouseDownName, startDialogResize); + + var startDialogW; + var startDialogH; + function startDialogResize() { + event.stopPropagation(); + + startMouseX = window.event.pageX; + startMouseY = window.event.pageY; + startDialogW = Number($dialog.css('width').replace('px','')); + startDialogH = Number($dialog.css('height').replace('px', '')); + + $dialog.addClass('active'); + $('
      ').insertAfter($('#notesOverlay')); + $(document).bind($axure.eventNames.mouseMoveName, doDialogResize).bind($axure.eventNames.mouseUpName, endDialogResize); + + $dialog.find('.notesDialogScroll').getNiceScroll().hide(); + } + + function doDialogResize() { + var currentX = window.event.pageX; + var currentY = window.event.pageY; + var newWidth = Math.max(200, startDialogW + currentX - startMouseX); + var newHeight = Math.max(200, startDialogH + currentY - startMouseY); + $dialog.css({ 'width': newWidth, 'height': newHeight }); + } + + function endDialogResize() { + $('div.splitterMask').remove(); + $dialog.removeClass('active'); + $(document).unbind($axure.eventNames.mouseMoveName, doDialogResize).unbind($axure.eventNames.mouseUpName, endDialogResize); + + $dialog.find('.notesDialogScroll').getNiceScroll().resize(); + $dialog.find('.notesDialogScroll').getNiceScroll().show(); + } + + dialogs[id] = $dialog; + + // scroll ... just for IE + //window.scrollTo(scrollX, scrollY); + }; + + $(document).on('sidebarCollapse', function (event, data) { + clearSelection(); + }); + + $(document).on('pluginShown', function (event, data) { + if(data != 2) { + clearSelection(); + } + }); + + function clearSelection() { + var selectedNote = $('#pageNotesContainer').find('.widgetNoteContainerSelected'); + if(selectedNote.length > 0) { + selectedNote.removeClass('widgetNoteContainerSelected'); + //var dimStr = $('.currentAdaptiveView').attr('data-dim'); + //var h = dimStr ? dimStr.split('x')[1] : '0'; + //var $leftPanel = $('.leftPanel:visible'); + //var leftPanelOffset = (!$axure.player.isMobileMode() && $leftPanel.length > 0) ? $leftPanel.width() : 0; + //var $rightPanel = $('.rightPanel:visible'); + //var rightPanelOffset = (!$axure.player.isMobileMode() && $rightPanel.length > 0) ? $rightPanel.width() : 0; + //var viewDimensions = { + // h: h != '0' ? h : '', + // scaleVal: $('.vpScaleOption').find('.selectedRadioButton').parent().attr('val'), + // scrollLeft: $('#clipFrameScroll').scrollLeft(), + // scrollTop: $('#clipFrameScroll').scrollTop(), + // height: $('.rightPanel').height(), + // panelWidthOffset: leftPanelOffset + rightPanelOffset + //}; + //$axure.messageCenter.postMessage('toggleSelectWidgetNote', { id: '', value: false, view: viewDimensions }); + $axure.messageCenter.postMessage('toggleSelectWidgetNote', { id: '', value: false }); + //$axure.messageCenter.postMessage('toggleSelectWidgetNote', ''); + } + } + + function closeAllDialogs() { + for (var id in dialogs) { + var $dialog = dialogs[id]; + if ($dialog !== undefined) _toggleAnnDialog(id); + } + } + + $axure.player.toggleFootnotes = function(val) { + var scaleCheckDiv = $('#showNotesOption').find('.overflowOptionCheckbox'); + if (scaleCheckDiv.hasClass('selected')) { + if (!val) $('#showNotesOption').click(); + } else { + if (val) $('#showNotesOption').click(); + } + } + + function footnotes_click(event) { + var scaleCheckDiv = $('#showNotesOption').find('.overflowOptionCheckbox'); + if (scaleCheckDiv.hasClass('selected')) { + closeAllDialogs(); + + scaleCheckDiv.removeClass('selected'); + $axure.messageCenter.postMessage('annotationToggle', false); + //Add 'fn' hash string var so that footnotes stay hidden across reloads + $axure.player.setVarInCurrentUrlHash(FOOTNOTES_VAR_NAME, 0); + } else { + scaleCheckDiv.addClass('selected'); + $axure.messageCenter.postMessage('annotationToggle', true); + //Delete 'fn' hash string var if it exists since default is visible + $axure.player.deleteVarFromCurrentUrlHash(FOOTNOTES_VAR_NAME); + } + } + + function createNotesOverlay() { + var $targetPanel = $('#clippingBounds'); + + if (!$('#notesOverlay').length) { + var notesOverlay = document.createElement('div'); + notesOverlay.setAttribute('id', 'notesOverlay'); + + $targetPanel.prepend(notesOverlay); + $(notesOverlay).append(' '); + } + } + + function generatePageNotes() { + var pageNotesUi = "
      "; + + pageNotesUi += "
      "; + pageNotesUi += "
      "; + pageNotesUi += "
      "; + + + pageNotesUi += "
      "; + pageNotesUi += "
      "; + pageNotesUi += "
      No notes for this page.
      Notes added in Axure RP will appear here.
      "; + pageNotesUi += ""; + pageNotesUi += "
      "; + + $('#pageNotesHost').html(pageNotesUi); + + if(!$axure.document.configuration.showAnnotations) { + $('#pageNotesHost .pageNameHeader').css('padding-right', '55px'); + } + } + +})(); \ No newline at end of file diff --git a/code/page/plugins/page_notes/styles/images/notes_panel_off.svg b/code/page/plugins/page_notes/styles/images/notes_panel_off.svg new file mode 100644 index 0000000..3682486 --- /dev/null +++ b/code/page/plugins/page_notes/styles/images/notes_panel_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/page_notes/styles/images/notes_panel_on.svg b/code/page/plugins/page_notes/styles/images/notes_panel_on.svg new file mode 100644 index 0000000..3e7af5d --- /dev/null +++ b/code/page/plugins/page_notes/styles/images/notes_panel_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/page_notes/styles/page_notes.css b/code/page/plugins/page_notes/styles/page_notes.css new file mode 100644 index 0000000..35674c3 --- /dev/null +++ b/code/page/plugins/page_notes/styles/page_notes.css @@ -0,0 +1,209 @@ +#pageNotesHost { + display: flex; + flex-direction: column; + height: 100%; +} + +#pageNotesHostBtn { + order: 2; +} + +#pageNotesHostBtn a { + background: url('images/notes_panel_on.svg') no-repeat center center,linear-gradient(transparent, transparent); +} + +#pageNotesHostBtn a.selected, #pageNotesHostBtn a.selected:hover { + background: url('images/notes_panel_off.svg') no-repeat center center,linear-gradient(transparent, transparent); +} + +#pageNotesScrollContainer { + overflow: auto; + width: 100%; + flex: 1; + -webkit-overflow-scrolling: touch; +} + +#pageNotesContent { + overflow: visible; +} + +.pageNoteContainer { + padding: 0px 12px 8px 12px; +} + +.mobileMode .pageNoteContainer { + padding: 0px 16px 8px 17px; +} + +.pageNoteName { + font-size: 13px; + font-weight: bold; + color: #2c2c2c; + margin: 15px 0px 5px 0px; + white-space: nowrap; +} + +.pageNote { + font-size: 13px; + color: #2a2e38; + line-height: 1.67; + word-wrap: break-word; +} + +.pageNote ul { + list-style: disc; + padding: 0px 0px 0px 40px; +} + +.pageNote ul ul{ + list-style: circle; +} + +.pageNote ul ul ul{ + list-style: square; +} + +.pageNote ul ul ul ul { + list-style: disc; +} + +.pageNote ul ul ul ul ul { + list-style: circle; +} + +.pageNote ul ul ul ul ul ul { + list-style: square; +} + +.widgetNoteContainer { + padding: 12px; + border-bottom: 1px solid transparent; + border-top: 1px solid transparent; + cursor: pointer; +} + +.mobileMode .widgetNoteContainer { + padding: 12px 16px 12px 17px; +} + +.widgetNoteContainerSelected { + background-color: white; + border-bottom: 1px solid #c2c2c2; + border-top: 1px solid #c2c2c2; +} + +.widgetNoteFootnote { + display: inline-block; + padding-top: 1px; + background-color: #fff849; + font-size: 11px; + font-weight: bold; + line-height: 16px; + margin-right: 8px; + padding: 0px 5px; + color: #000; +} + +div.annnoteline { + display: inline-block; + width: 9px; + height: 1px; + border-bottom: 1px solid white; + margin-top: 1px; +} + +.widgetNoteLabel { + font-size: 13px; + font-weight: 600; + color: #58167d; + margin-top: 4px; + float: right; +} + +.noteLink { + text-decoration: inherit; + color: inherit; +} + +.noteLink:hover { + background-color: white; +} + +.notesSectionHeader { + margin: 0px 8px 0px 12px; +} + +.notesPageNameHeader { + margin: 8px 8px 15px 12px; +} + +.mobileMode .notesPageNameHeader { + margin: 18px 14px 5px 16px; +} + +#notesOverlay { + width: 0; + height: 0; + position: absolute; + overflow: visible; + z-index: 1; +} + +div.closeNotesDialog { + position: absolute; + top: 6px; + right: 6px; + width: 11px; + height: 10px; + object-fit: contain; + background: url(../../../resources/images/close_x.svg) no-repeat center center, linear-gradient(transparent, transparent); + margin-left: auto; + cursor: pointer; +} + +div.resizeNotesDialog { + position: absolute; + bottom: 2px; + right: 2px; + width: 11px; + height: 10px; + object-fit: contain; + background: url(../../../resources/images/resize.svg) no-repeat center center, linear-gradient(transparent, transparent); + margin-left: auto; + cursor: nwse-resize; +} + +div.notesDialog { + position: absolute; + padding: 16px 3px 10px 3px; + background-color: #efefef; + width: 300px; + height: 300px; + line-height: normal; + border: #8F949A solid 1px; + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.4); + cursor: move; + display: flex; + flex-direction: column; + box-sizing: border-box; +} + +div.notesDialog.active { + user-select: none; +} + +div.notesDialog .widgetNoteContainer { + cursor: auto; + padding: 2px 26px 16px 14px; +} + +div.notesDialogScroll { + overflow-x: hidden; + overflow-y: auto; + height: 100%; + cursor: auto; +} + +.mobileMode .pageNoteName, .mobileMode #pageNotesToolbar, .mobileMode .dottedDivider { + display: none; +} \ No newline at end of file diff --git a/code/page/plugins/recordplay/recordplay.js b/code/page/plugins/recordplay/recordplay.js new file mode 100644 index 0000000..9d39458 --- /dev/null +++ b/code/page/plugins/recordplay/recordplay.js @@ -0,0 +1,479 @@ +// use this to isolate the scope +(function() { + + if(!$axure.document.configuration.showRecordPlay) { return; } + + $(window.document).ready(function() { + $axure.player.createPluginHost({ + id: 'recordPlayHost', + context: 'interface', + title: 'Recording' + }); + _generateRecordPlay(); + + $('#recordButton').click(_recordClick); + $('#playButton').click(_playClick); + $('#stopButton').click(_stopClick); + $('#deleteButton').click(_deleteClick); + + // bind to the page load + + $axure.page.bind('load.page_notes', function() { + + $.ajax({ + type: "POST", + url: '/RecordController/ListRecordings', + success: function(response) { + + $('#recordNameHeader').html(""); + $('#recordPlayContent').html(""); + //populate the notes + + axRecordingList = []; + + if(!eventList) { + recordingIndex = 0; + eventList = []; + recordingStartTime = 0; + bulkEventElement = ""; + lastBulkEvent = {}; + } + + for(var idx in response.recordingList) { + getOneRecording(response.recordingList[idx]); + } + + return false; + }, + // dataType: 'json' + }); + }); + }); + + var nameMatcher = new RegExp("^axRecording[0-9]{4}$", "i"); + var indexMatcher = new RegExp("[0-9]{4}$", "i"); + + var convertFromJson = function(oneRecording) { + + if(nameMatcher.exec(oneRecording.recordingName)) { + var myArray = indexMatcher.exec(oneRecording.recordingName); + var currIdx = parseInt(myArray); + if(recordingIndex < currIdx) { + recordingIndex = currIdx; + } + } + + + for(var idx in oneRecording.eventList) { + var thisEvent = oneRecording.eventList[idx]; + thisEvent.eventInfo = {}; + thisEvent.eventInfo.srcElement = thisEvent.elementID; + // TODO: check that this is correct. + + if(isBulkMouse(thisEvent.eventType)) { + thisEvent.eventInfo.mousePositions = []; + thisEvent.eventInfo.mousePositions = thisEvent.mousePositions; + thisEvent.timeStamp = thisEvent.mousePositions[0].timeStamp; + } + if(isSingleMouse(thisEvent.eventType)) { + thisEvent.eventInfo.cursor = {}; + thisEvent.eventInfo.cursor = thisEvent.cursor; + + } + if(thisEvent.eventType === 'OnDrag') { + thisEvent.eventInfo.dragInfo = {}; + thisEvent.eventInfo.dragInfo = thisEvent.dragInfo; + thisEvent.timeStamp = thisEvent.dragInfo.startTime; + } + + } + return oneRecording; + }; + + var getOneRecording = function(recordingItem) { + $.ajax({ + type: "POST", + url: '/RecordController/GetRecording', + data: { 'recordingId': recordingItem.recordingId }, + success: function(response) { + axRecordingList[axRecordingList.length] = convertFromJson(response); + var axRecordingContainer = $('#recordingContainer').find('li').filter('.recordingRootNode'); + axRecordingContainer.append(_formAxRecordingBranch(response)); + _attachEventTriggers(response); + }, // dataType: 'json' + }); + + }; + + var axRecordingList; + var eventList; + var recordingIndex; + var recordingStartTime; + var recordingId; + var recordingName; + + + var leadingZeros = function(number, digits) { // because this thing doesn't have string.format (or does it?) + var recurseLeadingZeros = function(number, digitsLeft) { + if(digitsLeft > 0) { + return recurseLeadingZeros("0" + number, digitsLeft - 1); + } else { + return number; + } + }; + return recurseLeadingZeros(number, digits - String(number).length); + }; + + + var generateRecordingName = function() { + return "axRecording" + leadingZeros(recordingIndex, 4); + }; + + var isSingleMouse = function(eventType) { + return (eventType === 'OnClick' || + eventType === 'OnMouseUp' || + eventType === 'OnMouseDown' || + eventType === 'OnMouseOver' || + eventType === 'OnKeyUp' || + eventType === 'OnSelectedChange' || + eventType === 'OnSelect' || + eventType === 'OnUnselect' || + eventType === 'OnTextChange' || + eventType === 'OnMouseOut'); + }; + + var isBulkMouse = function(eventType) { + return (eventType === 'OnMouseHover' || + eventType === 'OnMouseMove'); + }; + + var bulkEventElement; + var lastBulkEvent; + + + $axure.messageCenter.addMessageListener(function(message, eventData) { + var lastEvent, lastBulkData; + + if(message === 'logEvent') { + + if(bulkEventElement !== eventData.elementID) { + lastBulkEvent = {}; + bulkEventElement = eventData.elementID; + } + + if(isBulkMouse(eventData.eventType)) { + lastEvent = lastBulkEvent[eventData.eventType]; + + if(lastEvent) { + // this is the second or third or whatever onmousemove in a row + lastBulkData = lastEvent.eventInfo.mousePositions; + lastBulkData[lastBulkData.length] = { + cursor: eventData.eventInfo.cursor, + timeStamp: eventData.timeStamp + }; + } else { + + eventData.eventInfo.mousePositions = []; + eventData.eventInfo.mousePositions[0] = { + cursor: eventData.eventInfo.cursor, + timeStamp: eventData.timeStamp + }; + eventList[eventList.length] = eventData; + lastBulkEvent[eventData.eventType] = eventData; + } + } else { + var z = true; + } + + if(isSingleMouse(eventData.eventType) ) { + eventList[eventList.length] = eventData; + lastBulkEvent = {}; + bulkEventElement = eventData.elementID; + } + + if(eventData.eventType === 'OnDrag') { + + lastEvent = lastBulkEvent[eventData.eventType]; + + if (lastEvent) { + // this is the second or third or whatever onmousemove in a row + lastBulkData = lastEvent.eventInfo.mousePositions; + lastBulkData[lastBulkData.length] = { + dragInfo: eventData.eventInfo.dragInfo, + timeStamp: eventData.timeStamp + }; + } else { + eventData.eventInfo.mousePositions = []; + eventData.eventInfo.mousePositions[0] = { + dragInfo: eventData.eventInfo.dragInfo, + timeStamp: eventData.timeStamp + }; + eventList[eventList.length] = eventData; + lastBulkEvent[eventData.eventType] = eventData; + } + } +// if(eventData.eventType === 'OnKeyUp') { +// transmissionFields.eventInfo = eventData.eventInfo; +// $.ajax({ +// type: "POST", +// url: '/RecordController/LogMouseClick', +// data: transmissionFields, +// }); +// } + } + + }); + + + var _recordClick = function(event) { + $('#recordButton').addClass('recordPlayButtonSelected'); + recordingIndex++; + // $axure.recording.startRecord(); + + recordingStartTime = new Date().getTime(); + + $.ajax({ + type: "POST", + url: '/RecordController/CreateRecording', + data: { + 'recordingName': generateRecordingName(), + timeStamp: recordingStartTime + }, + success: function(response) { + recordingId = response.recordingId; + recordingName = response.recordingName; + $axure.messageCenter.postMessage('startRecording', {'recordingId' : recordingId, 'recordingName': recordingName}); + }, + // dataType: 'json' + }); + + }; + + var _playClick = function(event) { + $('#playButton').addClass('recordPlayButtonSelected'); + }; + + var _stopClick = function(event) { + var axRecording, axObjectDictionary, axRecordingContainer, transmissionFields; + $('#sitemapLinksContainer').toggle(); + if($('#recordButton').is('.recordPlayButtonSelected')) { + $('#recordButton').removeClass('recordPlayButtonSelected'); + // $axure.recording.stopRecord(); + + axRecording = { + 'recordingId' : recordingId, + 'recordingName': recordingName, + 'eventList': eventList + }; + + axRecordingList[axRecordingList.length] = axRecording; + axRecordingContainer = $('#recordingContainer').find('li').filter('.recordingRootNode'); + axRecordingContainer.append(_formAxRecordingBranch(axRecording)); + _attachEventTriggers(axRecording); + + lastBulkEvent = {}; + + var recordingStepList = []; + + for(var eventListIdx in eventList) { + var eventListItem = eventList[eventListIdx]; + + if(eventListItem.eventType === 'OnDrag') { + var lastDrag = eventListItem.eventInfo.mousePositions[eventListItem.eventInfo.mousePositions.length - 1].dragInfo; + eventListItem.eventInfo.dragInfo.currentX = lastDrag.currentX; + eventListItem.eventInfo.dragInfo.currentY = lastDrag.currentY; + eventListItem.eventInfo.dragInfo.currentTime = lastDrag.currentTime; + eventListItem.eventInfo.dragInfo.xDelta = eventListItem.eventInfo.dragInfo.currentX - eventListItem.eventInfo.dragInfo.lastX; + eventListItem.eventInfo.dragInfo.yDelta = eventListItem.eventInfo.dragInfo.currentY - eventListItem.eventInfo.dragInfo.lastY; + transmissionFields = {}; + transmissionFields = tackItOn(transmissionFields, eventListItem, ['eventType', 'elementID', 'path']); + transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['dragInfo']); + transmissionFields.recordingId = recordingId; + } + + if(isSingleMouse(eventListItem.eventType)) { + transmissionFields = {}; + transmissionFields = tackItOn(transmissionFields, eventListItem, ['timeStamp', 'eventType', 'elementID', 'path']); + transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['cursor']); + transmissionFields.recordingId = recordingId; + } + + if(isBulkMouse(eventListItem.eventType)) { + transmissionFields = {}; + transmissionFields = tackItOn(transmissionFields, eventListItem, ['eventType', 'elementID', 'path']); + transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['mousePositions']); + transmissionFields.recordingId = recordingId; + } + recordingStepList[recordingStepList.length] = transmissionFields; + } + + eventList = []; + $axure.messageCenter.postMessage('stopRecording', axObjectDictionary); + + var jsonText = { + 'recordingName': recordingName, + 'recordingId': recordingId, + recordingStart: new Date().getTime(), + recordingEnd: recordingStartTime, + 'eventList': recordingStepList + }; + + $.ajax({ + type: "POST", + url: '/RecordController/StopRecording', + data: { 'jsonText': JSON.stringify(jsonText) } + + }); + + } + + if($('#playButton').is('.recordPlayButtonSelected')) { + $('#playButton').removeClass('recordPlayButtonSelected'); + } + }; + + var _deleteClick = function(event) { + $.ajax({ + type: "POST", + url: '/RecordController/DeleteRecordings', + success: function(response) { + var x = true; + }, // dataType: 'json' + }); + }; + + var tackItOn = function(destination, source, fields) { + + for(var idx in fields) { + destination[fields[idx]] = source[fields[idx]]; + } + return destination; + }; + + var makeFirstLetterLower = function(eventName) { + return eventName.substr(0, 1).toLowerCase() + eventName.substr(1); + }; + + var _attachEventTriggers = function(axRecording) { + for(var eventIdx in axRecording.eventList) { + var eventObject = axRecording.eventList[eventIdx]; + var eventID = axRecording['recordingId'] + '_' + eventObject.timeStamp; + currentEvent = eventID; + $('#' + eventID).click(_triggerEvent(axRecording['recordingId'], eventObject.timeStamp)); + // $('#' + eventID).click(event.trigger); + } + }; + + var _formAxRecordingBranch = function(axRecording) { + var eventObject, eventID, RDOID; + var recordPlayUi = '"; + + return recordPlayUi; + }; + + var currentEvent = ''; + + var _triggerEvent = function(axRecording, timeStamp) { + // $axure.messageCenter.postMessage('triggerEvent', false); + + + for(var axRecordingIdx in axRecordingList) { + if(axRecordingList[axRecordingIdx].recordingId === axRecording) { + for(var eventIdx in axRecordingList[axRecordingIdx].eventList) { + if(axRecordingList[axRecordingIdx].eventList[eventIdx].timeStamp === timeStamp) { + + var thisEvent = axRecordingList[axRecordingIdx].eventList[eventIdx]; + // thisEvent.trigger(); + + var thisEventInfo, lowerEventType; + lowerEventType = thisEvent.eventType.toLowerCase(); + if(lowerEventType === 'onclick' || lowerEventType === 'onmousein') { + thisEventInfo = {}; + thisEventInfo = tackItOn(thisEventInfo, thisEvent.eventInfo, ['cursor', 'timeStamp', 'srcElement']); + if(thisEvent.eventInfo.inputType) { + thisEventInfo = tackItOn(thisEventInfo, thisEvent.eventInfo, ['inputType', 'inputValue']); + } + } else { + thisEventInfo = thisEvent.eventInfo; + } + + var thisParameters = { + 'element': thisEvent.elementID, + 'eventInfo': thisEventInfo, + // 'axEventObject': thisEvent.eventObject, + 'eventType': thisEvent.eventType + }; + + return function() { + $axure.messageCenter.postMessage('playEvent', thisParameters); + }; + + } + } + } + } + }; + + var _generateRecordPlay = function() { + var recordPlayUi = "
      "; + + recordPlayUi += "
      "; + + recordPlayUi += "
      "; + + recordPlayUi += ""; + recordPlayUi += ""; + recordPlayUi += ""; + recordPlayUi += ""; + recordPlayUi += "
      "; + + recordPlayUi += "
    • "; + recordPlayUi += "
      "; + + $('#recordPlayHost').html(recordPlayUi); + }; + +})(); \ No newline at end of file diff --git a/code/page/plugins/recordplay/styles/recordplay.css b/code/page/plugins/recordplay/styles/recordplay.css new file mode 100644 index 0000000..428f820 --- /dev/null +++ b/code/page/plugins/recordplay/styles/recordplay.css @@ -0,0 +1,90 @@ +#recordPlayHost { + font-size: 12px; + color:#333; + height: 100%; +} + + +#recordPlayContainer +{ + overflow: auto; + width: 100%; + height: 100%; + padding: 10px 10px 10px 10px; +} + +#recordPlayToolbar +{ + margin: 5px 5px 5px 5px; + height: 22px; +} + +#recordPlayToolbar .recordPlayButton +{ + float: left; + width: 22px; + height: 22px; + border: 1px solid transparent; +} + +#recordPlayToolbar .recordPlayButton:hover +{ + border: 1px solid rgb(0,157,217); + background-color : rgb(166,221,242); +} + +#recordPlayToolbar .recordPlayButton:active +{ + border: 1px solid rgb(0,157,217); + background-color : rgb(204,235,248); +} + +#recordPlayToolbar .recordPlayButtonSelected { + border: 1px solid rgb(0,157,217); + background-color : rgb(204,235,248); +} + +/* removed images */ +/*#recordButton { + background: url('../../sitemap/styles/images/233_hyperlink_16.png') no-repeat center center; +} + +#playButton { + background: url('../../sitemap/styles/images/225_responsive_16.png') no-repeat center center; +} + +#stopButton { + background: url('../../sitemap/styles/images/228_togglenotes_16.png') no-repeat center center; +} + +#deleteButton { + background: url('../../sitemap/styles/images/231_event_16.png') no-repeat center center; +}*/ + +#recordNameHeader +{ + /* yeah??*/ + font-size: 13px; + font-weight: bold; + height: 23px; + white-space: nowrap; +} + +#recordPlayContent +{ + /* yeah??*/ + overflow: visible; +} + +.recordPlayName +{ + font-size: 12px; + margin-bottom: 5px; + text-decoration: underline; + white-space: nowrap; +} + +.recordPlay +{ + margin-bottom: 10px; +} \ No newline at end of file diff --git a/code/page/plugins/sitemap/sitemap.js b/code/page/plugins/sitemap/sitemap.js new file mode 100644 index 0000000..94e5300 --- /dev/null +++ b/code/page/plugins/sitemap/sitemap.js @@ -0,0 +1,553 @@ +var currentNodeUrl = ''; +var allNodeUrls = []; + +var openNextPage = $axure.player.openNextPage = function () { + var index = allNodeUrls.indexOf(currentNodeUrl) + 1; + if(index >= allNodeUrls.length) return; + var nextNodeUrl = allNodeUrls[index]; + currentNodeUrl = nextNodeUrl; + $('.sitemapPageLink[nodeUrl="' + nextNodeUrl + '"]').parent().mousedown(); +}; + +var openPreviousPage = $axure.player.openPreviousPage = function () { + var index = allNodeUrls.indexOf(currentNodeUrl) - 1; + if(index < 0) return; + var nextNodeUrl = allNodeUrls[index]; + currentNodeUrl = nextNodeUrl; + $('.sitemapPageLink[nodeUrl="' + nextNodeUrl + '"]').parent().mousedown(); +}; + +// use this to isolate the scope +(function() { + + var SHOW_HIDE_ANIMATION_DURATION = 0; + + var HIGHLIGHT_INTERACTIVE_VAR_NAME = 'hi'; + + var currentPageLoc = ''; + var currentPlayerLoc = ''; + var currentPageHashString = ''; + + $(window.document).ready(function() { + $axure.player.createPluginHost({ + id: 'sitemapHost', + context: 'project', + title: 'Project Pages', + gid: 1, + }); + + $(window.document).bind('keyup', function (e) { + if (e.target.localName == "textarea" || e.target.localName == "input") return; + switch(e.which) { + case 188: + openPreviousPage(); + break; + case 190: + openNextPage(); + break; + default: return; // exit this handler for other keys + } + }); + + generateSitemap(); + + $('.leftArrow').click(openPreviousPage); + $('.rightArrow').click(openNextPage); + + $('.sitemapPlusMinusLink').click(collapse_click); + $('.sitemapPageLink').parent().mousedown(node_click); + + $('#interfaceAdaptiveViewsListContainer').hide(); + + $('#projectOptionsShowHotspots').click(showHotspots_click); + $('#searchIcon').click(searchBoxClose_click); + $('#searchDiv').click(searchBoxExpand_click); + $('#searchBox').keyup(search_input_keyup); + + // bind to the page load + $axure.page.bind('load.sitemap', function() { + currentPageLoc = $axure.page.location.split("#")[0]; + var decodedPageLoc = decodeURI(currentPageLoc); + currentNodeUrl = decodedPageLoc.substr(decodedPageLoc.lastIndexOf('/') ? decodedPageLoc.lastIndexOf('/') + 1 : 0); + currentPlayerLoc = $(location).attr('href').split("#")[0].split("?")[0]; + currentPageHashString = '#p=' + currentNodeUrl.substr(0, currentNodeUrl.lastIndexOf('.')); + + $axure.player.setVarInCurrentUrlHash(PAGE_ID_NAME, $axure.player.getPageIdByUrl(currentNodeUrl)); + $axure.player.setVarInCurrentUrlHash(PAGE_URL_NAME, currentNodeUrl.substring(0, currentNodeUrl.lastIndexOf('.html'))); + + $('#sitemapTreeContainer').find('.sitemapHighlight').removeClass('sitemapHighlight'); + $('.sitemapPageLink[nodeUrl="' + currentNodeUrl + '"]').parent().parent().addClass('sitemapHighlight'); + + var pageName = $axure.page.pageName; + $('.pageNameHeader').html(pageName); + + //If highlight var is present and set to 1 or else if + //sitemap highlight button is selected then highlight interactive elements + var hiVal = $axure.player.getHashStringVar(HIGHLIGHT_INTERACTIVE_VAR_NAME); + if(hiVal.length > 0 && hiVal == 1) { + $('#showHotspotsOption').find('.overflowOptionCheckbox').addClass('selected'); + if ($('#projectOptionsHotspotsCheckbox').length > 0) $('#projectOptionsHotspotsCheckbox').addClass('selected'); + $axure.messageCenter.postMessage('highlightInteractive', true); + } else if ($('#showHotspotsOption').find('.overflowOptionCheckbox').hasClass('selected')) { + $axure.messageCenter.postMessage('highlightInteractive', true); + } + + generateAdaptiveViews(false); + if (MOBILE_DEVICE) generateAdaptiveViews(true); + + $axure.player.suspendRefreshViewPort = true; + + //Set the current view if it is defined in the hash string + //If the view is invalid, set it to 'auto' in the string + //ELSE set the view based on the currently selected view in the toolbar menu + var viewStr = $axure.player.getHashStringVar(ADAPTIVE_VIEW_VAR_NAME); + if(viewStr.length > 0) { + var $view = $('.adaptiveViewOption[val="' + viewStr + '"]'); + if($view.length > 0) $view.click(); + else $('.adaptiveViewOption[val="auto"]').click(); + } else if($('.selectedRadioButton').length > 0) { + var $viewOption = $('.selectedRadioButton').parents('.adaptiveViewOption'); + $viewOption.click(); + } + updateAdaptiveViewHeader(); + + function setDefaultScaleForDevice() { + if(MOBILE_DEVICE && $axure.player.isMobileMode()) { + $('.projectOptionsScaleRow[val="0"]').click(); + } else { + $('.vpScaleOption[val="0"]').click(); + } + } + + var scaleStr = $axure.player.getHashStringVar(SCALE_VAR_NAME); + if(scaleStr.length > 0) { + var $scale = $('.vpScaleOption[val="' + scaleStr + '"]'); + if($scale.length > 0) $scale.click(); + else setDefaultScaleForDevice(); + } else { + setDefaultScaleForDevice(); + } + + var rotateStr = $axure.player.getHashStringVar(ROT_VAR_NAME); + if(rotateStr.length > 0) { + $('#vpRotate').prop('checked', true); + } + + $axure.player.suspendRefreshViewPort = false; + + if (!$axure.player.isViewOverridden()) $axure.messageCenter.postMessage('setAdaptiveViewForSize', { 'width': $('#mainPanel').width(), 'height': $('#mainPanel').height() }); + + $axure.player.refreshViewPort(); + + $axure.messageCenter.postMessage('finishInit'); + + showMainPanel(); + return false; + }); + + var $vpContainer = $('#interfaceScaleListContainer'); + + var scaleOptions = '
      Default Scale
      '; + scaleOptions += '
      Scale to Width
      '; + scaleOptions += '
      Scale to Fit
      '; + $(scaleOptions).appendTo($vpContainer); + + $('#overflowMenuContainer').append('
      Show Hotspots
      '); + $('#overflowMenuContainer').append($vpContainer); + $vpContainer.show(); + + $('#showHotspotsOption').click(showHotspots_click); + $('.vpScaleOption').click(vpScaleOption_click); + $('.vpScaleOption').mouseup(function (event) { + event.stopPropagation(); + }); + + if (MOBILE_DEVICE) { + var scaleOptions = '
      Scale to fit width
      '; + scaleOptions += '
      Original size (100%)
      '; + scaleOptions += '
      Fit all to screen
      '; + $(scaleOptions).appendTo($('#projectOptionsScaleContainer')); + + $('.projectOptionsScaleRow').click(vpScaleOption_click); + } + + $('#searchBox').focusin(function() { + if($(this).is('.searchBoxHint')) { + $(this).val(''); + $(this).removeClass('searchBoxHint'); + } + }).focusout(function() { + if($(this).val() == '') { + $(this).addClass('searchBoxHint'); + } + }); + + + $('#searchBox').focusout(); + }); + + var _formatViewDimension = function(dim) { + if(dim == 0) return 'any'; + if(dim.toString().includes('.')) return dim.toFixed(2); + return dim; + }; + + function generateAdaptiveViews(forProjectOptions) { + var $container = forProjectOptions ? $('#projectOptionsAdaptiveViewsContainer') : $('#interfaceAdaptiveViewsListContainer'); + var $viewSelect = forProjectOptions ? $('#projectOptionsViewSelect') : $('#viewSelect'); + var adaptiveViewOptionClass = forProjectOptions ? 'projectOptionsAdaptiveViewRow' : 'adaptiveViewOption'; + var currentViewClass = forProjectOptions ? '' : 'currentAdaptiveView'; + + $container.empty(); + $viewSelect.empty(); + + //Fill out adaptive view container with prototype's defined adaptive views, as well as the default, and Auto + var viewsList = '
      Adaptive
      '; + var viewSelect = ''; + if (typeof $axure.page.defaultAdaptiveView.name != 'undefined') { + //If the name is a blank string, make the view name the width if non-zero, else 'any' + var defaultView = $axure.page.defaultAdaptiveView; + var defaultViewName = defaultView.name; + + var widthString = _formatViewDimension(defaultView.size.width); + var heightString = _formatViewDimension(defaultView.size.height); + + var viewString = defaultViewName + ' (' + widthString + ' x ' + heightString + ')'; + + viewsList += '
      ' + + '
      ' + viewString + '
      '; + viewSelect += ''; + } + + var useViews = $axure.document.configuration.useViews; + var hasViews = false; + if(useViews) { + for(var viewIndex = 0; viewIndex < $axure.page.adaptiveViews.length; viewIndex++) { + var currView = $axure.page.adaptiveViews[viewIndex]; + + var widthString = _formatViewDimension(currView.size.width); + var heightString = _formatViewDimension(currView.size.height); + + var viewString = currView.name + ' (' + widthString + ' x ' + heightString + ')'; + viewsList += '
      ' + + viewString + + '
      '; + viewSelect += ''; + + hasViews = true; + } + } + + $container.append(viewsList); + $viewSelect.append(viewSelect); + + if (!hasViews) { + if (forProjectOptions) { + $('#projectOptionsAdaptiveViewsHeader').hide(); + $('#projectOptionsAdaptiveViewsContainer').hide(); + } else $('#interfaceAdaptiveViewsContainer').hide(); + } else { + if (forProjectOptions) { + $('#projectOptionsAdaptiveViewsHeader').show(); + $('#projectOptionsAdaptiveViewsContainer').show(); + } else $('#interfaceAdaptiveViewsContainer').show(); + } + + $(('.' + adaptiveViewOptionClass)).click(adaptiveViewOption_click); + + if (!forProjectOptions) { + $(('.' + adaptiveViewOptionClass)).mouseup(function (event) { + event.stopPropagation(); + }); + } + } + + + function collapse_click(event) { + if($(this).children('.sitemapPlus').length > 0) { + expand_click($(this)); + } else { + $(this) + .children('.sitemapMinus').removeClass('sitemapMinus').addClass('sitemapPlus').end() + .closest('li').children('ul').hide(SHOW_HIDE_ANIMATION_DURATION); + } + event.stopPropagation(); + } + + function expand_click($this) { + $this + .children('.sitemapPlus').removeClass('sitemapPlus').addClass('sitemapMinus').end() + .closest('li').children('ul').show(SHOW_HIDE_ANIMATION_DURATION); + } + + function searchBoxExpand_click(event) { + if (!$('#searchIcon').hasClass('sitemapToolbarButtonSelected')) { + $('#searchIcon').addClass('sitemapToolbarButtonSelected') + $('#searchBox').width(0); + $('#searchBox').show(); + $('#searchBox').animate({ width: '95%' }, { duration: 200, complete: function () { $('#searchBox').focus(); } }); + } + } + + function searchBoxClose_click(event) { + if ($('#searchIcon').hasClass('sitemapToolbarButtonSelected')) { + $('#searchBox').animate({ width: '0%' }, { duration: 200, + complete: function () { + $('#searchBox').hide(); + $('#searchIcon').removeClass('sitemapToolbarButtonSelected') + }}); + $('#searchBox').val(''); + $('#searchBox').keyup(); + } + } + + function node_click(event) { + hideMainPanel(); + $('#sitemapTreeContainer').find('.sitemapHighlight').removeClass('sitemapHighlight'); + $(this).parent().addClass('sitemapHighlight'); + $axure.page.navigate($(this).children('.sitemapPageLink')[0].getAttribute('nodeUrl'), true); + } + + function hideMainPanel() { + $('#mainPanel').css('opacity', '0'); + $('#clippingBounds').css('opacity', '0'); + } + function showMainPanel() { + $('#mainPanel').animate({ opacity: 1 }, 10); + $('#clippingBounds').animate({ opacity: 1 }, 10); + } + + $axure.messageCenter.addMessageListener(function(message, data) { + if(message == 'adaptiveViewChange') { + $('.adaptiveViewOption').removeClass('currentAdaptiveView'); + if(data.viewId) {$('.adaptiveViewOption[val="' + data.viewId + '"]').addClass('currentAdaptiveView');} + else $('.adaptiveViewOption[val="default"]').addClass('currentAdaptiveView'); + + //when we set adaptive view through user event, we want to update the checkmark on sitemap + if(data.forceSwitchTo) { + $('.adapViewRadioButton').find('.selectedRadioButtonFill').hide(); + $('.adapViewRadioButton').removeClass('selectedRadioButton'); + $('div[val="' + data.forceSwitchTo + '"]').find('.adapViewRadioButton').addClass('selectedRadioButton'); + $('div[val="' + data.forceSwitchTo + '"]').find('.selectedRadioButtonFill').show(); + } + + updateAdaptiveViewHeader(); + $axure.player.refreshViewPort(); + + } else if(message == 'previousPage') { + openPreviousPage(); + } else if(message == 'nextPage') { + openNextPage(); + } + }); + + $axure.player.toggleHotspots = function (val) { + var overflowMenuCheckbox = $('#showHotspotsOption').find('.overflowOptionCheckbox'); + if ($(overflowMenuCheckbox).hasClass('selected')) { + if (!val) $('#showHotspotsOption').click(); + } else { + if (val) $('#showHotspotsOption').click(); + } + } + + function showHotspots_click(event) { + var overflowMenuCheckbox = $('#showHotspotsOption').find('.overflowOptionCheckbox'); + var projOptionsCheckbox = $('#projectOptionsHotspotsCheckbox'); + + if ($(overflowMenuCheckbox).hasClass('selected')) { + overflowMenuCheckbox.removeClass('selected'); + if (projOptionsCheckbox.length > 0 ) projOptionsCheckbox.removeClass('selected'); + $axure.messageCenter.postMessage('highlightInteractive', false); + //Delete 'hi' hash string var if it exists since default is unselected + $axure.player.deleteVarFromCurrentUrlHash(HIGHLIGHT_INTERACTIVE_VAR_NAME); + } else { + overflowMenuCheckbox.addClass('selected'); + if (projOptionsCheckbox.length > 0) projOptionsCheckbox.addClass('selected'); + $axure.messageCenter.postMessage('highlightInteractive', true); + //Add 'hi' hash string var so that stay highlighted across reloads + $axure.player.setVarInCurrentUrlHash(HIGHLIGHT_INTERACTIVE_VAR_NAME, 1); + } + } + + + function adaptiveViewOption_click(event) { + var currVal = $(this).attr('val'); + + $('.adaptiveViewOption').removeClass('currentAdaptiveView'); + if(currVal) {$('.adaptiveViewOption[val="' + currVal + '"]').addClass('currentAdaptiveView');} + else $('.adaptiveViewOption[val="default"]').addClass('currentAdaptiveView'); + + $('.adapViewRadioButton').find('.selectedRadioButtonFill').hide(); + $('.adapViewRadioButton').removeClass('selectedRadioButton'); + $('div[val="' + currVal + '"]').find('.adapViewRadioButton').addClass('selectedRadioButton'); + $('div[val="' + currVal + '"]').find('.selectedRadioButtonFill').show(); + + selectAdaptiveView(currVal); + $axure.player.closePopup(); + updateAdaptiveViewHeader(); + } + + var selectAdaptiveView = $axure.player.selectAdaptiveView = function(currVal) { + if (currVal == 'auto') { + $axure.messageCenter.postMessage('setAdaptiveViewForSize', { 'width': $('#mainPanel').width(), 'height': $('#mainPanel').height() }); + $axure.player.deleteVarFromCurrentUrlHash(ADAPTIVE_VIEW_VAR_NAME); + } else { + currentPageLoc = $axure.page.location.split("#")[0]; + var decodedPageLoc = decodeURI(currentPageLoc); + var nodeUrl = decodedPageLoc.substr(decodedPageLoc.lastIndexOf('/') + ? decodedPageLoc.lastIndexOf('/') + 1 + : 0); + var adaptiveData = { + src: nodeUrl + }; + + adaptiveData.view = currVal; + $axure.messageCenter.postMessage('switchAdaptiveView', adaptiveData); + $axure.player.setVarInCurrentUrlHash(ADAPTIVE_VIEW_VAR_NAME, currVal); + } + } + + $axure.player.updateAdaptiveViewHeader = updateAdaptiveViewHeader = function () { + var hasDefinedDim = true; + var dimensionlessViewStr = '(any x any)'; + + var viewString = $('.adaptiveViewOption.currentAdaptiveView').text(); + if (viewString != null && viewString.indexOf(dimensionlessViewStr) >= 0) hasDefinedDim = false; + + if (!hasDefinedDim) { + var viewName = viewString.substring(0, viewString.lastIndexOf(' (')); + var widthString = $('#mainPanelContainer').width(); + viewString = viewName + ' (' + widthString + ' x any)'; + } + + $('.adaptiveViewHeader').html(viewString); + } + + $axure.player.selectScaleOption = function (scaleVal) { + var $scale = $('.vpScaleOption[val="' + scaleVal + '"]'); + if ($scale.length > 0) $scale.click(); + } + + function vpScaleOption_click(event) { + var scaleCheckDiv = $(this).find('.scaleRadioButton'); + var scaleVal = $(this).attr('val'); + if (scaleCheckDiv.hasClass('selectedRadioButton')) return false; + + var $selectedScaleOption = $('.vpScaleOption[val="' + scaleVal + '"], .projectOptionsScaleRow[val="' + scaleVal + '"]'); + var $allScaleOptions = $('.vpScaleOption, .projectOptionsScaleRow'); + $allScaleOptions.find('.scaleRadioButton').removeClass('selectedRadioButton'); + $allScaleOptions.find('.selectedRadioButtonFill').hide(); + $selectedScaleOption.find('.scaleRadioButton').addClass('selectedRadioButton'); + $selectedScaleOption.find('.selectedRadioButtonFill').show(); + + if (scaleVal == '0') { + $axure.player.deleteVarFromCurrentUrlHash(SCALE_VAR_NAME); + } else if (typeof scaleVal !== 'undefined') { + $axure.player.setVarInCurrentUrlHash(SCALE_VAR_NAME, scaleVal); + } + + $axure.player.refreshViewPort(); + } + + function search_input_keyup(event) { + var searchVal = $(this).val().toLowerCase(); + //If empty search field, show all nodes, else grey+hide all nodes and + //ungrey+unhide all matching nodes, as well as unhide their parent nodes + if(searchVal == '') { + $('.sitemapPageName').removeClass('sitemapGreyedName'); + $('.sitemapNode').show(); + } else { + $('.sitemapNode').hide(); + + $('.sitemapPageName').addClass('sitemapGreyedName').each(function() { + var nodeName = $(this).text().toLowerCase(); + if(nodeName.indexOf(searchVal) != -1) { + $(this).removeClass('sitemapGreyedName').parents('.sitemapNode:first').show().parents('.sitemapExpandableNode').show(); + } + }); + } + } + + + function generateSitemap() { + var treeUl = "
      "; + treeUl += "
      "; + + treeUl += '
      '; + treeUl += "
      "; + treeUl += "
      "; + + treeUl += "
      "; + treeUl += "
      "; + + /////////////////// + + var sitemapTitle = $axure.player.getProjectName(); + if (!sitemapTitle) sitemapTitle = "Pages"; + treeUl += "
      " + sitemapTitle + "
      "; + + treeUl += "
      "; + treeUl += "
        "; + var rootNodes = $axure.document.sitemap.rootNodes; + for(var i = 0; i < rootNodes.length; i++) { + treeUl += generateNode(rootNodes[i], 0); + } + treeUl += "
      "; + + if (!MOBILE_DEVICE) { + treeUl += "
      Use "; + treeUl += ''; + treeUl += " and "; + treeUl += ''; + treeUl += " keys
      to move between pages"; + treeUl += "
      "; + } + + $('#sitemapHost').html(treeUl); + } + + function generateNode(node, level) { + var hasChildren = (node.children && node.children.length > 0); + var margin, returnVal; + if(hasChildren) { + margin = (9 + level * 17); + returnVal = "
    • "; + + if(hasChildren) { + returnVal += "
        "; + for(var i = 0; i < node.children.length; i++) { + var child = node.children[i]; + returnVal += generateNode(child, level + 1); + } + returnVal += "
      "; + } + returnVal += "
    • "; + return returnVal; + } +})(); diff --git a/code/page/plugins/sitemap/styles/images/back_keys.svg b/code/page/plugins/sitemap/styles/images/back_keys.svg new file mode 100644 index 0000000..205ef8b --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/back_keys.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/code/page/plugins/sitemap/styles/images/closed_item.svg b/code/page/plugins/sitemap/styles/images/closed_item.svg new file mode 100644 index 0000000..cc96bf2 --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/closed_item.svg @@ -0,0 +1,14 @@ + + + + open item copy + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/code/page/plugins/sitemap/styles/images/folder_closed_blue.svg b/code/page/plugins/sitemap/styles/images/folder_closed_blue.svg new file mode 100644 index 0000000..f1fc99b --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/folder_closed_blue.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/plugins/sitemap/styles/images/forward_keys.svg b/code/page/plugins/sitemap/styles/images/forward_keys.svg new file mode 100644 index 0000000..cb04793 --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/forward_keys.svg @@ -0,0 +1,10 @@ + + + + + + + . + + + diff --git a/code/page/plugins/sitemap/styles/images/left_arrow.svg b/code/page/plugins/sitemap/styles/images/left_arrow.svg new file mode 100644 index 0000000..c1d72ba --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/left_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/sitemap/styles/images/open_item.svg b/code/page/plugins/sitemap/styles/images/open_item.svg new file mode 100644 index 0000000..062b37c --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/open_item.svg @@ -0,0 +1,12 @@ + + + + open item + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/code/page/plugins/sitemap/styles/images/page_lt_grey.svg b/code/page/plugins/sitemap/styles/images/page_lt_grey.svg new file mode 100644 index 0000000..15e33b0 --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/page_lt_grey.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/plugins/sitemap/styles/images/right_arrow.svg b/code/page/plugins/sitemap/styles/images/right_arrow.svg new file mode 100644 index 0000000..f21915b --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/right_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/sitemap/styles/images/search_off.svg b/code/page/plugins/sitemap/styles/images/search_off.svg new file mode 100644 index 0000000..55f40fe --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/search_off.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/plugins/sitemap/styles/images/search_on.svg b/code/page/plugins/sitemap/styles/images/search_on.svg new file mode 100644 index 0000000..c813852 --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/search_on.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/plugins/sitemap/styles/images/sitemap_panel_off.svg b/code/page/plugins/sitemap/styles/images/sitemap_panel_off.svg new file mode 100644 index 0000000..93cec71 --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/sitemap_panel_off.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/sitemap/styles/images/sitemap_panel_on.svg b/code/page/plugins/sitemap/styles/images/sitemap_panel_on.svg new file mode 100644 index 0000000..701e8b0 --- /dev/null +++ b/code/page/plugins/sitemap/styles/images/sitemap_panel_on.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/plugins/sitemap/styles/sitemap.css b/code/page/plugins/sitemap/styles/sitemap.css new file mode 100644 index 0000000..a52bf58 --- /dev/null +++ b/code/page/plugins/sitemap/styles/sitemap.css @@ -0,0 +1,380 @@ + +#sitemapHost { + display: flex; + flex-direction: column; + height: 100%; +} + +#sitemapHostBtn a { + background: url('images/sitemap_panel_on.svg') no-repeat center center, linear-gradient(transparent, transparent); +} + +#sitemapHostBtn a.selected, #sitemapHostBtn a.selected:hover { + background: url('images/sitemap_panel_off.svg') no-repeat center center, linear-gradient(transparent, transparent); +} + +#sitemapHost .pageButtonHeader { + top: -27px; +} + +#sitemapTreeContainer { + overflow: auto; + width: 100%; + flex: 1; + -webkit-overflow-scrolling: touch; +} + +.mobileMode #sitemapTreeContainer { + margin-left: 5px; + overflow-x: hidden; +} + +.sitemapTree { + margin: 0px 0px 10px 0px; + overflow:visible; +} + +.sitemapTree ul { + list-style-type: none; + margin: 0px 0px 0px 0px; + padding-left: 0px; +} + +ul.sitemapTree { + display: inline-block; + min-width: 100%; +} + +.pageSwapInstructions { + width: 129px; + font-size: 12px; + text-align: center; + color: #8c8c8c; + margin: 0 auto; + padding: 12px 0px; + line-height: 20px; +} + +.sitemapMinus, .sitemapPlus { + vertical-align:middle; + background-repeat: no-repeat; + margin-right: 3px; + width: 7px; + height: 8px; + object-fit: contain; + display:inline-block; +} + .sitemapMinus { + margin-bottom: 0px; + background: url('images/open_item.svg') no-repeat center center, linear-gradient(transparent,transparent); + } + .sitemapPlus { + margin-bottom: 2px; + background: url('images/closed_item.svg') no-repeat center center, linear-gradient(transparent,transparent); + } + +.mobileMode .sitemapMinus, .mobileMode .sitemapPlus { + width: 10.5px; + height: 12px; + margin-right: 5px; + background-size: contain; +} + +.sitemapPageLink { + margin-left: 0px; +} + +.sitemapPageIcon { + margin: 0px 6px -3px 3px; + width: 16px; + height: 16px; + display: inline-block; + background: url('images/page_lt_grey.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +.mobileMode .sitemapPageIcon { + margin-right: 7px; + background-size: contain; +} + +.sitemapFolderIcon { + background: url('images/folder_closed_blue.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +.mobileMode .sitemapFolderIcon { + width: 18px; + height: 18px; + margin-left: 1px; + background-position-y: 1px; + background-size: contain; +} + +.sitemapFolderOpenIcon { + background: url('images/folder_open.png') no-repeat center center; + background: url('images/folder_open.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +.sitemapPageName { + font-size: 14px; + line-height: 1.93; + color: #4a4a4a; +} + +.sitemapPageName.mobileText { + line-height: 1.69; +} + +.sitemapNode { + white-space:nowrap; +} + +.sitemapPageLinkContainer { + cursor: pointer; + padding-right: 10px; +} + +.mobileMode .sitemapPageLinkContainer { + margin-bottom: 13px; +} + +.sitemapHighlight { + background-color: #e6e6e6; +} + +.sitemapGreyedName +{ + color: #AAA; +} + +.sitemapPluginNameHeader { + margin: 13px 9px 5px 9px; + font-size: 14px; + color: #444444; +} + +.sitemapHeader { + padding-top: 7px; +} + +.mobileMode .sitemapHeader { + padding-top: 0px; +} + +.sitemapToolbar { + margin: 0px 3px 0px 5px; + display: flex; + align-items: center; + justify-content: flex-end; +} + +.sitemapToolbarButton { + width: 19px; + height: 18px; + border: 1px solid transparent; + cursor: pointer; + flex: 0 0 auto; +} + +.hashover .sitemapToolbarButton:hover { + border-radius: 3px; + background-color: #e6e6e6 !important; +} + +.sitemapToolbarButton.sitemapToolbarButtonSelected, .sitemapToolbarButton.sitemapToolbarButtonSelected:hover{ + background-color: inherit !important; +} + +.leftArrow { + background: url('images/left_arrow.svg') no-repeat center center, linear-gradient(transparent,transparent); + margin-left: 11px; +} + +.rightArrow { + background: url('images/right_arrow.svg') no-repeat center center, linear-gradient(transparent,transparent); + margin-left: 3px; + margin-right: 2px; +} + +#searchIcon { + width: 10px; + height: 10px; + object-fit: contain; + background: url('images/search_on.svg') no-repeat center center, linear-gradient(transparent,transparent); + vertical-align: bottom; + padding: 5px 4px 5px 4px; + display: inline-block; +} + +#searchIcon.sitemapToolbarButtonSelected { + padding: 5px 3px 5px 5px; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; + border-left: solid 1px #cccccc; + border-top: solid 1px #cccccc; + border-bottom: solid 1px #cccccc; + background: url('images/search_off.svg') no-repeat center center, linear-gradient(transparent,transparent); + background-color: #FFFFFF !important; +} + +.backKeys { + width: 20px; + height: 21px; + object-fit: contain; + vertical-align: bottom; + margin: 2px; + display: inline-block; + background: url('images/back_keys.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +.forwardKeys { + width: 20px; + height: 21px; + object-fit: contain; + vertical-align: bottom; + margin: 2px; + display: inline-block; + background: url('images/forward_keys.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +#interfaceAdaptiveViewsListContainer { + position: absolute; + display: none; + width: 220px; + left: 155px; + padding: 6px 9px; + top: 36px; +} + +#interfaceScaleListContainer { + padding: 7.5px 9px 12px 16px; + margin-top: 9px; + border-top: solid 1px #bdbcbc; + order: 10; +} + +.adaptiveViewOption, .vpPresetOption, .vpScaleOption { + padding: 3px 0px 3px 0px; + color: #3B3B3B; + display: flex; +} + +.projectOptionsScaleRow, .projectOptionsAdaptiveViewRow, .projectOptionsHotspotsRow { + border-top: solid 1px #c7c7c7; + display: flex; + padding: 13px 7px 13px 0px; +} + +.adaptiveViewOption:hover, .vpScaleOption:hover, .vpPresetOption:hover, .projectOptionsAdaptiveViewRow:hover, .projectOptionsScaleRow:hover +{ + cursor: pointer; +} + +.scaleRadioButton, .adapViewRadioButton { + border: solid 1px #8c8c8c; + display: inline-block; + position: relative; + width: 12px; + height: 12px; + border-radius: 48px; + margin-right: 12px; + top: 2px; + flex-shrink: 0; +} + +.mobileMode .scaleRadioButton, .mobileMode .adapViewRadioButton { + width: 20px; + height: 20px; + border-radius: 60px; + margin-right: 22px; + margin-left: 22px; + top: 0px; + flex-shrink: 0; +} + +.selectedRadioButton { + border: solid 1px #20aca9; +} + +.selectedRadioButtonFill { + position: relative; + display: none; + background-color: #20aca9; + margin: auto; + width: 8px; + height: 8px; + border-radius: 30px; + top: 2px; +} + .mobileMode .selectedRadioButtonFill { + width: 12px; + height: 12px; + border-radius: 48px; + top: 4px; + } + +#searchDiv { + display: flex; + margin-right: auto; + flex: 1; +} + +#searchBox { + display: none; + width: 0%; + height: 22px; + padding-left: 5px; + border-radius: 0px 5px 5px 0px; + border-right: solid 1px #cccccc; + border-top: solid 1px #cccccc; + border-bottom: solid 1px #cccccc; + border-left: none; + -webkit-appearance: none; +} + +#searchBox:focus { + outline-width: 0; +} + +.searchBoxHint { + color: #8f949a; +} + +#sitemapHost.popup #searchDiv{ + display: none; +} + +#sitemapHost.popup #sitemapHeader{ + display: none; +} + +#sitemapHost.popup #changePageInstructions{ + display: none; +} + +.mobileMode #sitemapHeader { + display: none; +} + + + +/* Expo Sitemap +******************************************************************************/ + +.expoSitemapNode { + padding: 15px; + text-align: center; +} + +.sitemapPageImg { + max-width: 90%; + max-height: 150px; +} + +.popup .sitemapPageImg { + display: none; +} + +.popup .expoSitemapNode { + padding: 0 0 0 10px; + text-align: left; +} \ No newline at end of file diff --git a/code/page/resources/Other.html b/code/page/resources/Other.html new file mode 100644 index 0000000..d0fa808 --- /dev/null +++ b/code/page/resources/Other.html @@ -0,0 +1,35 @@ + + + + + +
      +
      +
      +
      + +
      + + + + + + + \ No newline at end of file diff --git a/code/page/resources/chrome/allow-access.png b/code/page/resources/chrome/allow-access.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa707f1659a8c75cc5d3a8fed92a3054ab72b06 GIT binary patch literal 10061 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⪻NTY-riMV0K(teNT=Q0pk~@! zzm5E9|06lPE7sd~G#TkX5t;Z-pL@hO6+kQbQYBX){`I%SfXnhmGr#*Uz`z2)yQsHa z9(#88DU|bjlUd#0=o_U)+Z9+|qldSW1j%Uk;-HhROEr4j3W*eWYyAMUJT_-5 zo*z{SbwkUfMvQL~+w5%s3gi&d@LQ`Y^MfD1TM!ziC;KA-^>_Ry)tIpty?b*HYa0K- z9|z8|iDUS1*88ClKNO4imJT-VE?&+b_-s9$92-YCM<(i_I}IaBYN}{I2S*gLu-Ng~ z)37SPsjyd4vR@lUTSb#-u}5qbe=sf^h?yy#D-QK3{9teDW*wMss#l+!7cVVO`hz4O z(@yz{D^2#vGc2merAL2BOyEs_^Jv`rgS^=HjJHNNF za{otm%D2WYv(G33`N-}!zechrRi%oQ>IDFtl=6a$;z8R(74gi?u}4ijpYQ1*Ddm*e zfXWqZ*rfzyaCkx=SSL&_$-l8UMqNUmgh;EzW)>cQuRs&g=vH()4>$Vt%=ON{buyFkvUqV9lRYV*L`%9XO2# zAWg3NQ$sW|FP^rDZ%ZX3n4S|9nThGZ&|Wo&1E!tVvv^u#zbYU^NPUoD*JFvy&X(el zaJmx?6wba}$fYX0_}PWFDG^SDpKVjg8EfoE<%P4jn6N@Xpx;Y+u?;YiRY)zfX2j)< zuEFq^p)TY*$Qn+6S z%NXg3BiT#hZ7_6NwVRjtxqIu@a-g{JrWM`tbx#I8&O(xvAcVm;$<#uk`DJ&uMr}9+ z8NS@a0(lmx;nzLV&#amXB?(6t2Q%&a>?{}k%N1z&zepecfHS~l(gFpS_esWaOjU)x z#3y~c8yNT16n&VCBz6{j@}wpZA9C0X^4+u+9S~+@%5HQxytH6Z7c58u^LvUA)*j6- zb(YAJpR%O-Txs1Q&m+LV{Ir^D>3AofuBOb=}No84j@r0@mw<6L;^vcM<{f&|$Z z|D%Vc@Wl4x7+$FJ$vBz62-ZnCZ;J{56xF~zRgeca_X`Pc^j-=JZQzg?(dm8#StvLwc298TI5y1qx# ze1nFL2l&s~aUcGy|L61Xa^?P2;jhV8|5+XS&;tI&(eaYS0BlL3Pq^@8=?R4 znEb2EU-!iRDYItsuQLC4hwQI1e;pzIDMRW0FXP2uEC01)|7Yc#hsytGtsY^Wdr literal 0 HcmV?d00001 diff --git a/code/page/resources/chrome/axure_logo.png b/code/page/resources/chrome/axure_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..84a957bf37dbd5f40f950985f227d50e762709f4 GIT binary patch literal 8872 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 + + Install the Axure RP Chrome Extension + + + +
      +
      +
      + axure +
      +
      +

      + AXURE RP EXTENSION FOR CHROME

      +

      + Google Chrome requires an extension to view locally stored projects. Alternatively, + upload your RP file to Axure Cloud or use a different + browser.

      +

      + VIEW LOCAL PROJECTS IN CHROME

      +
      +

      + 1. Install Extension from Chrome Store

      + +
      +
      +

      + 2. Open "More Tools > Extensions"

      + extensions +
      +
      +  
      +
      +

      + 3. View Axure RP Extension Details

      + extension details +
      +
      +

      + 4. Check "Allow access to file URLs"

      + allow access +
      +
      +  
      +
      +

      + 5. Click the button below

      + +
      +
      +
      +

      + EXTENSION FAQ

      +

      + What is a Chrome Extension? Extensions are downloadable + plug-ins for Google Chrome that modify the browser + and allow you additional capabilities. +

      +

      + Why do I need to install the extension? Google requires + this extension to be installed to allow the viewing of local files in + Chrome +

      +

      + Why does this extension require a high access level? This + extension requires a high access level to allow the viewing of the file:// + protocol. Axure does not track or access any of your information. +

      +

      + WE'RE HERE TO HELP

      +

      + Need help or have any questions? Contact our support team at + support@axure.com. +

      +
      +
      +
      + + \ No newline at end of file diff --git a/code/page/resources/chrome/details.png b/code/page/resources/chrome/details.png new file mode 100644 index 0000000000000000000000000000000000000000..260397f757ddd6d12304ff0a28e808f97ed9a03d GIT binary patch literal 21867 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 literal 0 HcmV?d00001 diff --git a/code/page/resources/chrome/extensions.png b/code/page/resources/chrome/extensions.png new file mode 100644 index 0000000000000000000000000000000000000000..4b011c9492fc43d5279f720705faaef25d776e94 GIT binary patch literal 38642 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 z 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 literal 0 HcmV?d00001 diff --git a/code/page/resources/chrome/safari.html b/code/page/resources/chrome/safari.html new file mode 100644 index 0000000..824c8f5 --- /dev/null +++ b/code/page/resources/chrome/safari.html @@ -0,0 +1,154 @@ + + + Axure RP - Safari Local File Restrictions + + + +
      +
      +
      + axure +
      +

      + SAFARI LOCAL FILE RESTRICTIONS

      +

      + To view locally stored projects in Safari, you will need to "disable local file restrictions". Alternatively, + you can upload your RP file to Axure Cloud or publish the local files to a web server.

      +

      + VIEW LOCAL PROJECTS IN SAFARI

      +
      +

      + 1. Open "Safari > Preferences > Advanced" from the top menu menu, and check the option to "Show Develop menu in menu bar"

      + advanced +
      +
      +   +
      +
      +

      + 2. In the Develop menu that appears in the menu bar, click "Develop > Disable Local File Restrictions" to un-select the menu option

      + extensions +
      +
      +  
      +
      +

      + 3. Click the button below +

      + +
      +
      +
      +

      + We're Here to Help

      +

      + Need help or have any questions? Drop us a line at + support@axure.com. +

      +
      +
      +
      + + \ No newline at end of file diff --git a/code/page/resources/chrome/safari_advanced.png b/code/page/resources/chrome/safari_advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..9f81b2a1aad42641670e3ed550ba28bb4b7e7c5b GIT binary patch literal 84670 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 VD!>1rH2n(rc_XDLSuJi9^ncX*%0U1C literal 0 HcmV?d00001 diff --git a/code/page/resources/chrome/safari_restrictions.png b/code/page/resources/chrome/safari_restrictions.png new file mode 100644 index 0000000000000000000000000000000000000000..26ddf3f684e7384b1ba34a9a62d840c2794770c0 GIT binary patch literal 152746 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

      }C$H>QK{ zG4?WL@s({E%R61EkLot4oZe%J%IU>bx2VN2eOg1ynEN~-3G|gp@i%1;z97IkS*f^o z`5IEQaztjRo}Q0L#br~BN6^WiE+<^RjKsVAgOt?O#d@r*Bu#ln7l!Bkwd7|p$*tah z&fCFgj1Q>1(M`gI$&_+4W-T8WkFMnl<4L!;TuOgm$%ZR!<^x;1k{9#cu_x9yubnH! zSsFe|pw^lOYy*Av#iBm_Fml-;rwrUY@hkVI*DH@+xAUY{oD?Jkv26)M)L}9r5^3K0 zXCwLy8iY5;uXE$im*tp7d?t@4C9jeC?vwwJXF!w3loDTj@sURFNzWJF=7tS>PMB%K zDWZybX_5OQ@2mMLm7_gZA2lR3x-uR=Rin&PL*nW5uLBPrJg6<{M&Bd<^54af!b_F1asYi0cd8#i)Mq@3A=lS#s(HI=2+ zsLYlc-uhbS>6t|URjnaHK=S)23o%bXJsw@78 z!)0`ymPlUtH1~^{*nQz1d1gj5+PvNuy*f4KpQ}McPVZiY&nC}DJZT3Pegwnbc?->} z7eQv~1x$N$D#~|lkK^Bejl(HLF=-)rV1FU@SWzCITBEYRY`loaI=_g7l|Nzat}}S# zx$2HttE|*(SpMZS{6y&7AC>ff6G4ZU;8xXv7}}9Mkcce2A3xarsP6EC@{X>Wj5Ulh-Yo8U%k(u;TWY<6uO@bt{?QEu`Ij$rI~iH@ z&NwnmF+Qiu5g64d8bi&CYZjAH->4qTgE0(sX*q}D%W2wvilv!%Ok+2BP1S(|2hg=^ zS9I>&S>*-?euU0+*qY(WF&W>;+Iu5s?p7G$s(mf|*f8RrYgw8M`6nae0zM_LeA<7% zB8HEfh@S0>VEqqMFzwe99N@Vfv+)io%o(-YV9478P?J2pZtBQE*mE@nIo5PsOt_52 zGiTybrB-;kdq)%s<6o#QwnKs9|K5TNq+qsd-wy4_1MK&$+|Iq?ipphW-^Kh9L%71+ zqH|vidgK4FcJ@>(+kFMs$%FRkBKYw%@uR=Q56Vx^xPhGur{kL~0T}%5+jzQeVJ?o< ze_e;#Yow^&gSd!u>#8k@PbMte?VNWGnY?`Gaiy=t=Xk_9!Gy5a3p6obX!9*eWM1jG z@A(%7bDUPr7MW123bNO$GsL%;D3q>O7sjkS_{ymOd?vCbV3*h$I z9r*cT7TUcv9sOEW}7_ai^?<9oXwkK6rNO8jW}+M}EfeGc>I-;PEp z@+iX=jVj;<@$8AAi>{y0gBa|778xAumjVU3a;9{ma{ zQ5BDp(sF|gv8>4noFDgzALB)SoFa0(A4D=IgS^?LqT^+@fdMh7NaoxRvqaF>NRf6H zd6TwJ7G~EIV;JiNk(fmH~14WrqV3c?j1wZd#*s=~Co1RpbpxK3pD{;w;`V zZd|*;-5KF{nJ8geM1S}a5?TtQR?Nr#ZCkME_f1&6WH$Gqqu3t&fRxNLS45@ql}KeH z%H)5IYK@VvC@IXOO$%OVkZi_>(746ESDxRyp1f?9EStYYzs)?0exF>j9@k#1gCP66 zu(IrH%A;?)&UDPbQ3{>!7WqN?HL44Ka00R~AC+O5RqZZIjkc7XYe-lZqF*Q%G9cfK z4{Nc0=w4Ih$-W}r=whq@O9+Zr3q#7*KX5*oJoh+1|27XQb9(pxV9AL_^-|HuNKVAn z_*B$+sxulr-36J}Yxtu3Ky2T17_U6u7<4R~RDrR2a?9=b%SaC{MA~%ptg#RW zt+pg=U$6(^6}sZfk2@oRjFK%uAxJ#+GlqPy2z!s+L90mmUcLLK_7mM%k#$LxV?zh>}dC6CGq1|-eSv+c0Wj$dnHr>aRT^<@*|k1 zaj%hTDSeF;d-k)I|DN#JX7L2WultZ?fbA6aT~*dq4VK9%2}t*PB?< zbLkURa4DqUZ_{5>wPC{s+l?DH(Du3KR6Ugk?b2Nqut<^4-`-2QjZE^=(V*~xh>BqM zAv0l8H?0{+BX8eEKrq6?f}PATeqcyGGRG|FISIN!$jVH>@BjUsybJJgJYJVhq>yWm z$;UAC8|_`g-ylH-2NP%-Y>ZydiDHr4|xXIj$!U0BuSbVp&fQu z7!HC$!-yY6qVnKts`!{_7&KgAttWVeeDE+b2A$$47*kkArCnx|SPlwBxW;b-S9}F< z-K2n^{7Cp?B~~u_2|J$cjv57T#%L-|FDIC)_(d0bm`myRpX?$PTNc@E&E<8&RRx|@|2U|OqEht zPtT@P_Q-ur9xph5DYWa>k9?$qf99F8RX>$wKr2sL+eS-|VXLjhx@tDWGHN*H()C&t z%i9^y zlXpEbp8Dwv8?Jry#0#d&_IuXXw#uaVhZZQw+VPm6l8B$?aR%~Can`q;^+~B`h3T`M zRbA50@qGr^*73dNhu9*QR8eLP?D|woS)AeVTxB^XBhRfeqFl=7edQp0?uOW4o+!?0 zn^ADowS*w6r;eebsqi?efZEEn3_N1v27h7#A=A0?^Wrvi}4JSMn0b8?pWqKxeeOR0Y z&sm59CAV5mTS3JU=CN-!3hxB7sp68`WI3+8F$wqM=y%0kTly{h>m}uz*HuEOym+%1 z)#vaPl;pTXP9O;_SMIswGt(wQO7h{-0q+U;xHwC%1?vlo?m27==+iJJWdz&IJwVM% zBmSsic$3ci=bo2hEpbIq^H(e{meHdtme1w3S{TeNr*K>;Fh$YY4HbvBC%O(0g$Biy z#pXm3+m^{HAPOY09-}&eQ-)m7h!G`yMl*^-^^7fEE6%rX-*`I5 zLsv<`!Q_pKMPw|gfFje`ag!)sE6(D0P4bn%(ByarS)Y$$+roxoRDq%gjcGZ{s&kxW zJ)=-d#=Pe3dFr7ayLxQsk?|};hP5Rwy^H5nze3zvGh(=-!xuH*Tm1%CeRoth~DmG4G9e z$h2rG)c zHj|-iU3g+4aa#5WgUV?@t+gAgP+ zn6r=}O0E@WNgS*r$tWdC2%^B4f{3KhWKs-;^%X=_N$%)SFsjGwDuKJibt#~P>MqTd zw-ncaLk2{pnKGp4Zm_womlvXBK4|Tuxtl1X9x{2}YueL_O(M-YM1eIaik3ca#k=3R zR-6^Xa>}SURf-zAh~}W^G9?jm3dhdX^hc8^fj7C6YlcmZLwbOj4z3eW?ZD1!S!VvI z`KvQrFN#qQ-SbW!8|$k&D;6Lo#a&e$%Fr#SiQ>e}mEx=!3uU^uEu4bO3j}#ME@RIN zPJ7u0=Nvdws0&7R17!p+2ciL=*Zk3Nm1F7g*U0v8WzQJjm3P{nxzbkjg(+!6d#x~2 zpK_%*OOnBoASP0ptE9-~#eG-0N;bv%tnCVi$+=i-n$u*u0DeH&?uO{D-UE`B2hL5p zJxn?zOpe`)dx~1nE=_u#DW4Z-NlcQCY9l>T2BKi$!Uzxc z{6*q9whV0k?kgnM=!A|9%NyQnIQ@Boe#)&x+yi+lci{p8mM9j1=-lGsL_Wk7Ddfx~ zl+?S4xOLBl*pji_OKlbN5=HV7CgjCgCKyr0VmN(8BOVZShUtL?ziMt}fNtA=Re@#! z8`-H%NRZcxv&%SK3OMh2**U3LJahoor{u_(p?G!lC+O-%K@|hpY}vT*`~R>%qp@4X zS+0L%{>HwLfU-(7 zMITMXu{)U_dubu~5h2oIXatng59QB!LHP?KFg(;7-@ZLMb{l{Nn~q7WoZh_({q6kDz23&Eo&QMq zcWxiUoXI`y`n|AB#;5xI2sXv<+-ns6IIg@Qtyv^sOBSs5zw=K#w;NO5?9S=^(O4~Uw5I^xj$UvMppFRoOC#x9tybR| zmRa&%ai*D0gZg{2@Fr6wL-h0&k?fEyLsV)Xb?XkI1-E4~_q|NfoG znLD>*Hr|;$AGb?1$H?(x&?4dz=6^CA%m2E<@k62lar2KA*p<=*Z@oPLl`Xfii17co zd|#rUQM(O>5PnTk*rtvgggsYNoWdzwwjQcBDvltF1(_Ka@aeG0*mu7ohL4+wp6!cZ z{SQ+x?bj1ddX$iPI~#?n)Iw0uK5W<@?~qAL`Ws8P-NGYHYLE(^;h@t-a%MWRNbyd$ zX5iMf6WF@#48lq_N67+gd@T{@Ispjg*7uT)?}T~v;Bt=APw{33*kSIDjl8-KWn^Sv z(V|6Mk>0<5zp>Cv3QAh#jJc3&(($K`VDAC)+ku?bZr?bDC399I(AofX$`?TRoyRcg z;|8c$qbzr!t8T40oa*!@vaH#lbG7TgUXSn!T`_O!E8IMA{YO5B<=s&@clIVwH<~Mo zk@fpy&e*nGQEgPMFkXA(LtMX=0&9sZPQO6?KA1nQJr{qAW;HOn(;zI{d=d@1SCizV zQi~q=umw*_&qxP7Jv`gD7h2RW4b-oLS`7~(GqRXON8BmVpbZ|4K7-{8w&8__-8p~% z*}fWgNvuQK)WO7^D;?s&`7F5p+h^!ZKH{a<#C9kc7)a)vd1^|Al^@AxXCvj-87!Xj zBP=;(QKzc%g-0=#zwOU}H!>iuWhTuCnC51Dd^{#hn1F^28*=l}g~`nax)yOzx)hv+ z9=PI6i%`nZ)%b{f*b*F82OrHCh9W^EoWf-hm9Pt|zuSQGm#-t~)-|wkr!_eNhsj)R zwZ=6a7wAGlOJT^Di#RBH(TpxdO2lx5nYJwv1rSXeWMTUE_bjfi&KPG z;KEh%EiKMehb;l25vV{qt0xb}=F&CsMAN2d-m*EW#)cX<>bg*WZaWo%ydBfcBg7cpP{fF`9w zL305<>PqR-rI9~>egoS@ z9*F@}yXXT~oM{n?du9Y?4rqd$w2S!U#W(SHOc|6c63&HmWX%+enYRnUg)8F8`n6H6 zVhm1Syly-*A`R)}0XXbR#J7esut$C{?)%;tCnN0P6W}=j6Jd;Lm_!28`@$ z-YDet>eb^$%yDsXivD?%_&^kAwt?uH{yL8!cSF#5T!fd!E5kcr*k^0-(~cJC)1o-` z{=N^PAgN~NBE}n;^Qf<(=c}Y%A z{3W&>5FQCCkyf(}UU{LVL+p0^WuymdPYYxuC*o>+D(XDd8I7Lqf=uf*eDUf)Y~OSk zJz7>!zSr1dMNmLA+V^fkPB_yrVUv|i$-IQx#X@n9yl95{#{A=EEkbyg7!Blpa3;fO zabzC50omb{F_FN3&ASic)RA47)MpgAA&p;x1B;+7DRlSu&&8*1LSA_SGDVAatN-7p+YLod;xz%%s zBT-yS%|^SITR6#6Il5dqvxS90XXk2RrvB&Ik+WKo?Sn%{?t=oN&~4Of*fQpOEdA{) z-t0dX`_7KV+)pNOG7Y=+MDwi+9r88WzlC>6k^6MX0u1K|)M)kM+vwGb&IqS-a?$z4 zRszZ2_|b*;s7A+87@9m4U#ysg1HbZT>Xx0}M!$AdiHwpyr;O-wPvG4y`!IFIG7Q?c zj3ZWR_#%eC;yj9V#BRSUCA2^lba}cAzS&+Ht?R_{fZVrmD_sbgPfk0t2~(!ngChI_ zu{AJg#6YyE8q56=ia06}h`;I2z(bV*di=OEg05e`KIk8!6f0KDcs{5>$AN2HT}i`2 zZWFN)r`(A}2@e}KY_Q$9aRX03`DY}6O8b1=L=m_!$xj5OUukg zU`RfM2I&c3YDcUe=Fr#iE(W_@1Q6d8F2YHz=*gB}#-9Oy29z?O=crcFGmBO%I?8Pq zXkE^8BWGj9NnJWDjK4srCSeH*MY!(holyjR9R*puwTaz)cDoc+y!D)|h!y>9e+K*+ z_%~%hcX{%5Qp_z(^0McN_iCPr%c}eMYUu7G`ZfI-@MnN#z|1O;8yU^j;_O*r@=RM_ zvVCDgpC^7Pe+INN;A&4bXDFfNLEhxCym%vihV8A$eO{c+2}lnLmGNYg=&|9g&Em)P zXTaPHczQIL>y7Wx#7FakQWbnwoW;p8ebbn}=Xupz)5G@zDrdl3ThWt)TiH|3sCwg6 zlFMtcc$Nu$+AI%7VrM$~ESMu@dU3Xqr>t=wbNo|4QAraeJ7rsusDLRZso;x6JZkI3 zcM8TMtN#{dz1j67A7UH1xs}9zxEqfcBR6Al*MF)<{T9ce7mMj=#m!{&Vwx#udT|z< z(-W3fS_CA`mL4;j0Ai-8U}9j>Hi}KZt;n#PDKq*5e^di&DCk^qIV!C+j-zT~v+=so~23?6{_` zJh4G^ZEC)2IO&Fp2AU3*Co$@PcZm2rFo)%TMT72cBv92Xv(2m^ps8na@|YVGR>2jM zt>qqEE*EDOxH#R6<|6G%DpXZ*FHsX_w!F3Wz^+4;HC*IF90F4j(>!gfn)ik={m$mD zb^U(kSxJQiQj+TCmIb1qE|c(XH@EG3Gdiyo=i9f*lX<+kxY{au_bxp?s@hU8!jV)J zw5_?RrVXmbRq$O+l+m43eCjaqLU6#>mRSlO=(WM53E6gzTImO!mb^29pW-S5rWa>+ zK~Q`k2~KG29h9Ya>uSI_Y#G6GD2W<+Y;ePLs>2*7N=%QDM39P2Ca=i!CXpG|>nQO> zqQW}f^ihsYZ7TdlCUeC=C~{K2Z%;P3s0`*4!#^i+*h-0wjHre!)-Mu)qw2I z8&y+-(@E#8%8bhMC}Zn{c3(_x-+iP!rl}N|LULs!SvQZx^kBK;wc;#K1KnuC!6n-8 zqNYQK(d1j2(H(+18}91qgx3^fwuJ;}isxM>3q<6hoFv~~c2T*Q2*JIk7ND3X@kh*X z$E*m`P^{-EQ( zjcGfwte~bqa)`UvV2C=31SiVm-LocWF&rIs1*JUPV(}Ptk?M(ZpxreJ?w1#3!1Urw z=bUvdGBMdUmO{v6rOb!7rzdRDVdCNWi?^n^9So*gkN*ZCMdIE?7a5W@bIY#Gjl9%l zDG~3CdC5O7`yvjTrNRu8rWa?|P7(KI5wI>>i-UEI_i#zD9O#Y8sJvcWPv!EeU!KP0 z*QXg^TUU0ZGBOpBu_)MtcnrsD#aTGJYP+t)r8Hk|1|=U@ zg2ZdHebQ@J?1Qh`?rwv;9Fwnd_wTmD_5j(@qC(cr6;onTtS`f6?1yY^dU4Lo%mn=? zE-bf-Oev9ydV3QXaJ(@$b_ ze`Y^^Wk-mvoyyf7CFjd*7)iBDD6xPCc8vIBmo>dOtNI|0(JrJwQdMV+RGnjRWM3Sn zC$?>L%!!>$Y}*st#sm|qW81cE+sVYX?ahBtyZfO(-mdPtr*56|{+{=_JTNyB~oNP106E@@IoBD){6~diz=cZf))T^H+)cev6rqzow)r8z> zcQ{$&w0Q8r+}>+}2B4tf1^kY%bCY|Zde4BO1ar1azTiNO!x0DT{rwYB85rzTmQoP_ zAPr5!*9H|%Mg0rbi-+*tU)Zxn@Q7i)(ycN1o*eT~Vnl=>_Pi$G1Br*I7EX2P+{;_@ zvN*z;8M6V?6yd|2&ZY8}=?drdI6k`T&A7CPhr>A>St2RG-Bf#9ELVogz|CrQagEzk zxKVNB(^y{*FTNr9{BKAeRG4l|km)aKRgS6H`2Ftr7&T@ZE!S9a-7Pw}ICzdk{^xUn znQ+fozKM1{N?Lagp#%m_tGZ)3jb)%t`G>^&`ethNetUg_-ggH{ka6c(>wNVZn|caV zwj2Z9TJV=U)!zhIk6*;*FMk}b$vQSmz$?hQ*|pgn9YGa{X;k3Uu)eS17VbI)eSqU5 z#)-M;H^nDrmN*a@K`5owZFfc38;TPC{>&E36QNTpiNKDk5Qu8|X2yV?oIxC;%`=ko zY6pmsdTU4v#A(D?%%{@f!R|*3Ig`DJh&p9|@5e+A;d;ZiOmq9|KWg@fe9p}#yFx^X z;D1#!Nyo;;2lUfY8jaoZJzIUyHP~%sy+wYUcDJO{zsGbF_#($|c?Vr*0kRoV+7IQ8 zSFbksU+<1m?)R=V_?48W5Xi z5+EgEgP|3`8#rjRbCO<;=6tjcnwfx4ZHSq;l9(a54LNRz;e_LkD zWylQM_Sfu;V9Zd5>O&uf(Ap6L&am#?O9A|vu730Fe+-CwZ(X&J~ zjc7Ly$jQ}6dZ$rQ#dcgeQryk`)Y$?yD}D})t|B2vuRAN5GUf-7hX>UUceDMM!bf`f zH7^n!U|U<)Hju}$XNiOKzyC=6KZk$jUy7Wz_r31;O(%m~OiU=vwi~F4CXeF*Vgvl1 z?}sK9Or~&Fg~rCQU<*U!KnlkGtRC3PEMa=)!Rvz&BKzdXB1YQ}!f`}B(KiNqWE5n- ziV2>TMtf9>sr3lL{@|ShGt1rUA`fg{8-V)nIXj~M5g(%8)2-$m?B>Ya4Rpfclj13L zuT)1~reiken%rO!KH~#-x_Y7yc`q@EE@&JQic@4yhzA<;4oo}DKF_;w#!a3GeEJ@^ z9MN>5*;x9+@@CS8*WcVhvo*8YAFf1N=7tzLqAj9&-^~cjOs`zKZ_?i4f0FiyTm~8h z?r=r2!a|Ex?r)WZREe&L^G-&YBa+=O3o8NK-M&Lx`-ShS&Qtb!$ z&+U(=8?j|E&W;->8O?hv>HKjv9BtaMlA{oTRqMSR`pZdF6 zTELBE406Tc%vd{dhm0Dz1ZcpwCxwH9 zqtRfFqF(THwZ*t%Mn46$iL!SLFXCnM+90N*gAZ!rlsd(5EqLR6BM-);JL9Mz2_T#J z`@F?3SiA+!pZV@?@Q&|Xtqv<(-081(HPM^AB}#mgJV~|X%9&NI9EnBoim8oHG5LiW zJrENSQmLJ*ll#rs@BhcxvoSX_^gm?OrLnKi*6T4Ev*P{~nqS_4BM5+nf7?Ac34aIuWs_yx(;9 zIjEfq)8mIUVqyN?$m;QG0Vm~FiI5=koW6+Im+rNS`&Q7F!?hL!?{XCZM_Z%mrf~NS5owvB3wkseKf7gMOknpSG##-w14Z5;Q~QXWYQG`|V0KWQ1#rwgUausu91hNXtytys zq#_&y$ZRco9KCO~G4~MROwA_@!BsLi6~PStUlyN(NVmn_03;n!6w(CqR=%yqyig^- zlecF06n=mqDb-Y1WD*B@DtXS1UiD5l)X{)MME?TezXX}GS{$|~ zV^v=WAbVC!pcmXY& zPs->AW>`ZHJ|Gxpyuc)Stz6AJZiXft zsFSZ-LCEv=24${!=1J$0$PReRlhi>tSXiO|o!Xd5oMsGAw>KLWXEr)3em6h+GU^%L zfS?7+X=oAUN^l5gi^{6h8iBxdbJxEpn7>#kjmP5j<0PRVGd0Irvt>kt6$^z#(TV4Y zol7@6aZ?dTLrQXfT$}g<%6(>)aB!`&F^NrW_KSI%6|gutMp)tL3)Xqrb-@bDRD@or zx;W7yN>rh~G1b3R>wvm~jsw78Y(*=1s7^z^&CBpqmzxEYCsI~0yi!zpqh**@wA$d{ zg0KBCKiKbZSBTYc&$qFd-eV0mu_2H-b028i#PF$?(P%R7H9O)ZN{!Y$jeI3l^rp<= zL_E2lQ{bra|42uRB}!COgEBCpemS48Yp@o>H(9R-U#xK$UPcn6Jc;5D`SK9B?3v4b zNb8OKSi?(<7V8zJ7^bSYl9FeTfAe%nVbEO$xCC$Z3Yvj0U>#z_)^LcTyRczptW!^! zx>uoUXuaD;rq<$M;BpKlZtyVKI9SPeCVp|*)drH@QQ$0^{MQj+%;8`l1a!;fDVC}T z79`UD_4~pY`s#cpm4aFmuX95~$;K7&!GzkQdC-2(<&WWiDlT(vn<)Zs8cB5b{J{m7 zFSMLLnrURvhd;Ua%Tcu{m}>~(2k#>Sy_z}vo{~CTW4aoX>6x7#Q0%4udT}-~5jIpX zxRoPDCZMC&VaG*1rJ^@VNf`2V_|Z@V=hS0p>yVb6Irb8U(Bdy3Y2agdjD>wG;vsi2 zHid4@U9$|bbG_)}kMX_{A|aI{Dv%UEE|qWdFxcm~6uDmkbeg)P)akv*$aDW({9F&w ztNHVB!DxRzrt9mVCT~^ca7$X@+FL<-jj@B^)}4@HO(> zx;z#r5ddzeywFOgqRo-ZMT7LI3%0g1;1|8L`sEHT73;nv z`-Pv5l-ZLjptkz~GY%s<6B{IbICsH?SDsPd?VBD>^5OY=vnZfN680g>Mw=`2{bhv_ zjVrG^dkyEe7oKi?G)i{lsre{WyrAay{^k1NeAQe6mL=ZA3gF{GWA!?c+QoByxzS#P zZcw-_BoQn59U8g9+=43?MLn{y? z{?|;Z-A!JBaAClx{7a7C|6fIWj{wGR69c49+e&*$dwSot4Vq?vkZW)U4s4%0>>ijGpQUS#Z!gg&{yL)%5B(HlN*- z#Z4B~Tu=Lvo-nu+&+>Qg`zG{+gfQmIUif#+*6mrpS|K3~04)3c4qUq$yLP2JDJ|Vs z@2V5HTxp8a_GcdbSR*m+(z-#CgZGzmLmGTv5w+I5UlMZ!=qT_rKQSyiFN zps|QSRFUwelTt-?)8gQu5UblL<^Z8leGpt#r9`uKJjUO(;BoIG?~M^NTsuGCI%cQs$12Vr%GcPCmnlg z*n$#fz6M#7SkgfG?IQCMM2A=a28RUQrtbNEx#$&2O6V$?5*X=7J?(6;j=nM9)ARuF z!j;8!XAVkB_o@@I4yUNY803CS2=XK+s(8qJtCR49JInOJ9cYQ-d>MHbA6=m_$ka0C zgYpX$(zFbhyxm2Tnke$*bqRqq5j}eX&nyZNl!+vy6n~FMB^J7*rYY zZE3AYdMb&PG6K11s*^<{SA0Lxzk2W?RZ_y>Co$W$!+CtYp>Zj~n*qVm5%rGPebq{R zM~0Z7%V>DTR}yJS!Av>^*c3ziOp&BvDCXK+XpYoRukdTiL>u*&5cHTa?K4@Y?N%Js z$E}h2$jDksN7NfLp96ji3E29E!N>&8Y@$Wm$j0CX^ro$UQ5r;=21PW}4V)f^pj+U@ z#h1Thk#`w*RRN70LlEE)_T#oDBDN;obW>5ruycYjj;sU!G-5%CJO*{PF9uS;jrU}R zI@@Uy3}1=N5IvZl5;F&!p5rZvA6wf+YDexxe**lGbj1i=xCJ-JhQe&n#7-RJ6x$)u zJnL}D$)M(wKJ@8rHf(GUh6zR(9gh-0(s#r_`M0SnVEi7tCV+%BCG=NpV*>a9D}psb z(ggG}M*gk0S$KVxAYkf;t#U%gIG^1*qHr>4#3I%WlXe^aJaQhV*gM7=TOMT#u^4iR zN8VtoSl2q73=8-by4isx4W}X1vWf7wUvNWwRM?uYOgYl6v zO4{0tG=|t&M^*S-+y>hpFlogEQK7s+Q)sV9THXu#>Rx}9WTaScAnk*wlT`bd^B9M2 zTPpV>Lvp^;tmMxYj6iKE23;okp5#vtbLoo9rL2h`>q_j52R;Ql(?2%Q5*|UDLR$86 zDBBjYH1tO~N1gEQ4SWM*6cBUuy)G4wvYB_;dvL@gPQ-M zC8JbcSk83ORGdGvL6;xoT4j|fld5(i;tVSZF9nb}D%4tdIwa{K8#BxyYiRc(0m%>7 zgw;ZI=nlZCkAp%>hP_jX+F_J(?&|F7fzn z8X+EV)?Z+!CRR(yk?ps3o-- zkl*TV=xWI{kA@W{ODHIe1=0(-09LXp3GTm<`Gx(Vh$v7Q-8=tjD)mPE!k}`$Tj;O6S?ko;CUe4mqG^qktQ zux*N&lx0drVDP^&#WQ>hcMSag=yz;XW0Mz;II(Vx4IHld>or@N#^lXC*HC@`#61PE zmYN51YIdjvsp5u5K={&J2P8`+-tFAA{_Eru%9{WZl%EQa1gf;g1eVfb@8P!nc7YoO zD143P;VB8us4I@;GYwa{DPYVQhYoZ&Qi>HxBS<|A;+s{GKq0^##qMULQ~%6h>HfVe#>wg^(3T4s*@&f4=z(*AiT|36uzt_$BNGdwkN4}ZK@V-iC80NSnTqC|> zC*zPpc|0l(C6!H8d`l$p>Nay${@Glh&M%ga)5OrHr6ZSWkxbTp1;~>S_NL<9sS9 z@o4iA!z zlWpgC%%ygE_Zw_8t!p0~{TMCJO?46On%-rx)Jl;fya`f5siSUX*UO;hcv?uud4>ud zA@`3nWyg$|Jgv?MqD{+75i{_lvWPb|qru*H?E9g3TLLMdxI7cPr{`m75&@2FHblwqU zjy$f1Il*K3ZN1?5c>66a^^<~LClD86Rr_CNjtUIdKDg88lfXBJh11qVRZLSH-3wKW zlQ)h(UPLbXJFjSjz@$vV&rYd5Esue~>92Eoj`^5e!ZX#$$|N;S`$722VCu7}wUn^g zPnF0C^^ibqg@T4!gB3EA^jD@R#{4`cf~+<&ZHbM7fP# zR2Pi2gJ*xx^JULY@7gF^=953AG8_A?xm zni(4TlNdlFT0~jY>x&!zLUgQns&)GyozSaA74}>os>p`ShxXE}&`>nv@q7Nnz4>7K z#wuW9M#KhU;xRm&p4;dtXSaj6QKv66R>J51Qn3+~8kk zDviCBZa$OViIZ?MkBusso_hRO)GF&(LO8Q`K0jZG*S>$a*|#pGKj(P;k&Bl5KC{??9_p9)e|O15 z52N~1_+D5Lp`bp2fQZM- zZTMy((;MF6m%(xCd{qFqi6{9joBqK#k==LaITd`$H!%qrzK)NjFN3vxI|ZwIbY5M4 zQGh%-m%zS0=9~HZe>7X=9)OB)BKpxn@3B(f1Pe=SLT;^;c~!3e#C5mXNbQu3E}M@) zz=lWGS$NiCBzsI|N6JVGj&ak8!9AWUCIy-hS!awvvf_cf0kIcLy0 zWcbrNy$VABTm?O30KBk1I*{b7z*uWEXBCnbCwESs`$eG>--?@oLT3nRzKA5(Qr&U; z;n!$GeF~c=>1S(pkR^S#cs?_UF_|)^Zrc+DlpFpH6WBQA{ZY79#8l@@^HF_EgBe6H zQd&g&>S~Q?(XQA(2Re$NR)e>x<7aPGaIFk>gd+p{7|u-g^|n;Mp6hpLxTfuOL?wF( zgQ=2@VDw3l5*&M2WpTv5ta9p%%OpFom_BdV%-8M+q|FOKZ;b$y04zY}P^w4rvpsTl zT%S&ZvOK&`K46aVqVJf0&z^)l;?1Me+F73=I5<$i`+8hLpb_J$n+f!5deh~Hn4(^w`nq#}0S8}`GC!Mvc>895fEej71PkXb|qaf&9+#ZU{8%@%5ihoLI6E<@R-0iTU zj#zCA87cJ*EI%PDhA$st|BOTYwd-BRN}D&X>8E#aJ^hX(dLELVP#QJ5D4fSP057m( z>WDf^CjsmR60zfpFOdfAd|bne-4jNGB@4|K>I*cKs6*o=d54w?WbN8Veo`w{BUqx| z#X50t#Y%g16|B%J57-vjp0_ES`_v7|HSjUfW85@kYTEnK}szbKrL7C5t%0AAVsV_utZG|Z>Sv0mIv?cjc9OY;JSLy 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 literal 0 HcmV?d00001 diff --git a/code/page/resources/chrome/splitter.png b/code/page/resources/chrome/splitter.png new file mode 100644 index 0000000000000000000000000000000000000000..8e354e7644418791467ed34fc22271e0de87a9bf GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0y~yU_Jn3GjXs1$?0-icLFKS0*}aI1_r*vAk26?e?Dn=C?|oIg-h z({8YxH7Z-gX~*1V1`Y=XCV>V9mO9pNwae!iPYrTlW(12_u&&vf(z8=#)0L?HDVLV| z=IhGw-`SR%Uh{r#QqPmU^{+jiI6<^3FfelXXelgR^3n0x9RFJd@1h>Rn-X+H;`i@G s=PZSsY%V!x`@Y`g_wWFVdQ&MBb@06a5ad;kCd literal 0 HcmV?d00001 diff --git a/code/page/resources/css/axure_rp_page.css b/code/page/resources/css/axure_rp_page.css new file mode 100644 index 0000000..d4b188f --- /dev/null +++ b/code/page/resources/css/axure_rp_page.css @@ -0,0 +1,292 @@ +/* so the window resize fires within a frame in IE7 */ +html, body { + height: 100%; +} + +.mobileFrameCursor div * { + cursor: inherit !important; +} + +a { + color: inherit; +} + +p { + margin: 0px; + text-rendering: optimizeLegibility; + font-feature-settings: "kern" 1; + -webkit-font-feature-settings: "kern"; + -moz-font-feature-settings: "kern"; + -moz-font-feature-settings: "kern=1"; + font-kerning: normal; +} + +ul { + margin:0px; +} + +iframe { + background: #FFFFFF; +} + +/* to match IE with C, FF */ +input { + padding: 1px 0px 1px 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +input[type=text]::-ms-clear { + width: 0; + height: 0; + display: none; +} + +textarea { + margin: 0px; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +.focused:focus, .selectedFocused:focus { + outline: none; +} + +div.intcases { + font-family: arial; + font-size: 12px; + text-align:left; + border:1px solid #AAA; + background:#FFF none repeat scroll 0% 0%; + z-index:9999; + visibility:hidden; + position:absolute; + padding: 0px; + border-radius: 3px; + white-space: nowrap; +} + +div.intcaselink { + cursor: pointer; + padding: 3px 8px 3px 8px; + margin: 5px; + background:#EEE none repeat scroll 0% 0%; + border:1px solid #AAA; + border-radius: 3px; +} + +div.refpageimage { + position: absolute; + left: 0px; + top: 0px; + font-size: 0px; + width: 16px; + height: 16px; + cursor: pointer; + background-image: url(images/newwindow.gif); + background-repeat: no-repeat; +} + +div.annnoteimage { + position: absolute; + left: 0px; + top: 0px; + font-size: 0px; + /*width: 16px; + height: 12px;*/ + cursor: help; + /*background-image: url(images/note.gif);*/ + /*background-repeat: no-repeat;*/ + width: 13px; + height: 12px; + padding-top: 1px; + text-align: center; + background-color: #138CDD; + -moz-box-shadow: 1px 1px 3px #aaa; + -webkit-box-shadow: 1px 1px 3px #aaa; + box-shadow: 1px 1px 3px #aaa; +} + +div.annnoteline { + display: inline-block; + width: 9px; + height: 1px; + border-bottom: 1px solid white; + margin-top: 1px; +} + +div.annnotelabel { + /*position: absolute; + left: 0px; + top: 0px;*/ + font-family: Helvetica,Arial; + white-space: nowrap; + + padding-top: 1px; + background-color: #fff849; + font-size: 10px; + font-weight: bold; + line-height: 14px; + margin-right: 3px; + padding: 0px 4px; + color: #000; + + -moz-box-shadow: 1px 1px 3px #aaa; + -webkit-box-shadow: 1px 1px 3px #aaa; + box-shadow: 1px 1px 3px #aaa; +} + +div.annnote { + display: flex; + position: absolute; + cursor: help; + line-height: 14px; +} + +.annotation { + font-size: 12px; + padding-left: 2px; + margin-bottom: 5px; +} + +.annotationName { + /*font-size: 13px; + font-weight: bold; + margin-bottom: 3px; + white-space: nowrap;*/ + + font-family: 'Trebuchet MS'; + font-size: 14px; + font-weight: bold; + margin-bottom: 5px; + white-space: nowrap; +} + +.annotationValue { + font-family: Arial, Helvetica, Sans-Serif; + font-size: 12px; + color: #4a4a4a; + line-height: 21px; + margin-bottom: 20px; +} + +.noteLink { + text-decoration: inherit; + color: inherit; +} + +.noteLink:hover { + background-color: white; +} + +/* this is a fix for the issue where dialogs jump around and takes the text-align from the body */ +.dialogFix { + position:absolute; + text-align:left; + border: 1px solid #8f949a; +} + + +@keyframes pulsate { + from { + box-shadow: 0 0 10px #15d6ba; + } + to { + box-shadow: 0 0 20px #15d6ba; + } +} + +@-webkit-keyframes pulsate { + from { + -webkit-box-shadow: 0 0 10px #15d6ba; + box-shadow: 0 0 10px #15d6ba; + } + to { + -webkit-box-shadow: 0 0 20px #15d6ba; + box-shadow: 0 0 20px #15d6ba; + } +} + +@-moz-keyframes pulsate { + from { + -moz-box-shadow: 0 0 10px #15d6ba; + box-shadow: 0 0 10px #15d6ba; + } + to { + -moz-box-shadow: 0 0 20px #15d6ba; + box-shadow: 0 0 20px #15d6ba; + } +} + +.legacyPulsateBorder { + /*border: 5px solid #15d6ba; + margin: -5px;*/ + -moz-box-shadow: 0 0 10px 3px #15d6ba; + box-shadow: 0 0 10px 3px #15d6ba; +} + +.pulsateBorder { + animation-name: pulsate; + animation-timing-function: ease-in-out; + animation-duration: 0.9s; + animation-iteration-count: infinite; + animation-direction: alternate; + + -webkit-animation-name: pulsate; + -webkit-animation-timing-function: ease-in-out; + -webkit-animation-duration: 0.9s; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; + + -moz-animation-name: pulsate; + -moz-animation-timing-function: ease-in-out; + -moz-animation-duration: 0.9s; + -moz-animation-iteration-count: infinite; + -moz-animation-direction: alternate; +} + +.ax_default_hidden, .ax_default_unplaced{ + display: none; + visibility: hidden; +} + +.widgetNoteSelected { + -moz-box-shadow: 0 0 10px 3px #138CDD; + box-shadow: 0 0 10px 3px #138CDD; + /*-moz-box-shadow: 0 0 20px #3915d6; + box-shadow: 0 0 20px #3915d6;*/ + /*border: 3px solid #3915d6;*/ + /*margin: -3px;*/ +} + + +.singleImg { + display: none; + visibility: hidden; +} + +#ios-safari { + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +#ios-safari-html { + display: block; + overflow: auto; + -webkit-overflow-scrolling: touch; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +#ios-safari-fixed { + position: absolute; + pointer-events: none; + width: initial; +} + +#ios-safari-fixed div { + pointer-events: auto; +} \ No newline at end of file diff --git a/code/page/resources/css/default.css b/code/page/resources/css/default.css new file mode 100644 index 0000000..98d7f74 --- /dev/null +++ b/code/page/resources/css/default.css @@ -0,0 +1,1043 @@ +body { + font-family: 'Source Sans Pro', 'Trebuchet MS', Arial; + font-size: 14px; + color: #2c2c2c; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + -webkit-font-feature-settings: "kern"; + -moz-font-feature-settings: "kern"; + -moz-font-feature-settings: "kern=1"; + font-feature-settings: "kern" 1; + font-kerning: normal; + overflow: hidden; +} + +a { + cursor: pointer; +} + +input[type="radio"], input[type="checkbox"] { + margin: 0px 9px 0px 0px; + vertical-align: bottom; +} + +input { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +input[type=text]::-ms-clear { + width: 0; + height: 0; + display: none; +} + +#outerContainer { + position: absolute; + width:1000px; + height:1500px; + overflow: hidden; + display: flex; +} + +#mobileControlFrameContainer { + position: absolute; + width: 100%; + pointer-events: none; +} + +.splitbar { + display: none; + position: absolute; + top: 0px; + width: 3px; + height: 100%; + cursor: ew-resize; + z-index: 5; + user-select: none; +} + +.splitbar:hover, .splitbar.active { + background: #cccccc; +} + +#lsplitbar { + border-right: 1px solid #cccccc; +} + +#rsplitbar { + border-left: 1px solid #cccccc; +} + +#mainPanel { + background-color: #d8d8d8; + opacity: 0; + flex: 1; +} + +#clippingBounds { + width: 100%; + overflow: hidden; + pointer-events: none; + position: absolute; + z-index: 1; +} + +#clippingBounds div { + pointer-events: auto; +} + +#clippingBoundsScrollContainer { + position: absolute; + pointer-events: none; +} + +#browserOutOfDateNotification { + width: 100%; + height: 289px; + background-color: #e36154; + padding-top: 40px; + color: #FFFFFF; +} + .mobileMode #browserOutOfDateNotification { + padding-top: 15px; + } + +#supportedBrowsersListContainer { + border-radius: 5px; + line-height: 1.64; + background-color: #c3463a; + padding-top: 4px; + width: 255px; + margin: auto; +} + +.browserName { + display: inline-block; + width: 55%; + font-weight: bold; + margin-left: 18px; +} + +.browserSupportedVersion { + display: inline-block; + font-style: italic; +} + +#browserOutOfDateNotificationButtons { + display: flex; + justify-content: flex-end; + margin-top: 28px; +} + .mobileMode #browserOutOfDateNotificationButtons { + margin-top: 8px; + } + +#updateBrowserButton { + display: inline-block; + width: 330px; + height: 35px; + margin-left: auto; + line-height: 35px; + text-decoration: none; + text-align: center; + border-radius: 9px; + border: solid 1px #FFFFFF; + color: #FFFFFF; +} + +#continueToPrototypeButton { + display: inline-block; + text-align: center; + line-height: 37px; + text-decoration: underline; +} + +#topPanel { + z-index: 1; + height: 36px; + background-color: #f2f2f2; + border-bottom: 1px solid #cccccc; + user-select: none; +} + +.leftPanel, .rightPanel, .mobileOnlyPanel { + position: relative; + background-color: #f2f2f2; + overflow: hidden; + width: 0px; + flex-shrink: 0; +} + + +.popup, .leftPanel.popup { + position: absolute; + z-index: 20000; + display: none; + background-color: #f2f2f2; + border: solid 1px #bdbcbc; + position: absolute; + box-shadow: 0 1px 2px 0 rgba(87, 87, 87, 0.5); +} + +.leftPanel.popup .sitemapHeader, .leftPanel.popup #searchDiv { + display: none; +} + +#clipFrameScroll { +} + +.splitterMask { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: hidden; + background-image: url(../images/transparent.gif); + z-index: 10000; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#maximizePanelContainer { + font-size: 4px; + overflow: hidden; + z-index: 1000; + display: none; +} + +#maximizePanel { + background-color: #f2f2f2; + cursor: pointer; +} + +#maximizePanelContainer, #maximizePanelOver, #maximizePanel { + position:absolute; + left: 0px; + top: 0px; + width: 28px; + height: 36px; +} + +#interfaceControlFrameMinimizeContainer { + font-size: 2px; /*for IE*/ + text-align: right; + z-index: 100; + height: 36px; + width: 28px; + border-right: solid 1px #cbcbcb; +} +#interfaceControlFrameMinimizeContainer a { + display: inline-block; + width: 28px; + height: 100%; + font-size: 2px; + text-decoration: none; +} + +#interfaceControlFrame { + height: 100%; + display: flex; + opacity: 0; +} + +#interfaceControlFrameCloseContainer { + display: none; + font-size: 9px; + font-weight: bold; + letter-spacing: 1px; + z-index: 100; + width: 55px; + background-color: #62666b; + text-align: center; +} +#interfaceControlFrameCloseContainer a { + display: inline-block; + width: 55px; + color: #ffffff; + padding: 5px 0px; +} +#inspectControlFrameHeader li { + float: left; + display: block; + width: 42px; + height: 36px; + padding: 4px 5px 4px 5px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +#inspectControlFrameHeader li a { + height: 100%; + width: 32px; + display: block; + text-align: center; + outline: none; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.hashover #inspectControlFrameHeader li a:hover { + border-radius: 3px; + background-color: #e6e6e6; +} + +/*#inspectControlFrameHeader li a.selected, #inspectControlFrameHeader li a.selected:hover { + background-color: inherit; +}*/ + +#inspectControlFrameHeaderContainer { + overflow: visible; +} + +#inspectControlFrameHeader { + position: relative; + list-style: none; + z-index: 50; + letter-spacing: 1px; + display: flex; +} + +#projectControlFrameHeaderContainer { + overflow: visible; +} + +#projectControlFrameHeader { + position: relative; + list-style: none; + font-size: 8px; + z-index: 50; + font-weight: bold; + letter-spacing: 1px; +} + +#projectControlFrameHeader li { + float: left; + display: block; + width: 28px; + height: 28px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +#projectControlFrameHeader li a { + display: block; + height: 100%; + width: 32px; + outline: none; + margin: auto; + text-decoration: none; + color: #ffffff; + white-space: nowrap; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.hashover #projectControlFrameHeader li a:hover { + border-radius: 3px; + background-color: #e6e6e6; +} + +/*#projectControlFrameHeader li a.selected, #projectControlFrameHeader li a.selected:hover { + background-color: inherit; +}*/ + +#handoffControlFrameHeaderContainer { + display: none; +} + +#handoffControlFrameHeader li { + float: left; + display: block; + width: 44px; + height: 36px; + margin: 0px 3.5px 0px 3.5px; + padding: 4px 6px 4px 6px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +#handoffControlFrameHeader li.selected { + padding: 0px; + border-bottom: 2px solid #008dcb; +} + +#handoffControlFrameHeader li a { + float: left; + height: 100%; + width: 32px; + display: block; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.hashover #handoffControlFrameHeader li a:hover { + border-radius: 3px; + background-color: #e6e6e6; +} + +#handoffControlFrameHeader li a.selected { + width: 100%; + /*background-color: inherit;*/ +} + +#publishContainer { + display: none; + margin: 6px 20.5px 5px; + width: 150px; + height: 25px; + border-radius: 10px; + background-color: #008dcb; +} + + +#publishContainer.preview { + display: block; +} + +#overflowBtn { + order: 5; +} + +#overflowMenuButton { + background: url('../images/overflow-icon.svg') no-repeat center center, linear-gradient(transparent,transparent); +} +#overflowMenuButton.selected { + background: url('../images/overflow_icon_off.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +.overflowOptionCheckbox, #projectOptionsHotspotsCheckbox { + position: relative; + border: solid 1px #8c8c8c; + display: inline-block; +} + .overflowOptionCheckbox { + width: 10px; + height: 10px; + margin-right: 14px; + top: 1px; + } + #projectOptionsHotspotsCheckbox { + width: 16px; + height: 16px; + margin-right: 25px; + margin-left: 21px; + top: 2.5px; + } + +.overflowOptionCheckbox.selected, #projectOptionsHotspotsCheckbox.selected { + background: url('../images/overflow_checkmark.svg') no-repeat center center, linear-gradient(transparent,transparent); + background-color: #20bba6; + border: solid 1px #20bba6; + background-size: contain; +} + +#overflowMenuContainer { + display: none; + flex-direction: column; + top: 36px; + right: 80px; + width: 171px; + border-radius: 2px; +} + +#overflowMenuContainer.popup { + display: flex; +} + +.showOption { + font-size: 14px; + padding: 9px 0px 0px 15px; + color: #3B3B3B; +} + +.showOption:hover { + cursor: pointer; +} + +#signInButton { + padding: 0px 20px 0px 20px; + width: 50.8px; + height: 16px; + font-size: 12px; + text-align: center; + line-height: 22px; +} + +#accountLoginContainer { + display: none; + right: 220px; +} + +.accountOption { + font-size: 12px; + padding: 7px; + line-height: 1.83; +} + +/* temporary sign in css (borrowed from feedback9.css*/ +.feedbackGreenBtn_Player { + background-color: #74BC68; + border-radius: 2.5px; + box-shadow: inset 0 -1px 0 0 rgba(137, 137, 137, 0.58); + color: #FFFFFF; + cursor: pointer; + font-size: 12px; + height: 25px; + line-height: 25px; +} + + .feedbackGreenBtn_Player:hover { + background-color: #58964E; + } +/* Axure Commenter Login w/out pin */ +.axureLoginBubble_Player { + background-color: #F2F2F2 !important; +} + +.axureLoginBubbleContainer_Player { + padding: 5px; +} + + .axureLoginBubbleContainer_Player input { + width: 100%; + padding: 0 5px; + margin-bottom: 10px; + height: 30px; + font-size: 14px; + } + + .axureLoginBubbleContainer_Player span { + margin: 0; + } + +div.axClearMsgBubble_Player { + padding: 10px; + max-width: 300px; + text-align: center; +} + + div.axClearMsgBubble_Player span { + margin: 2px; + white-space: pre-wrap; + white-space: -moz-pre-wrap; /* Firefox */ + white-space: -pre-wrap; /* Opera <7 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* IE */ + } + + +#publishButton { + display: block; + width: 95px; + margin: auto; + font-size: 14px; + line-height: 26px; + color: #ffffff; +} + +.maximizeCaret { + width: 5px; + height: 5px; + object-fit: contain; + border-right: solid 1.5px #525252; + border-top: solid 1.5px #525252; + margin: auto; +} +.caret { + width: 9px; + height: 7px; + background: url('../images/caret_down.svg') no-repeat center center, linear-gradient(transparent,transparent); +} +.selected .caret { + background: url('../images/caret_down_off.svg') no-repeat center center, linear-gradient(transparent,transparent); +} +.upCaret { + transform: rotate(-45deg); +} +.leftCaret { + transform: rotate(-135deg); +} +.downCaret { + transform: rotate(-225deg); +} +.rightCaret { + transform: rotate(-315deg); +} + +#pageSelectDropdown, #adaptiveViewsDropdown { + display: inline-block; + margin-left: 8px; +} + +.minimizeIcon, .maximizeIcon { + transition: .25s linear; + position: absolute; + height: 36px; + width: 28px; +} + +#minimizeX { + background: url('../images/close_x_minimize.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +#minimizeArrow { + opacity: 0; + transform: rotate(270deg); + background: url('../images/caret_down.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +#maximizeButton { + transform: rotate(-270deg); + background: url('../images/caret_down.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +.collapseHovered #minimizeX { + transition: .25s linear; + opacity: 0; + transform: rotate(-90deg); +} + +.collapseHovered #minimizeArrow { + transition: .25s linear; + opacity: 1; + transform: rotate(90deg); +} + +#maximizeButton.rotated { + transition: .20s linear; + transform: rotate(-90deg); +} + +.expandHovered #minimizeX { + opacity: 0; +} + +.expandHovered #minimizeArrow { + opacity: 1; +} + +#separatorContainer { + display: none; + line-height: 24px; + height: 36px; +} + +#separatorContainer.hasLeft { + display: block; +} + +.separator { + display: block; + width: 0px; + height: 100%; + border: solid 0.5px #c4c4c4; +} + +#interfacePageNameContainer { + float: left; + cursor: pointer; +} + +#sitemapControlFrameContainer{ + display: flex; + margin: 4px 6px; +} + +.hashover #sitemapControlFrameContainer:hover { + border-radius: 3px; + background-color: #e6e6e6; +} + +/*.hashover #sitemapControlFrameContainer.selected:hover { + background-color: inherit; +}*/ + +#interfaceOverflowMenuContainer { + position: absolute; + display: none; + width: 220px; + background-color: #f2f2f2; + right: 240px; +} + +.pageNameHeader { + float: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 175px; + margin-left: 10px; + margin-right: 6px; +} + +#interfaceAdaptiveViewsContainer { + display: none; + margin: 4px 0px 4px 30.5px; + padding: 0px 6px; + cursor: pointer; +} +#interfaceAdaptiveViewsContainer:hover { + border-radius: 3px; + background-color: #e6e6e6; +} + +.adaptiveViewHeader { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#interfaceAdaptiveViewsButton { + float: left; + max-width: 145px; +} + +#interfaceAdaptiveViewsIconButton { + display: none; + float:left; + width: 16px; + margin-right: 6px; + background: url('../images/views-icon.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +#interfaceScaleContainer { + line-height: 36px; + padding: 0px 10px; + cursor: pointer; +} + +.scaleHeader { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#overflowMadeWith { + line-height: 36px; + margin: 0px 12px; +} + +#axureLogo { + display: inline-block; + width: 56px; + height: 36px; + padding-top: 1px; + background: url('../images/axure9_logo.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +#overflowMenuContainer > #overflowMadeWith { + line-height: 24px; + border-top: 1px solid #ccc; + margin-top: 7px; + padding-top: 7px; +} + +#interfaceControlFrameContainer { + overflow: hidden; + height: 36px; + display: flex; +} + +#interfaceControlFrameLeft { + flex: 1; + display: flex; + font-size: 14px; + line-height: 29px; + color: #3b3b3b; +} + +#interfaceControlFrameRight { + flex: 1; + display: flex; + justify-content: flex-end; +} + +#interfaceControlFrameLogoContainer { + overflow: hidden; + margin-left: auto; + margin-right: auto; + height: 100%; + display: flex; +} + +#interfaceControlFrameLogoCaptionContainer { + text-align: center; + margin: 5px 10px 0px 10px; + font-size: 14px; + color: #4a4a4a; + font-weight: bold; + line-height: 30px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +#previewNotice { + font-size: 14px; + line-height: 36px; + display: none; +} + +#logoImage { + margin: 12px; + max-width: 150px; + max-height: 12px; +} + +.emptyStateContainer { + text-align: center; + padding: 0px 10px; + margin-top: 32px +} + +.emptyStateTitle { + margin: 0px 0px 9px 0px; + font-weight: bold; +} + +.emptyStateContent { + line-height: 22px; +} + +.dottedDivider { + height: 2px; + margin: 15px 0px 15px 0px; + background: url('../images/divider.png') no-repeat center center; + background: url('../images/divider.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + +.mobileMode .dottedDivider { + display: none; +} + +.nondottedDivider { + height: 2px; + margin: 9px 0px 9px 0px; +} + +.lineDivider { + height: 2px; + margin: 10px 12px 20px 12px; + border-bottom: solid 1px #e7e7e7; +} + +.pluginNameHeader { + font-size: 14px; + font-weight: bold; + color: #6d6d6d; +} + +.mobileMode .pluginNameHeader { + margin: 14px 12px 13px 12px; + font-size: 18px; + color: #6d6d6d; +} + +#projectOptionsHost { + display: flex; + flex-direction: column; +} + +#projectOptionsScrollContainer { + overflow: auto; + width: 100%; + -webkit-overflow-scrolling: touch; + flex: 1; +} + +div.mobileSubHeader { + font-size: 18px; + font-weight: bold; + color: #4a4a4a; + margin: 0px 12px 11px 15px; +} + +div.mobileText, span.mobileText { + font-size: 16px; + color: #4a4a4a; +} + +.nativeMenuText { + height: 20px; + font-size: 14px; + text-align: center; + color: #ffffff; + margin-top: 6px; + margin-bottom: 13px; + text-decoration: none; +} + +#refreshText, #exitText { + margin-top: 6px; +} + +#returnText { + margin-top: 7px; +} + +#refreshIcon { + height: 20px; + object-fit: contain; + background: url('../images/refresh.svg') no-repeat center center, linear-gradient(transparent,transparent); + margin-top: 14px; +} + +#exitIcon { + height: 19px; + object-fit: contain; + background: url('../images/exit.svg') no-repeat center center, linear-gradient(transparent,transparent); + margin-top: 14px; +} + +#returnIcon { + height: 46px; + object-fit: contain; + background: url('../images/return.svg') no-repeat center center, linear-gradient(transparent,transparent); +} + + +.nativePrototypeButton { + width:50%; + margin-left:auto; + margin-right:auto; +} + +.circleBackground { + border-radius: 50%; + behavior: url(PIE.htc); + margin: auto; + box-shadow: 3px 3px 3px 0 rgba(55, 55, 55, 0.5); +} + +#returnBackground { + width: 46px; + height: 46px; + background-color: #ffffff; +} + +#closeBackground { + width: 61px; + height: 61px; + background-color: #f2f2f2; +} + +.closeIconSlash { + width: 35px; + height: 5px; + background-color: #9b9b9b; + position: relative; + margin: auto; +} +#forwardSlash{ + top: 28px; + transform: rotate(-45deg); +} +#backwardSlash{ + transform: rotate(90deg); +} + +.mobilePrototypeControlFrame { + position: absolute; + display: none; + width: 100%; + min-width: 310px; + bottom: 0px; + z-index: 2; + pointer-events: auto; +} + +#nativeMenuBlueBackground { + height: 72px; + width: 100%; + background-color: #008fe0; +} + +#mHideSidebar { + position: absolute; + width: 10000px; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + top: 0px; + z-index: 2; + display: none; + left: -60px; +} + +/*@media (max-width: 419px) {*/ + .mobileMode #topPanel { + display: none; + } + + .mobileMode #mainPanel { + -webkit-overflow-scrolling: touch; + } + + .mobileMode .leftPanel, .mobileMode .rightPanel, .mobileMode .mobileOnlyPanel { + box-shadow: 0 5.5px 5px 0 rgba(0, 0, 0, 0.24), 0 9px 18px 0 rgba(0, 0, 0, 0.18); + top: 45px; + left: 100px; + } + + .mobileMode .leftPanel, .mobileMode .rightPanel, .mobileMode .mobileOnlyPanel { + float: left; + } + + .mobileMode .rightPanel { + margin-left: 13px; + } + + .mobileMode #maximizePanelContainer { + display: none; + } +/*}*/ + +@media (max-width: 850px) { + #overflowMenuContainer { + right: 0px; + } + + #overflowMadeWith, #publishContainer.preview, #separatorContainer, #separatorContainer.hasLeft { + display: none; + } + + #interfaceControlFrameLogoCaptionContainer { + display: none; + } + + #interfaceControlFrameContainer { + justify-content: flex-end; + } + + #interfaceAdaptiveViewsButton { + display: none; + } + + #interfaceAdaptiveViewsIconButton { + display: block; + } + + #interfaceAdaptiveViewsContainer { + padding-left: 8px; + } +} + +@media (max-width: 700px) { + #interfacePageNameContainer { + display: none; + } +} + diff --git a/code/page/resources/css/images/images.html b/code/page/resources/css/images/images.html new file mode 100644 index 0000000..335d9c9 --- /dev/null +++ b/code/page/resources/css/images/images.html @@ -0,0 +1,25 @@ + + + + + + +

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

      + + \ No newline at end of file diff --git a/code/page/resources/css/images/newwindow.gif b/code/page/resources/css/images/newwindow.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b14cb0a0a06418c1c1d826edf1845036a7bbcbc GIT binary patch literal 112 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 D1lIl7 literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/touch.svg b/code/page/resources/css/images/touch.svg new file mode 100644 index 0000000..9903c7f --- /dev/null +++ b/code/page/resources/css/images/touch.svg @@ -0,0 +1,32 @@ + + + + touch_update + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/page/resources/css/images/ui-bg_flat_0_aaaaaa_40x100.png b/code/page/resources/css/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/code/page/resources/css/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/ui-bg_glass_65_ffffff_1x400.png b/code/page/resources/css/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/ui-bg_glass_75_dadada_1x400.png b/code/page/resources/css/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uPMaW978O6-<~?i$)F&>d~nX+ z>vO)oJQ&&FVaKefeOt$qOR>f~^ebnN_=~%qdHEaS{Ou}E*`%9 zKPdOkfrN+ZlHSt7(uY{3{#;wiJb&Ugx1>W4qtrSDm(4hFaaY-$3p3x|sIU3`%J?Qj YcLn#R=pC)AfTl5cy85}Sb4q9e0MP_2(*OVf literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/ui-icons_222222_256x240.png b/code/page/resources/css/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..b273ff111d219c9b9a8b96d57683d0075fb7871a GIT binary patch literal 4369 zcmd^?`8O2)_s3^phOrG}UnfiUEn8(9QW1?MNkxXVDEpFin2{xWrLx5kBC;k~GmPmYTG^FX}c% zlGE{DS1Q;~I7-6ze&TN@+F-xsI6sd%SwK#*O5K|pDRZqEy< zJg0Nd8F@!OxqElm`~U#piM22@u@8B<moyKE%ct`B(jysxK+1m?G)UyIFs1t0}L zemGR&?jGaM1YQblj?v&@0iXS#fi-VbR9zLEnHLP?xQ|=%Ihrc7^yPWR!tW$yH!zrw z#I2}_!JnT^(qk)VgJr`NGdPtT^dmQIZc%=6nTAyJDXk+^3}wUOilJuwq>s=T_!9V) zr1)DT6VQ2~rgd@!Jlrte3}}m~j}juCS`J4(d-5+e-3@EzzTJNCE2z)w(kJ90z*QE) zBtnV@4mM>jTrZZ*$01SnGov0&=A-JrX5Ge%Pce1Vj}=5YQqBD^W@n4KmFxxpFK`uH zP;(xKV+6VJ2|g+?_Lct7`uElL<&jzGS8Gfva2+=8A@#V+xsAj9|Dkg)vL5yhX@~B= zN2KZSAUD%QH`x>H+@Ou(D1~Pyv#0nc&$!1kI?IO01yw3jD0@80qvc?T*Nr8?-%rC8 z@5$|WY?Hqp`ixmEkzeJTz_`_wsSRi1%Zivd`#+T{Aib6-rf$}M8sz6v zb6ERbr-SniO2wbOv!M4)nb}6UVzoVZEh5kQWh_5x4rYy3c!871NeaM(_p=4(kbS6U#x<*k8Wg^KHs2ttCz<+pBxQ$Z zQMv;kVm5_fF_vH`Mzrq$Y&6u?j6~ftIV0Yg)Nw7JysIN_ z-_n*K_v1c&D}-1{NbBwS2h#m1y0a5RiEcYil+58$8IDh49bPnzE7R8In6P%V{2IZU z7#clr=V4yyrRe@oXNqbqo^^LvlLE?%8XaI&N(Np90-psU}7kqmbWk zZ;YBwJNnNs$~d!mx9oMGyT( znaBoj0d}gpQ^aRr?6nW)$4god*`@Uh2e+YpS@0(Mw{|z|6ko3NbTvDiCu3YO+)egL z>uW(^ahKFj>iJ-JF!^KhKQyPTznJa;xyHYwxJgr16&Wid_9)-%*mEwo{B_|M9t@S1 zf@T@q?b2Qgl!~_(Roe;fdK)y|XG0;ls;ZbT)w-aOVttk#daQcY7$cpY496H*`m@+L zeP#$&yRbBjFWv}B)|5-1v=(66M_;V1SWv6MHnO}}1=vby&9l+gaP?|pXwp0AFDe#L z&MRJ^*qX6wgxhA_`*o=LGZ>G_NTX%AKHPz4bO^R72ZYK}ale3lffDgM8H!Wrw{B7A z{?c_|dh2J*y8b04c37OmqUw;#;G<* z@nz@dV`;7&^$)e!B}cd5tl0{g(Q>5_7H^@bEJi7;fQ4B$NGZerH#Ae1#8WDTH`iB&) zC6Et3BYY#mcJxh&)b2C^{aLq~psFN)Q1SucCaBaBUr%5PYX{~-q{KGEh)*;n;?75k z=hq%i^I}rd;z-#YyI`8-OfMpWz5kgJE3I!3ean6=UZi!BxG7i(YBk? z02HM7wS0)Wni{dWbQMRtd-A)_Az!t>F;IwWf~!*)-Az4}yryNkz&9)w>ElA80Oc`6 zHo#9H!Y3*Qx9n@Jn)!w6G^hb;e_n8zpIyXCN`JFkPc)^Q?2MsLNFhMgrcZI-<#1ne zjH;KFf?4eAT9mQZ}ZfHLGA#d%s;SZK4p0FwZT2S^{ zQ2BG1xJsbK6?yrHTjJi|5C0u=!|r!?*4FL%y%3q#(d+e>b_2I9!*iI!30}42Ia0bq zUf`Z?LGSEvtz8s``Tg5o_CP(FbR0X$FlE0yCnB7suDPmI2=yOg^*2#cY9o`X z;NY-3VBHZjnVcGS){GZ98{e+lq~O$u6pEcgd0CrnIsWffN1MbCZDH<7c^hv+Z0Ucf0{w zSzi^qKuUHD9Dgp0EAGg@@$zr32dQx>N=ws`MESEsmzgT2&L;?MSTo&ky&!-JR3g~1 zPGTt515X)wr+Bx(G9lWd;@Y3^Vl}50Wb&6-Tiy;HPS0drF`rC}qYq22K4)G#AoD0X zYw$E+Bz@Zr^50MAwu@$?%f9$r4WHH?*2|67&FXFhXBrVFGmg)6?h3^-1?t;UzH0*I zNVf9wQLNLnG2@q>6CGm>&y|lC`iCFfYd}9i%+xkl^5oBJ?<;aneCfcHqJh7Yl5uLS z9Fx-(kMdcNyZejXh22N{mCw_rX1O!cOE&3>e(ZH81PR95wQC37En4O{w;{3q9n1t&;p)D%&Z%Nw$gSPa!nz8Slh7=ko2am)XARwOWw zpsz0~K!s{(dM$NB=(A=kkp>T(*yU6<_dwIx>cH4+LWl282hXa6-EUq>R3t?G2623< z*RwTN%-fgBmD{fu*ejNn)1@KG?Sg*8z3hYtkQJQjB6 zQ|x>wA=o$=O)+nLmgTXW3_6diA;b4EY{*i*R%6dO2EMg z@6g?M3rpbnfB@hOdUeb96=~I?OIA3@BWAGmTwiQ{x5Cqq<8c10L!P zd@Qk^BseTX%$Q7^s}5n%HB|)gKx}H$d8Sb$bBnq9-AglT2dGR2(+I;_fL|R4p$odJ zllfb0NqI)7=^z~qAm1V{(PkpxXsQ#4*NH9yYZ`Vf@)?#ueGgtCmGGY|9U#v|hRdg- zQ%0#cGIfXCd{Y)JB~qykO;KPvHu|5Ck&(Hn%DF~cct@}j+87xhs2ew;fLm5#2+mb| z8{9e*YI(u|gt|{x1G+U=DA3y)9s2w7@cvQ($ZJIA)x$e~5_3LKFV~ASci8W}jF&VeJoPDUy(BB>ExJpck;%;!`0AAo zAcHgcnT8%OX&UW_n|%{2B|<6Wp2MMGvd5`T2KKv;ltt_~H+w00x6+SlAD`{K4!9zx z*1?EpQ%Lwiik){3n{-+YNrT;fH_niD_Ng9|58@m8RsKFVF!6pk@qxa{BH-&8tsim0 zdAQ(GyC^9ane7_KW*#^vMIoeQdpJqmPp%%px3GIftbwESu#+vPyI*YTuJ6+4`z{s? zpkv~0x4c_PFH`-tqafw5)>4AuQ78SkZ!$8}INLK;Egr;2tS18hEO5=t;QDmZ-qu?I zG+=DN`nR72Xto{{bJp||`k}-2G;5#xg8E~xgz22)^_Z;=K|4@(E&5J)SY2of=olcw z5)@L)_Ntcm!*5nEy0M9v0`S33;pO4TN;>4(Z+19p_0>u#e-vE zXCU(6gAvu~I7Cw(xd%0e59MNLw^U37ZDbsBrj%eDCexw8a3G`nTcXVNL6{B7Hj@i& zbVB{;ApEtHk76q08DJ48dSxd$C(;$K6=FpU<~l9pVoT9arW^Vu{%Bcn4`eIpkOVC| z$)AKYG_`ypM{0@BUb3^9lqi_c?ONH|4UJMJWDowMVjacycX7}9g={O7swOB+{;+?; zjBo!9?+nd)ie#x5IbFW-zBOo0c4q@9wGVt5;pNt`=-~Zgcw#*`m($6ibxtZ`H=e=} zF#GZ~5$%AUn};8U#tRem0J(JTR}d4vR(dgK2ML~lZsPhayJ2h1%sD4FVst| zKF)+@`iNzLRjg4=K8@**0=5cE>%?FDc({I^+g9USk<8$&^qD~@%W0i4b|yMG*p4`N zh}I!ltTRI8Ex$+@V{02Br%xq#O?UlhO{r8WsaZnZCZq0MK9%AXU%MDLT;3=0A9(BV z9VxxxJd7jo$hw3q;3o?yBLmA=azBUrd9>-<_ANs0n3?-Ic*6&ytb@H~?0E(*d>T5n z-HiH2jsDf6uWhID%#n>SzOqrFCPDfUcu5QPd?<(=w6pv1BE#nsxS{n!UnC9qAha1< z;3cpZ9A-e$+Y)%b;w@!!YRA9p%Kf9IHGGg^{+p`mh;q8i7}&e@V3EQaMsItEMS&=X plT@$;k0WcB_jb;cn%_Idz4HO$QU*abf4}+wi?e96N>fbq{{i|W0@(ln literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/ui-icons_2e83ff_256x240.png b/code/page/resources/css/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/ui-icons_454545_256x240.png b/code/page/resources/css/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 zcmd^?`8O2)_s3^p#%>toqJ#RmwV2==ic*rz7lOw=eaq=H~;_ux21)-Jpcgw zdj+hrf&W^f<%Qk9Zpqf#;jH;N^Z%VA?R|9mZ{esQd(2F=?y+!`XZ5CR?ue=UdHIfUDFM*m15I;g=VN2jw zQW9?wOhDI#+P0|`@JQoC3!pu=AzGMtYB>V&?8(2>_B5_p`1Sb1t{^|J%bZYv09RS? zQ*dcs7}$)taJ@vX0E<96P{ur)Eygr{&ALyNoMP%_94m}=qFVT)&CeG1DBBMLUSKP^ zp%%Q3$MEtKll)X*+$)3O_3x`4%cHY0uhy7U;5x^Ir}X1)mv&B%|A)@A$a>f}tP{5X z9-gkti`YyT+hk9)cZW7fAQhjT%$XLLI^&VR=qev36;`WGBOP!^&(?!sK6jSH0Dnz4 zoEMMNu}y&n=rd-GWI?rGBI8!GD*NJ$k&e5-6+~-9F^6tV<=5`FcY~t{iqRcncEU+F zkT~jww!oy(@~b~WGI8!lzjURX&IpJjFGxShOKUunP+rW$I{c|x0qM6!Gxf6n(;$D> z+QYiULqq)Fy4VDk&Mev)NyM@nvF z7O6M*A$C)kBi0HGMT_+xfQ^USTM)>*h_Rx%eSRxA%n|FuC&=F=Pz}E5uCqbcy;7j=%Qh`glqEA-jx0(a<)uKO5Fe|JLD-ndZ-vnW`G=O&^%pa}Ah(2%m?oANs{lJ`?RhrZ8n!`Q97TKw{YAw9 zD)=M{mD(~_jj`LTd%q6Veum)Cnd!7lw}(5h%ubHcg^2O`prn%u9es3C#&%TsnmSD3%3Ik^Yd@6-d%(I7kqT(B@dVX2 zIidXgd>qYT-oTZ=1sGI7^*_E9Q)1F2mooE0R zXopPnh^ci@+wz2ZDjo&Owyxh6t90Gt!u0miLxc!bue^LvHF?)O@Yf!dQUXfW$u8(f_n07^N)-vpIe;TrHv5uKm{h_v`-IN^zwWc>Lk ziGsSr89sDcdOR_wa~DjrqV&Nd*$18(vohPJ3hSzEJPF2d!u}415wrSMtS(zNa7 zbO0G4ajgKNp{`D7DO<(T?wowarQ0dIKLb<}#prQM)ytB73YNTPQgX^xoT zm>;yKSJ*c@QfD8HW`6&+mowOaA|A&~G0fO6&xwj;E3O9^Zu~ZXts~;-d%FyyeXrijORi<_S(dw_5@h&-fTY?#FJo% zQZZ1&ED%$if+n8JVM{s-ZoK@P>p@z4s`AoI6hYxE!Ie_Y)cpjZjc8@~uNMYVfy#J$ z)+sdEX7DK^{}kUAST8U6^p6#c>0Lc>T~9`0}`*2 zizaU)TFS4(u;BenUWZr?s{D)Z)rc9L5&gUvz3iSQaF#J)D)Ts{YgagdDcI1S`dtes zPqb4|h-RIkjhnpmn(Q2Je6Di5C?MkCUL)!WoKn|P#al41v#-Q8`K1$Gh64UhPQj|T zaZb%tJ}O{A?Cvl26!jeKS3OUkp5@8RDBYwh`Loxb5W<^m*R37+v}#*m-G{{ocF-#r z7!k3ZS^4Qu9sNRNZ3`laW2TqV{rsR#~gtVp6C zL0?}~gbLTv^jqtPQD@Cpq6{B6v&*Y)?tx})z=qQNB4Z_59 zpI2L)xQ`!|J8wWgs82jSw_8(;#}y7~Y^&hY9P1G)@`CGtIi*tZ%-%&;$PuG(!M%)E zQ?T#imBH8dCZxUBX^RWPwIh9LcnL3#$befQDr@UJl{=}o0){qIt52vU9X=3L_gvVW zPqp_YhhpM6XiE7Lvn-G0Wzo>0;g|$_-7|ucz~*w%bW@hr6M?~v9dT}L=>UotTj13& z?Uvt0_uOvzMq4iG6)gZqeU;W=P@EVod;}Vr7P*@=C19v;iz$4N+c5ewauTtKK5e;yIx(FQUec0 z`G)VlTUY|m2L=KusMRgMlapu#wt8MohK3=y`!J`tD6nYd%?xIZO`Q)skL)R%3Vf(P z__5Sx3h%fKF=sNdZo2p(w=_|}1M%ri7fO?8))sU1ySG;M4p4;zrr}4l0lzvA!WQ&a zrwX>%lJkv`Gr_u=K>kHOg6(AB(R3FOryElY)-vi|fRsBS<)$1;TC_?BnyScjY6>_ZD=T|bjcbjz@D6V+yfHd4SU+J*2Dh%n;$5ou zHh6R=)$>IH@%5js2KH#JkfFCVI}P>~U;|}>kk|06tA}^~B;|gJ$UvSF-l4GX43DAR z&M2mp8OgiTaK4li0|Q2qmGNYsm+Qq^JM8yfCP>5!31rjh4Mnq~+5X8+_$scfP1Fp!c zcQO*#6cfJ?ZRxn_$Se_|}Xo1oIF7s(7CllypCW@W8-y5%Bel_K*0G zd~8UWeYCWz>~^hF3ond|tQcClJ(8^9FW&&?U)a4O-pE;Y*u|FHGax>F*Kg_beOF5c z&?#xRN5Q?ckEwCnNr-${XC=w-te5%QH(6O~yxke=R!_ns))PU07Pu)CY`<>$+XicZ zCI=g^;q7NZnw=-vf;HoWLD+}`&Bph>kiqyX5jxjI1A41d$R3nahq@CHULV#9ItIwJ z0)^JGy{hB;@SD|}Zel8~2z;UjN96MR@dt;EV`9RP4X&zn8ib=n*107cICSp7z6srZ~4Qg|Vp$OB0By{IxAPaD7HGFw_HTza~wWN1A6 z3`7BZFse2a4{y#V^&;nRVcZOz*2>A?jm$%?)KawLR0cEz24qxxOOo9_2)9MrWpSg7 zPiPz+M7(zPRZ3$#11ti?uI!}bM!Dg%L#+uR+^2L2RX+QlMpL zg_DrR=GIT7C~b+^OZK)?l7*9c-78zWVbLo1oS}bItdscuF80}guwA8c^(47DfaBjV z^V@&JJHxYHqS+e7&X;ezZwsE2+t~n0?*m^(db@WnI{LgAnOqOa<8pRvo0E>*O&~J_ z&A)t2LOG)5=3$3n2_gi2Kpvgv)#LCUh2Y~ z!A&(~-8reT$sJk0=L;m~ES3k}k% zkF%gzzT(+nRU0IeUvuW8pq=8uzr&7HW>K5ZiD*8qL17AI^ zGqo>*mvIChU6+&t{A3|!W?~pi9_O$>k2d|#(Z721wcT{S1)_UFZ+}QS^KZ*u?5Y~bz z^cLI;2{$C_ZwWqM@sYMYwG+^N<^Ivq8ZOwV;7xT+WCh)I9PHC}ut;VNr?w z<@?HsG!Qg3zaV+-xQ3ldtad!U<6iGz_enGH*2akP_r)o1D&8p^5M)_c8IIj6Wy*7HJo&CBLuo~nj>(63pZzO(Vv^ZuB3 zMYigjkwA;FEy|G}1jpiMj6|NTm7Uyiw=@FDE*nX<>jR!W@9XIyf%$Fd*J5*D0Z0Lm z9}ZQxyT|x5ftNy?V>EbJz-K>bV9gs9RaXUP<^=;e?&Fqxj;6{ieR-a-@HycA1KMKhql8GOmcxwZ?_-(3hMK^^a*(gaFvBH ziIC!fgH4$W*NbKIaY&T?%&13``KbD@S-0`xQ%v3TV+B!;RC7O!+1a9QCA$H@3tR;k z)SSoR7(s4)f{zM}eWgFN{(ZH5d1O}l)f$ruT!)Q&NImXyZsTzOf9TwctcSfr+M)aJ z5otO+$jvm-P4)ykH)x|cO5xeb>?!`qGw$(>&axqLL6yoB${vsMXgL_-bz@2J_tS92 zdvZG-+vKl@K4Vr(EL{WQt@Z+Ea-hxX0}nTSZxnpi^#Kn8Ox8FgIS|hc}KJQ4tm*HO16ui{(O9} z1YN)GjiQt6fGq`Cj+^`zUf?8hk^(T{{cOQGWFP98am}is28A!5%{R#ENv8fCN!j69 zlMEK(2z?|BY=Je$XD9mB-Kkem*(d-j^9j$2#6r$Dz?s)-TCDCGCs z8>6Pvj{Y+YIeFA@qY22V$)awy@q!9A4rgk5b9TcC;s9Ig^G|6nDP+5=Fzg&?(L=vc zCbGd>fSu~@6!94td+o#d@sid!EIX$rx7*cawe6 z`dScJ+$HssdOjE)O#Ybs56vm-FQ$7yuJJD^Zqk%hMaIgAJ<2yb_MFQte_i;62ScT$ zpjifYyR_E=rQ+>H)pmlr-Udzg*-!|ssw(D7wJvC+Sf8bb9;;q8#z?0p!!bsd{wy|5 zpBaMHE-Ve>i#LLjHRaMLtp%9&(HCng7Sw96jVv!#0k%?F^K7&=T)mnYn)D9(i;4x5 z^NJTJwq~pv;kH@#ejTd*48~(J(r6j34|m`h9fEDj0im)~+%I5XphWymhT;_Zty|Q& zzjPg#-ufAHZ1M*Gccw?Kf|8Pnhtb0`!{N`Bqsa37J+>wC$!e z00k+2Egzz;rbcWoUB%Jvp8W1}$XD%e3>4y;;OZ1ccT-O#uW6Ys@C}Pa`nZrNKzR(2 z4e%3)@QI4SE&E!lW`5y14QhbepBG%_XBV-O(%5tj)@9#|;sC-MNev!zGDHk}JdpGC`iJF#8=8-P$Xoku_=Dw%Cv3{U7L>gf zRQ?<$t`cZ*MP5GQmbmx#!+*!zu>0MewRO9GFGS{b^m_fJ-N0?j@EqoFf>$khj+E|@ z7r3We&^tR^YZrxKe*d22agXqCO0l44&kqCv{u)T|(lv`~PK@DvE z{QI_TlCH5z*gR!>LO)k67{^R+vWx24U2^2ODXpwT;6y+6+$5m)_*w4WY&#do9dCeE z)>p+Ykdhq($DhmMiaYXey!@N%L26uz($aJ!QT{B^Wu}U$^9e#5)=c+XF9@Ill?ZmM zlNgHiz*9!vDc&uxOo;ZVxb`Q!Sk0*gnfxWzmbZh4(=%CD%qP?0=);n$&zaW_$UKV9 z8axdcN#AyZ{P)wj?V{P}vM)YY!>6@}^>U+iv$`9>nMTCPjN>z%yF&3yf%>+T@0vh4 zlC8Xa6zeo?%=o3}M8{aebLHcO{^1Ar8qiM=Gquf?Jo)q5`-+?sUpg?QXyEUpWSm+n z$K-UyqkIwHLquru~o(OF)hhz$Y*|X>ZIbswnxRvr~ z2=rdOGVuD|xRlpAZE<0!X1F(%Anpl^@V^D3vbM}qxe|NI;TTiZy7(IM;R69RkA>a& z6gwYE2sREzQ_LHmWqB+ogMk(fMaSFeoDq-!HkFB_nXt5+2ncFuk9BQL1I&oB1zZi) zYW{6_&-Ip1l*OVRA##1ILQS;5R{-K^0wGTiJbVSi@LA^$D$;@J>^G{6@&+%4{b3(s zC~LEHiTv(0b#zxt?YJ0r_~pUZM~mQ(??(n#>&tD%+@nq=Abj5*8R!~Ul1`G~=qFJ4 zfl|m8ZDCYgtr`4LcOpgiJYX9qRY5;DcWti~PmS$VB$E-Zt^f4)vLDOe_3XTq5^ylW zJ9PKm!V-8sAOJXnUfuFNIf0R9tK-pNs2hO04zr620}5B(Ok>yB)Of-3sP59qfQNbm zA4{w!2@cB;GbR(~szVrbO%(w=5S!X`o@o@x++wbN_tMPT0Vc)*I;Fgsbf^*g0 z2Di?HTApwKq3+YwfNsqd3iP%{hyK1iyuVZc@*0tO_3+N0#GFsz>8MjeJ2UJ%L!%hi zGYYAthH`E+ywA*u{(eJ=ia3h*%k?779rk-K<0VZAPkl;TFUbmei|$fqWO8!_zIvqt z$ly$VrlH46nnpX~X5Yk0iBJl;=WuA4>~X4-f&K0yWf42h&0b30t@NYX$7egQ1Fp!a zbui-D6cWCWV&|R1CY@G8(qOmWjWeX3eX7UggZPGimA}soOuQdXe4uZ#2>5zN>qlI0 z9xk}lE=tNpX1m6*nFr2EQ3xs79!^sCldDJYE$m(qYv3q7>}1R7?iZW7>$~*%zKaC| z=$N?ME$>#+%T&MZC`dW1wUl6Z)JgyCn~V%K&i0H|iwE%$>xsZW3tTfZxIUePci@p;cRu|d=ItIwF z1clVHy{hH?@SD|(Zfqi^0DQ1hczHN7xq85h)rzQqLHMX2^IkuK7FB!kI40s$|CY7~ zNX^{_UjN8}L%Med;|+=4RNTMozn8KT;2tb77bUPCmioh+rZBfIiM6f_P34cQ__o1G zWqQp3VL~~pE5?qODf%iiQQ3f42YF@09tQ*$4v_EKUx;t1KCPCBtgqg z@+Tn;O)a0uky_%jm+WjNB?=~VyH>V#L!*=l*@OS6SVyt_UEH&NA=?V2stHPyKkVNy z&jg<#cjros){#ji)dK z%)We0L_478=HZ8-@xnwsKrWs8)x`MB;(Y`Cmu2c-&SH(vN-F(*e`l?c%+l$|y_AJJ zhcDGnwLvN+bu;_sX|1AiePhx@u&%P$hf*xE+O=~D?_(_KGWQ!158YL-y9$*6mmPo;Rp*Dl5lm-mVM2i`h- zM@nxv590_tvMwPD_{l=b$iOm|+|S{D9&P%zeT$GgX6Akl-tfUF>tL@Ld!B&{pN39t zH>3Vhqkr}2Yul+jb7UiouWVGPNsxX7Ueba+9|~dz?d*QM$ng0DZfO0`7fAy?2yMm| zcnRzUhZ&IcwgjH9cuU!w+VStYa{p*)4IgBf|E8)sqMYtB2KH_}SfsFq(c9i(Q6S3U oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn literal 0 HcmV?d00001 diff --git a/code/page/resources/css/images/ui-icons_cd0a0a_256x240.png b/code/page/resources/css/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab019b73ec11a485fa09378f3a0e155194f6a5d GIT binary patch literal 4369 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⋘wLzui*CzrQxHdC>qAqVXWf(Lwuz zg$WZSqIW_R_CV8ol#?Vj2`Z#9S*+KAiLr6pa!LZRdbl%tjoN_V?Z&$~pFW%G?)8KD zc>1IHY(MKjrzxmNBm#{|YL>6Gt+`3?hSaXgYcc7Nc(sJ!4W3r}!1w6z`{UmSf50E` z6<_hEoz055^H_qAIBBdY}P- z>P!o9Xb_G1qX4Up*nGoX>lE^VF(hIoG&k{>_j1g?T61{cJbf_4^3(dfg-q6-?`A>E zymTqVH_{VKCt=Q17bDFise=RZpghB^U-;_S@{%c!X@t3Vy{goFQ)?`ddLSLjhkt&u zB!1*uDT8WHtVlG1tV1YEqM3Ds0;F$f2EL?LFh?i}ffRMXaiI3Cu7E&LME(Cr3J>7# z@#hx}6kvra8#3r_G(>AJ8zOCyB!QztDu)o=)WEWd?8DE>y}H0Vl==O1&ksLVK~w{E zY7lJ9FQ_FGu@HtB_&qm@j@%SEm>Z51tjkGgbSd!dFdf19@ov1@#g0>O#ck&(9#cwm zk$JQG=7V{McQ0yKn%|Cp+y6KisluMtc*GTJd_;AhKOx3G*_;>t?2a;)@TFL?1I1XrEo^V_mVvZdVInrH$yeXT^A)E&1wOL8M{I)cyz zp03dby#CVT#+$({@Hv(VkXE~f?{nb2Wz_jFhnvGiQBd6W&ALK+i`8ce2yt33);S?l z5WBGeBE6?9umqF~0wBQF3z}urXQJ|K%(*#ip?4*yw*b#nFN>NdgxzAty-Q_X0GTaQ z4hDb7rC#;W*pR69>JcwjeNyXnvpubMWp6y^Qngx4Md$$WBy_OrEP&EhNi_G+E|;y> zce;ao`8>yuym;Of5#v=CqDcxEof$2l;n0x%9D0Xp_E1P zTOEySF%7;Ckn`%;nd(e+?+O7^LvjzlKw_wV?=4iq(5`+%1Bc;{_~Qruu)n(c*J6cu z+85}4G69fbk6?}m@J1;9^#l6 zFj6N*25~;E2KS1=;4Xm`Q)2ex8|VeE+f*Ejsqa=3-U0aiE{J-4e+m~HqA=2V(u#;J zh0Ce}En;a6E$rqm+$&=Z`BFue>7&~xB~eaYaAF9+1w1$+$e;pZTSjfbX@xi(K{wu= zjt1R2{acry*`gYg9jYeh|Nk9u1pWrUf6>6i-Dae$W2Cg<@m+pfc{j_(+|W($8mX}N zCc!Uu_+$7(#qbNgjo>^i^;JSLnj0&X;{;jbX{gaZ(-yP~f6Ud*I$~?RvcXJqG)L#n z2p0!Le8=+o@pt*vkCpZvV-Who$=1cl%@N-<0zTa8^O4qRrtf`3uj^smSx-NK2oi7> z2J`aL9CBXPd^+`CZpIGj(}cC>7_ly6V~C@96v|~*6*eqUtcpS7^V7gSZs95r$2BB|so6o5r+P;%^Wao7D80H-23;y;hcK?1i9jBi}`2?mo z?ktZ!olHJC*5Qo4O7pMH4m(vf2hfP!zR0k!U0O!oM9KSPW5Y{AO`d zqsINtV;APHuzf}Co=uX~k>P#5T;K~JJ%s#iOT0~~1Xaw+=30faMphq0UI5|?qd>;2 zfCjr&x>KJb%Ztszti~%Ehjm5wTKLr+wm#D?4vP^;CSjqv+gsBqyVV}qLisX;1>2r8 z&FH>R24OPGT1m+g?7X4-4EqX)S0F47#mC|!41N5}(Z}L$;j33Fq%)ziU>ZIw{my}} zsus?G?Awzj`tzz1XshUGRf4lm;78Y{&_8bHPRSO?IjPgP)X#OI9jp~F;Fd=94r-r}Xrg7ElN(nK#~ zw4W9YHVkLspJBV#_3V{<$?H@*UWI%scVwx(H!H1e%NsG$1$ecpF_rI zGHv1jBF-de(D~Sn#~+hLdKo^Dx3RXxivvBg6c^jlU=Zb`aA3(xA6+hQ758{_)#2s% zaoaZ+3-7Cb!v#g1*}>BTWtbX~VRssl`=nOao>DM|;bc^_#UKC?3I2g}t2j=|W~ThW zuvN17LJ)uAYjJ~GLDOsWp~&uY)7v!5Y;U6vKkXRA!LN*HJ@`!{;CljSdKZ6lC47|~ zdEXn=HE1_I+Tl02$t~m|{%&aZ{@zx6$hksjT9EF3x6fE!!C~BYIB*0oM4&Cvf?)vf znKpRpF>s<9;XEUZ@Q`G)l9jf0{%MUDg8Z`{*x00LoN1*k5WU}YS=lXXEDo)!;$?8& zl^S+=0N+Y}H=z)c3?y+f*@V1>N{d#0LG@+T*ylkv!{Dh3emU+nmecf+{UC(OB&O%D z;s@0qz+HHIcjx;}!}>X=DvX$U8e=ya z(I`-#R=1oX3umKFMcwm{_^Rm21w5s|-pXminwF%maeoqAgv{*_Zd5{nEAQa7XhLZ!_xt|x!J+8Tv*yJ{^^tFui$skW+AveEv z3o?lc$zb0w-B(NW)zV}BZUotBHwgZG+%n!>7Q_)G!rk=eHLN>9D;yV=05wYcA!Y}p z0f?3cv{dXumX|neXxm*Z=WuCaz#f-v_vJ8WXSV4sYp42-KI6A1pe6jg967%s?4%f_ z$@YZq7TWWh0y}FL^$k`3RX;7%;Q7N!v>^csS|fYdUn~q6*-o&3lJ%{^7BEO#y!Wp1 z1iK_t)!;#}4U>U+?_p*kZaTiX0d^NnGtW-95Ldb8x*Nr`fpWOXlrSN46BCo{3B-D* zg)l)_wdc0`%0#zF$>Fx$COB`;2-bVPAO4r38mJHXj92i}91^M%FHMk0RJw3Ji$k(a z)N;qKjsIQ1|A~vp+i4O?7VPu&RE;CbhZ+Q@zq)tQL=R@M<*wTa7Q@`8(~x7y3?{@k zt_x=YhTew63p%vT2KDu&7PYnB+IobWf4&qr#O{G&?3G(c-wVslbXODLFn|`rOyJhiY=|iqVSZ5QX?m!Abnh>B&zf z;)|~6U6CN!M-URJP=8Qp1((VPO^=FEq-f4$<-+dz6k0kYvd;uS=X!^p&vZu<**q#A zOqi3s4^DBGAM6q1b-3ZB-F33x81Ey<=dx7CGonh{|GgTE?XA1(XO8sz4(av>HT}4U zCXar8_D0JCroc?S=6m@+%H6WKLqjc6GT+r(MtWGJk>^HbshHX$kMq)VjmM6>>Bik# znvU`jT&}0T%!b!!9p5i?db+O3^2qk^^Cn8~N~5Uevflh6rPVgKr@Sh=Few)W5;(wJ zhSqv3uXE{ua7n!W9;u(zsGGH3TUNo>$J>0^y;zMd5%%ek%ll6*C#`^da z9BuQvwa&J(!I)_qFf%wRxwu$a{SIUmKbdV25nGhE+E$1VGPXkWrSumEIL%f<8;olt zYm%;j1{php4{laUrU#*Cjy2#g{_MYoo{R?lwm|SJxc22|6NUQSHSK9JM|b2UpQ@bL z@|<@CegXgm|2@U5Ml$0PdX~`=o7WmvI6ZD7xLlU$5NhEx(vHTn!ee+`Z zv*NS-yv5Pv#p03PYX7EhY6^*8IDb_+Nx2c^j-MJ&v!o14rhuPwLR!*OK2lMvB@hlV zO_3>)R-d`BY^<g@BLZ5lX>B3`^;u=@w@kJSb7RntJ!PG};Sw z6IS)0{%}+6vFGn=yQN{4)#rf0wmzlHVRlo421k1C^*+ccv2la7pGh9Qx9DMi8$%57 zSZbZ9h+hKMCPbVhoN$gE)eiGZ8Etj_d~>CuN2V)u-dDjB85$bq<3+xnBbZ>es&4@i zz^)2_tUmsA-;b>VGz-=Ay{T^-m`4ouabpP_?>|UqHB?2 z1Y07xRTUy?E7XSqq^I9jIO94Kim>wyU}LRAP~;$pU6W<7-{&q3S(9w;h?UcngvOwZ zOW_QT3jnu@hL97B6oW^;TL!;?%1GqNc1}S{IRt?9VbaJ}>lU@#oWSkMI%gXn%%<2V z2{F9g&hO0Y@$0y;5ygBR*4M4qHZp8;u=l?+ZZA@h)8_H;3I$INX~T+|MY#Gxt`1=> z_L5~_jw{Hi?>Tv)p3A~DIHVNw697Tt7YgrfBUSSvxa9MaTXXs?QZnBi2nuODiEy_% zf;Ob%lJ6En5dFN3j4&u@h}@Oq`D{?_Wrip*Qw=7yG!bS5UTp~t7$`j}z7|4eYXq+T zYQ0Q_HSE>l0@nkh{6r;Kt0$ppGp_q?0xSyx!ygpthU8KqB` zS26a9fg7*F&4oF-8f{+5Of;!JUfh|`5RCvFCpwYPePT&N%iZ9Vdk!{!m2w4rDm`12 zBY<_{Z|!#2!kNJi-eq;IijoOYg(M6oDS8TZBu#kIA;xXYR3*p21c_ZGy;T2KvO2&4 zkvC7asdRit@~6A86>D463C7S0tPjTJv#}8Iu!VWd65^}kDpnw(0$al6%07C7K?A>nAQ{b;isb0J*cTf zF@)m{zdjgtgE+nyETRwK1rRd4cXIieTS$Yupul1$`Uexdm# z!F2mJoh33Kz>UbvwOl=J%qO!@gCu6M5D*zSl4zz|RhvnQ`*>o8$Tz1@2#URuBw+G_ zG_mFJLyv{~gB$}#9g}3jR-ZQ_*v~E+^yD+DX|)mMWN)#WeG93NJ*Nj?(`M{Je$Na|ME z>%SUe0ltBTliym=k{6^_gH>e?lfMrE*_=r0NmewM^^*#ye{r!2QOLdI_g?`Zmj)b( zDF99oD0?pap^!GofHOdC;^{^6UijJyVf<)zCG+FK^d+{~tkqO~$RA8=&rBH9bGevg za_w==2c13z%*BE(m4PFmjE=z%(*>kJBHb-}={FcpEP-pZ--K)JIk`GkegSm^9tY-F zml7s(uA%@A@!&=Z_QUYbY6jJDJ$i&A1?OsBW+aBc!HkbZF) zwTwRjmaKL#{MRHN6abk7c)wN7b()7w zLFSDXAfw2P6Det&Fnkg$v2+O=WJ}Z~&(Qf_?b!C3IMDjQ5IyLuf}~%jY>MnS$dNda zh?4aSKxK;bGGC)Bfue*B_GsP8RUlL;hC_{J zZ_6Va!`TIT?S*w_m|J!OjSX3gvaol800h$j5-IjWx)t$4c9z1Hv@@NDNsLCdPe#HJ zR(VK}2cW%dqy+p!GZYzb?F)vKM#5dmz0O_qUVTX_<+I3Mkshx0^%I$)epQ{W*XejZ zvlB2LPy(lld+7dhs57OkY420)aDM|mDc}NH_Pp(ZL5>IhjPhN~qh-BA+wy2pT@R#7 z1w?s*!LDY|eRw}IqPh08dlO*tf1BT{NFpH^hg>UM=%S?VEw|UGC-{fDq@EzFbRz1}#=t=P}U?t9dNE zEAi7b0)RQF-w%20<*M;-1WwEs0Ixg~{d;}8)4%L}`{!=O-UOf#P(T0>K)m=r3>r>t zgyGQ;`2M)diB?E30W1xJI`hkjw&C)5z|SANe-`Dg`0O1it>A@>pLZ1Vsh!nzF!*>0 zQ&yCOg<@dAGS0ELvAJNPrQ_C#r zm6q|04 zq1UpMRp-T=96pAeR2re5WBELqP;&?MdWQ5Y2*IdGERRuo`b%Oyg#hadj9|>(=D(f8jsQ>ENYH9W;M(#KYoXkul0~9jP~SwotKf1DMRPnkg`X4_IFkR zEPIwf%a+92+fy*t*0$hAvb+S7UNR<_#(8A+@6^ps8Bm)82 zg@MG*WGu~RU}k~o*|xAQE@WsyD|NF0eKN*9a~=*Apv^D_%_K^4iU>yFfawno{=lmyrn7KJJAxt@Iucf%YcvcdQTRvK zGB@`C=5qh&q~24lDM%vYYwF~JkYSQ;_yF07P%SUC^d zco~5dBqO2eI4zf16X610?zT{be9jZHn!3}Xj_H8%U@)wX{D5$}IM5d=fy02cunX)j z_+!HY8wtD%w;T|^+cPl_ljn+Ump#<3nUG;E)7MHx$&-44zUIBh0r`=ZIw$BVcs7X- z0uY>Uis}dR^Mcc;t@UjvdtY!1-S~k+HX0<`JP=F?$4(;on68UsI-}X(`;1r0;dyfS zv~^!kTk{){tFutHPaaM`=KRSbqRN!5B7&@8VUtEC%DcwpY9reBAPOAl95v3%Ubh#k z1@T)XzotnHRcEIW=}DiqC42?CxE+C2X$n&w)A~xY8ThX*B~uK7X_)RsuwpIjr6_RN zNW(~2O8J1!YvKf%af8EnE@co0 z)95on%>w*JW~iKYW&rd0J@{8&=!s&Zpi8lds2|pCC`ixPPoo?Ha#qKjKSN=eaYTS` z_UPy>Zgkx(CfL#TR8D57X^vv4gx9!{`u1idA0l-ix+I8JIW-I=HRO@EI@@)AKt>5* zG+(K@478}Zs(K~SwsoBl(CM@j)DO626MlJiQJz6?T5(nCv+6T^v;p4!7uL&MB#&bhK%W_7>Ch@vp zx>YJ;*Wz8q$|TuT3QAdnZ{#wKHEsbO52z-(TrsYsdXy0FoRM}G=Nc=g=7ANJ=W?o3 zWKE8g0rb9oYM4+!0Hh3UEe$|~73GrL*{GOtx@0Sas(Ym(<;mMMH3~L~a4Cxpc%ABs zG^F(kUB)jo{OmHCpv{DV_^^Z(BgT!^ke6izJ?kt!gSjS)-wk(|UrF>glApl@KI=gi zmAyU#vIFb_GJ#{emR!GVXDRcTgm%2WCB<#f+`%({H(ycBF?7q5(Fue@GGxk7ampfE zresRY0O`G&Ix1MBbUd2LZ!k&sQDZJn?Ol1S*M)YM3_z=G<-Tb(4(^-Fh4yno&9`wL zm-T{elZf$YS(IsaTWP>n>nwY->ua?^LmMXqTRawMvq;j}T`^QYAlICFP7EKXpaQW0 z^Eg1LMaR5tP|6YR@;MEGv%&c_mGV{IojyX+Yi;O3X1ZrZJlnnSH4MhL=FVH?6Zkmi zYE6`@)dzws*wGGZ-!eonyYm%)Q{3^ObTo&Ut#qCwt6^(9P7^aD4EsfBa~)-5JWT}Q zerfI^k$b{l9EsW4MYXyAS4t@IK7bbvQ7*P2rIM&kIswuzen!U6)}aT45hr~ux2NF<<`X72&shWFR4a2#EP| zh7r%_X``v~zVq%R@*e@bQHi0QOYm~}{<)KOuA)$FCNbLf!aFK{M3yNKUm;)c5>FEg z1myGZwGa@qKC~uV4)#&35y-V zYZN2YhQLG8!GBT=e0JMPK6wlDzKwW99SYrc!hOFY4cXw_RRzg0wp2wBw-X!Z>x>8l z>>jfID}5cxJ)jjS9J%EE6a7y0A6e8O0Of>vt43%tUqw(OwSUPoC z%pjKQxTwivc|tmGt6u6FF9if(a8qhP5C}D48w7<&lW<~CEE@}frr(F4^ULNK4Z{^F z{54(Ca}jjM=~xy2Ethv5^9l~K>Qf!=aH{g&MPXfs&ILzz2G^MletcfF@%u$@0YQ}s z8Y+%o$}e-#cJ1l4bQVnK!i_EDGsJYba&a707CGxXkr?)ov~GjMJ&)j^jibTT4OOkv zA9IX_^j+-Zpxd(t4PqFM6y(jq;Hk<SN?zknD`yaXx+ie<*t8co;Um0vsGpt_rm?&EMG&) z{~r=*(N$O-7v!C;by!J#7DW_wmV2nT8(>k$-_6?`la;?v?aoe2PHv1&>e}X;-m%^6 z6ScBZ6lBsUygoi%SL+Q6*XqqtHkAm}WK7E&e{Wf5q1L$2q(rI(TsDX8DIe`}PtBhR z)qD|3g$twQ(ku^{N}#4ScZOzjsLY*gZcQ>_4e~UNNRmMzF4N||wbB!*m0q7GVnnoK z?61|Tx!?mS)oAQS|Lkf9S|HkO2g@M|!c+<-I~q!2mN+O_r{+R-4}UgOGfQ*aR5-rV zcm1BB1(@q}<&T=FAr(9no5z{IwgGvs*&T1p`V$mZ)k^^Q+thYMM$d zBRQY@s7Sg)eb2xW!fquVAbU(&7c(2#OZC-de@5siZJl%$YgCy@X;_&-_c?0OhW)B) zB@>u8Zn*42E2)RR3FE1!UBOYm4JfsjHoMHrM{cAAux}5Iwl70%rZb;;aK@yEW>ONEB#baAn3qH4dRqQ3W^ar8 zvPb!h$20ShGAl9WHUkShfu)+Ma!s*Ty!=0=uUNH``_d6Y8Y5J_%0A?La*z*UXO%~f{KQYfr*8UgNujXhg1lOh)GDv$SEkh!Xyv$jxOt+ z{hL0GVvsX7^q!gk%q*;I>>Pd2N4U6oc=-zRuv@0bOfy5fa1^`XoQPkqn7D+bGUX~d zs-pl^s^!k!35}XGYtgDryFtzCr-m467^-+I@BK;c8BchsKNQgzV~sOjw+SZ7l_y_; zLPd&|C{^aLauq5aQPq;3s9*YwtNY1xq6O`7%IUuHUHhF?Q>6V4h!)izyW*;L9mV=rCqTMf)9pG04vG`s{tk6OuRgAEGuY4Xu$;UCL9tD= z@#xR{mPvhIvc}m+O{eG5zaKpYlZ7~5uR3V56d3PS=$EiGsnTW2=shet{vOq!vp=@| z^-q{iU}s=EoLo6$9&Y7-hhh6w2m-R~R&8u8*91{XAWrnH!@AkeNuRxqlB&gia3ThN z7h+^Wp#e@2vF@|m=n%VPrR^Dvp)0b~_vq;eF7eb=Y7%UF&ue{|q`&l?~!L=?r zy@}6FL`hauO*c%-c3jU7!YEGCEHBEcZrZLN#%W&GZ9h)u>w8lYpMzpJym83T+~qSI zFL)b=JVhPW4dosjy1eW8L5OP{s-?=oTEJZK28U*@j-H}24%IBJV6{-q2f__0x$~LPID|0{c`^2omSa)# zFdx6Zp7mFdkO}krSSo8g8U-LoNYsHH&MOgPhx%Jq*x#J79uc z-VDq5QHK2T>whv63z_vcH0CJMTea`BWcsn)UN%XIG`@0F4WjSn)=k^>!#K^$y3xFq zoX(fp&HYxnqD5nPDGFn}OG%V7T9d_T_jV9TWM4Fe`PObQS!|syk1sGs^J9s$nUjYG zc9pn-YksL3np)aAx_Y4-`oAuk0|P@NV-r&|56N9k%$`;I&3~YU^Y8gB18_i(H_u-D z`t$C?oqIN)JbF@R`~#C8XC__j5+iVfX(LN(j#h^KGee$lr_LQ3Cme3KGS?K1e+@Go zKrM=aC4`QDafdn9*!{Tg`Y0Q$TdO-guEik}s{Cg#=)6G0e~yxh4*-g(QV$~8l8}-} zY8fP321W?Uq-ceS@%zaA2|kZ65Q@YSsZ6d=s?-{-PH!-p%oeN7?r?I3n4D3lG>dnX8rO3Es# zYU;K$G_|x9+Y*`5a+(fZSC3)Mcj7ijpUW%X{YsUcv2O+yxbyMw|2{Y}7D6T>F$^Gb z8rUxqp}Kxqv%ZvZA(b}f4itFA;dHqzGW>+m>ZD1LQSG>6EF2M}$px&|bV`kjt@U); znbv!KeEs|#I&$p9DS=2LQ>Zi>08xD%!08Moi_OVOg%{jh9$z5rrAN&&SR5u>zep^R z%H#^AO0CiA^ai8JYyk?uzhMlHK%&qXERI-?npW;h=iytu%Low1JSUa&eTf&`064%=({0%CN&S0|G94?P95Q-X>>$$05 z?Czlb)W-rr$LBWisnf9*TW56WnAo`Zgv65C)G@J7xHpmgus9#un%{-drh++M4ZpL(d5f>bfo4}eb7)1~zN(52%LpiRD~0_kEb0~TijyQsQB+hw_`GZ& z_F%JIO3^We^R^QmZ31QlQLdD}=;Y2~taV|e4hOex4eWnKUQ7jD{rXy>{>*URO zWX%Op4i$zK^QJp=V53=g8uGcvG_r^0!oqI(7l?{igJELhs^6mYJxZT7^XpupVMHvc zZC%Z^vItzPn6&V6yj-iM!KlN1lmgFOm71?!H?7>@3AKIL)`TF*Ub$+|Eo}vEM_9^1BxD#^ICuo?a{layNXRg- zmLz`o-Pl{>cBa*drAJ6P38wcOw5GdC2c2w5R5Q!f}~iqZ0i6*h^Pi6k~$fS z+9vMvaroEBPkwjz&M2FE+Ig2zeR;z5R3&Qd3vt*hTCAF;Ho*{EFSP8y*z>G4Sf2cX zwi;edKAyxfHk#qWcq%(0(u4;R2Ors=J+T@c_qk)_j;E(Hf${F>#yg0titBh*kkbpX zI6Q$!QnoZ$oX|3FlKUHejK{Zbd>#8F$ED7_9Dzwg1_w_^VHihhA^%FPUG3vmfCoKD z98Ui@@WBE|dCDna%>5Mc$1g5fnEf;aB|bZ?y{|aq{R*ULn%KJZ{@LXQ<<^aSR{HCj z40pAPmpKKq{H4dVEDR?!iXK4C%*uw7p7d3- z#ph^+Ket`IcMJTsZjBc_0-kuZ#gwgSZIJ6{!kKvzlDmS-WvGp+5pJ*$cT|5Gjl8G& z3hbT!o8_gMl}#~T;{PN|I%erB;GX}H{NVJ&%X-{!8QmTu2Nqlxv5zdU_*?XuSHqk= zvc)_%&$&5&mM`4iLAaVYbgo%N)d6W;&4>HFVX}B-Bnv_+OJ`Tk_~3H%;jJF@o|r^s z4aFj*hWvw+rL#9riPwtcFb6A3XYVzMk3eqwLGOu4RMxZ`jn(?CVr5s)c-d?VBFWz7 zl%@MfQ+rOwg;bW#KC8+n7gAX|``lGAxsb}z*#!`sA;ty*6Us6w0mcfUbD%JU5N-lG zl|&Ij2eFJPe=|sHvJ8wd#&|CPGK4cqpmUquD+m)hBGFQ4Es?zG157B(s5Sr*&M1S< zt+E(nj4}I6-V+E`QlutfLRp49i_0NcMUisCgtFG`62dz`g0(49L6}h1GUI%0;WF!N z{4@Gw|3_^9`}>zazPvvEzWwy&zr7LprJw(*{CM8o|F0+K711ZTzfmC{i@g0Mn_2`xK+zkPX}UvD!odBypP zUm=w>O?DALgb8Ja$%Ryw&Mp9mFrlo*x!=A#O)jMRs@H42I!kAd8F`QOVmpAYgIm6Q z`{X*P<;y<-C-?C4^AJtR`lr&rQVu5hnDi)#AmQ2PUsL zU-2uXvZl!{0f;c6%rLo-%F@}T01+mXU5&n!QcCI4rIa3un^7P()>wnfl`G-Gg;?4U z8*$5f~|^}sd3{jFFtkZXdowOEg4QMEi6t2V(g5zjiujIF12)ODo;Fu?{FdbZj5bOn8%rBHRwRQ4zF$dQmEAZpJhzfU0XfO%oFl4@P6@->AR#Ln z(7;6XOElFM+Cd-y6F?&90e}Zqp$Cx;1yLa(A)%n4e6^55JQ`&;Qu~0~s=5V~>9c6` z4r)ClaN9JpMMKRdC~XC17e^Nx&~qW$Ez(yofLrAC9y*Mz+rud2vhS6DY{K-SAve&~ zzqV18Z3ImQ71O)nnQGGTV0MwgEq$YTT${Hi6lCP$K21 zd!kt@IfChWtEn$Kphfqz=(~Guo@@^mLR>V?FFS$>Hn>*PM5!aBVN7JCPqBdzVo9qm ztZg0pQxHsgQhK*V3h;9Wvn#D(rKN*5dQMB)2FkycuzZ{DkOH%dqoe)(-Y`*?9L;-n+A1gkB!T{eUfc71Am$bCo0&%bX zBZLr3`f%&#w835)Xoxd5=d?>JU7(XL6;sa=EBh#}_3dphW48U(tk=hOujuIHGlr=p zgH)y~m5t{TD%Yx2$T1@yu8nL1FZc*UZ3Si%M4L%mZw2l#bKd~wslNDQ{mmY+k9s;j zJ84ChwA~dlg6LJjTwe&%J@!l!ZTiNZZ+r5A8B_HhhHrLdmqcHV*~&;VBF5HJWR7z~);5Rg!?pk)sL z0D*u(K*8LAYxy#*P#XXM00000;JHyfB9Vau5Ex8}K>!eh^dJEUOkz+VI9LDzCUejP z22=WI(|+*9O9aL8dZc9ZLYy1!`0rKzBl(2sN;r>%jD%HVODJKYgmX!_cX`8ZI#8Tn zDZNFW#!oIK&n-ITarX4~uz7QqdDhe7r9r^-%;|ITl%}JlwYGlh#ESJ>PT#-YcrUEr z{w?tGSkpGn&)}Mpr0VyCU*2e>y`65BPcf0rbClI#A;aEb;MG`8SV9m6r3R)3g3!cZ z)Ib=RZr@9-#qEdMXnr^Xy@{s5AjPYwREG`#fuI8bAP67?1fT`4Sare@f-opGFf|Z_ zCI+Jh!oW1crbgsi38V(i47|?N2}=mVpwz(BKoFW3j2Z|7(+ry$k!vN88Z`Uim78%k zKH;v3zvf>K@$wFz{*eOUObMY#ERo7+My^n*kXobF=`jGH8J5#yV&DZ)k`+}mn#>lf z&E64Vfe~;L9~H7k(t#FtY-JfT8{AX?jHSloZLb&(B94P{+ zvuyTlvwl#5&O-oi0Yvn=I1ld=_r0_0N7>}c-rBoe*m1MBgj1aLPuGH=c^X@VL%`BA6K?Fh#Kc@@Ys1Nzt-xO`IULRB2!v zFu>J#%es~8Zxx`6g9s%gH|0r}5m!)Gjh&HsBsTRDKUB|*D;n*X=}z2r!VS_*Dk;wJ z_9bQ~y9tB1JEEa;f>v2QQl1!OoeU>Pibcz|1TcbHJ6nnm(P-i!1e%lXRF4RXmTeh8 z1Sd#Jmdbi070M#xn|qg_A<0eZ-h zk)1ir*ad_Tpobh8*^#r15>6au6nKPG0-zq*K)Z4^Wd^%j!gua_p0ssI2KWojl literal 0 HcmV?d00001 diff --git a/code/page/resources/css/previewfonts/SourceSansPro-Semibold.woff2 b/code/page/resources/css/previewfonts/SourceSansPro-Semibold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2526d2e1b602bc40c347df3f78ce757a9b5adc0a GIT binary patch literal 86196 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�sdvaBR-19P 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 HkpTbzO@KSN literal 0 HcmV?d00001 diff --git a/code/page/resources/css/reset.css b/code/page/resources/css/reset.css new file mode 100644 index 0000000..01a4271 --- /dev/null +++ b/code/page/resources/css/reset.css @@ -0,0 +1,24 @@ +html,body,div,span, +applet,object,iframe, +h1,h2,h3,h4,h5,h6,p,blockquote,pre, +a,abbr,acronym,address,big,cite,code, +del,dfn,em,font,img,ins,kbd,q,s,samp, +small,strike,strong,sub,sup,tt,var, +dd,dl,dt,li,ol,ul, +fieldset,form,label,legend, +table,caption,tbody,tfoot,thead,tr,th,td { + margin: 0; + padding: 0; + border: 0; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +ol,ul { + list-style: none; +} +q:before,q:after, +blockquote:before,blockquote:after { + content: ""; +} \ No newline at end of file diff --git a/code/page/resources/expand.html b/code/page/resources/expand.html new file mode 100644 index 0000000..295783b --- /dev/null +++ b/code/page/resources/expand.html @@ -0,0 +1,60 @@ + + + + + + + + + + +

      +
      +
      +
      + + \ No newline at end of file diff --git a/code/page/resources/images/axure9_logo.svg b/code/page/resources/images/axure9_logo.svg new file mode 100644 index 0000000..0aa619c --- /dev/null +++ b/code/page/resources/images/axure9_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/code/page/resources/images/axure_logo.png b/code/page/resources/images/axure_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ed8be89dba00a5491eae85ed95a57bcf7466ecec GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/code/page/resources/images/axure_logo.svg b/code/page/resources/images/axure_logo.svg new file mode 100644 index 0000000..999ccf4 --- /dev/null +++ b/code/page/resources/images/axure_logo.svg @@ -0,0 +1,18 @@ + + + + axure_logo + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/code/page/resources/images/caret_down.svg b/code/page/resources/images/caret_down.svg new file mode 100644 index 0000000..692dab8 --- /dev/null +++ b/code/page/resources/images/caret_down.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/resources/images/caret_down_off.svg b/code/page/resources/images/caret_down_off.svg new file mode 100644 index 0000000..7b640d8 --- /dev/null +++ b/code/page/resources/images/caret_down_off.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/code/page/resources/images/close_x.svg b/code/page/resources/images/close_x.svg new file mode 100644 index 0000000..325ca55 --- /dev/null +++ b/code/page/resources/images/close_x.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/resources/images/close_x_minimize.svg b/code/page/resources/images/close_x_minimize.svg new file mode 100644 index 0000000..24f693b --- /dev/null +++ b/code/page/resources/images/close_x_minimize.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/resources/images/divider.png b/code/page/resources/images/divider.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b738ae3aa3929f75868f4987bde00ab77727f1 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^RzS?e!3HEbC!K!*q*&4&eH|GXHuiJ>Nn{1`RXtrC zLnI`V@9ZpIF3ik)m`#DLk)gc&d#!+4lMG+h41s%+_jDNi<|r2amOEGv)WG2B>gTe~ HDWM4fExR0& literal 0 HcmV?d00001 diff --git a/code/page/resources/images/divider.svg b/code/page/resources/images/divider.svg new file mode 100644 index 0000000..767941e --- /dev/null +++ b/code/page/resources/images/divider.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/code/page/resources/images/exit.svg b/code/page/resources/images/exit.svg new file mode 100644 index 0000000..f6e38c0 --- /dev/null +++ b/code/page/resources/images/exit.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/resources/images/favicon_play.ico b/code/page/resources/images/favicon_play.ico new file mode 100644 index 0000000000000000000000000000000000000000..6f9a87376a3c1e35f96bfcdeb5b4090b7ca4d49b GIT binary patch literal 5430 zcmeHLy-ve05WWHu6HT&^d#4=<@0xcKIcp{qCFaqiTjKu2Sg`Clx6Dw1J7Ua+$qoTkXNXA?udBa zMzaOI%;xmNt?1Y`ye`LH9oM_|%>(%%himVo^IzW|LHI>Q&&x}%eKbFMA6ZO(j8~sG zz2q?Y?_Q63@xrG*m}V^aV4D0w<34AuX+xab1zr2fit{_&=bsTq9>jdeGa0vYZpcR^ zA@MkfWzDO6gR>i^zy0iE&rO9<<|r*nh^>5W3{2pcdfVk~`gQnq+U62iO$>Fvq|DW^ zVy&sG-FGqKyesx@o!uv`cDa8$E>hkhkMC#Yz3qGdd*`dlR>0SUyIiE*OaN$eYq7DDw7Pryjq8om^xNO6hh(#B^)LE?KL+7XEMQhFs%{eB&i7%yd9bZ~! z6F>F+W6H7{5Aw#4@*7aqL>}Kk1NmOpV`BMZOKw$vguXR}$gbYX0&4Xwefs#Zsz3i~ X;6(NJn&@!KPXuUMme{? + + + + + + diff --git a/code/page/resources/images/overflow_checkmark.svg b/code/page/resources/images/overflow_checkmark.svg new file mode 100644 index 0000000..1902c82 --- /dev/null +++ b/code/page/resources/images/overflow_checkmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/resources/images/overflow_icon_off.svg b/code/page/resources/images/overflow_icon_off.svg new file mode 100644 index 0000000..392e0e7 --- /dev/null +++ b/code/page/resources/images/overflow_icon_off.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/code/page/resources/images/refresh.svg b/code/page/resources/images/refresh.svg new file mode 100644 index 0000000..258992e --- /dev/null +++ b/code/page/resources/images/refresh.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/code/page/resources/images/resize.svg b/code/page/resources/images/resize.svg new file mode 100644 index 0000000..3c62509 --- /dev/null +++ b/code/page/resources/images/resize.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/code/page/resources/images/return.svg b/code/page/resources/images/return.svg new file mode 100644 index 0000000..b5bc16d --- /dev/null +++ b/code/page/resources/images/return.svg @@ -0,0 +1,3 @@ + + + diff --git a/code/page/resources/images/transparent.gif b/code/page/resources/images/transparent.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/code/page/resources/images/views-icon.svg b/code/page/resources/images/views-icon.svg new file mode 100644 index 0000000..0f78550 --- /dev/null +++ b/code/page/resources/images/views-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/code/page/resources/reload.html b/code/page/resources/reload.html new file mode 100644 index 0000000..5f99f0b --- /dev/null +++ b/code/page/resources/reload.html @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/code/page/resources/scripts/axure/action.js b/code/page/resources/scripts/axure/action.js new file mode 100644 index 0000000..2481b26 --- /dev/null +++ b/code/page/resources/scripts/axure/action.js @@ -0,0 +1,2085 @@ +$axure.internal(function($ax) { + var _actionHandlers = {}; + var _action = $ax.action = {}; + + var queueTypes = _action.queueTypes = { + none: 0, + move: 1, + setState: 2, + fade: 3, + resize: 4, + rotate: 5 + }; + + var animationQueue = {}; + + // using array as the key doesn't play nice + var nextAnimationId = 1; + var animationsToCount = {}; + var actionToActionGroups = {}; + var getAnimation = function(id, type) { + return animationQueue[id] && animationQueue[id][type] && animationQueue[id][type][0]; + }; + + var _addAnimation = _action.addAnimation = function (id, type, func, suppressFire) { + + var wasEmpty = !getAnimation(id, type); + // Add the func to the queue. Create the queue if necessary. + var idQueue = animationQueue[id]; + if(!idQueue) animationQueue[id] = idQueue = {}; + + var queue = idQueue[type]; + if(!queue) idQueue[type] = queue = []; + + queue[queue.length] = func; + // If it was empty, there isn't a callback waiting to be called on this. You have to fire it manually. + // If this is waiting on something, suppress it, and it will fire when it's ready + if(wasEmpty && !suppressFire) func(); + }; + + var _addAnimations = function (animations) { + if(animations.length == 1) { + _addAnimation(animations[0].id, animations[0].type, animations[0].func); + return; + } + var allReady = true; + var readyCount = 0; + for(var i = 0; i < animations.length; i++) { + var animation = animations[i]; + var thisReady = !getAnimation(animation.id, animation.type); + allReady = allReady && thisReady; + if (thisReady) readyCount++; + else { + var typeToGroups = actionToActionGroups[animation.id]; + if (!typeToGroups) actionToActionGroups[animation.id] = typeToGroups = {}; + + var groups = typeToGroups[animation.type]; + if (!groups) typeToGroups[animation.type] = groups = []; + + groups[groups.length] = animations; + } + } + + for(i = 0; i < animations.length; i++) { + animation = animations[i]; + _addAnimation(animation.id, animation.type, animation.func, true); + } + + if (allReady) { + for (i = 0; i < animations.length; i++) animations[i].func(); + } else { + animations.id = nextAnimationId++; + animationsToCount[animations.id] = readyCount; + } + } + + var _fireAnimationFromQueue = _action.fireAnimationFromQueue = function (id, type) { + // Remove the function that was just fired + if (animationQueue[id] && animationQueue[id][type]) $ax.splice(animationQueue[id][type], 0, 1); + + // Fire the next func if there is one + var func = getAnimation(id, type); + if(func && !_checkFireActionGroup(id, type, func)) func(); + }; + + var _checkFireActionGroup = function(id, type, func) { + var group = actionToActionGroups[id]; + group = group && group[type]; + if (!group || group.length == 0) return false; + + var animations = group[0]; + var found = false; + for (var i = 0; i < animations.length; i++) { + var animation = animations[i]; + if (animation.id == id && animation.type == type) { + found = func == animation.func; + break; + } + } + + // if found then update this action group, otherwise, keep waiting for right action to fire + if(!found) return false; + $ax.splice(group, 0, 1); + var count = animationsToCount[animations.id] + 1; + if(count != animations.length) { + animationsToCount[animations.id] = count; + return true; + } + delete animationsToCount[animations.id]; + + // Funcs is needed because an earlier func can try to cascade right away (when no animation for example) and will kill this func and move on to the + // next one (which may not even exist). If we get all funcs before calling any, then we know they are all the func we want. + var funcs = []; + for(i = 0; i < animations.length; i++) { + animation = animations[i]; + funcs.push(getAnimation(animation.id, animation.type)); + } + for(i = 0; i < funcs.length; i++) { + funcs[i](); + } + + return true; + } + + var _refreshing = []; + _action.refreshStart = function(repeaterId) { _refreshing.push(repeaterId); }; + _action.refreshEnd = function() { _refreshing.pop(); }; + + // TODO: [ben] Consider moving this to repeater.js + var _repeatersToRefresh = _action.repeatersToRefresh = []; + var _ignoreAction = function(repeaterId) { + for(var i = 0; i < _refreshing.length; i++) if(_refreshing[i] == repeaterId) return true; + return false; + }; + + var _addRefresh = function(repeaterId) { + if(_repeatersToRefresh.indexOf(repeaterId) == -1) _repeatersToRefresh.push(repeaterId); + }; + + var _getIdToResizeMoveState = function(eventInfo) { + if(!eventInfo.idToResizeMoveState) eventInfo.idToResizeMoveState = {}; + return eventInfo.idToResizeMoveState; + } + + var _queueResizeMove = function (id, type, eventInfo, actionInfo) { + if (type == queueTypes.resize || type == queueTypes.rotate) $ax.public.fn.convertToSingleImage($jobj(id)); + + var idToResizeMoveState = _getIdToResizeMoveState(eventInfo); + if(!idToResizeMoveState[id]) { + idToResizeMoveState[id] = {}; + idToResizeMoveState[id][queueTypes.move] = { queue: [], used: 0 }; + idToResizeMoveState[id][queueTypes.resize] = { queue: [], used: 0 }; + idToResizeMoveState[id][queueTypes.rotate] = { queue: [], used: 0 }; + } + var state = idToResizeMoveState[id]; + + // If this is not a type being queued (no action of it's type waiting already) then if it is an instant, fire right away. + var myOptions = type == queueTypes.resize ? actionInfo : actionInfo.options; + if(!state[type].queue.length && (!myOptions.easing || myOptions.easing == 'none' || !myOptions.duration)) { + var func = type == queueTypes.resize ? _addResize : type == queueTypes.rotate ? _addRotate : _addMove; + func(id, eventInfo, actionInfo, { easing: 'none', duration: 0, stop: { instant: true } }); + return; + } + + // Check other 2 types to see if either is empty, if so, we can't do anything, so just queue it up + var otherType1 = type == queueTypes.move ? queueTypes.resize : queueTypes.move; + var otherType2 = type == queueTypes.rotate ? queueTypes.resize : queueTypes.rotate; + if (!state[otherType1].queue.length || !state[otherType2].queue.length) { + state[type].queue.push({ eventInfo: eventInfo, actionInfo: actionInfo }); + } else { + var duration = myOptions.duration; + var used1 = state[otherType1].used; + var used2 = state[otherType2].used; + + while(state[otherType1].queue.length && state[otherType2].queue.length && duration != 0) { + var other1 = state[otherType1].queue[0]; + var otherOptions1 = otherType1 == queueTypes.resize ? other1.actionInfo : other1.actionInfo.options; + // If queue up action is a non animation, then don't combo it, just queue it and move on + if(!otherOptions1.easing || otherOptions1.easing == 'none' || !otherOptions1.duration) { + func = otherType1 == queueTypes.resize ? _addResize : otherType1 == queueTypes.rotate ? _addRotate : _addMove; + func(id, eventInfo, actionInfo, { easing: 'none', duration: 0, stop: { instant: true } }); + continue; + } + var other2 = state[otherType2].queue[0]; + var otherOptions2 = otherType2 == queueTypes.resize ? other2.actionInfo : other2.actionInfo.options; + // If queue up action is a non animation, then don't combo it, just queue it and move on + if(!otherOptions2.easing || otherOptions2.easing == 'none' || !otherOptions2.duration) { + func = otherType2 == queueTypes.resize ? _addResize : otherType2 == queueTypes.rotate ? _addRotate : _addMove; + func(id, eventInfo, actionInfo, { easing: 'none', duration: 0, stop: { instant: true } }); + continue; + } + + // Other duration is what is left over. When in queue it may be partly finished already + var otherDuration1 = otherOptions1.duration - used1; + var otherDuration2 = otherOptions2.duration - used2; + + var resizeInfo = type == queueTypes.resize ? actionInfo : otherType1 == queueTypes.resize ? other1.actionInfo : other2.actionInfo; + var rotateInfo = type == queueTypes.rotate ? actionInfo : otherType1 == queueTypes.rotate ? other1.actionInfo : other2.actionInfo; + var moveInfo = type == queueTypes.move ? actionInfo : otherType1 == queueTypes.move ? other1.actionInfo : other2.actionInfo; + var options = { easing: moveInfo.options.easing, duration: Math.min(duration, otherDuration1, otherDuration2) }; + // Start for self is whole duration - duration left, end is start plus duration of combo to be queued, length is duration + var stop = { start: myOptions.duration - duration, len: myOptions.duration }; + stop.end = stop.start + options.duration; + // Start for other is used (will be 0 after 1st round), end is start plus length is duration of combo to be queued, length is other duration + var otherStop1 = { start: used1, end: options.duration + used1, len: otherOptions1.duration }; + var otherStop2 = { start: used2, end: options.duration + used2, len: otherOptions2.duration }; + options.stop = type == queueTypes.resize ? stop : otherType1 == queueTypes.resize ? otherStop1 : otherStop2; + options.moveStop = type == queueTypes.move ? stop : otherType1 == queueTypes.move ? otherStop1 : otherStop2; + options.rotateStop = type == queueTypes.rotate ? stop : otherType1 == queueTypes.rotate ? otherStop1 : otherStop2; + + _addResize(id, eventInfo, resizeInfo, options, moveInfo, rotateInfo); + + // Update duration for this animation + duration -= options.duration; + // For others update used and remove from queue if necessary + if(otherDuration1 == options.duration) { + $ax.splice(state[otherType1].queue, 0, 1); + used1 = 0; + } else used1 += options.duration; + + if(otherDuration2 == options.duration) { + $ax.splice(state[otherType2].queue, 0, 1); + used2 = 0; + } else used2 += options.duration; + } + + // Start queue for new type if necessary + if(duration) { + state[type].queue.push({ eventInfo: eventInfo, actionInfo: actionInfo }); + state[type].used = myOptions.duration - duration; + } + + // Update used for others + state[otherType1].used = used1; + state[otherType2].used = used2; + } + }; + + _action.flushAllResizeMoveActions = function (eventInfo) { + var idToResizeMoveState = _getIdToResizeMoveState(eventInfo); + for(var id in idToResizeMoveState) _flushResizeMoveActions(id, idToResizeMoveState); + }; + + var _flushResizeMoveActions = function(id, idToResizeMoveState) { + var state = idToResizeMoveState[id]; + var move = state[queueTypes.move]; + var moveInfo = move.queue[0]; + var resize = state[queueTypes.resize]; + var resizeInfo = resize.queue[0]; + var rotate = state[queueTypes.rotate]; + var rotateInfo = rotate.queue[0]; + while (moveInfo || resizeInfo || rotateInfo) { + var eventInfo = moveInfo ? moveInfo.eventInfo : resizeInfo ? resizeInfo.eventInfo : rotateInfo.eventInfo; + moveInfo = moveInfo && moveInfo.actionInfo; + resizeInfo = resizeInfo && resizeInfo.actionInfo; + rotateInfo = rotateInfo && rotateInfo.actionInfo; + + // Resize is used by default, then rotate + if(resizeInfo) { + // Check for instant resize + if(!resizeInfo.duration || resizeInfo.easing == 'none') { + _addResize(id, resize.queue[0].eventInfo, resizeInfo, { easing: 'none', duration: 0, stop: { instant: true } }); + _updateResizeMoveUsed(id, queueTypes.resize, 0, idToResizeMoveState); + resizeInfo = resize.queue[0]; + continue; + } + + var duration = resizeInfo.duration - resize.used; + if(moveInfo) duration = Math.min(duration, moveInfo.options.duration - move.used); + if(rotateInfo) duration = Math.min(duration, rotateInfo.options.duration - rotate.used); + + var baseOptions = moveInfo ? moveInfo.options : resizeInfo; + var options = { easing: baseOptions.easing, duration: duration }; + + options.stop = { start: resize.used, end: resize.used + duration, len: resizeInfo.duration }; + if(moveInfo) options.moveStop = { start: move.used, end: move.used + duration, len: moveInfo.options.duration }; + if(rotateInfo) options.rotateStop = { start: rotate.used, end: rotate.used + duration, len: rotateInfo.options.duration }; + + _addResize(id, eventInfo, resizeInfo, options, moveInfo, rotateInfo); + + _updateResizeMoveUsed(id, queueTypes.resize, duration, idToResizeMoveState); + resizeInfo = resize.queue[0]; + if(rotateInfo) { + _updateResizeMoveUsed(id, queueTypes.rotate, duration, idToResizeMoveState); + rotateInfo = rotate.queue[0]; + } + if(moveInfo) { + _updateResizeMoveUsed(id, queueTypes.move, duration, idToResizeMoveState); + moveInfo = move.queue[0]; + } + } else if (rotateInfo) { + // Check for instant rotate + if(!rotateInfo.options.duration || rotateInfo.options.easing == 'none') { + _addRotate(id, rotate.queue[0].eventInfo, rotateInfo, { easing: 'none', duration: 0, stop: { instant: true } }); + _updateResizeMoveUsed(id, queueTypes.rotate, 0, idToResizeMoveState); + rotateInfo = rotate.queue[0]; + continue; + } + + duration = rotateInfo.options.duration - rotate.used; + if(moveInfo) duration = Math.min(duration, moveInfo.options.duration - move.used); + + baseOptions = moveInfo ? moveInfo.options : rotateInfo.options; + options = { easing: baseOptions.easing, duration: duration }; + + options.stop = { start: rotate.used, end: rotate.used + duration, len: rotateInfo.options.duration }; + if(moveInfo) options.moveStop = { start: move.used, end: move.used + duration, len: moveInfo.options.duration }; + + _addRotate(id, eventInfo, rotateInfo, options, moveInfo); + + _updateResizeMoveUsed(id, queueTypes.rotate, duration, idToResizeMoveState); + rotateInfo = rotate.queue[0]; + if(moveInfo) { + _updateResizeMoveUsed(id, queueTypes.move, duration, idToResizeMoveState); + moveInfo = move.queue[0]; + } + } else { + if(!moveInfo.options.duration || moveInfo.options.easing == 'none') { + _addMove(id, eventInfo, moveInfo, { easing: 'none', duration: 0, stop: { instant: true } }); + _updateResizeMoveUsed(id, queueTypes.move, 0, idToResizeMoveState); + moveInfo = move.queue[0]; + continue; + } + + duration = moveInfo.options.duration - move.used; + options = { easing: moveInfo.options.easing, duration: duration }; + options.stop = { start: move.used, end: moveInfo.options.duration, len: moveInfo.options.duration }; + _addMove(id, eventInfo, moveInfo, options); + + _updateResizeMoveUsed(id, queueTypes.move, duration, idToResizeMoveState); + moveInfo = move.queue[0]; + } + } + }; + + var _updateResizeMoveUsed = function(id, type, duration, idToResizeMoveState) { + var state = idToResizeMoveState[id][type]; + state.used += duration; + var options = state.queue[0].actionInfo; + if(options.options) options = options.options; + var optionDur = (options.easing && options.easing != 'none' && options.duration) || 0; + if(optionDur <= state.used) { + $ax.splice(state.queue, 0, 1); + state.used = 0; + } + } + + var _dispatchAction = $ax.action.dispatchAction = function(eventInfo, actions, currentIndex) { + currentIndex = currentIndex || 0; + //If no actions, you can bubble + if(currentIndex >= actions.length) return; + //actions are responsible for doing their own dispatching + _actionHandlers[actions[currentIndex].action](eventInfo, actions, currentIndex); + }; + + _actionHandlers.wait = function(eventInfo, actions, index) { + var action = actions[index]; + var infoCopy = $ax.eventCopy(eventInfo); + window.setTimeout(function() { + infoCopy.now = new Date(); + infoCopy.idToResizeMoveState = undefined; + _dispatchAction(infoCopy, actions, index + 1); + _action.flushAllResizeMoveActions(infoCopy); + }, action.waitTime); + }; + + _actionHandlers.expr = function(eventInfo, actions, index) { + var action = actions[index]; + + $ax.expr.evaluateExpr(action.expr, eventInfo); //this should be a block + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.setFunction = _actionHandlers.expr; + + _actionHandlers.linkWindow = function(eventInfo, actions, index) { + linkActionHelper(eventInfo, actions, index); + }; + + _actionHandlers.closeCurrent = function(eventInfo, actions, index) { + $ax.closeWindow(); + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.linkFrame = function(eventInfo, actions, index) { + linkActionHelper(eventInfo, actions, index); + }; + + _actionHandlers.setAdaptiveView = function(eventInfo, actions, index) { + var action = actions[index]; + var view = action.setAdaptiveViewTo; + + if(view) $ax.adaptive.setAdaptiveView(view); + }; + + var linkActionHelper = function(eventInfo, actions, index) { + var action = actions[index]; + eventInfo.link = true; + + if(action.linkType != 'frame') { + var includeVars = _includeVars(action.target, eventInfo); + if(action.target.targetType == "reloadPage") { + $ax.reload(action.target.includeVariables); + } else if(action.target.targetType == "backUrl") { + $ax.back(); + } + + var url = action.target.url; + if(!url && action.target.urlLiteral) { + url = $ax.expr.evaluateExpr(action.target.urlLiteral, eventInfo, true); + } + + if(url) { + if(action.linkType == "popup") { + $ax.navigate({ + url: url, + target: action.linkType, + includeVariables: includeVars, + popupOptions: action.popup + }); + } else { + $ax.navigate({ + url: url, + target: action.linkType, + includeVariables: includeVars + }); + } + } + } else linkFrame(eventInfo, action); + eventInfo.link = false; + + _dispatchAction(eventInfo, actions, index + 1); + }; + + var _includeVars = function(target, eventInfo) { + if(target.includeVariables) return true; + // If it is a url literal, that is a string literal, that has only 1 sto, that is an item that is a page, include vars. + if(target.urlLiteral) { + var literal = target.urlLiteral; + var sto = literal.stos[0]; + if(literal.exprType == 'stringLiteral' && literal.value.indexOf('[[') == 0 && literal.value.indexOf(']]' == literal.value.length - 2) && literal.stos.length == 1 && sto.sto == 'item' && eventInfo.item) { + var data = $ax.repeater.getData(eventInfo, eventInfo.item.repeater.elementId, eventInfo.item.index, sto.name, 'data'); + if (data && $ax.public.fn.IsPage(data.type)) return true; + } + } + return false; + }; + + var linkFrame = function(eventInfo, action) { + for(var i = 0; i < action.framesToTargets.length; i++) { + var framePath = action.framesToTargets[i].framePath; + var target = action.framesToTargets[i].target; + var includeVars = _includeVars(target, eventInfo); + + var url = target.url; + if(!url && target.urlLiteral) { + url = $ax.expr.evaluateExpr(target.urlLiteral, eventInfo, true); + } + + var id = $ax.getElementIdsFromPath(framePath, eventInfo)[0]; + if(id) $ax('#' + $ax.INPUT(id)).openLink(url, includeVars); + } + }; + + var _repeatPanelMap = {}; + + _actionHandlers.setPanelState = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.panelsToStates.length; i++) { + var panelToState = action.panelsToStates[i]; + var stateInfo = panelToState.stateInfo; + var elementIds = $ax.getElementIdsFromPath(panelToState.panelPath, eventInfo); + + for(var j = 0; j < elementIds.length; j++) { + var elementId = elementIds[j]; + // Need new scope for elementId and info + (function(elementId, stateInfo) { + _addAnimation(elementId, queueTypes.setState, function() { + var stateNumber = stateInfo.stateNumber; + if(stateInfo.setStateType == "value") { + var oldTarget = eventInfo.targetElement; + eventInfo.targetElement = elementId; + var stateName = $ax.expr.evaluateExpr(stateInfo.stateValue, eventInfo); + eventInfo.targetElement = oldTarget; + + // Try for state name first + var states = $ax.getObjectFromElementId(elementId).diagrams; + var stateNameFound = false; + for(var k = 0; k < states.length; k++) { + if(states[k].label == stateName) { + stateNumber = k + 1; + stateNameFound = true; + } + } + + // Now check for index + if(!stateNameFound) { + stateNumber = Number(stateName); + var panelCount = $('#' + elementId).children().length; + + // Make sure number is not NaN, is in range, and is a whole number. + // Wasn't a state name or number, so return + if(isNaN(stateNumber) || stateNumber <= 0 || stateNumber > panelCount || Math.round(stateNumber) != stateNumber) return _fireAnimationFromQueue(elementId, queueTypes.setState); + } + } else if(stateInfo.setStateType == 'next' || stateInfo.setStateType == 'previous') { + var info = $ax.deepCopy(stateInfo); + var repeat = info.repeat; + + // Only map it, if repeat exists. + if(typeof (repeat) == 'number') _repeatPanelMap[elementId] = info; + return _progessPanelState(elementId, info, info.repeatSkipFirst); + } + delete _repeatPanelMap[elementId]; + + // If setting to current (to stop repeat) break here + if(stateInfo.setStateType == 'current') return _fireAnimationFromQueue(elementId, queueTypes.setState); + + $ax('#' + elementId).SetPanelState(stateNumber, stateInfo.options, stateInfo.showWhenSet); + }); + })(elementId, stateInfo); + } + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + var _progessPanelState = function(id, info, skipFirst) { + var direction = info.setStateType; + var loop = info.loop; + var repeat = info.repeat; + var options = info.options; + + var hasRepeat = typeof (repeat) == 'number'; + var currentStateId = $ax.visibility.GetPanelState(id); + var stateNumber = ''; + if(currentStateId != '') { + currentStateId = $ax.repeater.getScriptIdFromElementId(currentStateId); + var currentStateNumber = Number(currentStateId.substr(currentStateId.indexOf('state') + 5)); + if(direction == "next") { + stateNumber = currentStateNumber + 2; + + if(stateNumber > $ax.visibility.GetPanelStateCount(id)) { + if(loop) stateNumber = 1; + else { + delete _repeatPanelMap[id]; + return _fireAnimationFromQueue(id, queueTypes.setState); + } + } + } else if(direction == "previous") { + stateNumber = currentStateNumber; + if(stateNumber <= 0) { + if(loop) stateNumber = $ax.visibility.GetPanelStateCount(id); + else { + delete _repeatPanelMap[id]; + return _fireAnimationFromQueue(id, queueTypes.setState); + } + } + } + + if(hasRepeat && _repeatPanelMap[id] != info) return _fireAnimationFromQueue(id, queueTypes.setState); + + if (!skipFirst) $ax('#' + id).SetPanelState(stateNumber, options, info.showWhenSet); + else _fireAnimationFromQueue(id, queueTypes.setState); + + if(hasRepeat) { + var animate = options && options.animateIn; + if(animate && animate.easing && animate.easing != 'none' && animate.duration > repeat) repeat = animate.duration; + animate = options && options.animateOut; + if(animate && animate.easing && animate.easing != 'none' && animate.duration > repeat) repeat = animate.duration; + + window.setTimeout(function() { + // Either new repeat, or no repeat anymore. + if(_repeatPanelMap[id] != info) return; + _addAnimation(id, queueTypes.setState, function() { + _progessPanelState(id, info, false); + }); + }, repeat); + } else delete _repeatPanelMap[id]; + } + }; + + _actionHandlers.fadeWidget = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.objectsToFades.length; i++) { + var fadeInfo = action.objectsToFades[i].fadeInfo; + var elementIds = $ax.getElementIdsFromPath(action.objectsToFades[i].objectPath, eventInfo); + + for(var j = 0; j < elementIds.length; j++) { + var elementId = elementIds[j]; + // Need new scope for elementId and info + (function(elementId, fadeInfo) { + _addAnimation(elementId, queueTypes.fade, function() { + if(fadeInfo.fadeType == "hide") { + $ax('#' + elementId).hide(fadeInfo.options); + } else if(fadeInfo.fadeType == "show") { + $ax('#' + elementId).show(fadeInfo.options, eventInfo); + } else if(fadeInfo.fadeType == "toggle") { + $ax('#' + elementId).toggleVisibility(fadeInfo.options); + } + }); + })(elementId, fadeInfo); + } + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.setOpacity = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.objectsToSetOpacity.length; i++) { + var opacityInfo = action.objectsToSetOpacity[i].opacityInfo; + var elementIds = $ax.getElementIdsFromPath(action.objectsToSetOpacity[i].objectPath, eventInfo); + + for(var j = 0; j < elementIds.length; j++) { + var elementId = elementIds[j]; + + (function(elementId, opacityInfo) { + _addAnimation(elementId, queueTypes.fade, function () { + var oldTarget = eventInfo.targetElement; + eventInfo.targetElement = elementId; + var opacity = $ax.expr.evaluateExpr(opacityInfo.opacity, eventInfo); + eventInfo.targetElement = oldTarget; + opacity = Math.min(100, Math.max(0, opacity)); + $ax('#' + elementId).setOpacity(opacity/100, opacityInfo.easing, opacityInfo.duration); + }) + })(elementId, opacityInfo); + } + } + + _dispatchAction(eventInfo, actions, index + 1); + } + + _actionHandlers.moveWidget = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.objectsToMoves.length; i++) { + var moveInfo = action.objectsToMoves[i].moveInfo; + var elementIds = $ax.getElementIdsFromPath(action.objectsToMoves[i].objectPath, eventInfo); + + for(var j = 0; j < elementIds.length; j++) { + var elementId = elementIds[j]; + _queueResizeMove(elementId, queueTypes.move, eventInfo, moveInfo); + //_addMove(eventInfo, elementId, moveInfo, eventInfo.dragInfo); + } + } + _dispatchAction(eventInfo, actions, index + 1); + }; + + //var _compoundChildrenShallow = function (id) { + // var deep = []; + // var children = $ax('#' + id).getChildren()[0].children; + // var piecePrefix = id + 'p'; + + // for (var i = 0; i < children.length; i++) { + // if(children[i].substring(0, id.length + 1) == piecePrefix) { + // deep.push(children[i]); + // } + // } + // return deep; + //}; + + var _addMove = function (elementId, eventInfo, moveInfo, optionsOverride) { + var eventInfoCopy = $ax.eventCopy(eventInfo); + var idToResizeMoveState = _getIdToResizeMoveState(eventInfoCopy); + eventInfoCopy.targetElement = elementId; + + var options = $ax.deepCopy(moveInfo.options); + options.easing = optionsOverride.easing; + options.duration = optionsOverride.duration; + options.dragInfo = eventInfo.dragInfo; + + if($ax.public.fn.IsLayer($obj(elementId).type)) { + var childrenIds = $ax.public.fn.getLayerChildrenDeep(elementId, true); + if(childrenIds.length == 0) return; + + var animations = []; + + // Get move delta once, then apply to all children + animations.push({ + id: elementId, + type: queueTypes.move, + func: function () { + var layerInfo = $ax('#' + elementId).offsetBoundingRect(); + //var layerInfo = $ax.public.fn.getWidgetBoundingRect(elementId); + var deltaLoc = _getMoveLoc(elementId, moveInfo, eventInfoCopy, optionsOverride.stop, idToResizeMoveState[elementId], options, layerInfo); +// $ax.event.raiseSyntheticEvent(elementId, "onMove"); + $ax.visibility.pushContainer(elementId, false); + + options.onComplete = function () { + _fireAnimationFromQueue(elementId, queueTypes.move); + $ax.visibility.popContainer(elementId, false); + }; + + $ax('#' + elementId).moveBy(deltaLoc.x, deltaLoc.y, options); + } + }); + + //for(var i = 0; i < childrenIds.length; i++) { + // (function(childId) { + // animations.push({ + // id: childId, + // type: queueTypes.move, + // func: function () { + // // Nop, while trying to move as container + // //$ax.event.raiseSyntheticEvent(childId, "onMove"); + // //if($ax.public.fn.IsLayer($obj(childId).type)) _fireAnimationFromQueue(childId, queueTypes.move); + // //else $ax('#' + childId).moveBy(deltaLoc.x, deltaLoc.y, moveInfo.options); + // } + // }); + // })(childrenIds[i]); + //} + _addAnimations(animations); + } else { + _addAnimation(elementId, queueTypes.move, function() { + var loc = _getMoveLoc(elementId, moveInfo, eventInfoCopy, optionsOverride.stop, idToResizeMoveState[elementId], options); + +// $ax.event.raiseSyntheticEvent(elementId, "onMove"); + if(loc.moveTo) $ax('#' + elementId).moveTo(loc.x, loc.y, options); + else $ax('#' + elementId).moveBy(loc.x, loc.y, options); + }); + } + }; + + var _moveSingleWidget = function (elementId, delta, options, onComplete) { + if(!delta.x && !delta.y) { + $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.move); + if (onComplete) onComplete(); + return; + } + var fixedInfo = $ax.dynamicPanelManager.getFixedInfo(elementId); + var xProp = 'left'; + var xDiff = '+='; + if(fixedInfo) { + if(fixedInfo.horizontal == 'right') { + xProp = 'right'; + xDiff = '-='; + } else if(fixedInfo.horizontal == 'center') { + xProp = 'margin-left'; + } + } + var yProp = 'top'; + var yDiff = '+='; + if(fixedInfo) { + if(fixedInfo.vertical == 'bottom') { + yProp = 'bottom'; + yDiff = '-='; + } else if(fixedInfo.vertical == 'middle') { + yProp = 'margin-top'; + } + } + + var css = {}; + css[xProp] = xDiff + delta.x; + css[yProp] = yDiff + delta.y; + + $ax.visibility.moveMovedLocation(elementId, delta.x, delta.y); + + var moveInfo = $ax.move.PrepareForMove(elementId, delta.x, delta.y,false, options); + $jobjAll(elementId).animate(css, { + duration: options.duration, + easing: options.easing, + queue: false, + complete: function () { + if(onComplete) onComplete(); + if(moveInfo.rootLayer) $ax.visibility.popContainer(moveInfo.rootLayer, false); + $ax.dynamicPanelManager.fitParentPanel(elementId); + $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.move); + } + }); + } + + var _getMoveLoc = function (elementId, moveInfo, eventInfoCopy, stopInfo, comboState, options, layerInfo) { + var moveTo = false; + var moveWithThis = false; + var xValue = 0; + var yValue = 0; + var moveResult = comboState.moveResult; + var widgetDragInfo = eventInfoCopy.dragInfo; + var jobj = $jobj(elementId); + + var startX; + var startY; + + switch(moveInfo.moveType) { + case "location": + // toRatio is ignoring anything before start since that has already taken effect we just know whe have from start to len to finish + // getting to the location we want to get to. + var toRatio = stopInfo.instant ? 1 : (stopInfo.end - stopInfo.start) / (stopInfo.len - stopInfo.start); + + // If result already caluculated, don't recalculate again, other calculate and save + if (moveResult) { + xValue = moveResult.x; + yValue = moveResult.y; + } else { + comboState.moveResult = moveResult = { x: $ax.expr.evaluateExpr(moveInfo.xValue, eventInfoCopy), y: $ax.expr.evaluateExpr(moveInfo.yValue, eventInfoCopy) }; + xValue = moveResult.x; + yValue = moveResult.y; + } + // If this is final stop for this move, then clear out the result so next move won't use it + if(stopInfo.instant || stopInfo.end == stopInfo.len) comboState.moveResult = undefined; + + if (layerInfo) { + startX = layerInfo.left; + startY = layerInfo.top; + //} else if ($ax.public.fn.isCompoundVectorHtml(jobj[0])) { + // var dimensions = $ax.public.fn.compoundWidgetDimensions(jobj); + // startX = dimensions.left; + // startY = dimensions.top; + } else { + var offsetLocation = $ax('#' + elementId).offsetLocation(); + startX = offsetLocation.left; + startY = offsetLocation.top; + //startX = $ax('#' + elementId).locRelativeIgnoreLayer(false); + //startY = $ax('#' + elementId).locRelativeIgnoreLayer(true); + if(jobj.css('position') == 'fixed') { + startX -= $(window).scrollLeft(); + startY -= $(window).scrollTop(); + } + } + + xValue = xValue == '' ? 0 : (xValue - startX) * toRatio; + yValue = yValue == '' ? 0 : (yValue - startY) * toRatio; + + break; + case "delta": + var ratio = stopInfo.instant ? 1 : (stopInfo.end - stopInfo.start) / stopInfo.len; + + // See case location above + if(moveResult) { + xValue = moveResult.x * ratio; + yValue = moveResult.y * ratio; + } else { + comboState.moveResult = moveResult = { x: $ax.expr.evaluateExpr(moveInfo.xValue, eventInfoCopy), y: $ax.expr.evaluateExpr(moveInfo.yValue, eventInfoCopy) }; + xValue = moveResult.x * ratio; + yValue = moveResult.y * ratio; + } + if (stopInfo.instant || stopInfo.end == stopInfo.len) comboState.moveResult = undefined; + + break; + case "drag": + xValue = widgetDragInfo.xDelta; + yValue = widgetDragInfo.yDelta; + break; + case "dragX": + xValue = widgetDragInfo.xDelta; + yValue = 0; + break; + case "dragY": + xValue = 0; + yValue = widgetDragInfo.yDelta; + break; + case "locationBeforeDrag": + var location = widgetDragInfo.movedWidgets[eventInfoCopy.targetElement]; + if (location) { + var axObj = $ax('#' + eventInfoCopy.targetElement); + //This may require using the css value + var viewportLocation = axObj.viewportLocation(); + xValue = location.x - viewportLocation.left; + yValue = location.y - viewportLocation.top; + //xValue = location.x - axObj.left(); + //yValue = location.y - axObj.top(); + } else { + _fireAnimationFromQueue(eventInfoCopy.srcElement, queueTypes.move); + return { x: 0, y: 0 }; + } + //moveTo = true; + break; + case "withThis": + moveWithThis = true; + var widgetMoveInfo = $ax.move.GetWidgetMoveInfo(); + var srcElementId = $ax.getElementIdsFromEventAndScriptId(eventInfoCopy, eventInfoCopy.srcElement)[0]; + var delta = widgetMoveInfo[srcElementId]; + options.easing = delta.options.easing; + options.duration = delta.options.duration; + xValue = delta.x; + yValue = delta.y; + break; + } + + if (options && options.boundaryExpr) { + //$ax.public.fn.removeCompound(jobj); + + //if(jobj.css('position') == 'fixed') { + // //swap page coordinates with fixed coordinates + // options.boundaryExpr.leftExpr.value = options.boundaryExpr.leftExpr.value.replace('.top', '.topfixed').replace('.left', '.leftfixed').replace('.bottom', '.bottomfixed').replace('.right', '.rightfixed'); + // options.boundaryExpr.leftExpr.stos[0].leftSTO.prop = options.boundaryExpr.leftExpr.stos[0].leftSTO.prop + 'fixed'; + // options.boundaryStos.boundaryScope.direcval0.value = options.boundaryStos.boundaryScope.direcval0.value.replace('.top', '.topfixed').replace('.left', '.leftfixed').replace('.bottom', '.bottomfixed').replace('.right', '.rightfixed'); + // options.boundaryStos.boundaryScope.direcval0.stos[0].leftSTO.prop = options.boundaryStos.boundaryScope.direcval0.stos[0].leftSTO.prop + 'fixed'; + //} + + if(moveWithThis && (xValue || yValue)) { + _updateLeftExprVariable(options.boundaryExpr, xValue.toString(), yValue.toString()); + } + + if(!$ax.expr.evaluateExpr(options.boundaryExpr, eventInfoCopy)) { + var boundaryStoInfo = options.boundaryStos; + if(boundaryStoInfo) { + if(moveWithThis) { + var stoScopes = boundaryStoInfo.boundaryScope; + if(stoScopes) { + for(var s in stoScopes) { + var boundaryScope = stoScopes[s]; + if(!boundaryScope.localVariables) continue; + + if(boundaryScope.localVariables.withx) boundaryScope.localVariables.withx.value = xValue.toString(); + if(boundaryScope.localVariables.withy) boundaryScope.localVariables.withy.value = yValue.toString(); + } + } + } + + if(layerInfo) { + startX = layerInfo.left; + startY = layerInfo.top; + } else { + offsetLocation = $ax('#' + elementId).offsetLocation(); + startX = offsetLocation.left; + startY = offsetLocation.top; + //startX = $ax('#' + elementId).locRelativeIgnoreLayer(false); + //startY = $ax('#' + elementId).locRelativeIgnoreLayer(true); + if(jobj.css('position') == 'fixed') { + startX -= $(window).scrollLeft(); + startY -= $(window).scrollTop(); + } + } + + if(boundaryStoInfo.ySto) { + var currentTop = layerInfo ? layerInfo.top : startY; + var newTop = $ax.evaluateSTO(boundaryStoInfo.ySto, boundaryStoInfo.boundaryScope, eventInfoCopy); + if(moveTo) yValue = newTop; + else yValue = newTop - currentTop; + } + + if(boundaryStoInfo.xSto) { + var currentLeft = layerInfo ? layerInfo.left : startX; + var newLeft = $ax.evaluateSTO(boundaryStoInfo.xSto, boundaryStoInfo.boundaryScope, eventInfoCopy); + if(moveTo) xValue = newLeft; + else xValue = newLeft - currentLeft; + } + } + } + + //$ax.public.fn.restoreCompound(jobj); + } + + return { x: Number(xValue), y: Number(yValue), moveTo: moveTo }; + }; + + //we will have something like [[Target.right + withX]] for leftExpr, and this function set the value of withX + var _updateLeftExprVariable = function (exprTree, xValue, yValue) { + if(exprTree.leftExpr && !exprTree.leftExpr.op) { + var localVars = exprTree.leftExpr.localVariables; + if(localVars) { + if(localVars.withx) localVars.withx.value = xValue; + if(localVars.withy) localVars.withy.value = yValue; + } + } + + //traversal + if(exprTree.op) { + if(exprTree.leftExpr) _updateLeftExprVariable(exprTree.leftExpr, xValue, yValue); + if(exprTree.rightExpr) _updateLeftExprVariable(exprTree.rightExpr, xValue, yValue); + } + } + + var widgetRotationFilter = [ + $ax.constants.IMAGE_BOX_TYPE, $ax.constants.IMAGE_MAP_REGION_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE, + $ax.constants.VECTOR_SHAPE_TYPE, $ax.constants.VERTICAL_LINE_TYPE, $ax.constants.HORIZONTAL_LINE_TYPE + ]; + _actionHandlers.rotateWidget = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.objectsToRotate.length; i++) { + var rotateInfo = action.objectsToRotate[i].rotateInfo; + var elementIds = $ax.getElementIdsFromPath(action.objectsToRotate[i].objectPath, eventInfo); + + for(var j = 0; j < elementIds.length; j++) { + var elementId = elementIds[j]; + _queueResizeMove(elementId, queueTypes.rotate, eventInfo, rotateInfo); + } + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + var _addRotate = function (elementId, eventInfo, rotateInfo, options, moveInfo) { + var idToResizeMoveState = _getIdToResizeMoveState(eventInfo); + rotateInfo = $ax.deepCopy(rotateInfo); + rotateInfo.options.easing = options.easing; + rotateInfo.options.duration = options.duration; + + var eventInfoCopy = $ax.eventCopy(eventInfo); + eventInfoCopy.targetElement = elementId; + + //calculate degree value at start of animation + var rotateDegree; + var offset = {}; + var eval = function(boundingRect) { + rotateDegree = parseFloat($ax.expr.evaluateExpr(rotateInfo.degree, eventInfoCopy)); + offset.x = Number($ax.expr.evaluateExpr(rotateInfo.offsetX, eventInfoCopy)); + offset.y = Number($ax.expr.evaluateExpr(rotateInfo.offsetY, eventInfoCopy)); + if(!rotateInfo.options.clockwise) rotateDegree = -rotateDegree; + + _updateOffset(offset, rotateInfo.anchor, boundingRect); + } + + if(moveInfo) { + var moveOptions = { dragInfo: eventInfoCopy.dragInfo, duration: options.duration, easing: options.easing, boundaryExpr: moveInfo.options.boundaryExpr, boundaryStos: moveInfo.options.boundaryStos }; + } + + var obj = $obj(elementId); + + if($ax.public.fn.IsLayer(obj.type)) { + var childrenIds = $ax.public.fn.getLayerChildrenDeep(elementId, true, true); + if(childrenIds.length == 0) return; + + var animations = []; + //get center point of the group, and degree delta + var centerPoint, degreeDelta, moveDelta; + animations.push({ + id: elementId, + type: queueTypes.rotate, + func: function () { + var boundingRect = $ax('#' + elementId).offsetBoundingRect(); + //var boundingRect = $axure.fn.getWidgetBoundingRect(elementId); + eval(boundingRect); + centerPoint = boundingRect.centerPoint; + centerPoint.x += offset.x; + centerPoint.y += offset.y; + degreeDelta = _initRotateLayer(elementId, rotateInfo, rotateDegree, options, options.stop); + _fireAnimationFromQueue(elementId, queueTypes.rotate); + + moveDelta = { x: 0, y: 0 }; + if (moveInfo) { + moveDelta = _getMoveLoc(elementId, moveInfo, eventInfoCopy, options.moveStop, idToResizeMoveState[elementId], moveOptions, boundingRect); + if (moveDelta.moveTo) { + moveDelta.x -= $ax.getNumFromPx($jobj(elementId).css('left')); + moveDelta.y -= $ax.getNumFromPx($jobj(elementId).css('top')); + } + $ax.event.raiseSyntheticEvent(elementId, 'onMove'); + } + } + }); + + for(var idIndex = 0; idIndex < childrenIds.length; idIndex++) { + var childId = childrenIds[idIndex]; + (function(id) { + var childObj = $obj(id); + var rotate = $.inArray(childObj.type, widgetRotationFilter) != -1; + + var isLayer = $ax.public.fn.IsLayer(childObj.type); + animations.push({ + id: id, + type: queueTypes.rotate, + func: function() { + $ax.event.raiseSyntheticEvent(id, "onRotate"); + if(isLayer) _fireAnimationFromQueue(id, queueTypes.rotate); + else $ax('#' + id).circularMoveAndRotate(degreeDelta, options, centerPoint.x, centerPoint.y, rotate, moveDelta); + } + }); + if(!isLayer) animations.push({ id: id, type: queueTypes.move, func: function() {} }); + })(childId); + } + + _addAnimations(animations); + } else { + animations = []; + animations.push({ + id: elementId, + type: queueTypes.rotate, + func: function () { + var jobj = $jobj(elementId); + var unrotatedDim = { width: $ax.getNumFromPx(jobj.css('width')), height: $ax.getNumFromPx(jobj.css('height')) }; + eval(unrotatedDim); + var delta = { x: 0, y: 0 }; + if(moveInfo) { + delta = _getMoveLoc(elementId, moveInfo, eventInfoCopy, options.moveStop, idToResizeMoveState[elementId], moveOptions); + if(delta.moveTo) { + delta.x -= $ax.getNumFromPx($jobj(elementId).css('left')); + delta.y -= $ax.getNumFromPx($jobj(elementId).css('top')); + } + } + + $ax.event.raiseSyntheticEvent(elementId, 'onRotate'); + if(offset.x == 0 && offset.y == 0) _rotateSingle(elementId, rotateDegree, rotateInfo.rotateType == 'location', delta, options, options.stop, true); + else _rotateSingleOffset(elementId, rotateDegree, rotateInfo.rotateType == 'location', delta, { x: offset.x, y: offset.y }, options, options.stop); + if(moveInfo) $ax.event.raiseSyntheticEvent(elementId, 'onMove'); + } + }); + animations.push({ id: elementId, type: queueTypes.move, func: function () { } }); + + _addAnimations(animations); + } + } + + var _updateOffset = function(offset, anchor, boundingRect) { + if (anchor.indexOf('left') != -1) offset.x -= boundingRect.width / 2; + if (anchor.indexOf('right') != -1) offset.x += boundingRect.width / 2; + if (anchor.indexOf('top') != -1) offset.y -= boundingRect.height / 2; + if (anchor.indexOf('bottom') != -1) offset.y += boundingRect.height / 2; + } + + var _rotateSingle = function(elementId, rotateDegree, rotateTo, delta, options, stop, handleMove) { + var degreeDelta = _applyRotateStop(rotateDegree, $ax.move.getRotationDegree(elementId), rotateTo, stop); + $ax('#' + elementId).rotate(degreeDelta, options.easing, options.duration, false, true); + if(handleMove) { + if (delta.x || delta.y) _moveSingleWidget(elementId, delta, options); + else $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.move); + } + }; + + var _rotateSingleOffset = function (elementId, rotateDegree, rotateTo, delta, offset, options, stop, resizeOffset) { + var obj = $obj(elementId); + var currRotation = $ax.move.getRotationDegree(elementId); + + // Need to fix offset. Want to to stay same place on widget after rotation, so need to take the offset and rotate it to where it should be. + if(currRotation) { + offset = $axure.fn.getPointAfterRotate(currRotation, offset, { x: 0, y: 0 }); + } + + var degreeDelta = _applyRotateStop(rotateDegree, currRotation, rotateTo, stop); + var widgetCenter = $ax('#' + elementId).offsetBoundingRect().centerPoint; + //var widgetCenter = $axure.fn.getWidgetBoundingRect(elementId).centerPoint; + + var rotate = $.inArray(obj.type, widgetRotationFilter) != -1; + $ax('#' + elementId).circularMoveAndRotate(degreeDelta, options, widgetCenter.x + offset.x, widgetCenter.y + offset.y, rotate, delta, resizeOffset); + } + + var _applyRotateStop = function(rotateDegree, currRotation, to, stop) { + var degreeDelta; + var ratio; + if(to) { + degreeDelta = rotateDegree - currRotation; + ratio = stop.instant ? 1 : (stop.end - stop.start) / (stop.len - stop.start); + } else { + degreeDelta = rotateDegree; + ratio = stop.instant ? 1 : (stop.end - stop.start) / stop.len; + } + + return degreeDelta * ratio; + } + + + var _initRotateLayer = function(elementId, rotateInfo, rotateDegree, options, stop) { + var layerDegree = $jobj(elementId).data('layerDegree'); + if (layerDegree === undefined) layerDegree = 0; + else layerDegree = parseFloat(layerDegree); + + var to = rotateInfo.rotateType == 'location'; + var newDegree = to ? rotateDegree : layerDegree + rotateDegree; + var degreeDelta = newDegree - layerDegree; + + var ratio = stop.instant ? 1 : (stop.end - stop.start) / (stop.len - stop.start); + degreeDelta *= ratio; + + $jobj(elementId).data('layerDegree', newDegree); + $ax.event.raiseSyntheticEvent(elementId, "onRotate"); + + return degreeDelta; + } + + _actionHandlers.setWidgetSize = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.objectsToResize.length; i++) { + var resizeInfo = action.objectsToResize[i].sizeInfo; + var objPath = action.objectsToResize[i].objectPath; + if(objPath == 'thisItem') { + var thisId = eventInfo.srcElement; + var repeaterId = $ax.getParentRepeaterFromElementId(thisId); + var itemId = $ax.repeater.getItemIdFromElementId(thisId); + var currSize = $ax.repeater.getItemSize(repeaterId, itemId); + var newSize = _getSizeFromInfo(resizeInfo, eventInfo, currSize.width, currSize.height); + $ax.repeater.setItemSize(repeaterId, itemId, newSize.width, newSize.height); + + continue; + } + + var elementIds = $ax.getElementIdsFromPath(objPath, eventInfo); + + for(var j = 0; j < elementIds.length; j++) { + var elementId = elementIds[j]; + _queueResizeMove(elementId, queueTypes.resize, eventInfo, resizeInfo); + //_addResize(elementId, resizeInfo); + } + } + _dispatchAction(eventInfo, actions, index + 1); + }; + + // Move info undefined unless this move/resize actions are being merged + var _addResize = function(elementId, eventInfo, resizeInfo, options, moveInfo, rotateInfo) { + var axObject = $obj(elementId); + resizeInfo = $ax.deepCopy(resizeInfo); + resizeInfo.easing = options.easing; + resizeInfo.duration = options.duration; + + var eventInfoCopy = $ax.eventCopy(eventInfo); + eventInfoCopy.targetElement = elementId; + + var moves = moveInfo || resizeInfo.anchor != "top left" || ($ax.public.fn.IsDynamicPanel(axObject.type) && + ((axObject.fixedHorizontal && axObject.fixedHorizontal == 'center') || (axObject.fixedVertical && axObject.fixedVertical == 'middle'))) || + (rotateInfo && (rotateInfo.offsetX || rotateInfo.offsetY)); + + if(moveInfo) { + var moveOptions = { dragInfo: eventInfoCopy.dragInfo, duration: options.duration, easing: options.easing, boundaryExpr: moveInfo.options.boundaryExpr, boundaryStos: moveInfo.options.boundaryStos }; + } + + var idToResizeMoveState = _getIdToResizeMoveState(eventInfoCopy); + + var animations = []; + if($ax.public.fn.IsLayer(axObject.type)) { + moves = true; // Assume widgets will move will layer, even though not all widgets may move + var childrenIds = $ax.public.fn.getLayerChildrenDeep(elementId, true, true); + if(childrenIds.length === 0) return; + // Need to wait to calculate new size, until time to animate, but animates are in separate queues + // best option seems to be to calculate in a "animate" for the layer itself and all children will use that. + // May just have to be redundant if this doesn't work well. + + var boundingRect, widthChangedPercent, heightChangedPercent, unchanged, deltaLoc, degreeDelta, resizeOffset; + animations.push({ + id: elementId, + type: queueTypes.resize, + func: function () { + $ax.visibility.pushContainer(elementId, false); + boundingRect = $ax('#' + elementId).offsetBoundingRect(); + //boundingRect = $ax.public.fn.getWidgetBoundingRect(elementId); + var size = _getSizeFromInfo(resizeInfo, eventInfoCopy, boundingRect.width, boundingRect.height, elementId); + deltaLoc = { x: 0, y: 0 }; + + var stop = options.stop; + var ratio = stop.instant ? 1 : (stop.end - stop.start) / (stop.len - stop.start); + widthChangedPercent = Math.round(size.width - boundingRect.width) / boundingRect.width * ratio; + heightChangedPercent = Math.round(size.height - boundingRect.height) / boundingRect.height * ratio; + resizeOffset = _applyAnchorToResizeOffset(widthChangedPercent * boundingRect.width, heightChangedPercent * boundingRect.height, resizeInfo.anchor); + if(stop.instant || stop.end == stop.len) idToResizeMoveState[elementId].resizeResult = undefined; + + unchanged = widthChangedPercent === 0 && heightChangedPercent === 0; + $ax.event.raiseSyntheticEvent(elementId, 'onResize'); + _fireAnimationFromQueue(elementId, queueTypes.resize); + } + }); + + if(moveInfo) animations.push({ + id: elementId, + type: queueTypes.move, + func: function() { + deltaLoc = _getMoveLoc(elementId, moveInfo, eventInfoCopy, options.moveStop, idToResizeMoveState[elementId], moveOptions, boundingRect); + $ax.visibility.pushContainer(elementId, false); + _fireAnimationFromQueue(elementId, queueTypes.move); + $ax.event.raiseSyntheticEvent(elementId, 'onMove'); + } + }); + if (rotateInfo) animations.push({ + id: elementId, + type: queueTypes.rotate, + func: function () { + resizeOffset = _applyAnchorToResizeOffset(widthChangedPercent * boundingRect.width, heightChangedPercent * boundingRect.height, resizeInfo.anchor); + var rotateDegree = parseFloat($ax.expr.evaluateExpr(rotateInfo.degree, eventInfoCopy)); + degreeDelta = _initRotateLayer(elementId, rotateInfo, rotateDegree, options, options.rotateStop); + _fireAnimationFromQueue(elementId, queueTypes.rotate); + $ax.event.raiseSyntheticEvent(elementId, 'onRotate'); + } + }); + + var completeCount = childrenIds.length*2; // Because there is a resize and move complete, it needs to be doubled + for(var idIndex = 0; idIndex < childrenIds.length; idIndex++) { + // Need to use scoping trick here to make sure childId doesn't change on next loop + (function(childId) { + //use ax obj to get width and height, jquery css give us the value without border + var isLayer = $ax.public.fn.IsLayer($obj(childId).type); + var rotate = $.inArray($obj(childId).type, widgetRotationFilter) != -1; + animations.push({ + id: childId, + type: queueTypes.resize, + func: function() { + //$ax.event.raiseSyntheticEvent(childId, 'onResize'); + if(isLayer) { + completeCount -= 2; + _fireAnimationFromQueue(childId, queueTypes.resize); + $ax.event.raiseSyntheticEvent(childId, 'onResize'); + } else { + var currDeltaLoc = { x: deltaLoc.x, y: deltaLoc.y }; + var resizeDeltaMove = { x: 0, y: 0 }; + var css = _getCssForResizingLayerChild(childId, resizeInfo.anchor, boundingRect, widthChangedPercent, heightChangedPercent, resizeDeltaMove); + var onComplete = function() { + if(--completeCount == 0) $ax.visibility.popContainer(elementId, false); + }; + $ax('#' + childId).resize(css, resizeInfo, true, moves, onComplete); + if(rotateInfo) { + var offset = { x: Number($ax.expr.evaluateExpr(rotateInfo.offsetX, eventInfoCopy)), y: Number($ax.expr.evaluateExpr(rotateInfo.offsetY, eventInfo)) }; + _updateOffset(offset, resizeInfo.anchor, boundingRect); + var centerPoint = { x: boundingRect.centerPoint.x + offset.x, y: boundingRect.centerPoint.y + offset.y }; + $ax('#' + childId).circularMoveAndRotate(degreeDelta, options, centerPoint.x, centerPoint.y, rotate, currDeltaLoc, resizeOffset, resizeDeltaMove, onComplete); + } else { + currDeltaLoc.x += resizeDeltaMove.x; + currDeltaLoc.y += resizeDeltaMove.y; + _moveSingleWidget(childId, currDeltaLoc, options, onComplete); + } + } + } + }); + if(!isLayer) animations.push({ id: childId, type: queueTypes.move, func: function () {} }); + if(!isLayer && rotateInfo) animations.push({ id: childId, type: queueTypes.rotate, func: function () {} }); + })(childrenIds[idIndex]); + } + } else { + // Not func, obj with func + animations.push({ + id: elementId, + type: queueTypes.resize, + func: function() { + //textarea can be resized manully by the user, but doesn't update div size yet, so doing this for now. + //alternatively axquery get for size can account for this + + var sizeId = $ax.public.fn.IsTextArea(axObject.type) ? $jobj(elementId).children('textarea').attr('id') : elementId; + var oldSize = $ax('#' + sizeId).size(); + var oldWidth = oldSize.width; + var oldHeight = oldSize.height; + + var stop = options.stop; + var ratio = stop.instant ? 1 : (stop.end - stop.start) / (stop.len - stop.start); + + var size = _getSizeFromInfo(resizeInfo, eventInfoCopy, oldWidth, oldHeight, elementId); + var newWidth = size.width; + var newHeight = size.height; + var deltaWidth = Math.round(newWidth - oldWidth) * ratio; + var deltaHeight = Math.round(newHeight - oldHeight) * ratio; + newWidth = oldWidth + deltaWidth; + newHeight = oldHeight + deltaHeight; + + var delta = { x: 0, y: 0 }; + if(moveInfo) { + delta = _getMoveLoc(elementId, moveInfo, eventInfoCopy, options.moveStop, idToResizeMoveState[elementId], moveOptions); + if (delta.moveTo) { + delta.x -= $ax.getNumFromPx($jobj(elementId).css('left')); + delta.y -= $ax.getNumFromPx($jobj(elementId).css('top')); + } + } + + var rotateHandlesMove = false; + var offset = { x: 0, y: 0 }; + if(rotateInfo) { + offset.x = Number($ax.expr.evaluateExpr(rotateInfo.offsetX, eventInfoCopy)); + offset.y = Number($ax.expr.evaluateExpr(rotateInfo.offsetY, eventInfoCopy)); + _updateOffset(offset, rotateInfo.anchor, $ax('#' + elementId).offsetBoundingRect()); + //_updateOffset(offset, rotateInfo.anchor, $axure.fn.getWidgetBoundingRect(elementId)); + rotateHandlesMove = Boolean(rotateInfo && (offset.x || offset.y || rotateInfo.anchor != 'center')); + $ax.event.raiseSyntheticEvent(elementId, 'onRotate'); + } + + var css = null; + var rootLayer = null; + if(deltaHeight != 0 || deltaWidth != 0) { + rootLayer = $ax.move.getRootLayer(elementId); + if(rootLayer) $ax.visibility.pushContainer(rootLayer, false); + css = _getCssForResizingWidget(elementId, eventInfoCopy, resizeInfo.anchor, newWidth, newHeight, oldWidth, oldHeight, delta, options.stop, !rotateHandlesMove); + idToResizeMoveState[elementId].resizeResult = undefined; + } + + if(rotateInfo) { + var rotateDegree = parseFloat($ax.expr.evaluateExpr(rotateInfo.degree, eventInfoCopy)); + + if(rotateHandlesMove) { + var resizeOffset = _applyAnchorToResizeOffset(deltaWidth, deltaHeight, rotateInfo.anchor); + _rotateSingleOffset(elementId, rotateDegree, rotateInfo.rotateType == 'location', delta, offset, options, options.rotateStop, resizeOffset); + } else { + // Not handling move so pass in nop delta + _rotateSingle(elementId, rotateDegree, rotateInfo.rotateType == 'location', { x: 0, y: 0 }, options, options.rotateStop); + if (moves) _fireAnimationFromQueue(elementId, queueTypes.move); + } + } else if(!css && moves) _moveSingleWidget(elementId, delta, options); + + // Have to do it down here to make sure move info is registered + if(moveInfo) $ax.event.raiseSyntheticEvent(elementId, 'onMove'); + + //$ax.event.raiseSyntheticEvent(elementId, 'onResize'); + if (css) { + $ax('#' + elementId).resize(css, resizeInfo, true, moves, function () { + if(rootLayer) $ax.visibility.popContainer(rootLayer, false); + }); + } else { + _fireAnimationFromQueue(elementId, queueTypes.resize); + + $ax.event.raiseSyntheticEvent(elementId, 'onResize'); + } + } + }); + // Nop move (move handled by resize) + if(rotateInfo) animations.push({ id: elementId, type: queueTypes.rotate, func: function () { } }); + if(moves) animations.push({ id: elementId, type: queueTypes.move, func: function () { } }); + } + + _addAnimations(animations); + }; + + var _applyAnchorToResizeOffset = function (deltaWidth, deltaHeight, anchor) { + var offset = {}; + if (anchor.indexOf('left') != -1) offset.x = -deltaWidth / 2; + else if (anchor.indexOf('right') != -1) offset.x = deltaWidth / 2; + if (anchor.indexOf('top') != -1) offset.y = -deltaHeight / 2; + else if (anchor.indexOf('bottom') != -1) offset.y = deltaHeight / 2; + + return offset; + } + + //var _getOldAndNewSize = function (resizeInfo, eventInfo, targetElement) { + // var axObject = $obj(targetElement); + // var oldWidth, oldHeight; + // //textarea can be resized manully by the user, use the textarea child to get the current size + // //because this new size may not be reflected on its parents yet + // if ($ax.public.fn.IsTextArea(axObject.type)) { + // var jObject = $jobj(elementId); + // var textObj = $ax('#' + jObject.children('textarea').attr('id')); + // //maybe we shouldn't use ax obj to get width and height here anymore... + // oldWidth = textObj.width(); + // oldHeight = textObj.height(); + // } else { + // oldWidth = $ax('#' + elementId).width(); + // oldHeight = $ax('#' + elementId).height(); + // } + + // var size = _getSizeFromInfo(resizeInfo, eventInfo, oldHeight, oldWidth, elementId); + // return { oldWidth: oldWidth, oldHeight: oldHeight, newWidth: size.width, newHeight: size.height, change: oldWidth != size.width || oldHeight != size.height }; + //} + + var _getSizeFromInfo = function(resizeInfo, eventInfo, oldWidth, oldHeight, targetElement) { + var oldTarget = eventInfo.targetElement; + eventInfo.targetElement = targetElement; + + var state = _getIdToResizeMoveState(eventInfo)[targetElement]; + if(state && state.resizeResult) return state.resizeResult; + + var width = $ax.expr.evaluateExpr(resizeInfo.width, eventInfo); + var height = $ax.expr.evaluateExpr(resizeInfo.height, eventInfo); + eventInfo.targetElement = oldTarget; + + + // If either one is not a number, use the old value + width = width != "" ? Number(width) : oldWidth; + height = height != "" ? Number(height) : oldHeight; + + width = isNaN(width) ? oldWidth : width; + height = isNaN(height) ? oldHeight : height; + + // can't be negative + var result = { width: Math.max(width, 0), height: Math.max(height, 0) }; + if(state) state.resizeResult = result; + return result; + } + + //var _queueResize = function (elementId, css, resizeInfo) { + // var resizeFunc = function() { + // $ax('#' + elementId).resize(css, resizeInfo, true); + // //$ax.public.fn.resize(elementId, css, resizeInfo, true); + // }; + // var obj = $obj(elementId); + // var moves = resizeInfo.anchor != "top left" || ($ax.public.fn.IsDynamicPanel(obj.type) && ((obj.fixedHorizontal && obj.fixedHorizontal == 'center') || (obj.fixedVertical && obj.fixedVertical == 'middle'))) + // if(!moves) { + // _addAnimation(elementId, queueTypes.resize, resizeFunc); + // } else { + // var animations = []; + // animations[0] = { id: elementId, type: queueTypes.resize, func: resizeFunc }; + // animations[1] = { id: elementId, type: queueTypes.move, func: function() {}}; // Nop func - resize handles move and firing from queue + // _addAnimations(animations); + // } + //}; + + //should clean this function and + var _getCssForResizingWidget = function (elementId, eventInfo, anchor, newWidth, newHeight, oldWidth, oldHeight, delta, stop, handleMove) { + var ratio = stop.instant ? 1 : (stop.end - stop.start) / (stop.len - stop.start); + var deltaWidth = (newWidth - oldWidth) * ratio; + var deltaHeight = (newHeight - oldHeight) * ratio; + if(stop.instant || stop.end == stop.len) { + var idToResizeMoveState = _getIdToResizeMoveState(eventInfo); + if(idToResizeMoveState[elementId]) idToResizeMoveState[elementId].resizeResult = undefined; + } + + var css = {}; + css.height = oldHeight + deltaHeight; + + var obj = $obj(elementId); + //if it's 100% width, don't change its width + if($ax.dynamicPanelManager.isPercentWidthPanel(obj)) var is100Dp = true; + else css.width = oldWidth + deltaWidth; + + var jobj = $jobj(elementId); + //if this is pinned dp, we will mantain the pin, no matter how you resize it; so no need changes left or top + //NOTE: currently only pinned DP has position == fixed + if(jobj.css('position') == 'fixed') { + if(obj.fixedHorizontal && obj.fixedHorizontal == 'center') css['margin-left'] = '+=' + delta.x; + if(obj.fixedVertical && obj.fixedVertical == 'middle') css['margin-top'] = '+=' + delta.y; + return css; + } + + // If it is pinned, but temporarily not fixed because it is wrappen in a container, then just make sure to anchor it correctly + if(obj.fixedVertical) { + if(obj.fixedVertical == 'middle') anchor = obj.fixedHorizontal; + else anchor = obj.fixedVertical + (obj.fixedHorizontal == 'center' ? '' : ' ' + obj.fixedHorizontal); + + } + + //use position relative to parents + //var position = obj.generateCompound ? $ax.public.fn.getWidgetBoundingRect(elementId) : $ax.public.fn.getPositionRelativeToParent(elementId); + + + var locationShift; + switch(anchor) { + case "top left": + locationShift = { x: 0, y: 0 }; break; + case "top": + locationShift = { x: -deltaWidth / 2.0, y: 0.0 }; break; + case "top right": + locationShift = { x: -deltaWidth, y: 0.0 }; break; + case "left": + locationShift = { x: 0.0, y: -deltaHeight / 2.0 }; break; + case "center": + locationShift = { x: -deltaWidth / 2.0, y: -deltaHeight / 2.0 }; break; + case "right": + locationShift = { x: -deltaWidth, y: -deltaHeight / 2.0 }; break; + case "bottom left": + locationShift = { x: 0.0, y: -deltaHeight }; break; + case "bottom": + locationShift = { x: -deltaWidth/2.0, y: -deltaHeight }; break; + case "bottom right": + locationShift = { x: -deltaWidth, y: -deltaHeight }; break; + } + + if(handleMove) { + if(jobj.css('position') === 'absolute') { + css.left = $ax.getNumFromPx(jobj.css('left')) + locationShift.x + delta.x; + css.top = $ax.getNumFromPx(jobj.css('top')) + locationShift.y + delta.y; + } else { + var axQuery = $ax('#' + elementId); + var offsetLocation = axQuery.offsetLocation(); + css.left = offsetLocation.left + locationShift.x + delta.x; + css.top = offsetLocation.top + locationShift.y + delta.y; + //css.left = axQuery.left(true) + locationShift.x + delta.x; + //css.top = axQuery.top(true) + locationShift.y + delta.y; + } + } else { + delta.x += locationShift.x; + delta.y += locationShift.y; + } + + css.deltaX = locationShift.x + delta.x; + css.deltaY = locationShift.y + delta.y; + + return css; + }; + + + var _getCssForResizingLayerChild = function (elementId, anchor, layerBoundingRect, widthChangedPercent, heightChangedPercent, deltaLoc) { + var boundingRect = $ax('#' + elementId).offsetBoundingRect(); + //var boundingRect = $ax.public.fn.getWidgetBoundingRect(elementId); + var childCenterPoint = boundingRect.centerPoint; + + var currentSize = $ax('#' + elementId).size(); + var newWidth = currentSize.width + currentSize.width * widthChangedPercent; + var newHeight = currentSize.height + currentSize.height * heightChangedPercent; + + var css = {}; + css.height = newHeight; + + var obj = $obj(elementId); + //if it's 100% width, don't change its width and left + var changeLeft = true; + if($ax.dynamicPanelManager.isPercentWidthPanel(obj)) changeLeft = false; + else css.width = newWidth; + + var jobj = $jobj(elementId); + //if this is pinned dp, we will mantain the pin, no matter how you resize it; so no need changes left or top + //NOTE: currently only pinned DP has position == fixed + if(jobj.css('position') == 'fixed') return css; + //use bounding rect position relative to parents to calculate delta + //var axObj = $ax('#' + elementId); + // This will be absolute world coordinates, but we want body coordinates. + var offsetLocation = $ax('#' + elementId).offsetLocation(); + var currentLeft = offsetLocation.left; + var currentTop = offsetLocation.top; + //var currentLeft = axObj.locRelativeIgnoreLayer(false); + //var currentTop = axObj.locRelativeIgnoreLayer(true); + + var resizable = $ax.public.fn.IsResizable(obj.type); + if(anchor.indexOf("top") > -1) { + var topDelta = (currentTop - layerBoundingRect.top) * heightChangedPercent; + if(!resizable && Math.round(topDelta)) topDelta += currentSize.height * heightChangedPercent; + } else if(anchor.indexOf("bottom") > -1) { + if(resizable) topDelta = (currentTop - layerBoundingRect.bottom) * heightChangedPercent; + else { + var bottomDelta = Math.round(currentTop + currentSize.height - layerBoundingRect.bottom) * heightChangedPercent; + if(bottomDelta) topDelta = bottomDelta - currentSize.height * heightChangedPercent; + else topDelta = 0; + } + } else { //center vertical + if(resizable) topDelta = (childCenterPoint.y - layerBoundingRect.centerPoint.y)*heightChangedPercent - currentSize.height*heightChangedPercent/2; + else { + var centerTopChange = Math.round(childCenterPoint.y - layerBoundingRect.centerPoint.y)*heightChangedPercent; + if(centerTopChange > 0) topDelta = centerTopChange + Math.abs(currentSize.height * heightChangedPercent / 2); + else if(centerTopChange < 0) topDelta = centerTopChange - Math.abs(currentSize.height * heightChangedPercent / 2); + else topDelta = 0; + } + } + + if(changeLeft) { + if(anchor.indexOf("left") > -1) { + var leftDelta = (currentLeft - layerBoundingRect.left) * widthChangedPercent; + if(!resizable && Math.round(leftDelta)) leftDelta += currentSize.width * widthChangedPercent; + } else if(anchor.indexOf("right") > -1) { + if(resizable) leftDelta = (currentLeft - layerBoundingRect.right) * widthChangedPercent; + else { + var rightDelta = Math.round(currentLeft + currentSize.width - layerBoundingRect.right) * widthChangedPercent; + if(rightDelta) leftDelta = rightDelta - currentSize.width * widthChangedPercent; + else leftDelta = 0; + } + } else { //center horizontal + if(resizable) leftDelta = (childCenterPoint.x - layerBoundingRect.centerPoint.x)*widthChangedPercent - currentSize.width*widthChangedPercent/2; + else { + var centerLeftChange = Math.round(childCenterPoint.x - layerBoundingRect.centerPoint.x) * widthChangedPercent; + if(centerLeftChange > 0) leftDelta = centerLeftChange + Math.abs(currentSize.width * widthChangedPercent / 2); + else if(centerLeftChange < 0) leftDelta = centerLeftChange - Math.abs(currentSize.width * widthChangedPercent / 2); + else leftDelta = 0; + } + } + } + + if(topDelta) deltaLoc.y += topDelta; + if(leftDelta && changeLeft) deltaLoc.x += leftDelta; + + return css; + }; + + _actionHandlers.setPanelOrder = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.panelPaths.length; i++) { + var func = action.panelPaths[i].setOrderInfo.bringToFront ? 'bringToFront' : 'sendToBack'; + var elementIds = $ax.getElementIdsFromPath(action.panelPaths[i].panelPath, eventInfo); + for(var j = 0; j < elementIds.length; j++) $ax('#' + elementIds[j])[func](); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.modifyDataSetEditItems = function(eventInfo, actions, index) { + var action = actions[index]; + var add = action.repeatersToAddTo; + var repeaters = add || action.repeatersToRemoveFrom; + var itemId; + for(var i = 0; i < repeaters.length; i++) { + var data = repeaters[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(data.path, eventInfo)[0]; + if(!id) continue; + + if(data.addType == 'this') { + var scriptId = $ax.repeater.getScriptIdFromElementId(eventInfo.srcElement); + itemId = $ax.repeater.getItemIdFromElementId(eventInfo.srcElement); + var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId); + if(add) $ax.repeater.addEditItems(repeaterId, [itemId]); + else $ax.repeater.removeEditItems(repeaterId, [itemId]); + } else if(data.addType == 'all') { + var allItems = $ax.repeater.getAllItemIds(id); + if(add) $ax.repeater.addEditItems(id, allItems); + else $ax.repeater.removeEditItems(id, allItems); + } else { + var oldTarget = eventInfo.targetElement; + var itemIds = $ax.repeater.getAllItemIds(id); + var itemIdsToAdd = []; + for(var j = 0; j < itemIds.length; j++) { + itemId = itemIds[j]; + eventInfo.targetElement = $ax.repeater.createElementId(id, itemId); + if($ax.expr.evaluateExpr(data.query, eventInfo) == "true") { + itemIdsToAdd[itemIdsToAdd.length] = String(itemId); + } + eventInfo.targetElement = oldTarget; + } + if(add) $ax.repeater.addEditItems(id, itemIdsToAdd); + else $ax.repeater.removeEditItems(id, itemIdsToAdd); + } + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _action.repeaterInfoNames = { addItemsToDataSet: 'dataSetsToAddTo', deleteItemsFromDataSet: 'dataSetItemsToRemove', updateItemsInDataSet: 'dataSetsToUpdate', + addFilterToRepeater: 'repeatersToAddFilter', removeFilterFromRepeater: 'repeatersToRemoveFilter', + addSortToRepeater: 'repeaterToAddSort', removeSortFromRepeater: 'repeaterToRemoveSort', + setRepeaterToPage: 'repeatersToSetPage', setItemsPerRepeaterPage: 'repeatersToSetItemCount' + }; + + _actionHandlers.addItemsToDataSet = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.dataSetsToAddTo.length; i++) { + var datasetInfo = action.dataSetsToAddTo[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(datasetInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + var dataset = datasetInfo.data; + + for(var j = 0; j < dataset.length; j++) $ax.repeater.addItem(id, $ax.deepCopy(dataset[j]), eventInfo); + if(dataset.length) _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.deleteItemsFromDataSet = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.dataSetItemsToRemove.length; i++) { + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var deleteInfo = action.dataSetItemsToRemove[i]; + var id = $ax.getElementIdsFromPath(deleteInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + $ax.repeater.deleteItems(id, eventInfo, deleteInfo.type, deleteInfo.rule); + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.updateItemsInDataSet = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.dataSetsToUpdate.length; i++) { + var dataSet = action.dataSetsToUpdate[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(dataSet.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + + $ax.repeater.updateEditItems(id, dataSet.props, eventInfo, dataSet.type, dataSet.rule); + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.setRepeaterToDataSet = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.repeatersToSet.length; i++) { + var setRepeaterInfo = action.repeatersToSet[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(setRepeaterInfo.path, eventInfo)[0]; + if(!id) continue; + $ax.repeater.setDataSet(id, setRepeaterInfo.localDataSetId); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.addFilterToRepeater = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.repeatersToAddFilter.length; i++) { + var addFilterInfo = action.repeatersToAddFilter[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(addFilterInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + + $ax.repeater.addFilter(id, addFilterInfo.removeOtherFilters, addFilterInfo.label, addFilterInfo.filter, eventInfo.srcElement); + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.removeFilterFromRepeater = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.repeatersToRemoveFilter.length; i++) { + var removeFilterInfo = action.repeatersToRemoveFilter[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(removeFilterInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + + if(removeFilterInfo.removeAll) $ax.repeater.removeFilter(id); + else if(removeFilterInfo.filterName != '') { + $ax.repeater.removeFilter(id, removeFilterInfo.filterName); + } + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.addSortToRepeater = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.repeatersToAddSort.length; i++) { + var addSortInfo = action.repeatersToAddSort[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(addSortInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + + $ax.repeater.addSort(id, addSortInfo.label, addSortInfo.columnName, addSortInfo.ascending, addSortInfo.toggle, addSortInfo.sortType); + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.removeSortFromRepeater = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.repeatersToRemoveSort.length; i++) { + var removeSortInfo = action.repeatersToRemoveSort[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(removeSortInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + + if(removeSortInfo.removeAll) $ax.repeater.removeSort(id); + else if(removeSortInfo.sortName != '') $ax.repeater.removeSort(id, removeSortInfo.sortName); + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.setRepeaterToPage = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.repeatersToSetPage.length; i++) { + var setPageInfo = action.repeatersToSetPage[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(setPageInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + + var oldTarget = eventInfo.targetElement; + eventInfo.targetElement = id; + $ax.repeater.setRepeaterToPage(id, setPageInfo.pageType, setPageInfo.pageValue, eventInfo); + eventInfo.targetElement = oldTarget; + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.setItemsPerRepeaterPage = function(eventInfo, actions, index) { + var action = actions[index]; + + for(var i = 0; i < action.repeatersToSetItemCount.length; i++) { + var setItemCountInfo = action.repeatersToSetItemCount[i]; + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(setItemCountInfo.path, eventInfo)[0]; + if(!id || _ignoreAction(id)) continue; + + if(setItemCountInfo.noLimit) $ax.repeater.setNoItemLimit(id); + else $ax.repeater.setItemLimit(id, setItemCountInfo.itemCountValue, eventInfo); + _addRefresh(id); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.refreshRepeater = function(eventInfo, actions, index) { + // We use this as a psudo action now. + var action = actions[index]; + for (var i = 0; i < action.repeatersToRefresh.length; i++) { + // Grab the first one because repeaters must have only element id, as they cannot be inside repeaters + // or none if unplaced + var id = $ax.getElementIdsFromPath(action.repeatersToRefresh[i], eventInfo)[0]; + if(id) _tryRefreshRepeater(id, eventInfo); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + var _tryRefreshRepeater = function(id, eventInfo) { + var idIndex = _repeatersToRefresh.indexOf(id); + if(idIndex == -1) return; + + $ax.splice(_repeatersToRefresh, idIndex, 1); + $ax.repeater.refreshRepeater(id, eventInfo); + }; + + _action.tryRefreshRepeaters = function(ids, eventInfo) { + for(var i = 0; i < ids.length; i++) _tryRefreshRepeater(ids[i], eventInfo); + }; + + _actionHandlers.scrollToWidget = function(eventInfo, actions, index) { + var action = actions[index]; + var elementIds = $ax.getElementIdsFromPath(action.objectPath, eventInfo); + if(elementIds.length > 0) $ax('#' + elementIds[0]).scroll(action.options); + + _dispatchAction(eventInfo, actions, index + 1); + }; + + + _actionHandlers.enableDisableWidgets = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.pathToInfo.length; i++) { + var elementIds = $ax.getElementIdsFromPath(action.pathToInfo[i].objectPath, eventInfo); + var enable = action.pathToInfo[i].enableDisableInfo.enable; + for(var j = 0; j < elementIds.length; j++) $ax('#' + elementIds[j]).enabled(enable); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.setImage = function(eventInfo, actions, index) { + var oldTarget = eventInfo.targetElement; + var action = actions[index]; + var view = $ax.adaptive.currentViewId; + + eventInfo.image = true; + for(var i = 0; i < action.imagesToSet.length; i++) { + var imgInfo = action.imagesToSet[i]; + if (view && imgInfo.adaptive[view]) imgInfo = imgInfo.adaptive[view]; + else imgInfo = imgInfo.base; + var elementIds = $ax.getElementIdsFromPath(action.imagesToSet[i].objectPath, eventInfo); + + for(var j = 0; j < elementIds.length; j++) { + var elementId = elementIds[j]; + + eventInfo.targetElement = elementId; + var evaluatedImgs = _evaluateImages(imgInfo, eventInfo); + + var img = evaluatedImgs.normal; + if($ax.style.IsWidgetDisabled(elementId)) { + if(imgInfo.disabled) img = evaluatedImgs.disabled; + } else if($ax.style.IsWidgetSelected(elementId)) { + if(imgInfo.selected) img = evaluatedImgs.selected; + } else if($ax.event.mouseDownObjectId == elementId && imgInfo.mouseDown) img = evaluatedImgs.mouseDown; + else if($ax.event.mouseOverIds.indexOf(elementId) != -1 && imgInfo.mouseOver) { + img = evaluatedImgs.mouseOver; + //Update mouseOverObjectId + var currIndex = $ax.event.mouseOverIds.indexOf($ax.event.mouseOverObjectId); + var imgIndex = $ax.event.mouseOverIds.indexOf(elementId); + if(currIndex < imgIndex) $ax.event.mouseOverObjectId = elementId; + } else if(imgInfo.mouseOver && elementId == eventInfo.srcElement) { + img = evaluatedImgs.mouseOver; + } + + // $('#' + $ax.repeater.applySuffixToElementId(elementId, '_img')).attr('src', img); + $jobj($ax.GetImageIdFromShape(elementId)).attr('src', img); + + //Set up overrides + $ax.style.mapElementIdToImageOverrides(elementId, evaluatedImgs); + $ax.style.updateElementIdImageStyle(elementId); + + if(evaluatedImgs.mouseOver || evaluatedImgs.mouseDown) $ax.event.updateIxStyleEvents(elementId); + } + } + eventInfo.targetElement = oldTarget; + eventInfo.image = false; + + _dispatchAction(eventInfo, actions, index + 1); + }; + + var _evaluateImages = function(imgInfo, eventInfo) { + var retVal = {}; + for(var state in imgInfo) { + if(!imgInfo.hasOwnProperty(state)) continue; + var img = imgInfo[state][$ax.adaptive.getSketchKey()] || $ax.expr.evaluateExpr(imgInfo[state].literal, eventInfo); + if(!img) img = $axure.utils.getTransparentGifPath(); + retVal[state] = img; + } + return retVal; + }; + + $ax.clearRepeaterImageOverrides = function(repeaterId) { + var childIds = $ax.getChildElementIdsForRepeater(repeaterId); + for(var i = childIds; i < childIds.length; i++) $ax.style.deleteElementIdToImageOverride(childIds[i]); + }; + + _actionHandlers.setFocusOnWidget = function(eventInfo, actions, index) { + var action = actions[index]; + if(action.objectPaths.length > 0) { + var elementIds = $ax.getElementIdsFromPath(action.objectPaths[0], eventInfo); + if(elementIds.length > 0) { + $ax('#' + elementIds[0]).focus(); + //if select text and not in placeholder mode, then select all text + if(action.selectText && !$ax.placeholderManager.isActive(elementIds[0])) { + var elementChildren = document.getElementById(elementIds[0]).children; + //find the input or textarea element + for(var i = 0; i < elementChildren.length; i++) { + if (elementChildren[i].id.indexOf('_input') == -1) continue; + var elementTagName = elementChildren[i].tagName; + if(elementTagName && (elementTagName.toLowerCase() == "input" || elementTagName.toLowerCase() == "textarea")) { + elementChildren[i].select(); + } + } + } + } + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.expandCollapseTree = function(eventInfo, actions, index) { + var action = actions[index]; + for(var i = 0; i < action.pathToInfo.length; i++) { + var pair = action.pathToInfo[i]; + var elementIds = $ax.getElementIdsFromPath(pair.treeNodePath, eventInfo); + for(var j = 0; j < elementIds.length; j++) $ax('#' + elementIds[j]).expanded(pair.expandCollapseInfo.expand); + } + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.other = function(eventInfo, actions, index) { + var action = actions[index]; + $ax.navigate({ + url: $axure.utils.getOtherPath() + "#other=" + encodeURI(action.otherDescription), + target: "popup", + includeVariables: false, + popupOptions: action.popup + }); + + _dispatchAction(eventInfo, actions, index + 1); + }; + + _actionHandlers.fireEvents = function(eventInfo, actions, index) { + var action = actions[index]; + //look for the nearest element id + + var objId = eventInfo.srcElement; + var thisWidget = eventInfo.thiswidget; + var obj = $ax.getObjectFromElementId(objId); + var rdoId = obj ? $ax.getRdoParentFromElementId(objId) : ""; + var rdo = $ax.getObjectFromElementId(rdoId); + var page = rdo ? $ax.pageData.masters[rdo.masterId] : $ax.pageData.page; + + // Check if rdo should be this + var oldIsMasterEvent = eventInfo.isMasterEvent; + if (obj && $ax.public.fn.IsReferenceDiagramObject(obj.type) && eventInfo.isMasterEvent) { + rdoId = objId; + rdo = obj; + page = $ax.pageData.masters[rdo.masterId]; + } + + for(var i = 0; i < action.firedEvents.length; i++) { + var firedEvent = action.firedEvents[i]; + var isPage = firedEvent.objectPath.length == 0; + var targetObjIds = isPage ? [rdoId] : $ax.getElementIdsFromPath(firedEvent.objectPath, eventInfo); + for (var j = 0; j < targetObjIds.length; j++) { + var targetObjId = targetObjIds[j]; + var targetObj = isPage ? rdo : $ax.getObjectFromElementId(targetObjId); + + eventInfo.srcElement = targetObjId || ''; + eventInfo.thiswidget = $ax.getWidgetInfo(eventInfo.srcElement); + + eventInfo.isMasterEvent = false; + var raisedEvents = firedEvent.raisedEventIds; + if(raisedEvents) { + for(var k = 0; k < raisedEvents.length; k++) { + var event = targetObj.interactionMap && targetObj.interactionMap.raised && targetObj.interactionMap.raised[raisedEvents[k]]; + if(event) $ax.event.handleEvent(targetObjId, eventInfo, event, false, true); + } + } + + if(isPage) { + eventInfo.isMasterEvent = true; + eventInfo.label = $ax.pageData.page.name; + eventInfo.friendlyType = 'Page'; + } + + var firedTarget = isPage ? page : targetObj; + var firedEventNames = firedEvent.firedEventNames; + if(firedEventNames) { + for(k = 0; k < firedEventNames.length; k++) { + event = firedTarget.interactionMap && firedTarget.interactionMap[firedEventNames[k]]; + if(event) $ax.event.handleEvent(isPage ? '' : targetObjId, eventInfo, event, false, true); + } + } + if(isPage) eventInfo.isMasterEvent = oldIsMasterEvent; + } + eventInfo.srcElement = objId; + eventInfo.thiswidget = thisWidget; + + eventInfo.isMasterEvent = oldIsMasterEvent; + } + + _dispatchAction(eventInfo, actions, index + 1); + }; +}); diff --git a/code/page/resources/scripts/axure/adaptive.js b/code/page/resources/scripts/axure/adaptive.js new file mode 100644 index 0000000..8bd801f --- /dev/null +++ b/code/page/resources/scripts/axure/adaptive.js @@ -0,0 +1,689 @@ +$axure.internal(function($ax) { + $ax.adaptive = {}; + + $axure.utils.makeBindable($ax.adaptive, ["viewChanged"]); + + var _auto = true; + var _autoIsHandledBySidebar = false; + + var _views; + var _idToView; + var _enabledViews = []; + + var _initialViewToLoad; + var _initialViewSizeToLoad; + + var _loadFinished = false; + $ax.adaptive.loadFinished = function() { + if(_loadFinished) return; + _loadFinished = true; + if($ax.adaptive.currentViewId) $ax.viewChangePageAndMasters(); + else $ax.postAdaptiveViewChanged(); + }; + + var _handleResize = function(forceSwitchTo) { + if(!_auto) return; + if(_auto && _autoIsHandledBySidebar && !forceSwitchTo) return; + + var $window = $(window); + var height = $window.height(); + var width = $window.width(); + + var toView = _getAdaptiveView(width, height); + var toViewId = toView && toView.id; + + _switchView(toViewId, forceSwitchTo); + }; + + var _setAuto = $ax.adaptive.setAuto = function(val) { + if(_auto != val) { + _auto = Boolean(val); + } + }; + + var _setLineImage = function(id, imageUrl) { + $jobj(id).attr('src', imageUrl); + }; + + var _switchView = function (viewId, forceSwitchTo) { + //if(!$ax.pageData.isAdaptiveEnabled) return; + + var previousViewId = $ax.adaptive.currentViewId; + if(typeof previousViewId == 'undefined') previousViewId = ''; + if(typeof viewId == 'undefined') viewId = ''; + if (viewId == previousViewId) { + if(forceSwitchTo) $ax.postAdaptiveViewChanged(forceSwitchTo); + return; + } + + $ax('*').each(function(obj, elementId) { + if (!$ax.public.fn.IsTreeNodeObject(obj.type)) return; + if(!obj.hasOwnProperty('isExpanded')) return; + + var query = $ax('#' + elementId); + var defaultExpanded = obj.isExpanded; + + query.expanded(defaultExpanded); + }); + + // reset all the inline positioning from move and rotate actions including size and transformation + $axure('*').each(function (diagramObject, elementId) { + if(diagramObject.isContained) return; + if($ax.getParentRepeaterFromElementIdExcludeSelf(elementId)) return; + + var element = document.getElementById(elementId); + if(element) { + var resetCss = { + top: "", left: "", width: "", height: "", opacity: "", + transform: "", webkitTransform: "", MozTransform: "", msTransform: "", OTransform: "" + }; + var query = $(element); + query.css(resetCss); + var isPanel = $ax.public.fn.IsDynamicPanel(diagramObject.type); + if(!isPanel || diagramObject.fitToContent) { //keeps size on the panel states when switching adaptive views to optimize fit to panel + if(diagramObject.fitToContent) $ax.dynamicPanelManager.setFitToContentCss(elementId, true); + var children = query.children(); + if(children.length) children.css(resetCss); + } + + $ax.dynamicPanelManager.resetFixedPanel(diagramObject, element); + $ax.dynamicPanelManager.resetAdaptivePercentPanel(diagramObject, element); + } + }); + + $ax.adaptive.currentViewId = viewId; // we need to set this so the enabled and selected styles will apply properly + if(previousViewId) { + $ax.style.clearAdaptiveStyles(); + $('*').removeClass(previousViewId); + } else { + $ax.style.reselectElements(); + } + + $axure('*').each(function (obj, elementId) { + if($ax.getParentRepeaterFromElementIdExcludeSelf(elementId)) return; + + $ax.style.updateElementIdImageStyle(elementId); // When image override exists, fix styling/borders + }); + + //$ax.style.startSuspendTextAlignment(); + + // reset all the images only if we're going back to the default view + if(!viewId) { + $axure('*').each(function (diagramObject, elementId) { + if($ax.getParentRepeaterFromElementIdExcludeSelf(elementId)) return; + + $ax.placeholderManager.refreshPlaceholder(elementId); + + var images = diagramObject.images; + if(diagramObject.type == 'horizontalLine' || diagramObject.type == 'verticalLine') { + var startImg = images['start~']; + _setLineImage(elementId + "_start", startImg); + var endImg = images['end~']; + _setLineImage(elementId + "_end", endImg); + var lineImg = images['line~']; + _setLineImage(elementId + "_line", lineImg); + } else if(diagramObject.type == $ax.constants.CONNECTOR_TYPE) { + _setAdaptiveConnectorImages(elementId, images, ''); + } else if(images) { + if (diagramObject.generateCompound) { + + if($ax.style.IsWidgetDisabled(elementId)) { + disabledImage = _getImageWithTag(images, 'disabled~'); + if(disabledImage) $ax.style.applyImage(elementId, disabledImage, 'disabled'); + return; + } + if($ax.style.IsWidgetSelected(elementId)) { + selectedImage = _getImageWithTag(images, 'selected~'); + if(selectedImage) $ax.style.applyImage(elementId, selectedImage, 'selected'); + return; + } + $ax.style.applyImage(elementId, _getImageWithTag(images, 'normal~'), 'normal'); + } else { + if ($ax.style.IsWidgetDisabled(elementId)) { + var disabledImage = _matchImage(elementId, images, [], 'disabled', true); + if (disabledImage) $ax.style.applyImage(elementId, disabledImage, 'disabled'); + return; + } + if ($ax.style.IsWidgetSelected(elementId)) { + var selectedImage = _matchImage(elementId, images, [], 'selected', true); + if (selectedImage) $ax.style.applyImage(elementId, selectedImage, 'selected'); + return; + } + var normalImage = _matchImage(elementId, images, [], 'normal', true); + $ax.style.applyImage(elementId, normalImage, 'normal'); + } + } + + //align all text + var child = $jobj(elementId).children('.text'); + if(child.length) $ax.style.transformTextWithVerticalAlignment(child[0].id, function() { }); + }); + // we have to reset visibility if we aren't applying a new view + $ax.visibility.resetLimboAndHiddenToDefaults(); + $ax.visibility.clearMovedAndResized(); + $ax.repeater.refreshAllRepeaters(); + $ax.dynamicPanelManager.updateParentsOfNonDefaultFitPanels(); + $ax.dynamicPanelManager.updatePercentPanelCache($ax('*')); + } else { + $ax.visibility.clearLimboAndHidden(); + $ax.visibility.clearMovedAndResized(); + _applyView(viewId); + $ax.repeater.refreshAllRepeaters(); + $ax.dynamicPanelManager.updateAllLayerSizeCaches(); + $ax.dynamicPanelManager.updateParentsOfNonDefaultFitPanels(); + } + + $ax.annotation.updateAllFootnotes(); + //$ax.style.resumeSuspendTextAlignment(); + + $ax.adaptive.triggerEvent('viewChanged', {}); + if(_loadFinished) $ax.viewChangePageAndMasters(forceSwitchTo); + }; + + var _getImageWithTag = function(image, tag) { + var flattened = {}; + for (var component in image) { + var componentImage = image[component][tag]; + if(componentImage) flattened[component] = componentImage; + } + return flattened; + } + + // gets the inheritance chain of a particular view. + var _getAdaptiveIdChain = $ax.adaptive.getAdaptiveIdChain = function(viewId) { + if(!viewId) return []; + var view = _idToView[viewId]; + var chain = []; + var current = view; + while(current) { + chain[chain.length] = current.id; + current = _idToView[current.baseViewId]; + } + return chain.reverse(); + }; + + var _getMasterAdaptiveIdChain = $ax.adaptive.getMasterAdaptiveIdChain = function (masterId, viewId) { + if (!viewId) return []; + + var master = $ax.pageData.masters[masterId]; + var masterViews = master.adaptiveViews; + var idToMasterView = {}; + if (masterViews && masterViews.length > 0) { + for (var i = 0; i < masterViews.length; i++) { + var view = masterViews[i]; + idToMasterView[view.id] = view; + } + } + + if (!idToMasterView) return []; + + var view = idToMasterView[viewId]; + var chain = []; + var current = view; + while (current) { + chain[chain.length] = current.id; + current = idToMasterView[current.baseViewId]; + } + return chain.reverse(); + }; + + var _getPageStyle = $ax.adaptive.getPageStyle = function() { + var currentViewId = $ax.adaptive.currentViewId; + var adaptiveChain = _getAdaptiveIdChain(currentViewId); + + var currentStyle = $.extend({}, $ax.pageData.page.style); + for(var i = 0; i < adaptiveChain.length; i++) { + var viewId = adaptiveChain[i]; + $.extend(currentStyle, $ax.pageData.page.adaptiveStyles[viewId]); + } + + return currentStyle; + }; + + var _setAdaptiveLineImages = function(elementId, images, viewIdChain) { + for(var i = viewIdChain.length - 1; i >= 0; i--) { + var viewId = viewIdChain[i]; + var startImg = images['start~' + viewId]; + if(startImg) { + _setLineImage(elementId + "_start", startImg); + var endImg = images['end~' + viewId]; + _setLineImage(elementId + "_end", endImg); + var lineImg = images['line~' + viewId]; + _setLineImage(elementId + "_line", lineImg); + break; + } + } + }; + + var _setAdaptiveConnectorImages = function (elementId, images, view) { + var conn = $jobj(elementId); + var count = conn.children().length-1; // -1 for rich text panel + for(var i = 0; i < count; i++) { + var img = images['' + i + '~' + view]; + $jobj(elementId + '_seg' + i).attr('src', img); + } + }; + + var _applyView = $ax.adaptive.applyView = function(viewId, query) { + var limboIds = {}; + var hiddenIds = {}; + + var jquery; + if(query) { + jquery = query.jQuery(); + jquery = jquery.add(jquery.find('*')); + var jqueryAnn = $ax.annotation.jQueryAnn(query); + jquery = jquery.add(jqueryAnn); + } else { + jquery = $('*').not('#ios-safari-fixed'); + query = $ax('*'); + } + jquery.addClass(viewId); + var viewIdChain = _getAdaptiveIdChain(viewId); + // this could be made more efficient by computing it only once per object + query.each(function(diagramObject, elementId) { + _applyAdaptiveViewOnObject(diagramObject, elementId, viewIdChain, viewId, limboIds, hiddenIds); + }); + + $ax.visibility.addLimboAndHiddenIds(limboIds, hiddenIds, query); + //$ax.dynamicPanelManager.updateAllFitPanelsAndLayerSizeCaches(); + $ax.dynamicPanelManager.updatePercentPanelCache(query); + }; + + var _applyAdaptiveViewOnObject = function(diagramObject, elementId, viewIdChain, viewId, limboIds, hiddenIds) { + var adaptiveChain = []; + for(var i = 0; i < viewIdChain.length; i++) { + var viewId = viewIdChain[i]; + var viewStyle = diagramObject.adaptiveStyles[viewId]; + if(viewStyle) { + adaptiveChain[adaptiveChain.length] = viewStyle; + if (viewStyle.size) $ax.public.fn.convertToSingleImage($jobj(elementId)); + } + } + + var state = $ax.style.generateState(elementId); + + // set the image + var images = diagramObject.images; + if(images) { + if(diagramObject.type == 'horizontalLine' || diagramObject.type == 'verticalLine') { + _setAdaptiveLineImages(elementId, images, viewIdChain); + } else if (diagramObject.type == $ax.constants.CONNECTOR_TYPE) { + _setAdaptiveConnectorImages(elementId, images, viewId); + } else if (diagramObject.generateCompound) { + var compoundUrl = _matchImageCompound(diagramObject, elementId, viewIdChain, state); + if (compoundUrl) $ax.style.applyImage(elementId, compoundUrl, state); + }else { + var imgUrl = _matchImage(elementId, images, viewIdChain, state); + if(imgUrl) $ax.style.applyImage(elementId, imgUrl, state); + } + } + // addaptive override style (not including default style props) + var adaptiveStyle = $ax.style.computeAllOverrides(elementId, undefined, state, viewId); + + // this style INCLUDES the object's my style + var compoundStyle = $.extend({}, diagramObject.style, adaptiveStyle); + + if (diagramObject.owner.type == 'Axure:Master' && diagramObject.adaptiveStyles) { + adaptiveStyle = $ax.style.computeFullStyle(elementId, state, viewId); + } + + if(!diagramObject.isContained) { + $ax.style.setAdaptiveStyle(elementId, adaptiveStyle); + } + + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + if(compoundStyle.limbo && !diagramObject.isContained) limboIds[scriptId] = true; + // sigh, javascript. we need the === here because undefined means not overriden + if(compoundStyle.visible === false) hiddenIds[scriptId] = true; + }; + + var _matchImage = function(id, images, viewIdChain, state, doNotProgress) { + var override = $ax.style.getElementImageOverride(id, state); + if(override) return override; + + if(!images) return undefined; + + var scriptId = $ax.repeater.getScriptIdFromElementId(id); + // first check all the images for this state + for(var i = viewIdChain.length - 1; i >= 0; i--) { + var viewId = viewIdChain[i]; + var img = images[scriptId + "~" + state + "~" + viewId]; + if(!img) img = images[state + "~" + viewId]; + if(img) return img; + } + // check for the default state style + var defaultStateImage = images[scriptId + "~" + state + "~"]; + if(!defaultStateImage) defaultStateImage = images[state + "~"]; + if(defaultStateImage) return defaultStateImage; + + if(doNotProgress) return undefined; + + state = $ax.style.progessState(state); + if (state) return _matchImage(scriptId, images, viewIdChain, state); + + // SHOULD NOT REACH HERE! NORMAL SHOULD ALWAYS CATCH AT THE DEFAULT! + return images['normal~']; // this is the default + }; + + var _matchImageCompound = function(diagramObject, id, viewIdChain, state) { + var images = []; + for(var i = 0; i < diagramObject.compoundChildren.length; i++) { + var component = diagramObject.compoundChildren[i]; + images[component] = _matchImage(id, diagramObject.images[component], viewIdChain, state); + } + return images; + }; + + + + $ax.adaptive.getImageForStateAndView = function(id, state) { + var viewIdChain = _getAdaptiveIdChain($ax.adaptive.currentViewId); + var diagramObject = $ax.getObjectFromElementId(id); + if (diagramObject.generateCompound) return _matchImageCompound(diagramObject, id, viewIdChain, state); + else return _matchImage(id, diagramObject.images, viewIdChain, state); + }; + + var _getAdaptiveView = function(winWidth, winHeight) { + var _isViewOneGreaterThanTwo = function (view1, view2, winHeight) { + if (view1.size.width > view2.size.width) return true; + if (view1.size.width == view2.size.width) { + if (view2.size.height <= winHeight) return view1.size.height > view2.size.height && view1.size.height <= winHeight; + else return view1.size.height < view2.size.height; + } + return false; + }; + + var _isViewOneLessThanTwo = function(view1, view2) { + var width2 = view2.size.width || 1000000; // artificially large number + var height2 = view2.size.height || 1000000; + + var width1 = view1.size.width || 1000000; + var height1 = view1.size.height || 1000000; + + return width1 < width2 || (width1 == width2 && height1 < height2); + }; + + var _isWindowWidthGreaterThanViewWidth = function(view, width) { + return width >= view.size.width; + }; + + var _isWindowWidthLessThanViewWidth = function(view1, width) { + var viewWidth = view1.size.width || 1000000; + + return width <= viewWidth; + }; + + var greater = undefined; + var less = undefined; + + var defaultView = $ax.pageData.defaultAdaptiveView; + if (_isWindowWidthGreaterThanViewWidth(defaultView, winWidth, winHeight)) greater = defaultView; + less = defaultView; + for(var i = 0; i < _enabledViews.length; i++) { + var view = _enabledViews[i]; + if(_isWindowWidthGreaterThanViewWidth(view, winWidth, winHeight)) { + if(!greater || _isViewOneGreaterThanTwo(view, greater, winHeight)) greater = view; + } + if(_isWindowWidthLessThanViewWidth(view, winWidth, winHeight)) { + if(!less || _isViewOneLessThanTwo(view, less)) less = view; + } + } + return greater || less; + }; + + var _isAdaptiveInitialized = function() { + return typeof _idToView != 'undefined'; + }; + + + $ax.messageCenter.addMessageListener(function(message, data) { + //If the adaptive plugin hasn't been initialized yet then + //save the view to load so that it can get set when initialize occurs + if (message == 'switchAdaptiveView') { + if (window.name != 'mainFrame') return; + + var href = window.location.href.split('#')[0]; + var lastSlash = href.lastIndexOf('/'); + href = href.substring(lastSlash + 1); + if(href != data.src) return; + + var view = data.view == 'auto' ? undefined : (data.view == 'default' ? '' : data.view); + + if(!_isAdaptiveInitialized()) { + _initialViewToLoad = view; + } else _handleLoadViewId(view); + } else if (message == 'setAdaptiveViewForSize') { + if (window.name != 'mainFrame') return; + + _autoIsHandledBySidebar = true; + if(!_isAdaptiveInitialized()) { + _initialViewSizeToLoad = data; + } else _handleSetViewForSize(data.width, data.height); + } else if (message == 'getScale') { + if (window.name != 'mainFrame') return; + + var prevScaleN = data.prevScaleN; + var newScaleN = 1; + var contentOriginOffset = 0; + + var $body = $('body'); + $body.css('height', ''); + + if (data.scale != 0) { + var adjustScrollScale = false; + if ($('html').getNiceScroll().length == 0 && !MOBILE_DEVICE && !SAFARI) { + //adding nicescroll so width is correct when getting scale + _addNiceScroll($('html'), { emulatetouch: false, horizrailenabled: false }); + adjustScrollScale = true; + } + if (!MOBILE_DEVICE && SAFARI) _removeNiceScroll($('html')); + + $('html').css('overflow-x', 'hidden'); + + var bodyWidth = $body.width(); + var isCentered = $body.css('position') == 'relative'; + + // screen width does not adjust on screen rotation for iOS (width is always shorter screen measurement) + var isLandscape = window.orientation != 0 && window.orientation != 180; + var mobileWidth = (IOS ? (isLandscape ? window.screen.height : window.screen.width) : window.screen.width) - data.panelWidthOffset; + var scaleN = newScaleN = (MOBILE_DEVICE ? mobileWidth : $(window).width()) / bodyWidth; + + if (data.scale == 2) { + var pageSize = $ax.public.fn.getPageSize(); + var hScaleN = (MOBILE_DEVICE ? data.viewportHeight : $(window).height()) / Math.max(1, pageSize.bottom); + if (hScaleN < scaleN) { + scaleN = newScaleN = hScaleN; + } + if (isCentered) contentOriginOffset = scaleN * (bodyWidth / 2); + } + + if ((SAFARI && IOS) || SHARE_APP) { + var pageSize = $ax.public.fn.getPageSize(); + $body.first().css('height', pageSize.bottom + 'px'); + } //else $body.css('height', $body.height() + 'px'); + + if (adjustScrollScale) { + _removeNiceScroll($('html')); + _addNiceScroll($('html'), { emulatetouch: false, horizrailenabled: false, cursorwidth: Math.ceil(6 / newScaleN) + 'px', cursorborder: 1 / newScaleN + 'px solid #fff', cursorborderradius: 5 / newScaleN + 'px' }); + } + } + var contentScale = { + scaleN: newScaleN, + prevScaleN: prevScaleN, + contentOriginOffset: contentOriginOffset, + clipToView: data.clipToView, + viewportHeight: data.viewportHeight, + viewportWidth: data.viewportWidth, + panelWidthOffset: data.panelWidthOffset, + scale: data.scale + }; + $axure.messageCenter.postMessage('setContentScale', contentScale); + + } else if (message == 'setDeviceMode') { + if (window.name != 'mainFrame') return; + + _isDeviceMode = data.device; + if (data.device) { + // FIXES firefox cursor not staying outside initial device frame border + // SAFARI needs entire content height so that trackpad can be disabled + //if (FIREFOX || (SAFARI && !IOS)) { + // var pageSize = $ax.public.fn.getPageSize(); + // $('html').css('height', pageSize.bottom + 'px'); + //} + + _removeNiceScroll($('html'), true); + if (!MOBILE_DEVICE) { + _addNiceScroll($('html'), { emulatetouch: true, horizrailenabled: false }, true); + $('html').addClass('mobileFrameCursor'); + $('html').css('cursor', 'url(resources/css/images/touch.cur), auto'); + $('html').css('cursor', 'url(resources/css/images/touch.svg) 32 32, auto'); + $('html').css('overflow-x', 'hidden'); + + if (IE) { + document.addEventListener("click", function () { + // IE still sometimes wants an argument here + this.activeElement.releasePointerCapture(); + }, false); + } + + if ($axure.browser.isEdge) { + document.addEventListener("pointerdown", function (e) { + this.activeElement.releasePointerCapture(e.pointerId); + }, false); + } + + $ax.dynamicPanelManager.initMobileScroll(); + } + + // Gives horizontal scroll to android in 100% (handled outside of iframe) + $('html').css('overflow-x', 'hidden'); + $('body').css('margin', '0px'); + $(function () { _setHorizontalScroll(false); }); + } else { + _removeNiceScroll($('html'), true); + $('html').css('overflow-x', ''); + $('html').css('cursor', ''); + //$('html').removeAttr('style'); + $('body').css('margin', ''); + $('html').removeClass('mobileFrameCursor'); + $(function () { _setHorizontalScroll(!data.scaleToWidth); }); + + $ax.dynamicPanelManager.initMobileScroll(); + } + } + }); + + var _isDeviceMode = false; + $ax.adaptive.isDeviceMode = function () { + return _isDeviceMode; + } + + var _removeNiceScroll = $ax.adaptive.removeNiceScroll = function ($container, blockResetScroll) { + if (!blockResetScroll) { + $container.scrollLeft(0); + $container.scrollTop(0); + } + $container.getNiceScroll().remove(); + //clean up nicescroll css + if (IE) $container.css({ '-ms-overflow-y': '', 'overflow-y': '', '-ms-overflow-style': '', '-ms-touch-action': '' }); + } + + var _addNiceScroll = $ax.adaptive.addNiceScroll = function ($container, options, blockResetScroll) { + if (!blockResetScroll) { + $container.scrollLeft(0); + $container.scrollTop(0); + } + $container.niceScroll(options); + //clean up nicescroll css so child scroll containers show scrollbars in IE + if (IE) $container.css({ '-ms-overflow-y': '', '-ms-overflow-style': '' }); + if(IOS) $container.css({ 'overflow-y': ''}); + } + + + $ax.adaptive.updateMobileScrollOnBody = function () { + var niceScroll = $('html').getNiceScroll(); + if (niceScroll.length == 0) return; + niceScroll.resize(); + } + + var _setTrackpadHorizontalScroll = function (active) { + var preventScroll = function (e) { + if (Math.abs(e.wheelDeltaX) != 0) { + e.preventDefault(); + } + } + + if (!active) { + document.body.addEventListener("mousewheel", preventScroll, { passive: false }); + document.getElementById('html').addEventListener("mousewheel", preventScroll, { passive: false }); + } else { + document.body.removeEventListener("mousewheel", preventScroll, { passive: false }); + document.getElementById('html').removeEventListener("mousewheel", preventScroll, { passive: false }); + } + } + + var _setHorizontalScroll = function (active) { + var $body = $(document); + if (!active) { + $body.bind('scroll', function () { + if ($body.scrollLeft() !== 0) { + $body.scrollLeft(0); + } + }); + } else { + $body.unbind('scroll'); + } + } + + $ax.adaptive.setAdaptiveView = function(view) { + var viewIdForSitemapToUnderstand = view == 'auto' ? undefined : (view == 'default' ? '' : view); + + if(!_isAdaptiveInitialized()) { + _initialViewToLoad = viewIdForSitemapToUnderstand; + } else _handleLoadViewId(viewIdForSitemapToUnderstand); + }; + + $ax.adaptive.initialize = function() { + _views = $ax.pageData.adaptiveViews; + _idToView = {}; + + var useViews = $ax.document.configuration.useViews; + + if(_views && _views.length > 0) { + for(var i = 0; i < _views.length; i++) { + var view = _views[i]; + _idToView[view.id] = view; + if(useViews) _enabledViews[_enabledViews.length] = view; + } + + if(_autoIsHandledBySidebar && _initialViewSizeToLoad) _handleSetViewForSize(_initialViewSizeToLoad.width, _initialViewSizeToLoad.height); + else _handleLoadViewId(_initialViewToLoad); + } + + $axure.resize(function(e) { + _handleResize(); + $ax.postResize(e); //window resize fires after view changed + }); + }; + + var _handleLoadViewId = function (loadViewId, forceSwitchTo) { + if(typeof loadViewId != 'undefined') { + _setAuto(false); + _switchView(loadViewId != 'default' ? loadViewId : '', forceSwitchTo); + } else { + _setAuto(true); + _handleResize(forceSwitchTo); + } + }; + + var _handleSetViewForSize = function (width, height) { + var toView = _getAdaptiveView(width, height); + var toViewId = toView && toView.id; + _switchView(toViewId, "auto"); + }; + + $ax.adaptive.getSketchKey = function() { + return $ax.pageData.sketchKeys[$ax.adaptive.currentViewId || '']; + } +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/annotation.js b/code/page/resources/scripts/axure/annotation.js new file mode 100644 index 0000000..d71dd25 --- /dev/null +++ b/code/page/resources/scripts/axure/annotation.js @@ -0,0 +1,161 @@ +// ******* Annotation MANAGER ******** // +$axure.internal(function($ax) { + var NOTE_SIZE = 10; + + var _annotationManager = $ax.annotation = {}; + + var _updateLinkLocations = $ax.annotation.updateLinkLocations = function(elementId) { + var textId = $ax.GetTextPanelId(elementId); + if(!textId) return; + + var rotation = $ax.getObjectFromElementId(elementId).style.rotation; + //we have to do this because webkit reports the post-transform position but when you set positions it's pre-transform + if(WEBKIT && rotation) { + //we can dynamiclly rotate a widget now, show need to remember the transform rather than just remove it + //here jquery.css will return 'none' if element is display none + var oldShapeTransform = document.getElementById(elementId).style['-webkit-transform']; + var oldTextTransform = document.getElementById(textId).style['-webkit-transform']; + $('#' + elementId).css('-webkit-transform', 'scale(1)'); + $('#' + textId).css('-webkit-transform', 'scale(1)'); + } + + $('#' + textId).find('div[id$="_ann"]').each(function(index, value) { + var elementId = value.id.replace('_ann', ''); + var $link = $('#' + elementId); + var annPos = $link.position(); + annPos.left += $link.width(); + //var annPos = $(value).position(); + var left = annPos.left;// - NOTE_SIZE; + var top = annPos.top - 5; + + $(value).css('left', left).css('top', top); + }); + + //undo the transform reset + if(WEBKIT && rotation) { + $('#' + elementId).css('-webkit-transform', oldShapeTransform || ''); + $('#' + textId).css('-webkit-transform', oldTextTransform || ''); + } + }; + + var _toggleAnnotationDialog = function (elementId, event) { + var win = $(window); + var scrollY = win.scrollTop(); + var scrollX = win.scrollLeft(); + + var messageData = { id: elementId, x: event.pageX - scrollX, y: event.pageY - scrollY } + if (window.name != 'mainFrame') messageData.page = $ax.pageData.notesData; + $ax.messageCenter.postMessage('toggleAnnDialog', messageData); + } + + $ax.annotation.initialize = function () { + _createFootnotes($ax('*'), true); + } + + var _createFootnotes = $ax.annotation.createFootnotes = function(query, create) { + if(!$ax.document.configuration.showAnnotations) return; + + var widgetNotes = $ax.pageData.notesData.widgetNotes; + if (widgetNotes) { + var ownerToFns = $ax.pageData.notesData.ownerToFns; + if(!$.isEmptyObject(ownerToFns)) { + query.each(function(dObj, elementId) { + var fns = ownerToFns[dObj.id]; + if (fns !== undefined) { + var elementIdQuery = $('#' + elementId); + if (dObj.type == 'hyperlink') { + var parentId = $ax.GetParentIdFromLink(elementId); + if (create) { + elementIdQuery.after("
      "); + appendFns($('#' + elementId + "_ann"), fns); + } + _updateLinkLocations(parentId); + } else { + if (create) { + elementIdQuery.after("
      "); + appendFns($('#' + elementId + "_ann"), fns); + } + _adjustIconLocation(elementId, dObj); + } + + if (create) { + $('#' + elementId + "_ann").click(function (e) { + _toggleAnnotationDialog(dObj.id, e); + return false; + }); + + var isVisible = true; + var isMaster = $ax.public.fn.IsReferenceDiagramObject(dObj.type); + if (isMaster) isVisible = dObj.visible; + else isVisible = $ax.visibility.IsIdVisible(elementId); + if (!isVisible) { + var ann = document.getElementById(elementId + "_ann"); + if (ann) $ax.visibility.SetVisible(ann, false); + } + } + } + }); + } + } + + function appendFns($parent, fns) { + for (var index = 0; index < fns.length; index++) { + $parent.append("
      " + fns[index] + "
      "); + } + } + }; + + $ax.annotation.updateAllFootnotes = function () { + _createFootnotes($ax('*'), false); + } + + $ax.annotation.jQueryAnn = function(query) { + var elementIds = []; + query.each(function(diagramObject, elementId) { + if(diagramObject.annotation) elementIds[elementIds.length] = elementId; + }); + var elementIdSelectors = jQuery.map(elementIds, function(elementId) { return '#' + elementId + '_ann'; }); + var jQuerySelectorText = (elementIdSelectors.length > 0) ? elementIdSelectors.join(', ') : ''; + return $(jQuerySelectorText); + }; + + $(window.document).ready(function() { + //$ax.annotation.InitializeAnnotations($ax(function(dObj) { return dObj.annotation; })); + + $ax.messageCenter.addMessageListener(function(message, data) { + //If the annotations are being hidden via the Sitemap toggle button, hide any open dialogs + if(message == 'annotationToggle') { + if (data == true) { + $('div.annnote').show(); + } else { + $('div.annnote').hide(); + } + } + }); + }); + + //adjust annotation location to a element's top right corner + var _adjustIconLocation = $ax.annotation.adjustIconLocation = function(id, dObj) { + var ann = document.getElementById(id + "_ann"); + if(ann) { + var corners = $ax.public.fn.getCornersFromComponent(id); + var width = $(ann).width(); + var newTopRight = $ax.public.fn.vectorPlus(corners.relativeTopRight, corners.centerPoint); + //note size is 14x8, this is how rp calculated it as well + ann.style.left = (newTopRight.x - width) + "px"; + + var elementType = dObj ? dObj.type : $ax.getTypeFromElementId(id); + var yOffset = $ax.public.fn.IsTableCell(elementType) ? 0 : -8; + ann.style.top = (newTopRight.y + yOffset) + "px"; + } + + var ref = document.getElementById(id + "_ref"); + if(ref) { + if(!corners) corners = $ax.public.fn.getCornersFromComponent(id); + var newBottomRight = $ax.public.fn.vectorPlus(corners.relativeBottomRight, corners.centerPoint); + + ref.style.left = (newBottomRight.x - 8) + 'px'; + ref.style.top = (newBottomRight.y - 10) + 'px'; + } + } +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/axQuery.js b/code/page/resources/scripts/axure/axQuery.js new file mode 100644 index 0000000..7fbfe34 --- /dev/null +++ b/code/page/resources/scripts/axure/axQuery.js @@ -0,0 +1,404 @@ +$axure = function(query) { + return $axure.query(query); +}; + +// ******* AxQuery and Page metadata ******** // +(function() { + var $ax = function() { + var returnVal = $axure.apply(this, arguments); + var axFn = $ax.fn; + for (var key in axFn) { + returnVal[key] = axFn[key]; + } + + return returnVal; + }; + + $ax.public = $axure; + $ax.fn = {}; + + $axure.internal = function(initFunction) { + //Attach messagecenter to $ax object so that it can be used in viewer.js, etc in internal scope + if(!$ax.messageCenter) $ax.messageCenter = $axure.messageCenter; + + return initFunction($ax); + }; + + var _lastFiredResize = 0; + var _resizeFunctions = []; + var _lastTimeout; + var _fireResize = function() { + if (_lastTimeout) window.clearTimeout(_lastTimeout); + _lastTimeout = undefined; + _lastFiredResize = new Date().getTime(); + for(var i = 0; i < _resizeFunctions.length; i++) _resizeFunctions[i](); + }; + + $axure.resize = function(fn) { + if(fn) _resizeFunctions[_resizeFunctions.length] = fn; + else $(window).resize(); + }; + + $(window).resize(function() { + var THRESHOLD = 50; + var now = new Date().getTime(); + if(now - _lastFiredResize > THRESHOLD) { + _updateWindowInfo(); + _fireResize(); + } else if(!_lastTimeout) { + _lastTimeout = window.setTimeout(_fireResize, THRESHOLD); + } + }); + + $(window).scroll(function () { + _updateWindowInfo(); + }); + + var _windowInfo; + var _updateWindowInfo = $axure.updateWindowInfo = function () { + var win = {}; + var jWin = $(window); + var scrollWin = $('#ios-safari-html').length > 0 ? $('#ios-safari-html') : jWin; + win.width = jWin.width(); + win.height = jWin.height(); + win.scrollx = scrollWin.scrollLeft(); + win.scrolly = scrollWin.scrollTop(); + _windowInfo = win; + }; + $ax.getWindowInfo = function () { + if(!_windowInfo) _updateWindowInfo(); + return _windowInfo; + }; + + + window.$obj = function(id) { + return $ax.getObjectFromElementId(id); + }; + + window.$id = function(obj) { + return obj.scriptIds[0]; + }; + + window.$jobj = function(id) { + return $(document.getElementById(id)); + }; + + window.$jobjAll = function(id) { + return $addAll($jobj(id), id); + }; + + window.$addAll = function(jobj, id) { + return jobj.add($jobj(id + '_ann')).add($jobj(id + '_ref')); + }; + + $ax.INPUT = function(id) { return id + "_input"; }; + $ax.IsImageFocusable = function (type) { return $ax.public.fn.IsImageBox(type) || $ax.public.fn.IsVector(type) || $ax.public.fn.IsTreeNodeObject(type) || $ax.public.fn.IsTableCell(type); }; + $ax.IsTreeNodeObject = function (type) { return $ax.public.fn.IsTreeNodeObject(type); }; + $ax.IsSelectionButton = function (type) { return $ax.public.fn.IsCheckBox(type) || $ax.public.fn.IsRadioButton(type); }; + + var _fn = {}; + $axure.fn = _fn; + $axure.fn.jQuery = function() { + var elements = this.getElements(); + return $(elements); + }; + $axure.fn.$ = $axure.fn.jQuery; + + var _query = function(query, queryArg) { + var returnVal = {}; + var _axQueryObject = returnVal.query = { }; + _axQueryObject.filterFunctions = []; + + if (query == '*') { + _axQueryObject.filterFunctions[0] = function() { return true; }; + } else if (typeof(query) === 'function') { + _axQueryObject.filterFunctions[0] = query; + } else { + var firstString = $.trim(query.toString()); + if (firstString.charAt(0) == '@') { + _axQueryObject.filterFunctions[0] = function(diagramObject) { + return diagramObject.label == firstString.substring(1); + }; + } else if (firstString.charAt(0) == '#') { + _axQueryObject.elementId = firstString.substring(1); + } else { + if (firstString == 'label') { + _axQueryObject.filterFunctions[0] = function(diagramObject) { + return queryArg instanceof Array && queryArg.indexOf(diagramObject.label) > 0 || + queryArg instanceof RegExp && queryArg.test(diagramObject.label) || + diagramObject.label == queryArg; + }; + } else if(firstString == 'elementId') { + _axQueryObject.filterFunctions[0] = function(diagramObject, elementId) { + return queryArg instanceof Array && queryArg.indexOf(elementId) > 0 || + elementId == queryArg; + }; + } + } + } + + var axureFn = $axure.fn; + for (var key in axureFn) { + returnVal[key] = axureFn[key]; + } + return returnVal; + }; + $axure.query = _query; + + var _getFilterFnFromQuery = function(query) { + var filter = function(diagramObject, elementId) { + // Non diagram objects are allowed to be queryed, such as text inputs. + if (diagramObject && !$ax.public.fn.IsReferenceDiagramObject(diagramObject.type) && !document.getElementById(elementId)) return false; + var retVal = true; + for(var i = 0; i < query.filterFunctions.length && retVal; i++) { + retVal = query.filterFunctions[i](diagramObject, elementId); + } + return retVal; + }; + return filter; + }; + + $ax.public.fn.filter = function(query, queryArg) { + var returnVal = _query(query, queryArg); + + if(this.query.elementId) returnVal.query.elementId = this.query.elementId; + + //If there is already a function, offset by 1 when copying other functions over. + var offset = returnVal.query.filterFunctions[0] ? 1 : 0; + + //Copy all functions over to new array. + for(var i = 0; i < this.query.filterFunctions.length; i++) returnVal.query.filterFunctions[i+offset] = this.query.filterFunctions[i]; + + //Functions are in reverse order now + returnVal.query.filterFunctions.reverse(); + + return returnVal; + }; + + $ax.public.fn.each = function(fn) { + var filter = _getFilterFnFromQuery(this.query); + var elementIds = this.query.elementId ? [this.query.elementId] : $ax.getAllElementIds(); + for (var i = 0; i < elementIds.length; i++) { + var elementId = elementIds[i]; + var diagramObject = $ax.getObjectFromElementId(elementId); + if (filter(diagramObject, elementId)) { + fn.apply(diagramObject, [diagramObject, elementId]); + } + } + }; + + $ax.public.fn.getElements = function() { + var elements = []; + this.each(function(dObj, elementId) { + var elementById = document.getElementById(elementId); + if(elementById) elements[elements.length] = elementById; + }); + return elements; + }; + + $ax.public.fn.getElementIds = function() { + var elementIds = []; + this.each(function(dObj, elementId) { elementIds[elementIds.length] = elementId; }); + return elementIds; + }; + + // Deep means to keep getting parents parent until at the root parent. Parent is then an array instead of an id. + // Filter options: layer, rdo, repeater, item, dynamicPanel, state + $ax.public.fn.getParents = function (deep, filter) { + if(filter == '*') filter = ['layer', 'rdo', 'repeater', 'item', 'dynamicPanel', 'state']; + var elementIds = this.getElementIds(); + var parentIds = []; + + var getParent = function(elementId) { + var containerIndex = elementId.indexOf('_container'); + if(containerIndex !== -1) elementId = elementId.substring(0, containerIndex); + if(elementId.indexOf('_text') !== -1) elementId = $ax.GetShapeIdFromText(elementId); + + // Check repeater item before layer, because repeater item detects it's parent layer, but wants to go directly to it's repeater first. + // if repeater item, then just return repeater + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + var itemNum = $ax.repeater.getItemIdFromElementId(elementId); + var parentRepeater = $ax.getParentRepeaterFromScriptId(scriptId); + + // scriptId is item or repeater itself + if (parentRepeater == scriptId) { + // If you are repeater item, return your repeater + if (itemNum) return filter.indexOf('repeater') != -1 ? scriptId : getParent(scriptId); + // Otherwise you are actually at repeater, clean parentRepeater, or else you loop + parentRepeater = undefined; + } + + // Layer only references it if it is a direct layer to it + var parent = $ax.getLayerParentFromElementId(elementId); + // If layer is allowed we found parent, otherwise ignore and keep climbing + if (parent) return filter.indexOf('layer') != -1 ? parent : getParent(parent); + + // if state, then just return panel + if(scriptId.indexOf('_state') != -1) { + var panelId = $ax.repeater.createElementId(scriptId.split('_')[0], itemNum); + // If dynamic panel is allowed we found parent, otherwise ignore and keep climbing + return filter.indexOf('dynamicPanel') != -1 ? panelId : getParent(panelId); + } + + var parentType = ''; + if(parentRepeater) { + parentType = 'item'; + parent = $ax.repeater.createElementId(parentRepeater, itemNum); + } + + var masterPath = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(elementId)); + masterPath.pop(); + if(masterPath.length > 0) { + var masterId = $ax.getElementIdFromPath(masterPath, { itemNum: itemNum }, true); + if(!masterId) return undefined; + var masterRepeater = $ax.getParentRepeaterFromElementId($ax.repeater.getScriptIdFromElementId(masterId)); + if(!parentRepeater || masterRepeater) { + parentType = 'rdo'; + parent = masterId; + } + } + + var obj = $obj(elementId); + var parentDynamicPanel = obj.parentDynamicPanel; + if(parentDynamicPanel) { + // Make sure the parent if not parentRepeater, or dynamic panel is also in that repeater + // If there is a parent master, the dynamic panel must be in it, otherwise parentDynamicPanel would be undefined. + var panelPath = masterPath; + panelPath[panelPath.length] = parentDynamicPanel; + panelId = $ax.getElementIdFromPath(panelPath, { itemNum: itemNum }, true); + if(!panelId) return undefined; + var panelRepeater = $ax.getParentRepeaterFromElementId(panelId); + if(!parentRepeater || panelRepeater) { + parentType = 'state'; + parent = panelId + '_state' + obj.panelIndex; + } + } + + // If at top or parent type is desired, then return parent, otherwise keep climbing + return !parent || filter.indexOf(parentType) != -1 ? parent : getParent(parent); + }; + + for(var i = 0; i < elementIds.length; i++) { + var parent = getParent(elementIds[i]); + if(deep) { + var parents = []; + while(parent) { + parents[parents.length] = parent; + // If id is not a valid object, you are either repeater item or dynamic panel state + //if(!$obj(parent)) parent = $ax.visibility.getWidgetFromContainer($jobj(parent).parent().attr('id')); + + parent = getParent(parent); + } + parent = parents; + } + parentIds[parentIds.length] = parent; + } + return parentIds; + }; + + // Get the path to the child, where non leaf nodes can be masters, layers, dynamic panels, and repeaters. + $ax.public.fn.getChildren = function(deep, ignoreUnplaced) { // ignoreUnplaced should probably be the default, but when that is done a full audit of usages should be done + var elementIds = this.getElementIds(); + var children = []; + + var getChildren = function (elementId) { + var obj = $obj(elementId); + //if(!obj) return undefined; + + var isRepeater = obj && obj.type == $ax.constants.REPEATER_TYPE; + if (isRepeater && $ax.repeater.getScriptIdFromElementId(elementId) != elementId) { + //prevent repeater items from being marked as isRepeater + //TODO: evaluate changing the naming convention to be more like panel states which don't seem to have this problem + obj = undefined; + isRepeater = false; + } + var isDynamicPanel = obj && obj.type == $ax.constants.DYNAMIC_PANEL_TYPE; + //var isLayer = obj.type == $ax.constants.LAYER_TYPE; + //var isMaster = obj.type == $ax.constants.MASTER_TYPE || obj.type == $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE; + + var isMenu = obj && obj.type == $ax.constants.MENU_OBJECT_TYPE; + var isTreeNode = obj && obj.type == $ax.constants.TREE_NODE_OBJECT_TYPE; + //var isTable = obj.type == $ax.constants.TABLE_TYPE; + //var isCompoundVector = obj.type == $ax.constants.VECTOR_SHAPE_TYPE && obj.generateCompound; + + //if (isRepeater || isDynamicPanel || isLayer || isMaster || isMenu || isTreeNode || isTable) {// || isCompoundVector) { + // Find parent that children should be pulled from. Default is just the elementId query (used by table and master) + var parent = $jobj(elementId); + if(isRepeater) { + parent = $(); + var itemIds = $ax.getItemIdsForRepeater(elementId); + for(var itemIndex = 0; itemIndex < itemIds.length; itemIndex++) parent = parent.add($jobj($ax.repeater.createElementId(elementId, itemIds[itemIndex]))); + } else if(isDynamicPanel) { + // Really only need to do active state probably... + parent = $jobj(elementId).children(); + // Get through all containers + while ($(parent[0]).attr('id').indexOf('container') != -1) parent = parent.children(); + // Now at states, but want states content + parent = parent.children(); + } else if(isTreeNode) parent = $jobj($ax.repeater.applySuffixToElementId(elementId, '_children')); + + // Menu doesn't want all children, only tables and menus, so it must be handled specially + var children = isMenu ? parent.children('.ax_table').add(parent.children('.ax_menu')) : parent.children(); + children = $ax.visibility.getRealChildren(_fixForBasicLinks(children)); + + // For tree nodes you want the the button shape contained by the elementQuery too + if(isTreeNode) { + var treeNodeChildren = $jobj(elementId).children(); + for(var treeNodeIndex = 0; treeNodeIndex < treeNodeChildren.length; treeNodeIndex++) { + var treeNodeChild = $(treeNodeChildren[treeNodeIndex]); + var childObj = $obj(treeNodeChild.attr('id')); + if (childObj && $ax.public.fn.IsVector(childObj.type)) children = children.add(treeNodeChild); + } + } + + + var childrenIds = []; + for(var childIndex = 0; childIndex < children.length; childIndex++) { + var childObj = $(children[childIndex]); + var id = childObj.attr('id'); + if(typeof(id) == 'undefined' && childObj.is('a')) id = $(childObj.children()[0]).attr('id'); + // Ignore annotations and any other children that are not elements + if (id.split('_').length > 1) continue; + // Ignore Unplaced + if(ignoreUnplaced && $ax.visibility.isScriptIdLimbo($ax.repeater.getScriptIdFromElementId(id))) continue; + childrenIds.push(id); + } + + if(deep) { + var childObjs = []; + for(var i = 0; i < childrenIds.length; i++) { + var childId = childrenIds[i]; + childObjs[i] = { id: childId, children: getChildren(childId) }; + } + childrenIds = childObjs; + } + + return childrenIds; + //} + + //return undefined; + }; + + for(var i = 0; i < elementIds.length; i++) { + var elementId = elementIds[i]; + //if the state is passed in, look for children in the content element + if (elementId.indexOf('_state') > -1 && elementId.indexOf('_content') < 0) elementId = elementId + '_content'; + children[children.length] = { id: elementId, children: getChildren(elementId)}; + } + return children; + }; + + var _fixForBasicLinks = function(query) { + var hasBasicLinks = query.filter('.basiclink').length > 0; + if(!hasBasicLinks) return query; + + var retval = $(); + for(var i = 0; i < query.length; i++) { + var child = $(query[i]); + if(child.hasClass('basiclink')) retval = retval.add(child.children()); + else retval = retval.add(child); + } + return retval; + }; + +})(); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/axQuery.std.js b/code/page/resources/scripts/axure/axQuery.std.js new file mode 100644 index 0000000..5be1d28 --- /dev/null +++ b/code/page/resources/scripts/axure/axQuery.std.js @@ -0,0 +1,1806 @@ +// ******* AxQuery Plugins ******** // + +$axure.internal(function($ax) { + $ax.constants = {}; + + $ax.constants.TABLE_TYPE = 'table'; + $ax.constants.MENU_OBJECT_TYPE = 'menuObject'; + $ax.constants.MASTER_TYPE = 'master'; + $ax.constants.PAGE_TYPE = 'page'; + $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE = 'referenceDiagramObject'; + $ax.constants.REPEATER_TYPE = 'repeater'; + $ax.constants.DYNAMIC_PANEL_TYPE = 'dynamicPanel'; + $ax.constants.LAYER_TYPE = 'layer'; + $ax.constants.TEXT_BOX_TYPE = 'textBox'; + $ax.constants.TEXT_AREA_TYPE = 'textArea'; + $ax.constants.LIST_BOX_TYPE = 'listBox'; + $ax.constants.COMBO_BOX_TYPE = 'comboBox'; + $ax.constants.CHECK_BOX_TYPE = 'checkbox'; + $ax.constants.RADIO_BUTTON_TYPE = 'radioButton'; + $ax.constants.BUTTON_TYPE = 'button'; //html button + $ax.constants.IMAGE_MAP_REGION_TYPE = 'imageMapRegion'; + $ax.constants.IMAGE_BOX_TYPE = 'imageBox'; + $ax.constants.VECTOR_SHAPE_TYPE = 'vectorShape'; + $ax.constants.SNAPSHOT_TYPE = 'screenshot'; + $ax.constants.TREE_NODE_OBJECT_TYPE = 'treeNodeObject'; + $ax.constants.TABLE_CELL_TYPE = 'tableCell'; + $ax.constants.VERTICAL_LINE_TYPE = 'verticalLine'; + $ax.constants.HORIZONTAL_LINE_TYPE = 'horizontalLine'; + $ax.constants.INLINE_FRAME_TYPE = 'inlineFrame'; + $ax.constants.CONNECTOR_TYPE = 'connector'; + $ax.constants.ALL_TYPE = '*'; + + $ax.constants.TEXT_TYPE = 'richTextPanel'; + $ax.constants.LINK_TYPE = 'hyperlink'; + + // TODO: Need solid passo f this. Constants should be able to bemade local, may need some public lists or something. + // public.fn function should take not arg and use this. May need some $ax.IsType fuctions that will take a type arg and be static + $ax.public.fn.IsTable = function (type) { return type == $ax.constants.TABLE_TYPE; } + $ax.public.fn.IsMenuObject = function (type) { return type == $ax.constants.MENU_OBJECT_TYPE; } + $ax.public.fn.IsMaster = function (type) { return type == $ax.constants.MASTER_TYPE; } + $ax.public.fn.IsPage = function (type) { return type == $ax.constants.PAGE_TYPE; } + $ax.public.fn.IsReferenceDiagramObject = function (type) { return type == $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE; } + $ax.public.fn.IsRepeater = function (type) { return type == $ax.constants.REPEATER_TYPE; } + $ax.public.fn.IsDynamicPanel = $ax.IsDynamicPanel = function (type) { return type == $ax.constants.DYNAMIC_PANEL_TYPE; } + $ax.public.fn.IsLayer = $ax.IsLayer = function (type) { return type == $ax.constants.LAYER_TYPE; } + $ax.public.fn.IsTextBox = function (type) { return type == $ax.constants.TEXT_BOX_TYPE; } + $ax.public.fn.IsTextArea = function (type) { return type == $ax.constants.TEXT_AREA_TYPE; } + $ax.public.fn.IsListBox = function (type) { return type == $ax.constants.LIST_BOX_TYPE; } + $ax.public.fn.IsComboBox = function (type) { return type == $ax.constants.COMBO_BOX_TYPE; } + $ax.public.fn.IsCheckBox = function (type) { return type == $ax.constants.CHECK_BOX_TYPE; } + $ax.public.fn.IsRadioButton = function (type) { return type == $ax.constants.RADIO_BUTTON_TYPE; } + $ax.public.fn.IsButton = function (type) { return type == $ax.constants.BUTTON_TYPE; } + $ax.public.fn.IsIamgeMapRegion = function (type) { return type == $ax.constants.IMAGE_MAP_REGION_TYPE; } + $ax.public.fn.IsImageBox = function (type) { return type == $ax.constants.IMAGE_BOX_TYPE; } + $ax.public.fn.IsVector = function (type) { return type == $ax.constants.VECTOR_SHAPE_TYPE; } + $ax.public.fn.IsSnapshot = function (type) { return type == $ax.constants.SNAPSHOT_TYPE; } + $ax.public.fn.IsTreeNodeObject = function (type) { return type == $ax.constants.TREE_NODE_OBJECT_TYPE; } + $ax.public.fn.IsTableCell = function (type) { return type == $ax.constants.TABLE_CELL_TYPE; } + $ax.public.fn.IsInlineFrame = function (type) { return type == $ax.constants.INLINE_FRAME_TYPE; } + $ax.public.fn.IsConnector = function (type) { return type == $ax.constants.CONNECTOR_TYPE; } + $ax.public.fn.IsContainer = function (type) { return type== $ax.constants.VECTOR_SHAPE_TYPE || type == $ax.constants.TABLE_TYPE || type == $ax.constants.MENU_OBJECT_TYPE || type == $ax.constants.TREE_NODE_OBJECT_TYPE; } + + var PLAIN_TEXT_TYPES = [$ax.constants.TEXT_BOX_TYPE, $ax.constants.TEXT_AREA_TYPE, $ax.constants.LIST_BOX_TYPE, + $ax.constants.COMBO_BOX_TYPE, $ax.constants.CHECK_BOX_TYPE, $ax.constants.RADIO_BUTTON_TYPE, $ax.constants.BUTTON_TYPE]; + + $ax.public.fn.IsResizable = function (type) { return $.inArray(type, RESIZABLE_TYPES) !== -1; } + var RESIZABLE_TYPES = [ + $ax.constants.BUTTON_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE, $ax.constants.IMAGE_BOX_TYPE, $ax.constants.IMAGE_MAP_REGION_TYPE, + $ax.constants.INLINE_FRAME_TYPE, $ax.constants.LAYER_TYPE, $ax.constants.LIST_BOX_TYPE, $ax.constants.COMBO_BOX_TYPE, + $ax.constants.VECTOR_SHAPE_TYPE, $ax.constants.TEXT_AREA_TYPE, $ax.constants.TEXT_BOX_TYPE, $ax.constants.SNAPSHOT_TYPE + ]; + + $ax.public.fn.SupportsRichText = function() { + var obj = $obj(this.getElementIds()[0]); + // Catch root tree nodes as they are not supported. + if(obj.type == $ax.constants.TREE_NODE_OBJECT_TYPE) return obj.friendlyType == 'Tree Node'; + // Do the same for tree node icons maybe? + + return $.inArray(obj.type, SUPPORTS_RICH_TEXT_TYPES) != -1; + } + var SUPPORTS_RICH_TEXT_TYPES = [$ax.constants.CHECK_BOX_TYPE, $ax.constants.RADIO_BUTTON_TYPE, + $ax.constants.IMAGE_BOX_TYPE, $ax.constants.VECTOR_SHAPE_TYPE, $ax.constants.TABLE_CELL_TYPE, $ax.constants.CONNECTOR_TYPE]; + + var _addJQueryFunction = function(name) { + $ax.public.fn[name] = function() { + var val = $.fn[name].apply(this.jQuery(), arguments); + return arguments[0] ? this : val; + }; + }; + var _jQueryFunctionsToAdd = ['text', 'val', 'css']; + for (var jqueryFunctionIndex = 0; jqueryFunctionIndex < _jQueryFunctionsToAdd.length; jqueryFunctionIndex++) _addJQueryFunction(_jQueryFunctionsToAdd[jqueryFunctionIndex]); + + + // var _addJQueryEventFunction = function(name) { + // $ax.public.fn[name] = function() { + // $.fn[name].apply(this.jQuery(), arguments); + // return this; + // }; + // }; + + // var _addJQueryEventFunction = function(name) { + // $ax.public.fn[name] = (function(nn) { + // return function() { + // $.fn[nn].apply(this.jQuery(), arguments); + // return this; + // }; + // })(name); + // }; + + var _addJQueryEventFunction = function(name) { + $ax.public.fn[name] = function() { + //With Martin - No idea why this is necessary. We tried encapsulating the function thinking it was related to closure (above), + //but that didn't fix the problem. If we don't add this Repeaters will give "Uncaught TypeError: Object # has no method 'apply'" + //here (but Indeterminately, often on larger/slower Repeaters) because it is Undefined. However it seems the catch is never hit + //if we surround the statement with the try/catch. Perhaps the try/catch block creates a scope or closure. + try { + $.fn[name].apply(this.jQuery(), arguments); + } catch(e) { + console.log("Couldn't find the event: " + name); + } + + return this; + }; + }; + var _jQueryEventFunctionsToAdd = ['click', 'mouseenter', 'mouseleave', 'bind']; + for(var jqueryEventIndex = 0; jqueryEventIndex < _jQueryEventFunctionsToAdd.length; jqueryEventIndex++) _addJQueryEventFunction(_jQueryEventFunctionsToAdd[jqueryEventIndex]); + + + $ax.public.fn.openLink = function(url, includeVariables) { + this.jQuery().each(function() { + if(!($(this).is('iframe'))) { + return; + } + + var objIframe = $(this).get(0); + + $ax.navigate({ + url: url, + target: "frame", + includeVariables: includeVariables, + frame: objIframe + }); + }); + + return this; + }; + + $ax.public.fn.SetPanelState = function(stateNumber, options, showWhenSet) { + + var animateInInfo = _getAnimateInfo(options && options.animateIn, 500); + var animateOutInfo = _getAnimateInfo(options && options.animateOut, 500); + + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + if ($ax.public.fn.IsDynamicPanel($ax.getTypeFromElementId(elementId))) { + var stateName = $ax.visibility.GetPanelStateId(elementId, Number(stateNumber) - 1); + var wasVisible = $ax.visibility.IsIdVisible(elementId); + // If compressing because you are fit to content and the change of state may change size, must be before the change. + if(options.compress && $ax.dynamicPanelManager.isIdFitToContent(elementId) && wasVisible) { + $ax.dynamicPanelManager.compressDelta(elementId, $ax.visibility.GetPanelState(elementId), stateName, options.vertical, options.compressEasing, options.compressDuration); + } + $ax.visibility.SetPanelState(elementId, stateName, animateOutInfo.easingType, animateOutInfo.direction, animateOutInfo.duration, + animateInInfo.easingType, animateInInfo.direction, animateInInfo.duration, showWhenSet); + // If compressing because of a show, must be after state is set. + if(options.compress && !wasVisible && showWhenSet) { + $ax.dynamicPanelManager.compressToggle(elementId, options.vertical, true, options.compressEasing, options.compressDuration); + } + } + } + + return this; + }; + + $ax.public.fn.show = function(options, eventInfo) { + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + + var lightboxId = $ax.repeater.applySuffixToElementId(elementId, '_lightbox'); + var lightbox = $jobj(lightboxId); + if(options && options.showType == 'lightbox') { + $ax.flyoutManager.unregisterPanel(elementId, true); + // Add lightbox if there isn't one + if(lightbox.length == 0) { + lightbox = $('
      '); + lightbox.attr('id', lightboxId); + var color = 'rgb(' + options.lightbox.r + ',' + options.lightbox.g + ',' + options.lightbox.b + ')'; + lightbox.css({ + position: 'fixed', + left: '0px', + top: '0px', + width: '10000px', + height: '10000px', + 'background-color': color, + opacity: options.lightbox.a / 255 + }); + + var parents = $ax('#' + elementId).getParents(true, ['dynamicPanel'])[0]; + var fixedParentPanelId = undefined; + for(var j = 0; j < parents.length; j++) { + var parentId = parents[j]; + if($jobj(parentId).css('z-index') != 'auto' || $ax.features.supports.mobile) { + fixedParentPanelId = parents[j]; + break; + } + } + + if(!fixedParentPanelId) $('#base').append(lightbox); + else $jobj(fixedParentPanelId).append(lightbox); + + var wasVisible = $ax.visibility.IsIdVisible(elementId); + + (function(lightbox, query) { + $ax.event.attachClick(lightbox, function() { + $ax.action.addAnimation(elementId, $ax.action.queueTypes.fade, function() { + if(!wasVisible) query.hide(); + else $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.fade); + lightbox.remove(); + }); + }); + })(lightbox, this); + } + $ax.legacy.BringToFront(lightboxId, true); + $ax.legacy.BringToFront(elementId, true); + } else if(options && options.showType == 'flyout') { + // Remove lightbox if there is one + lightbox.remove(); + + var src = eventInfo.thiswidget; + var target = $ax.getWidgetInfo(elementId); + var rects = {}; + if(src.valid) rects.src = $ax.geometry.genRect(src, true); + if(target.valid) rects.target = $ax.geometry.genRect(target, true); + $ax.flyoutManager.registerFlyout(rects, elementId, eventInfo.srcElement); + //$ax.style.AddRolloverOverride(elementId); + $ax.legacy.BringToFront(elementId); + } else { + // Remove lightbox, unregister flyout + lightbox.remove(); + $ax.flyoutManager.unregisterPanel(elementId, true); + } + _setVisibility(elementId, true, options); + } + + return this; + }; + + var _getAnimateInfo = function (options, defaultDuration, useHide) { + var durationOption, easingOption, animationOption; + + if(options) { + if (useHide) { + durationOption = options.durationHide; + easingOption = options.easingHide; + animationOption = options.animationHide; + } else { + durationOption = options.duration; + easingOption = options.easing; + animationOption = options.animation; + } + if (animationOption == 'none') animationOption = 'swing'; + } else { + durationOption = defaultDuration; + easingOption = 'none', + animationOption = 'swing'; + } + var animateInfo = { duration: durationOption }; + switch (easingOption) { + case 'fade': + animateInfo.easingType = 'fade'; + animateInfo.direction = ''; + break; + case 'slideLeft': + animateInfo.easingType = animationOption; + animateInfo.direction = 'left'; + break; + case 'slideRight': + animateInfo.easingType = animationOption; + animateInfo.direction = 'right'; + break; + case 'slideUp': + animateInfo.easingType = animationOption; + animateInfo.direction = 'up'; + break; + case 'slideDown': + animateInfo.easingType = animationOption; + animateInfo.direction = 'down'; + break; + case 'flipLeft': + animateInfo.easingType = 'flip'; + animateInfo.direction = 'left'; + break; + case 'flipRight': + animateInfo.easingType = 'flip'; + animateInfo.direction = 'right'; + break; + case 'flipUp': + animateInfo.easingType = 'flip'; + animateInfo.direction = 'up'; + break; + case 'flipDown': + animateInfo.easingType = 'flip'; + animateInfo.direction = 'down'; + break; + default: + animateInfo.easingType = 'none'; + animateInfo.direction = ''; + } + + return animateInfo; + }; + + $ax.public.fn.hide = function(options) { + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; +// var wasShown = $ax.visibility.IsIdVisible(elementId); + _setVisibility(elementId, false, options, true); + } + + return this; + }; + + $ax.public.fn.toggleVisibility = function(options) { + var elementIds = this.getElementIds(); + + for (var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + var show = !$ax.visibility.IsIdVisible(elementId); + _setVisibility(elementId, show, options, !show); + } + + return this; + }; + + var _setVisibility = function (elementId, value, options, useHide) { + var animateInfo = _getAnimateInfo(options, 0, useHide); + + var wasShown = $ax.visibility.IsIdVisible(elementId); + var compress = options && options.showType == 'compress' && wasShown != value; + if (compress) $ax.dynamicPanelManager.compressToggle(elementId, options.vertical, value, options.compressEasing, options.compressDuration); + + var onComplete = function () { + $ax.dynamicPanelManager.fitParentPanel(elementId); + }; + $ax.visibility.SetWidgetVisibility(elementId, { + value: value, + easing: animateInfo.easingType, + direction: animateInfo.direction, + duration: animateInfo.duration, + animation: animateInfo.animation, + fire: true, + onComplete: onComplete + }); + + if(options && options.bringToFront) $ax.legacy.BringToFront(elementId); + }; + + $ax.public.fn.setOpacity = function(opacity, easing, duration) { + if(!easing || ! duration) { + easing = 'none'; + duration = 0; + } + + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + var onComplete = function() { + $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.fade); + }; + + var query = $jobj(elementId); + if(duration == 0 || easing == 'none') { + query.css('opacity', opacity); + onComplete(); + } else query.animate({ opacity: opacity }, { duration: duration, easing: easing, queue: false, complete: onComplete }); + } + } + //move one widget. I didn't combine moveto and moveby, since this is in .public, and separate them maybe more clear for the user + var _move = function (elementId, x, y, options, moveTo) { + if(!options.easing) options.easing = 'none'; + if(!options.duration) options.duration = 500; + var obj = $obj(elementId); + + // Layer move using container now. + if($ax.public.fn.IsLayer(obj.type)) { + $ax.move.MoveWidget(elementId, x, y, options, moveTo, + function () { + if(options.onComplete) options.onComplete(); + $ax.dynamicPanelManager.fitParentPanel(elementId); + }, false); + } else { + var xDelta = x; + var yDelta = y; + if (moveTo) { + var jobj = $jobj(elementId); + var left = $ax.getNumFromPx(jobj.css('left')); + var top = $ax.getNumFromPx(jobj.css('top')); + xDelta = x - left; + yDelta = y - top; + } + $ax.move.MoveWidget(elementId, xDelta, yDelta, options, false, + function () { $ax.dynamicPanelManager.fitParentPanel(elementId); }, true); + } + }; + + $ax.public.fn.moveTo = function (x, y, options) { + var elementIds = this.getElementIds(); + for(var index = 0; index < elementIds.length; index++) { + _move(elementIds[index], x, y, options, true); + } + + return this; + }; + + $ax.public.fn.moveBy = function (x, y, options) { + var elementIds = this.getElementIds(); + + if(x == 0 && y == 0) { + for(var i = 0; i < elementIds.length; i++) { + var elementId = elementIds[i]; + $ax.move.nopMove(elementId, options); + + //$ax.event.raiseSyntheticEvent(elementId, "onMove"); + $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.move); + + //if($axure.fn.IsLayer($obj(elementId).type)) { + // var childrenIds = $ax.public.fn.getLayerChildrenDeep(elementId, true); + // for(var j = 0; j < childrenIds.length; j++) $ax.event.raiseSyntheticEvent(childrenIds[j], 'onMove'); + //} + } + return this; + } + + for(var index = 0; index < elementIds.length; index++) { + _move(elementIds[index], x, y, options, false); + } + return this; + }; + + $ax.public.fn.circularMoveAndRotate = function(degreeChange, options, centerPointLeft, centerPointTop, doRotation, moveDelta, resizeOffset, rotatableMove, moveComplete) { + if(!rotatableMove) rotatableMove = { x: 0, y: 0 }; + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + + var onComplete = function () { + $ax.dynamicPanelManager.fitParentPanel(elementId); + if (moveComplete) moveComplete(); + } + + $ax.move.circularMove(elementId, degreeChange, { x: centerPointLeft, y: centerPointTop }, moveDelta, rotatableMove, resizeOffset, options, true, onComplete, doRotation); + if(doRotation) $ax.move.rotate(elementId, degreeChange, options.easing, options.duration, false, true, function () { $ax.dynamicPanelManager.fitParentPanel(elementId); }); + else $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.rotate); + } + }; + + $ax.public.fn.rotate = function (degree, easing, duration, to, axShouldFire) { + var elementIds = this.getElementIds(); + // this function will no longer handle compound vectors. + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + degree = parseFloat(degree); + $ax.move.rotate(elementId, degree, easing, duration, to, axShouldFire, function () { $ax.dynamicPanelManager.fitParentPanel(elementId); }); + } + }; + + $ax.public.fn.resize = function(newLocationAndSizeCss, resizeInfo, axShouldFire, moves, onCompletedFunc) { + var elementIds = this.getElementIds(); + if(!elementIds) return; + + var completeAndFire = function(moved, id) { + if(axShouldFire) { + $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.resize); + if(moves) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move); + } + + if(onCompletedFunc) onCompletedFunc(); + }; + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + + var obj = $obj(elementId); + if(!$ax.public.fn.IsResizable(obj.type)) { + //$ax.dynamicPanelManager.fitParentPanel(elementId); + completeAndFire(moves, elementId); + continue; + } + + var oldSize = $ax('#' + elementId).size(); + var oldWidth = oldSize.width; + var oldHeight = oldSize.height; + var query = $jobj(elementId); + + var isDynamicPanel = $ax.public.fn.IsDynamicPanel(obj.type); + if(isDynamicPanel) { + // No longer fitToContent, calculate additional styling that needs to be done. + $ax.dynamicPanelManager.setFitToContentCss(elementId, false, oldWidth, oldHeight); + + if (query.css('position') == 'fixed' && ((obj.fixedHorizontal && obj.fixedHorizontal == 'center') || (obj.fixedVertical && obj.fixedVertical == 'middle'))) { + moves = true; + var loc = $ax.dynamicPanelManager.getFixedPosition(elementId, oldWidth, oldHeight, newLocationAndSizeCss.width, newLocationAndSizeCss.height); + if(loc) { + if (loc[0] != 0 && !$ax.dynamicPanelManager.isPercentWidthPanel(obj)) newLocationAndSizeCss['margin-left'] = '+=' + (Number(newLocationAndSizeCss['margin-left'].substr(2)) + loc[0]); + if (loc[1] != 0) newLocationAndSizeCss['margin-top'] = '+=' + (Number(newLocationAndSizeCss['margin-top'].substr(2)) + loc[1]); + } + } + + var onComplete = function() { + $ax.flyoutManager.updateFlyout(elementId); + $ax.dynamicPanelManager.fitParentPanel(elementId); + $ax.dynamicPanelManager.updatePanelPercentWidth(elementId); + $ax.dynamicPanelManager.updatePanelContentPercentWidth(elementId); + + completeAndFire(moves, elementId); + $ax.event.raiseSyntheticEvent(elementId, 'onResize'); + }; + + } else { + ////if contains text + //var textChildren = query.children('div.text'); + //if(textChildren && textChildren.length != 0) { + // var textDivId = textChildren.attr('id'); + // var padding = $ax.style.getPadding(textDivId); + // var leftPadding = padding.paddingLeft; + // var rightPadding = padding.paddingRight; + // //var textObj = $ax('#' + textDivId); + // //var leftPadding = textObj.left(true); + // //var rightPadding = oldWidth - leftPadding - textObj.width(); + + // //greater or equal to 1px + // var newTextWidth = Math.max(newLocationAndSizeCss.width - leftPadding - rightPadding, 1); + // var textChildCss = { width: newTextWidth }; + + // var textStepFunction = function() { + // //change the width of the text div may effect the height + // //var currentTextHeight = Number($(textChildren.children('p')[0]).css('height').replace('px', '')); + // //textChildren.css('height', currentTextHeight); + // //var display = $ax.public.fn.displayHackStart(document.getElementById(textDivId)); + + // var trap = _displayWidget(textDivId); + // $ax.style.setTextAlignment([textDivId]); + // trap(); + + // //$ax.public.fn.displayHackEnd(display); + // }; + //} + + //get all the other children that matters + onComplete = function() { + $ax.dynamicPanelManager.fitParentPanel(elementId); + completeAndFire(moves, elementId); + + $ax.annotation.adjustIconLocation(elementId); + $ax.event.raiseSyntheticEvent(elementId, 'onResize'); + }; + } + + var children = query.children().not('div.text'); + while(children && children.length && $(children[0]).attr('id').indexOf('container') != -1) { + children = children.children().not('div.text'); + } + + if(children && children.length !== 0) { + var childAnimationArray = []; + var isConnector = $ax.public.fn.IsConnector(obj.type); + children.each(function (i, child) { + var childCss = { + width: newLocationAndSizeCss.width, + height: newLocationAndSizeCss.height + }; + + //$ax.size() use outerWidth/Height(false), which include padding and borders(no margins) + var childSizingObj = $ax('#' + child.id).size(); + var differentSizedImage = childSizingObj.width - oldWidth != 0 || childSizingObj.height - oldHeight != 0; + if ((differentSizedImage || isConnector) && child.tagName == 'IMG') { + //oldwidth is zero for connectors + var widthOffset = oldWidth ? (childSizingObj.width - oldWidth) * newLocationAndSizeCss.width / oldWidth : childSizingObj.width; + var heightOffset = oldHeight ? (childSizingObj.height - oldHeight) * newLocationAndSizeCss.height / oldHeight : childSizingObj.height; + + childCss.width += widthOffset; + childCss.height += heightOffset; + } + //there are elements like inputs, come with a padding and border, so need to use outerwidth for starting point, due to jquery 1.7 css() on width/height bugs + if($(child).css('position') === 'absolute') { + if(child.offsetLeft) { + childSizingObj.left = child.offsetLeft; + childCss.left = oldWidth ? child.offsetLeft * newLocationAndSizeCss.width / oldWidth : child.offsetLeft; //- transformedShift.x; + } + if(child.offsetTop) { + childSizingObj.top = child.offsetTop; + childCss.top = oldHeight ? child.offsetTop * newLocationAndSizeCss.height / oldHeight : child.offsetTop; //- transformedShift.y; + } + } + childAnimationArray.push({ obj: child, sizingObj: childSizingObj, sizingCss: childCss }); + }); + } + + if (newLocationAndSizeCss.left || newLocationAndSizeCss.top) { + //var movedLeft = newLocationAndSizeCss.left; + //var movedTop = newLocationAndSizeCss.top; + //$ax.visibility.setMovedLocation(elementId, movedLeft, movedTop); + var movedLeft = newLocationAndSizeCss.deltaX; + var movedTop = newLocationAndSizeCss.deltaY; + $ax.visibility.moveMovedLocation(elementId, movedLeft, movedTop); + } + if (newLocationAndSizeCss.width || newLocationAndSizeCss.height) { + var resizedWidth = newLocationAndSizeCss.width; + var resizedHeight = newLocationAndSizeCss.height; + $ax.visibility.setResizedSize(elementId, resizedWidth, resizedHeight); + } + + if (!resizeInfo.easing || resizeInfo.easing == 'none') { + query.animate(newLocationAndSizeCss, 0); + + if (childAnimationArray) { + $(childAnimationArray).each(function (i, animationObj) { + if(animationObj.resizeMatrixFunction) { + $(animationObj.obj).css($ax.public.fn.setTransformHowever(animationObj.resizeMatrixFunction(animationObj.width, animationObj.height))); + } else { + //var sizingCss = animationObj.sizingCss; + //if (sizingCss.left || sizingCss.top) { + // var movedLeft = sizingCss.left; + // var movedTop = sizingCss.top; + // $ax.visibility.setMovedLocation(animationObj.obj.id, movedLeft, movedTop); + //} + //if (sizingCss.width || sizingCss.height) { + // var resizedWidth = sizingCss.width; + // var resizedHeight = sizingCss.height; + // $ax.visibility.setResizedSize(animationObj.obj.id, resizedWidth, resizedHeight); + //} + + $(animationObj.obj).animate(animationObj.sizingCss, 0); + } + }); + } + //if(childCss) children.animate(childCss, 0); + //if(sketchyImage && sketchyImageCss) $(sketchyImage).animate(sketchyImageCss, 0); + //if(textChildCss) { + // textChildren.animate(textChildCss, { + // duration: 0, + // step: textStepFunction + // }); + //} + onComplete(); + } else { + if(childAnimationArray) { + $(childAnimationArray).each(function (i, animationObj) { + if(animationObj.resizeMatrixFunction) { + $(animationObj.sizingObj).animate(animationObj.sizingCss, { + queue: false, + duration: resizeInfo.duration, + easing: resizeInfo.easing, + step: function (now) { + var widthRatio = (animationObj.width - 1.0) * now + 1.0; + var heightRatio = (animationObj.height - 1.0) * now + 1.0; + $(animationObj.obj).css($ax.public.fn.setTransformHowever(animationObj.resizeMatrixFunction(widthRatio, heightRatio))); + } + }); + } else { + $(animationObj.sizingObj).animate(animationObj.sizingCss, { + queue: false, + duration: resizeInfo.duration, + easing: resizeInfo.easing, + step: function (now, tween) { + $(animationObj.obj).css(tween.prop, now); + } + }); + } + }); + } + + //if(textChildCss) { + // textChildren.animate(textChildCss, { + // queue: false, + // duration: resizeInfo.duration, + // easing: resizeInfo.easing, + // step: textStepFunction + // }); + //} + + if(isDynamicPanel) { + query.animate(newLocationAndSizeCss, { queue: false, duration: resizeInfo.duration, easing: resizeInfo.easing, complete: onComplete }); + } else { + var locObj = { + left: $ax.public.fn.GetFieldFromStyle(query, 'left'), top: $ax.public.fn.GetFieldFromStyle(query, 'top'), + width: $ax.public.fn.GetFieldFromStyle(query, 'width'), height: $ax.public.fn.GetFieldFromStyle(query, 'height'), + }; + $(locObj).animate(newLocationAndSizeCss, { + queue: false, + duration: resizeInfo.duration, + easing: resizeInfo.easing, + step: function (now, tween) { + query.css(tween.prop, now); + }, + complete: onComplete + }); + } + } + } + }; + + $ax.public.fn.bringToFront = function() { + var elementIds = this.getElementIds(); + for(var index = 0; index < elementIds.length; index++) { $ax.legacy.BringToFront(elementIds[index]); } + return this; + }; + + $ax.public.fn.sendToBack = function() { + var elementIds = this.getElementIds(); + for(var index = 0; index < elementIds.length; index++) { $ax.legacy.SendToBack(elementIds[index]); } + return this; + }; + + $ax.public.fn.text = function() { + if(arguments[0] == undefined) { + var firstId = this.getElementIds()[0]; + + if(!firstId) { return undefined; } + + return getWidgetText(firstId); + } else { + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var currentItem = elementIds[index]; + + var widgetType = $ax.getTypeFromElementId(currentItem); + + if($ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsTextArea(widgetType)) { //For non rtf + SetWidgetFormText(currentItem, arguments[0]); + } else { + var idRtf = '#' + currentItem; + if($(idRtf).length == 0) idRtf = '#u' + (Number(currentItem.substring(1)) + 1); + + if($(idRtf).length != 0) { + //If the richtext div already has some text in it, + //preserve only the first style and get rid of the rest + //If no pre-existing p-span tags, don't do anything + if($(idRtf).find('p').find('span').length > 0) { + $(idRtf).find('p:not(:first)').remove(); + $(idRtf).find('p').find('span:not(:first)').remove(); + + //Replace new-lines with NEWLINE token, then html encode the string, + //finally replace NEWLINE token with linebreak + var textWithLineBreaks = arguments[0].replace(/\n/g, '--NEWLINE--'); + var textHtml = $('
      ').text(textWithLineBreaks).html(); + $(idRtf).find('span').html(textHtml.replace(/--NEWLINE--/g, '
      ')); + } + } + } + } + + return this; + } + }; + + var getWidgetText = function(id) { + var idQuery = $jobj(id); + var inputQuery = $jobj($ax.INPUT(id)); + if(inputQuery.length) idQuery = inputQuery; + + if (idQuery.is('input') && ($ax.public.fn.IsCheckBox(idQuery.attr('type')) || idQuery.attr('type') == 'radio')) { + idQuery = idQuery.parent().find('label').find('div'); + } + + if(idQuery.is('div')) { + var $rtfObj = idQuery.hasClass('text') ? idQuery : idQuery.find('.text'); + if($rtfObj.length == 0) return ''; + + var textOut = ''; + $rtfObj.children('p,ul,ol').each(function(index) { + if(index != 0) textOut += '\n'; + + //var htmlContent = $(this).html(); + //if(isSoloBr(htmlContent)) return; // It has a solo br, then it was just put in for a newline, and paragraph already added the new line. + if (isSoloBr($(this).children())) return; + + var htmlContent = $(this).html(); + //Replace line breaks (set in SetWidgetRichText) with newlines and nbsp's with regular spaces. + htmlContent = htmlContent.replace(/]*>/ig, '\n').replace(/ /ig, ' '); + textOut += $(htmlContent).text(); + //textOut += htmlContent.replace(/<[^>]*>/g, ''); + }); + + return textOut; + } else { + var val = idQuery.val(); + return val == undefined ? '' : val; + } + }; + + var isSoloBr = function($html) { + //html = $(html); + // Html needs one and only one span + var spanChildren = $html.length == 1 && $html.is('span') ? $html.children() : false; + // Span children needs exactly one br and no text in the span + return spanChildren && spanChildren.length == 1 && spanChildren.is('br') && spanChildren.text().trim() == ''; + }; + + $ax.public.fn.setRichTextHtml = function() { + if(arguments[0] == undefined) { + //No getter function, so just return undefined + return undefined; + } else { + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var currentItem = elementIds[index]; + + var widgetType = $ax.getTypeFromElementId(currentItem); + if ($ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsTextArea(widgetType)) { //Do nothing for non rtf + continue; + } else { + //TODO -- [mas] fix this! + var idRtf = '#' + currentItem; + if($(idRtf).length == 0) idRtf = '#u' + (parseInt(currentItem.substring(1)) + 1); + if($(idRtf).length != 0) SetWidgetRichText(idRtf, arguments[0]); + } + } + + return this; + } + }; + + $ax.public.fn.value = function() { + if(arguments[0] == undefined) { + var firstId = this.getElementIds()[0]; + + if(!firstId) { + return undefined; + } + + var widgetType = $ax.getTypeFromElementId(firstId); + + if ($ax.public.fn.IsComboBox(widgetType) || $ax.public.fn.IsListBox(widgetType)) { //for select lists and drop lists + return $('#' + firstId + ' :selected').text(); + } else if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) { //for radio/checkboxes + return $('#' + firstId + '_input').is(':selected'); + } else if ($ax.public.fn.IsTextBox(widgetType)) { //for text box + return $('#' + firstId + '_input').val(); + } else { //for text based form elements + return this.jQuery().first().val(); + } + } else { + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var widgetType = $ax.getTypeFromElementId(elementIds[index]); + + var elementIdQuery = $('#' + elementIds[index]); + + if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) { //for radio/checkboxes + if(arguments[0] == true) { + elementIdQuery.prop('selected', true); + } else if(arguments[0] == false) { + elementIdQuery.prop('selected', false); + } + } else { //For select lists, drop lists, text based form elements + elementIdQuery.val(arguments[0]); + } + } + + return this; + } + }; + + $ax.public.fn.checked = function() { + if(arguments[0] == undefined) { + return this.selected(); + } else { + this.selected(arguments[0]); + return this; + } + }; + + //var _getRelativeLeft = function (id, parent) { + // var currentNode = window.document.getElementById(id).offsetParent; + // var left = $ax('#' + id).left(true); + // while (currentNode != null && currentNode.tagName != "BODY" && currentNode != parent) { + // left += currentNode.offsetLeft; + // currentNode = currentNode.offsetParent; + // } + // return left; + //}; + + //var _getRelativeTop = function(id, parent) { + // var currentNode = window.document.getElementById(id).offsetParent; + // var top = $ax('#' + id).top(true); + // while(currentNode != null && currentNode.tagName != "BODY" && currentNode != parent) { + // top += currentNode.offsetTop; + // currentNode = currentNode.offsetParent; + // } + // return top; + //}; + + var _scrollHelper = function(id, scrollX, scrollY, easing, duration) { + var target = window.document.getElementById(id); + var scrollable = $ax.legacy.GetScrollable(target); + var $scrollable = $(scrollable); + + var viewportLocation; + if ($scrollable.is('body')) viewportLocation = $ax('#' + id).viewportLocation(); + else viewportLocation = $ax('#' + id).pageBoundingRect(true, $scrollable.attr('id')).location; + + var targetLeft = viewportLocation.left; + var targetTop = viewportLocation.top; + //var targetLeft = _getRelativeLeft(id, scrollable); + //var targetTop = _getRelativeTop(id, scrollable); + if(!scrollX) targetLeft = scrollable.scrollLeft; + if(!scrollY) targetTop = scrollable.scrollTop; + + if($scrollable.is('body')) { + $scrollable = $('html,body'); + } + if(easing == 'none') { + if(scrollY) $scrollable.scrollTop(targetTop); + if(scrollX) $scrollable.scrollLeft(targetLeft); + } else { + if(!scrollX) { + $scrollable.animate({ scrollTop: targetTop }, duration, easing); + } else if(!scrollY) { + $scrollable.animate({ scrollLeft: targetLeft }, duration, easing); + } else { + $scrollable.animate({ scrollTop: targetTop, scrollLeft: targetLeft }, duration, easing); + } + } + }; + + $ax.public.fn.scroll = function(scrollOption) { + var easing = 'none'; + var duration = 500; + + if(scrollOption && scrollOption.easing) { + easing = scrollOption.easing; + + if(scrollOption.duration) { + duration = scrollOption.duration; + } + } + + var scrollX = true; + var scrollY = true; + + // TODO: check this without vertical option -- might scroll outside of device frame + if(scrollOption.direction == 'vertical') { + scrollX = false; + } else if(scrollOption.direction == 'horizontal') { + scrollY = false; + } + + var elementIds = this.getElementIds(); + for(var index = 0; index < elementIds.length; index++) { + // if($ax.getTypeFromElementId(elementIds[index]) == IMAGE_MAP_REGION_TYPE) { + _scrollHelper(elementIds[index], scrollX, scrollY, easing, duration); + // } + } + + return this; + }; + + $ax.public.fn.enabled = function() { + if(arguments[0] == undefined) { + var firstId = this.getElementIds()[0]; + if(!firstId) return undefined; + + var widgetType = $ax.getTypeFromElementId(firstId); + if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType) + || $ax.public.fn.IsLayer(widgetType)) return !$ax.style.IsWidgetDisabled(firstId); + else return this.jQuery().children(':disabled').length <= 0; + } else { + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + var widgetType = $ax.getTypeFromElementId(elementId); + + var enabled = arguments[0]; + if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType) + || $ax.public.fn.IsTextBox(widgetType) || $ax.public.fn.IsTextArea(widgetType) + || $ax.public.fn.IsComboBox(widgetType) || $ax.public.fn.IsListBox(widgetType) + || $ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType) + ) $ax.style.SetWidgetEnabled(elementId, enabled); + + if ($ax.public.fn.IsDynamicPanel(widgetType) || $ax.public.fn.IsLayer(widgetType)) { + $ax.style.SetWidgetEnabled(elementId, enabled); + var children = this.getChildren(false, true)[index].children; + for(var i = 0; i < children.length; i++) { + $axure('#' + children[i]).enabled(enabled); + } + } + var obj = $obj(elementId); + var images = obj.images; + if(PLAIN_TEXT_TYPES.indexOf(widgetType) != -1 && images) { + var img = $jobj($ax.repeater.applySuffixToElementId(elementId, '_image_sketch')); + var key = (enabled ? 'normal~' : 'disabled~') + ($ax.adaptive.currentViewId || ''); + img.attr('src', images[key]); + + } + var jobj = $jobj(elementId); + var input = $jobj($ax.INPUT(elementId)); + if(input.length) jobj = input; + + //if (OS_MAC && WEBKIT && $ax.public.fn.IsComboBox(widgetType)) jobj.css('color', enabled ? '' : 'grayText'); + + if(enabled) jobj.prop('disabled', false); + else jobj.prop('disabled', true); + } + + return this; + } + }; + + $ax.public.fn.visible = function() { + var ids = this.getElementIds(); + for(var index = 0; index < ids.length; index++) $ax.visibility.SetIdVisible(ids[index], arguments[0]); + return this; + }; + + $ax.public.fn.selected = function() { + if(arguments[0] == undefined) { + var firstId = this.getElementIds()[0]; + if(!firstId) return undefined; + + var widgetType = $ax.getTypeFromElementId(firstId); + if ($ax.public.fn.IsTreeNodeObject(widgetType)) { + var treeNodeButtonShapeId = ''; + var allElementIds = $ax.getAllElementIds(); + for(var i = 0; i < allElementIds.length; i++) { + var elementId = allElementIds[i]; + var currObj = $ax.getObjectFromElementId(elementId); + + if ($ax.public.fn.IsVector(currObj.type) && currObj.parent && currObj.parent.scriptIds && currObj.parent.scriptIds[0] == firstId) { + treeNodeButtonShapeId = elementId; + break; + } + } + + if(treeNodeButtonShapeId == '') return undefined; + return $ax.style.IsWidgetSelected(treeNodeButtonShapeId); + } else if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType) || $ax.public.fn.IsTableCell(widgetType) || $ax.public.fn.IsDynamicPanel(widgetType) || $ax.public.fn.IsLayer(widgetType)) { + return $ax.style.IsWidgetSelected(firstId); + } else if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) { + return $jobj($ax.INPUT(firstId)).prop('checked'); + } + return this; + } + var elementIds = this.getElementIds(); + var func = typeof (arguments[0]) === 'function' ? arguments[0] : null; + var enabled = arguments[0]; // If this is a function it will be overridden with the return value; + + for(var index = 0; index < elementIds.length; index++) { + var elementId = elementIds[index]; + if(func) { + enabled = func($axure('#' + elementId)); + } + + var widgetType = $ax.getTypeFromElementId(elementId); + + if ($ax.public.fn.IsTreeNodeObject(widgetType)) { //for tree node + var treeRootId = $('#' + elementIds[index]).parents('.treeroot').attr('id'); + + var treeNodeButtonShapeId = ''; + var childElementIds = $jobj(elementId).children(); + for(var i = 0; i < childElementIds.length; i++) { + var elementId = childElementIds[i].id; + var currObj = $ax.getObjectFromElementId(elementId); + + if (currObj && currObj.type == $ax.constants.VECTOR_SHAPE_TYPE && currObj.parent && + currObj.parent.scriptIds && currObj.parent.scriptIds[0] == elementIds[index]) { + treeNodeButtonShapeId = elementId; + break; + } + } + + if(treeNodeButtonShapeId == '') continue; + + $ax.tree.SelectTreeNode(elementId, enabled); + } else if ($ax.public.fn.IsImageBox(widgetType) || $ax.public.fn.IsVector(widgetType) || $ax.public.fn.IsVector(widgetType) || $ax.public.fn.IsTableCell(widgetType) || $ax.public.fn.IsDynamicPanel(widgetType) || $ax.public.fn.IsLayer(widgetType)) { + $ax.style.SetWidgetSelected(elementIds[index], enabled); + } else if ($ax.public.fn.IsCheckBox(widgetType) || $ax.public.fn.IsRadioButton(widgetType)) { + var query = $jobj($ax.INPUT(elementId)); + var curr = query.prop('checked'); + //NOTE: won't fire onselect nore onunselect event if states didn't changes + if(curr != enabled) { + query.prop('checked', enabled); + $ax.style.SetWidgetSelected(elementIds[index], enabled, true); + $ax.event.TryFireCheckChanged(elementId, enabled); + } + } + } + return this; + }; + + $ax.public.fn.focus = function() { + var firstId = this.getElementIds()[0]; + var focusableId = $ax.event.getFocusableWidgetOrChildId(firstId); + // This will scroll but not focus + $('#' + focusableId).triggerHandler("focus"); + // This will focus but does not call our custom scroll so will not animate scroll + $('#' + focusableId).focus(); + + return this; + }; + + $ax.public.fn.expanded = function() { + if(arguments[0] == undefined) { + var firstId = this.getElementIds()[0]; + return firstId && !$ax.public.fn.IsTreeNodeObject($ax.getTypeFromElementId(firstId)) && $ax.visibility.IsIdVisible(firstId + '_children'); + } else { + var elementIds = this.getElementIds(); + + for(var index = 0; index < elementIds.length; index++) { + if ($ax.public.fn.IsTreeNodeObject($ax.getTypeFromElementId(elementIds[index]))) { + var treeNodeId = elementIds[index]; + var childContainerId = treeNodeId + '_children'; + + var scriptId = $ax.repeater.getScriptIdFromElementId(treeNodeId); + var itemId = $ax.repeater.getItemIdFromElementId(treeNodeId); + var plusMinusId = 'u' + (parseInt(scriptId.substring(1)) + 1); + if(itemId) plusMinusId = $ax.repeater.createElementId(plusMinusId, itemId); + if($('#' + childContainerId).length == 0 || !$jobj(plusMinusId).children().first().is('img')) + plusMinusId = ''; + + if(arguments[0] == true) { + $ax.tree.ExpandNode(treeNodeId, childContainerId, plusMinusId); + } else if(arguments[0] == false) { + $ax.tree.CollapseNode(treeNodeId, childContainerId, plusMinusId); + } + } + } + + return this; + } + }; + + var _populateBoundingRect = function (boundingRect) { + boundingRect.right = boundingRect.left + boundingRect.width; + boundingRect.bottom = boundingRect.top + boundingRect.height; + + boundingRect.x = boundingRect.left; + boundingRect.y = boundingRect.top; + + boundingRect.location = { + x: boundingRect.left, + y: boundingRect.top, + left: boundingRect.left, + top: boundingRect.top + }; + + boundingRect.size = { + width: boundingRect.width, + height: boundingRect.height + }; + + boundingRect.centerPoint = { + x: boundingRect.width / 2 + boundingRect.left, + y: boundingRect.height / 2 + boundingRect.top + }; + return boundingRect; + } + + //boundingrect relative to its offset parent + //var _getBoundingRectForSingleWidget = function (elementId) { + // var element = document.getElementById(elementId); + // var tempBoundingRect, position; + + // var state = $ax.style.generateState(elementId); + // var style = $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId); + // position = { left: style.location.x, top: style.location.y }; + // tempBoundingRect = { left: style.location.x, top: style.location.y, width: style.size.width, height: style.size.height }; + + // if ($ax.public.fn.isCompoundVectorHtml(element)) { + // tempBoundingRect.width = Number(element.getAttribute('data-width')); + // tempBoundingRect.height = Number(element.getAttribute('data-height')); + // } else { + // var boundingElement = element; + // if ($ax.dynamicPanelManager.isIdFitToContent(elementId)) { + // var stateId = $ax.visibility.GetPanelState(elementId); + // if (stateId != '') boundingElement = document.getElementById(stateId); + // tempBoundingRect = boundingElement.getBoundingClientRect(); + // } + + // //From getLoc + // //var fixed = _fixedOffset(id, vert); + // //if (fixed.valid) loc = !vert && fixed.fullWidth ? 0 : fixed.offset; + + // var jElement = $(element); + // if (jElement.css('position') == 'fixed') { + // position = jElement.position(); + // position.left += Number(jElement.css('margin-left').replace("px", "")); + // position.top += Number(jElement.css('margin-top').replace("px", "")); + // } + // } + + // var boundingRect = { + // left: position.left, + // top: position.top, + // width: tempBoundingRect.width, + // height: tempBoundingRect.height + // }; + + // return _populateBoundingRect(boundingRect); + //}; + + //var _getBoundingRectForMultipleWidgets = function (widgetsIdArray) { + // if (!widgetsIdArray || widgetsIdArray.constructor !== Array) return undefined; + // if (widgetsIdArray.length == 0) return { left: 0, top: 0, centerPoint: { x: 0, y: 0 }, width: 0, height: 0 }; + // var widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[0]); + // var boundingRect = { left: widgetRect.left, right: widgetRect.right, top: widgetRect.top, bottom: widgetRect.bottom }; + + // for (var index = 1; index < widgetsIdArray.length; index++) { + // widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[index]); + // boundingRect.left = Math.min(boundingRect.left, widgetRect.left); + // boundingRect.top = Math.min(boundingRect.top, widgetRect.top); + // boundingRect.right = Math.max(boundingRect.right, widgetRect.right); + // boundingRect.bottom = Math.max(boundingRect.bottom, widgetRect.bottom); + // } + + // boundingRect.centerPoint = { x: (boundingRect.right + boundingRect.left) / 2.0, y: (boundingRect.bottom + boundingRect.top) / 2.0 }; + // boundingRect.width = boundingRect.right - boundingRect.left; + // boundingRect.height = boundingRect.bottom - boundingRect.top; + // return _populateBoundingRect(boundingRect); + //}; + + //var _getLayerChildrenDeep = $ax.public.fn.getLayerChildrenDeep = function (layerId, includeLayers, includeHidden) { + // var deep = []; + // var children = $ax('#' + layerId).getChildren()[0].children; + // for (var index = 0; index < children.length; index++) { + // var childId = children[index]; + // if (!includeHidden && !$ax.visibility.IsIdVisible(childId)) continue; + // if ($ax.public.fn.IsLayer($obj(childId).type)) { + // if (includeLayers) deep.push(childId); + // var recursiveChildren = _getLayerChildrenDeep(childId, includeLayers, includeHidden); + // for (var j = 0; j < recursiveChildren.length; j++) deep.push(recursiveChildren[j]); + // } else deep.push(childId); + // } + // return deep; + //}; + + var _boundingRectForIds = function(childIds) { + // Default size + var childrenBoundingRect = { left: childIds.length > 0 ? 9999999 : 0, top: childIds.length > 0 ? 9999999 : 0, right: 0, bottom: 0 }; + for (var i = 0; i < childIds.length; i++) { + var childId = childIds[i]; + var childObj = $obj(childId); + + if (!childObj) continue; + + // Ignore fixed and hidden + if ($ax.visibility.limboIds[childId] || + !$ax.visibility.IsIdVisible(childId) || + $ax.public.fn.IsDynamicPanel(childObj.type) && childObj.fixedHorizontal) continue; + + var boundingRect = $ax('#' + childId).offsetBoundingRect(); + + // Ignore empty groups + if ($ax.public.fn.IsLayer(childObj.type) && boundingRect.width == 0 && boundingRect.height == 0) continue; + + childrenBoundingRect.left = Math.min(childrenBoundingRect.left, boundingRect.left); + childrenBoundingRect.top = Math.min(childrenBoundingRect.top, boundingRect.top); + childrenBoundingRect.right = Math.max(childrenBoundingRect.right, boundingRect.right); + childrenBoundingRect.bottom = Math.max(childrenBoundingRect.bottom, boundingRect.bottom); + } + childrenBoundingRect.width = childrenBoundingRect.right - childrenBoundingRect.left; + childrenBoundingRect.height = childrenBoundingRect.bottom - childrenBoundingRect.top; + + return _populateBoundingRect(childrenBoundingRect); + } + + $ax.public.fn.getPageSize = function() { + var containerQuery = $('#base'); + var children = containerQuery.children(); + var childIds = []; + for (var i = 0; i < children.length; i++) { + var child = $(children[i]); + var childId = child.attr('id'); + childIds.push(childId); + } + + return _boundingRectForIds(childIds); + } + + $ax.public.fn.childrenBoundingRect = function () { + var childIds = this.getChildren()[0].children; + return _boundingRectForIds(childIds); + }; + + var _fixedLocation = function (elementId, size) { + var axObj = $obj(elementId); + if (!axObj || !axObj.fixedVertical) return { valid: false }; + + var win = $(window); + var windowWidth = win.width(); + var windowHeight = win.height(); + //getting the scroll forces layout. consider caching these values. + var windowScrollLeft = win.scrollLeft(); + var windowScrollTop = win.scrollTop(); + + var newLeft = 0; + var newTop = 0; + var width = size.width; + var height = size.height; + + var horz = axObj.fixedHorizontal; + if(horz == 'left') { + newLeft = windowScrollLeft + (axObj.percentWidth ? 0 : $ax.getNumFromPx($jobj(elementId).css('left'))); + } else if(horz == 'center') { + newLeft = windowScrollLeft + ((windowWidth - width) / 2) + axObj.fixedMarginHorizontal; + } else if(horz == 'right') { + newLeft = windowScrollLeft + windowWidth - width - axObj.fixedMarginHorizontal; + } + + var vert = axObj.fixedVertical; + if(vert == 'top') { + newTop = windowScrollTop + $ax.getNumFromPx($jobj(elementId).css('top')); + } else if(vert == 'middle') { + newTop = windowScrollTop + ((windowHeight - height) / 2) + axObj.fixedMarginVertical; + } else if(vert == 'bottom') { + newTop = windowScrollTop + windowHeight - height - axObj.fixedMarginVertical; + } + + //probably need to make this relative to the page for hit testing + return { valid: true, top: newTop, left: axObj.isPercentWidthPanel ? 0 : newLeft }; + }; + + //relative to the parent + $ax.public.fn.offsetBoundingRect = function (ignoreRotation) { + var elementId = this.getElementIds()[0]; + if (!elementId) return undefined; + + //element is null if RDO + //data- values are for layers (legacy compound) + var element = document.getElementById(elementId); + var position, size, rotation; + + var trap; + var state; + var style; + var movedLoc = $ax.visibility.getMovedLocation(elementId); + var resizedSize = $ax.visibility.getResizedSize(elementId); + + if (movedLoc) { + position = movedLoc; + } else if(element && element.getAttribute('data-left')) { + position = { + left: Number(element.getAttribute('data-left')), + top: Number(element.getAttribute('data-top')) + }; + } else if($obj(elementId)) { + state = $ax.style.generateState(elementId); + style = $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId); + position = { left: style.location.x, top: style.location.y }; + + var parents = this.getParents(true, '*')[0]; + //if(parents.length > 0) { + // var parentId = parents[0]; + // var type = $ax.getTypeFromElementId(parentId); + // if ($axure.fn.IsReferenceDiagramObject(type)) { + // var rdoLoc = $ax('#' + parentId).offsetLocation(); + // position.left += rdoLoc.x; + // position.top += rdoLoc.y; + // } + //} + for(var i = 0; i < parents.length; i++) { + var parentId = parents[i]; + var type = $ax.getTypeFromElementId(parentId); + if ($axure.fn.IsReferenceDiagramObject(type)) { + var rdoLoc = $ax('#' + parentId).offsetLocation(); + position.left += rdoLoc.x; + position.top += rdoLoc.y; + break; + } else if (!$axure.fn.IsLayer(type)) break; + } + } else { + if (!trap) trap = _displayWidget($ax.repeater.removeSuffixFromElementId(elementId)); + var jObjPosition = $(element).position(); + position = { left: jObjPosition.left, top: jObjPosition.top }; + } + + if (resizedSize) { + size = resizedSize; + } else if (element && element.getAttribute('data-width')) { + size = { + width: Number(element.getAttribute('data-width')), + height: Number(element.getAttribute('data-height')) + }; + } else if($obj(elementId)) { + state = state || $ax.style.generateState(elementId); + style = style || $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId); + size = { width: style.size.width, height: style.size.height }; + } else { + if(!trap) trap = _displayWidget($ax.repeater.removeSuffixFromElementId(elementId)); + var jObj = $(element); + size = { width: jObj.outerWidth(), height: jObj.outerHeight() }; + } + + var fixed = _fixedLocation(elementId, size); + if(fixed.valid) { + position.left = fixed.left; + position.top = fixed.top; + } + + var boundingRect = { + left: position.left, + top: position.top, + width: size.width, + height: size.height, + isFixed: fixed.valid + }; + + if(!ignoreRotation) { + var rotatedAngle = $ax.visibility.getRotatedAngle(elementId); + if(rotatedAngle) { + rotation = rotatedAngle; + } else if(element && element.getAttribute('data-rotation')) { + rotation = Number(element.getAttribute('data-rotation')); + } else if($obj(elementId)) { + state = state || $ax.style.generateState(elementId); + style = style || $ax.style.computeFullStyle(elementId, state, $ax.adaptive.currentViewId); + rotation = style.rotation; + } else { + if (!trap) trap = _displayWidget($ax.repeater.removeSuffixFromElementId(elementId)); + rotation = $ax.move.getRotationDegreeFromElement(element); + } + if(rotation && rotation != 0) + boundingRect = $ax.public.fn.getBoundingRectForRotate(_populateBoundingRect(boundingRect), rotation); + } + + if (trap) trap(); + + return _populateBoundingRect(boundingRect); + }; + + //relative to the page + $ax.public.fn.pageBoundingRect = function (ignoreRotation, scrollableId) { + var boundingRect = this.offsetBoundingRect(ignoreRotation); + if(!boundingRect) return undefined; + + if(boundingRect.isFixed) return _populateBoundingRect(boundingRect); + + var loc = boundingRect.location; + + //var parents = []; + //var parObj = id.indexOf('text') != -1 ? axObj : axObj.parent; // When working with text id, parent widget is the ax obj we are dealing with, so that should be the first parent + //while ($ax.public.fn.IsContainer(parObj.type)) { + // parents.push($ax.getScriptIdFromPath([parObj.id], strippedId)); + // parObj = parObj.parent; + //} + //var otherParents = $ax('#' + id).getParents(true, ['item', 'repeater', 'dynamicPanel', 'layer'])[0]; + //for (var i = 0; i < otherParents.length; i++) { + // parents.push(otherParents[i]); + //} + + var elementId = this.getElementIds()[0]; + // var strippedId = $ax.repeater.removeSuffixFromElementId(id); + // var parObj = id.indexOf('text') != -1 ? axObj : axObj.parent; // When working with text id, parent widget is the ax obj we are dealing with, so that should be the first parent + var parentIds = []; + var parObj = $obj(elementId).parent; + while ($ax.public.fn.IsContainer(parObj.type)) { + parentIds.push($ax.getScriptIdFromPath([parObj.id], this.id)); + parObj = parObj.parent; + } + var otherParents = $ax('#' + elementId).getParents(true, ['item', 'repeater', 'dynamicPanel'])[0]; + for (var i = 0; i < otherParents.length; i++) { + parentIds.push(otherParents[i]); + } + + var parentScrollableId = scrollableId ? scrollableId.split('_')[0] : scrollableId; + for (var i = 0; i < parentIds.length; i++) { + //var parentId = $ax.visibility.getWidgetFromContainer(parents[0]); + //var parent = $ax.visibility.applyWidgetContainer(parentId, true); + //if(parent.length) { + //var parentId = parentIds[i]; + //var fixed = _fixedOffset(parentId, vert); + //if (fixed.valid) { + // loc += fixed.offset; + // break; + //} else loc += $ax.getNumFromPx(parent.css(prop)); + //} + + var parentId = parentIds[i]; + if (parentId == parentScrollableId) break; + var parentLoc = $ax('#' + parentId).offsetLocation(); + loc = { + x: loc.x + parentLoc.x, + y: loc.y + parentLoc.y, + left: loc.left + parentLoc.left, + top: loc.top + parentLoc.top, + } + var axObj = $obj(parentId); + if(axObj && axObj.fixedVertical) { + boundingRect.isFixed = true; + break; + } + } + + boundingRect.left = loc.x; + boundingRect.top = loc.y; + return _populateBoundingRect(boundingRect); + }; + + $ax.public.fn.viewportBoundingRect = function (scrollableId) { + var boundingRect = this.pageBoundingRect(true, scrollableId); + if (!boundingRect) return undefined; + + if(!boundingRect.isFixed) boundingRect.left = _bodyToWorld(boundingRect.left, false); + return _populateBoundingRect(boundingRect); + } + + $ax.public.fn.size = function () { + var boundingRect = this.offsetBoundingRect(true); + return boundingRect ? boundingRect.size : undefined; + + //var firstId = this.getElementIds()[0]; + //if(!firstId) return undefined; + + //var object = $ax.getObjectFromElementIdDisregardHex(firstId); + //if(object && (object.type == 'layer' || object.generateCompound)) { + // var boundingRect = $ax.public.fn.getWidgetBoundingRect(firstId); + // return { width: boundingRect.width, height: boundingRect.height }; + //} + + //var firstIdObject = $jobj(firstId); + //var trap = _displayWidget($ax.repeater.removeSuffixFromElementId(firstId)); + //var size = { width: firstIdObject.outerWidth(), height: firstIdObject.outerHeight() }; + //trap(); + //return size; + }; + + $ax.public.fn.width = function () { + var boundingRect = this.offsetBoundingRect(true); + return boundingRect ? boundingRect.width : undefined; + + //var firstId = this.getElementIds()[0]; + //if(!firstId) return undefined; + + //var object = $ax.getObjectFromElementIdDisregardHex(firstId); + //if (object && (object.type == 'layer' || object.generateCompound)) { + // var boundingRect = $ax.public.fn.getWidgetBoundingRect(firstId); + // return boundingRect.width; + //} + + //var firstIdObject = $jobj(firstId); + + //return firstIdObject.outerWidth(); + }; + + $ax.public.fn.height = function () { + var boundingRect = this.offsetBoundingRect(true); + return boundingRect ? boundingRect.height : undefined; + + //var firstId = this.getElementIds()[0]; + //if(!firstId) return undefined; + + //var object = $ax.getObjectFromElementIdDisregardHex(firstId); + //if (object && (object.type == 'layer' || object.generateCompound)) { + // var boundingRect = $ax.public.fn.getWidgetBoundingRect(firstId); + // return boundingRect.height; + //} + + //var firstIdObject = $jobj(firstId); + + //return firstIdObject.outerHeight(); + }; + + //this should replace locRelativeIgnoreLayer + $ax.public.fn.offsetLocation = function () { + var boundingRect = this.offsetBoundingRect(true); + return boundingRect ? boundingRect.location : undefined; + }; + + //$ax.public.fn.offsetLeft = function () { + // var boundingRect = this.offsetBoundingRect(); + // return boundingRect ? boundingRect.left : undefined; + //}; + + //$ax.public.fn.offsetTop = function () { + // var boundingRect = this.offsetBoundingRect(); + // return boundingRect ? boundingRect.top : undefined; + //}; + + $ax.public.fn.viewportLocation = function (scrollableId) { + var boundingRect = this.viewportBoundingRect(scrollableId); + return boundingRect ? boundingRect.location : undefined; + }; + + //$ax.public.fn.pageLeft = function () { + // var boundingRect = this.pageBoundingRect(); + // return boundingRect ? boundingRect.left : undefined; + //}; + + //$ax.public.fn.pageTop = function () { + // var boundingRect = this.pageBoundingRect(); + // return boundingRect ? boundingRect.top : undefined; + //}; + + //This is getting its position in the Editor + //It was needed because the widget would be contained so getting the position from jQuery would not be accurate + //This can use the editor values + //$ax.public.fn.locRelativeIgnoreLayer = function (vert) { + // var elementId = this.getElementIds()[0]; + // if(!elementId) return undefined; + + // var parents = this.getParents(true, '*')[0]; + + // for(var i = 0; i < parents.length; i++) { + // var type = $ax.getTypeFromElementId(parents[i]); + // if(!$axure.fn.IsLayer(type) && !$axure.fn.IsReferenceDiagramObject(type)) { + // var func = vert ? _getRelativeTop : _getRelativeLeft; + // return func(elementId, $jobj(parents[i])[0]); + // } + // } + // var axThis = $ax('#' + elementId); + // return vert ? axThis.top() : _bodyToWorld(axThis.left(), true); + //}; + + var _bodyToWorld = $axure.fn.bodyToWorld = function(x, from) { + var body = $('body'); + if (body.css('position') != 'relative') return x; + var offset = $ax.getNumFromPx(body.css('left')) + Math.max(0, ($(window).width() - body.width()) / 2); + if(from) offset *= -1; + return x + offset; + } + + $ax.public.fn.left = function (relative) { + return relative ? this.offsetLocation().left : this.viewportLocation().left; + + //var firstId = this.getElementIds()[0]; + //if(!firstId) return undefined; + + //var left = _getLoc(firstId, false, false, relative); + + //// If you are absolute, unless your are a pinned panel... + //if(relative || $obj(firstId) && $obj(firstId).fixedVertical) return left; + + //// ... or you are in one... + //var parentPanels = $ax('#' + firstId).getParents(true, 'dynamicPanel')[0]; + //for(var i = 0; i < parentPanels.length; i++) if ($obj(parentPanels[i]).fixedVertical) return left; + + //// ... you must convert from body to world coordinates + //return _bodyToWorld(left); + }; + + $ax.public.fn.top = function(relative) { + return relative ? this.offsetLocation().top : this.viewportLocation().top; + + //var firstId = this.getElementIds()[0]; + //return firstId && _getLoc(firstId, true, false, relative); + }; + + //var _getLoc = function(id, vert, high, relative) { + // var mathFunc = high ? 'max' : 'min'; + // var prop = vert ? 'top' : 'left'; + // var dim = vert ? 'height' : 'width'; + + // var obj = $jobj(id); + // var strippedId = $ax.repeater.removeSuffixFromElementId(id); + // var axObj = $obj(strippedId); + // var oldDisplay = obj.css('display'); + // var displaySet = false; + // if(oldDisplay == 'none') { + // obj.css('display', ''); + // displaySet = true; + // } + // var loc = Math.NaN; + // var rdo = axObj.type == $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE; + + // if (!rdo) loc = $ax.getNumFromPx(obj.css(prop)); + + // var fixed = _fixedOffset(id, vert); + // if(fixed.valid) loc = !vert && fixed.fullWidth ? 0 : fixed.offset; + // else if (!relative) { + // var parents = []; + // var parObj = id.indexOf('text') != -1 ? axObj : axObj.parent; // When working with text id, parent widget is the ax obj we are dealing with, so that should be the first parent + // while($ax.public.fn.IsContainer(parObj.type)) { + // parents.push($ax.getScriptIdFromPath([parObj.id], strippedId)); + // parObj = parObj.parent; + // } + // var otherParents = $ax('#' + id).getParents(true, ['item', 'repeater', 'dynamicPanel', 'layer'])[0]; + // for(var i = 0; i < otherParents.length; i++) { + // parents.push(otherParents[i]); + // } + + // for(var i = 0; i < parents.length; i++) { + // var parentId = $ax.visibility.getWidgetFromContainer(parents[i]); + // var parent = $ax.visibility.applyWidgetContainer(parentId, true); + + // // Layer may not have container, and will be at 0,0 otherwise. + // if (!parent.length) continue; + + // fixed = _fixedOffset(parentId, vert); + // if(fixed.valid) { + // loc += fixed.offset; + // break; // If fixed ignore any parents if there are any, they don't matter. + // } else loc += $ax.getNumFromPx(parent.css(prop)); + // } + // } + + // if (high) loc += obj[dim](); + + // // Special Layer code + // if (axObj.type == 'layer') { + // // If layer has a container, then use that. Otherwise must deal with children. Children can move in container after created, but ignoring for now. + // var container = $ax.visibility.applyWidgetContainer(id, true, true); + // if(container.length) loc += $ax.getNumFromPx(container.css(prop)); + // else loc += (_getChildLoc(axObj.objs, vert, high, dim, true, id) || 0); + // } + + // if(displaySet) obj.css('display', oldDisplay); + // return loc; + //}; + + //var _getChildLoc = function (children, vert, high, dim, root, path, itemId) { + // if (typeof (path) == 'string') { + // itemId = $ax.repeater.getItemIdFromElementId(path); + // path = $ax.getPathFromScriptId(path); + // path.pop(); // Remove object id, only want rdo path. + // } + // var mathFunc = high ? 'max' : 'min'; + // var childLoc = NaN; + // for (var i = 0; i < children.length; i++) { + // var childObj = children[i]; + // var childId = $ax.getElementIdFromPath([childObj.id], { relativeTo: path }); + // if (!childId) continue; + // childId = $ax.repeater.createElementId(childId, itemId); + // if($ax.public.fn.IsReferenceDiagramObject(childObj.type)) { + // path.push(childObj.id); + // var childProp = _getChildLoc($ax.pageData.masters[$obj(childId).masterId].diagram.objects, vert, high, dim, false, path, itemId); + // path.pop(); + // if(isNaN(childProp)) continue; + // } else if($ax.public.fn.IsLayer(childObj.type)) { + // childProp = _getChildLoc(childObj.objs, vert, high, dim, false, path, itemId); + // } else { + // if(!$ax.visibility.IsIdVisible(childId)) continue; + // childProp = $ax('#' + childId).locRelativeIgnoreLayer(vert); + // if(high) childProp += $jobj(childId)[dim](); + // } + + // if(isNaN(childLoc)) childLoc = childProp; + // else if(!isNaN(childProp)) childLoc = Math[mathFunc](childLoc, childProp); + // } + + // return root && isNaN(childLoc) ? 0 : childLoc; + //}; + + //var _fixedOffset = function (id, vert) { + // var axObj = $obj(id); + // //I think this is only for pinned panels? So why are we coming through here for rtps? + // if(!axObj) return { valid: false }; + + // var dim = vert ? 'height' : 'width'; + // var alignment = axObj['fixed' + (vert ? 'Vertical' : 'Horizontal')]; + // if(!alignment) return { valid: false }; + // var loc = 0; + + // // TODO: This returns 0 for width/height it or any parent is display none. Similar issue when using axquery width/height + // // TODO: Look into replacing this with axquery width/height and fixing that to use this hack. Potentially want to make js generic trapper. + // var trap = _displayWidget(id); + // var query = $jobj(id); + // var objSize = query[dim](); + // trap(); + + // if(alignment == 'center' || alignment == 'middle') { + // loc = $ax.getNumFromPx(query.css('margin-' + (vert ? 'top' : 'left'))); + // loc += ($(window)[dim]()) / 2; + // } else if(alignment == 'bottom' || alignment == 'right') { + // loc = $ax.getNumFromPx(query.css(vert ? 'bottom' : 'right')); + // loc = $(window)[dim]() - objSize - loc; // subract loc because margin here moves farther left/up as it gets bigger. + // } else { + // loc = $ax.getNumFromPx(query.css(vert ? 'top' : 'left')); + // } + + // var scrollKey = 'scroll' + (vert ? 'Top' : 'Left'); + // return { offset: $(window)[scrollKey]() + loc, valid: true, fullWidth: axObj.percentWidth == 1 }; + //}; + + var _displayWidget = function(id) { + var parents = $ax('#' + id).getParents(true, '*')[0]; + parents.push(id); // also need to show self + + var displayed = []; + for(var i = 0; i < parents.length; i++) { + var currId = parents[i]; + var currObj = $jobj(currId); + if(currObj.css('display') == 'none') { + currObj.css('display', 'block'); + displayed.push(currId); + } + } + + return function() { + for(var i = 0; i < displayed.length; i++) { + $jobj(displayed[i]).css('display', 'none'); + } + }; + } +}); diff --git a/code/page/resources/scripts/axure/doc.js b/code/page/resources/scripts/axure/doc.js new file mode 100644 index 0000000..53d77bb --- /dev/null +++ b/code/page/resources/scripts/axure/doc.js @@ -0,0 +1,901 @@ +$axure.internal(function($ax) { + var _pageData; + + + var _initializePageFragment = function(pageFragment, objIdToObject) { + var objectArrayHelper = function(objects, parent) { + for(var i = 0; i < objects.length; i++) { + diagramObjectHelper(objects[i], parent); + } + }; + + var diagramObjectHelper = function(diagramObject, parent) { + $ax.initializeObject('diagramObject', diagramObject); + objIdToObject[pageFragment.packageId + '~' + diagramObject.id] = diagramObject; + diagramObject.parent = parent; + diagramObject.owner = pageFragment; + diagramObject.scriptIds = []; + if(diagramObject.diagrams) { //dynamic panel + for(var i = 0; i < diagramObject.diagrams.length; i++) { + var diagram = diagramObject.diagrams[i]; + objectArrayHelper(diagram.objects, diagram); + } + } else if($ax.public.fn.IsLayer(diagramObject.type)) { + var layerObjs = diagramObject.objs; + objectArrayHelper(layerObjs, parent); + } + if(diagramObject.objects) objectArrayHelper(diagramObject.objects, diagramObject); + }; + objectArrayHelper(pageFragment.diagram.objects, pageFragment.diagram); + }; + + var _initalizeStylesheet = function(stylesheet) { + var stylesById = {}; + var customStyles = stylesheet.customStyles; + for(var key in customStyles) { + var style = customStyles[key]; + stylesById[style.id] = style; + } + var duplicateStyles = stylesheet.duplicateStyles; + for(var duplicateKey in duplicateStyles) { + stylesById[duplicateKey] = stylesById[duplicateStyles[duplicateKey]]; + } + + stylesheet.stylesById = stylesById; + }; + + + var _initializeDocumentData = function() { + _initalizeStylesheet($ax.document.stylesheet); + }; + + + var _initializePageData; + // ******* Dictionaries ******** // + (function() { + var scriptIdToParentLayer = {}; + var elementIdToObject = {}; + var scriptIdToObject = {}; + var scriptIdToRepeaterId = {}; + var repeaterIdToScriptIds = {}; + var repeaterIdToItemIds = {}; + var scriptIdToPath = {}; + var _scriptIds = []; + var elementIdToText = {}; + var radioGroupToSelectedElementId = {}; + _initializePageData = function() { + if(!_pageData || !_pageData.page || !_pageData.page.diagram) return; + + var objIdToObject = {}; + _initializePageFragment(_pageData.page, objIdToObject); + for(var masterId in _pageData.masters) { + var master = _pageData.masters[masterId]; + _initializePageFragment(master, objIdToObject); + } + + var _pathsToScriptIds = []; + _pathToScriptIdHelper(_pageData.objectPaths, [], _pathsToScriptIds, scriptIdToPath); + + for(var i = 0; i < _pathsToScriptIds.length; i++) { + var path = _pathsToScriptIds[i].idPath; + var scriptId = _pathsToScriptIds[i].scriptId; + + var packageId = _pageData.page.packageId; + if(path.length > 1) { + for(var j = 0; j < path.length - 1; j++) { + var rdoId = path[j]; + var rdo = objIdToObject[packageId + '~' + rdoId]; + packageId = rdo.masterId; + } + } + var diagramObject = objIdToObject[packageId + '~' + path[path.length - 1]]; + diagramObject.scriptIds[diagramObject.scriptIds.length] = scriptId; + + scriptIdToObject[scriptId] = diagramObject; + _scriptIds[_scriptIds.length] = scriptId; + } + + // Now map scriptIds to repeaters and layers + var mapScriptIdToRepeaterId = function(scriptId, repeaterId) { + scriptIdToRepeaterId[scriptId] = repeaterId; + var scriptIds = repeaterIdToScriptIds[repeaterId]; + if(scriptIds) scriptIds[scriptIds.length] = scriptId; + else repeaterIdToScriptIds[repeaterId] = [scriptId]; + }; + var mapScriptIdToLayerId = function(obj, layerId, path) { + var pathCopy = $ax.deepCopy(path); + pathCopy[path.length] = obj.id; + var scriptId = $ax.getScriptIdFromPath(pathCopy); + scriptIdToParentLayer[scriptId] = layerId; + } + var mapIdsToRepeaterAndLayer = function(path, objs, repeaterId) { + var pathCopy = $ax.deepCopy(path); + + for(var i = 0; i < objs.length; i++) { + var obj = objs[i]; + pathCopy[path.length] = obj.id; + var scriptId = $ax.getScriptIdFromPath(pathCopy); + // Rdo have no element on page and are not mapped to the repeater + if(repeaterId) mapScriptIdToRepeaterId(scriptId, repeaterId); + + if($ax.public.fn.IsDynamicPanel(obj.type)) { + for(var j = 0; j < obj.diagrams.length; j++) mapIdsToRepeaterAndLayer(path, obj.diagrams[j].objects, repeaterId); + } else if($ax.public.fn.IsReferenceDiagramObject(obj.type)) { + mapIdsToRepeaterAndLayer(pathCopy, $ax.pageData.masters[obj.masterId].diagram.objects, repeaterId); + } else if($ax.public.fn.IsRepeater(obj.type)) { + mapScriptIdToRepeaterId(scriptId, scriptId); + mapIdsToRepeaterAndLayer(path, obj.objects, scriptId); + } else if($ax.public.fn.IsLayer(obj.type)) { + var layerObjs = obj.objs; + for(var j = 0; j < layerObjs.length; j++) { + mapScriptIdToLayerId(layerObjs[j], scriptId, path); + } + mapIdsToRepeaterAndLayer(path, layerObjs, repeaterId); + } else if(obj.objects && obj.objects.length) { + if(repeaterId) { + for(var j = 0; j < obj.objects.length; j++) { + mapIdsToRepeaterAndLayer(path, obj.objects, repeaterId); + } + } + } + } + }; + mapIdsToRepeaterAndLayer([], $ax.pageData.page.diagram.objects); + }; + + + $ax.getPathFromScriptId = function(scriptId) { + var reversedPath = []; + var path = scriptIdToPath[scriptId]; + while(path && path.uniqueId) { + reversedPath[reversedPath.length] = path.uniqueId; + path = path.parent; + } + return reversedPath.reverse(); + }; + + var _getScriptIdFromFullPath = function(path) { + var current = $ax.pageData.objectPaths; + for(var i = 0; i < path.length; i++) { + current = current[path[i]]; + if(!current) return current; + } + return current && current.scriptId; + }; + + + var _getScriptIdFromPath = function(path, relativeTo, includeLimbo) { + var relativePath = []; + var includeMasterInPath = false; + if(relativeTo) { + var relativeToScriptId; + if(relativeTo.srcElement) { //this is eventInfo + relativeToScriptId = $ax.repeater.getScriptIdFromElementId(relativeTo.srcElement); + includeMasterInPath = relativeTo.isMasterEvent; + } else if(typeof relativeTo === 'string') { //this is an element id + relativeToScriptId = relativeTo; + } + + if(relativeToScriptId) { + relativePath = $ax.getPathFromScriptId(relativeToScriptId); + if(!includeMasterInPath) relativePath = relativePath.slice(0, relativePath.length - 1); + } else if(relativeTo instanceof Array) { //this is a path + relativePath = relativeTo; + } + } + var fullPath = relativePath.concat(path); + var scriptId = _getScriptIdFromFullPath(fullPath); + return (includeLimbo || !$ax.visibility.isScriptIdLimbo(scriptId)) && scriptId; + }; + $ax.getScriptIdFromPath = _getScriptIdFromPath; + + var _getElementIdsFromPath = function(path, eventInfo) { + var scriptId = _getScriptIdFromPath(path, eventInfo); + if(!scriptId) return []; + // Don't need placed check hear. If unplaced, scriptId will be undefined and exit out before here. + return $ax.getElementIdsFromEventAndScriptId(eventInfo, scriptId); + }; + $ax.getElementIdsFromPath = _getElementIdsFromPath; + + var _getElementIdFromPath = function(path, params, includeLimbo) { + var scriptId = _getScriptIdFromPath(path, params.relativeTo, includeLimbo); + if(!scriptId) return scriptId; + + var itemNum = params.itemNum; + if(params.relativeTo && typeof params.relativeTo === 'string') { + if($jobj(params.relativeTo)) itemNum = $ax.repeater.getItemIdFromElementId(params.relativeTo); + } + return $ax.repeater.createElementId(scriptId, itemNum); + }; + $ax.getElementIdFromPath = _getElementIdFromPath; + + var _getElementsIdFromEventAndScriptId = function(eventInfo, scriptId) { + var itemId = eventInfo && $ax.repeater.getItemIdFromElementId(eventInfo.srcElement); + var target = false; + // Try to get itemId from target if you can't get it from source. + if(!itemId) { + itemId = eventInfo && eventInfo.targetElement && $ax.repeater.getItemIdFromElementId(eventInfo.targetElement); + if(itemId) target = true; + } + + var parentRepeater = $ax.getParentRepeaterFromScriptId(scriptId); + if(parentRepeater && scriptId != parentRepeater) { + if(itemId && (!eventInfo || parentRepeater == $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(target ? eventInfo.targetElement : eventInfo.srcElement)))) { + return [$ax.repeater.createElementId(scriptId, itemId)]; + } + var elementIds = []; + var itemIds = $ax.getItemIdsForRepeater(parentRepeater); + if(!itemIds) return []; + + for(var i = 0; i < itemIds.length; i++) elementIds[i] = $ax.repeater.createElementId(scriptId, itemIds[i]); + return elementIds; + } + return [scriptId]; + }; + $ax.getElementIdsFromEventAndScriptId = _getElementsIdFromEventAndScriptId; + + var _getSrcElementIdFromEvent = function(event) { + var currentQuery = $(event.srcElement || event.target); + while(currentQuery && currentQuery.length && (!$obj(currentQuery.attr('id')) || $jobj(currentQuery.attr('id')).hasClass('text'))) { + currentQuery = currentQuery.parent(); + }; + return currentQuery.attr('id'); + }; + $ax.getSrcElementIdFromEvent = _getSrcElementIdFromEvent; + + var _getEventInfoFromEvent = function(event, skipShowDescriptions, elementId) { + var eventInfo = {}; + eventInfo.srcElement = elementId; + eventInfo.now = new Date(); + + if(event != null) { + //elementId can be empty string, so can't simple use "or" assignment here. + eventInfo.srcElement = elementId || elementId == '' ? elementId : _getSrcElementIdFromEvent(event); + eventInfo.which = event.which; + + // When getting locations in mobile, need to extract the touch object to get the mouse location attributes + var mouseEvent = (event.originalEvent && event.originalEvent.changedTouches && event.originalEvent.changedTouches[0]) || event.originalEvent; + if(mouseEvent && !mouseEvent.type) mouseEvent.type = event.type; + + if(skipShowDescriptions) eventInfo.skipShowDescriptions = true; + + // Always update mouse location if possible + $ax.event.updateMouseLocation(mouseEvent); + } + + // Always set event info about cursor + var _cursor = eventInfo.cursor = {}; + _cursor.x = $ax.mouseLocation.x; + _cursor.y = $ax.mouseLocation.y; + + var body = $('body'); + if(body.css('position') == 'relative') { + _cursor.x -= ($ax.getNumFromPx(body.css('left')) + Math.max(0, ($(window).width() - body.width()) / 2)); + } + + eventInfo.pageX = _cursor.x + 'px'; + eventInfo.pageY = _cursor.y + 'px'; + + // Do Keyboard Info + eventInfo.keyInfo = $ax.event.keyState(); + + eventInfo.window = $ax.getWindowInfo(); + + eventInfo.thiswidget = _getWidgetInfo(eventInfo.srcElement); + eventInfo.item = _getItemInfo(eventInfo.srcElement); + eventInfo.dragInfo = $ax.drag.GetWidgetDragInfo(); + + return eventInfo; + }; + $ax.getEventInfoFromEvent = _getEventInfoFromEvent; + + $ax.getBasicEventInfo = function() { + var eventInfo = {}; + eventInfo.now = new Date(); + eventInfo.window = $ax.getWindowInfo(); + eventInfo.cursor = { x: 0, y: 0}; + return eventInfo; + + }; + + //var _getWindowInfo = function() { + // var win = {}; + // win.width = $(window).width(); + // win.height = $(window).height(); + // win.scrollx = $(window).scrollLeft(); + // win.scrolly = $(window).scrollTop(); + // return win; + //}; + //$ax.getWindowInfo = _getWindowInfo; + + var repeaterInfoCache = []; + $ax.cacheRepeaterInfo = function(repeaterId, repeaterInfo) { + repeaterInfoCache[repeaterId] = repeaterInfo; + } + $ax.removeCachedRepeaterInfo = function(repeaterId) { + repeaterInfoCache[repeaterId] = undefined; + } + + var _getItemInfo = function(elementId) { + if(!elementId) return { valid: false }; + + elementId = _getParentElement(elementId); + + var index = $ax.repeater.getItemIdFromElementId(elementId); + if(!index) return { valid: false }; + + var item = { valid: true }; + + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId); + item.repeater = repeaterInfoCache[repeaterId] ? repeaterInfoCache[repeaterId] : _getWidgetInfo(repeaterId); + $ax.repeater.setDisplayProps(item, repeaterId, index); + item.ismarked = $ax.repeater.isEditItem(repeaterId, index); + item.isvisible = Boolean($jobj(elementId).length); + + return item; + }; + $ax.getItemInfo = _getItemInfo; + + var _getWidgetInfo = function(elementId) { + if(!elementId) return { valid: false }; + + elementId = _getParentElement(elementId); + + //var elementAxQuery = $ax('#' + elementId); + var elementQuery = $jobj(elementId); + var obj = $obj(elementId); + var widget = { valid: true, isWidget: true, obj: obj, elementQuery: elementQuery, isLayer: $ax.public.fn.IsLayer(obj.type) }; + widget.elementId = elementId; + widget.name = widget.label = (elementQuery.data('label') ? elementQuery.data('label') : ''); + //widget.text = $ax('#' + elementId).text(); + widget.opacity = Number(elementQuery.css('opacity')) * 100; + //widget.rotation = $ax.move.getRotationDegree(widget.elementId); + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + var repeaterId = $ax.getParentRepeaterFromScriptId(scriptId); + if(repeaterId) widget.repeater = $ax.public.fn.IsRepeater(obj.type) ? widget : _getWidgetInfo(repeaterId); + + // Right now only dynamic panel can scroll + if($ax.public.fn.IsDynamicPanel(obj.type)) { + var stateId = $ax.visibility.GetPanelState(elementId); + //can be empty when refreshing repeater and applying filter + if(stateId) { + var stateQuery = $('#' + stateId); + widget.scrollx = stateQuery.scrollLeft(); + widget.scrolly = stateQuery.scrollTop(); + //widget.stateQuery = stateQuery; + } + } else { + widget.scrollx = 0; + widget.scrolly = 0; + } + + // repeater only props + if($ax.public.fn.IsRepeater(obj.type)) { + widget.visibleitemcount = repeaterIdToItemIds[scriptId] ? repeaterIdToItemIds[scriptId].length : $ax.repeater.getVisibleDataCount(scriptId); + widget.itemcount = $ax.repeater.getFilteredDataCount(scriptId); + widget.datacount = $ax.repeater.getDataCount(scriptId); + widget.pagecount = $ax.repeater.getPageCount(scriptId); + widget.pageindex = $ax.repeater.getPageIndex(scriptId); + } + + // Get widget info funcs + //widget.elementAxQuery = function () { + // return this.elementAxQueryProp || (this.elementAxQueryProp = $ax('#' + this.elementId)); + //} + + //widget.isFitToContent = function () { + // if (this.isFitToContentProp === undefined) { + // if (!this.stateQuery) this.isFitToContentProp = false; + // else this.isFitToContentProp = $ax.dynamicPanelManager.isIdFitToContent(this.elementId); + // } + // return this.isFitToContentProp; + //} + + widget.x = function () { return this.getProp('x'); } + widget.y = function () { return this.getProp('y'); } + widget.pagex = function () { return this.getProp('pagex'); } + widget.pagey = function () { return this.getProp('pagey'); } + widget.width = function () { return this.getProp('width'); } + widget.height = function () { return this.getProp('height'); } + widget.left = function () { return this.x(); } + widget.top = function () { return this.y(); } + widget.right = function () { return this.x() + this.width(); } + widget.bottom = function () { return this.y() + this.height(); } + widget.rotation = function () { return this.getProp('rotation'); } + widget.text = function () { return this.getProp('text'); } + + widget.getProp = function (prop) { + var propName = prop + 'Prop'; + if (typeof (this[propName]) != 'undefined') return this[propName]; + return this[propName] = this.cacheProp(prop); + }; + + widget.cacheProp = function (prop) { + + if(prop == 'x' || prop == 'y' || prop == 'width' || prop == 'height') { + var boundingRect = $ax('#' + this.elementId).offsetBoundingRect(true); + this.xProp = boundingRect.left; + this.yProp = boundingRect.top; + this.widthProp = boundingRect.width; + this.heightProp = boundingRect.height; + } + + if(prop == 'pagex' || prop == 'pagey') { + var viewportLocation = $ax('#' + this.elementId).viewportLocation(); + this.pagexProp = viewportLocation.left; + this.pageyProp = viewportLocation.top; + } + + if(prop == 'rotation') { + this.rotationProp = $ax.move.getRotationDegree(this.elementId); + } + + if (prop == 'text') { + this.textProp = $ax('#' + this.elementId).text(); + } + + return this[prop + 'Prop']; + + //// I'm keeping the returned undefineds the same as before, but really I could probably return undefined right away if elementQuery is empty + //if (this.isLayer) { + // if (prop == 'pagex' || prop == 'pagey') { + // if (this.elementQuery.length > 0) { + // if (prop == 'pagex') return this.elementAxQuery().left(); + // else return this.elementAxQuery().top(); + // } + // return undefined; // Otherwise, it is undefined as there is no element + // } + // var boundingRect = $ax.public.fn.getWidgetBoundingRect(this.elementId); + // this.xProp = boundingRect.left; + // this.yProp = boundingRect.top; + // this.widthProp = boundingRect.width; + // this.heightProp = boundingRect.height; + // return this[prop + 'Prop']; + //} + + //if (this.elementQuery.length <= 0) return prop == 'x' || prop == 'y' ? 0 : undefined; + + //switch (prop) { + // case 'x': return this.elementAxQuery().locRelativeIgnoreLayer(false); + // case 'y': return this.elementAxQuery().locRelativeIgnoreLayer(true); + // case 'pagex': return this.elementAxQuery().left(); + // case 'pagey': return this.elementAxQuery().top(); + //} + + //var val = this.elementAxQuery()[prop](); + //if (this.isFitToContent()) val = this.stateQuery[prop](); + + //return val; + }; + + //widget.leftfixed = function() { this.getFixed('left'); } + //widget.topfixed = function() { this.getFixed('top'); } + //widget.rightfixed = function() { this.getFixed('right'); } + //widget.bottomfixed = function() { this.getFixed('bottom'); } + + //widget.isFixed = function() { + // if(this.isFixedProp === undefined) this.isFixedProp = this.elementQuery.css('position') == 'fixed)'; + // return this.isFixedProp; + //} + + //widget.getFixed = function (prop) { + // var fixed = prop + 'fixedProp'; + // if(!this.isFixed()) widget[fixed] = widget[prop](); + // if(widget[fixed] === undefined) { + + // if(prop == 'left' || prop == 'right') { + // if(this.windowScrollX === undefined) this.windowScrollX = $(window).scrollLeft(); + // var windowScroll = this.windowScrollX; + // } else { + // if(this.windowScrollY === undefined) this.windowScrollY = $(window).scrollTop(); + // windowScroll = this.windowScrollY; + // } + // widget[fixed] = widget[prop]() - windowScroll; + // } + // return widget[fixed]; + //} + + return widget; + }; + $ax.getWidgetInfo = _getWidgetInfo; + + $ax.GetTextPanelId = function (id, create) { + if(!$ax('#' + id).SupportsRichText()) return ''; + var buttonShape = $ax.GetButtonShape(id); + var panelDiv = buttonShape.find('.text')[0]; + if(!panelDiv) { + if(!create) return ""; + + var adaptiveId = $ax.adaptive.currentViewId; + var newId = id + "_text"; + //var newDiv = $('
      '); + var newDiv = $('

      '); + buttonShape.append(newDiv); + + $ax.style.setAdaptiveStyle(id, $ax.style.computeAllOverrides(id, undefined, $ax.style.generateState(id), adaptiveId)); + + panelDiv = newDiv[0]; + } + + return panelDiv.id; + } + + $ax.GetParentIdFromLink = function(id) { + return $ax.GetShapeIdFromText($jobj(id).parentsUntil('.text').parent().attr('id')); + }; + + $ax.GetButtonShapeId = function(id) { + var obj = $obj(id); + switch(obj.type) { + case $ax.constants.TREE_NODE_OBJECT_TYPE: + return obj.buttonShapeId ? $ax.getElementIdFromPath([obj.buttonShapeId], { relativeTo: id }) : ""; + case $ax.constants.LINK_TYPE: + return ""; + default: + return id; + } + }; + + $ax.GetButtonShape = function(id) { + return $jobj($ax.GetButtonShapeId(id)); + }; + + $ax.GetShapeIdFromText = function(id) { + if(!id) return undefined; // this is to prevent an infinite loop. + + var current = document.getElementById(id); + if(!current) return undefined; + current = current.parentElement; + while(current && current.tagName != 'BODY') { + var currentId = current.id; + if(currentId && currentId != 'base') return $ax.visibility.getWidgetFromContainer(currentId); + current = current.parentElement; + } + + return undefined; + }; + + $ax.GetImageIdFromShape = function(id) { + var image = $ax.GetButtonShape(id).find('img[id$=img]'); + if(!image.length) image = $jobj(id).find('img[id$=image_sketch]'); + return image.attr('id'); + }; + + var _getParentElement = $ax.getParentElement = function(elementId) { + var obj = $obj(elementId); + while(obj.isContained) { + var path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(elementId)); + var itemId = $ax.repeater.getItemIdFromElementId(elementId); + path[path.length - 1] = obj.parent.id; + elementId = $ax.getElementIdFromPath(path, { itemNum: itemId }); + obj = $obj(elementId); + } + + return elementId; + }; + + $ax.addItemIdToRepeater = function(itemId, repeaterId) { + var itemIds = repeaterIdToItemIds[repeaterId]; + if(itemIds) itemIds[itemIds.length] = itemId; + else repeaterIdToItemIds[repeaterId] = [itemId]; + + var scriptIds = repeaterIdToScriptIds[repeaterId]; + for(var i = 0; i < scriptIds.length; i++) elementIdToObject[$ax.repeater.createElementId(scriptIds[i], itemId)] = $ax.getObjectFromScriptId(scriptIds[i]); + }; + + $ax.getAllElementIds = function() { + var elementIds = []; + for(var i = 0; i < _scriptIds.length; i++) { + var scriptId = _scriptIds[i]; + var repeaterId = scriptIdToRepeaterId[scriptId]; + if(repeaterId && repeaterId != scriptId) { + var itemIds = repeaterIdToItemIds[repeaterId] || []; + for(var j = 0; j < itemIds.length; j++) elementIds[elementIds.length] = $ax.repeater.createElementId(scriptId, itemIds[j]); + } else elementIds[elementIds.length] = scriptId; + } + return elementIds; + }; + + $ax.getAllScriptIds = function() { + return _scriptIds; + }; + + $ax.getObjectFromElementId = function(elementId) { + return $ax.getObjectFromScriptId($ax.repeater.getScriptIdFromElementId(elementId)); + }; + + $ax.getObjectFromScriptId = function(scriptId) { + return scriptIdToObject[scriptId]; + }; + + $ax.getParentRepeaterFromElementId = function(elementId) { + return $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(elementId)); + }; + + $ax.getParentRepeaterFromElementIdExcludeSelf = function (elementId) { + var repeaterId = $ax.getParentRepeaterFromElementId(elementId); + return repeaterId != elementId ? repeaterId : undefined; + }; + + $ax.getParentRepeaterFromScriptId = function(scriptId) { + return scriptIdToRepeaterId[scriptId]; + }; + + var _getChildScriptIdsForRepeater = function(repeaterId) { + return repeaterIdToScriptIds[repeaterId]; + }; + + var _getItemIdsForRepeater = function(repeaterId) { + return repeaterIdToItemIds[repeaterId] || []; + }; + $ax.getItemIdsForRepeater = _getItemIdsForRepeater; + + var _clearItemIdsForRepeater = function(repeaterId) { + repeaterIdToItemIds[repeaterId] = []; + }; + $ax.clearItemsForRepeater = _clearItemIdsForRepeater; + + $ax.getChildElementIdsForRepeater = function(repeaterId) { + var scriptIds = _getChildScriptIdsForRepeater(repeaterId); + var itemIds = _getItemIdsForRepeater(repeaterId); + + var retVal = []; + if(!itemIds || !scriptIds) return retVal; + + for(var i = 0; i < scriptIds.length; i++) { + for(var j = 0; j < itemIds.length; j++) { + retVal[retVal.length] = $ax.repeater.createElementId(scriptIds[i], itemIds[j]); + } + } + return retVal; + }; + + $ax.getRdoParentFromElementId = function(elementId) { + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + var rdoId = scriptIdToPath[scriptId].parent.scriptId; + if($ax.getParentRepeaterFromScriptId(rdoId)) rdoId = $ax.repeater.createElementId(rdoId, $ax.repeater.getItemIdFromElementId(elementId)); + return rdoId; + }; + + $ax.getLayerParentFromElementId = function (elementId) { + var itemId = $ax.repeater.getItemIdFromElementId(elementId); + var scriptId = scriptIdToParentLayer[$ax.repeater.getScriptIdFromElementId(elementId)]; + return $ax.getParentRepeaterFromElementId(scriptId) ? $ax.repeater.createElementId(scriptId, itemId) : scriptId; + } + + $ax.updateElementText = function(elementId, text) { + elementIdToText[elementId] = text; + }; + + $ax.hasElementTextChanged = function(elementId, text) { + return elementIdToText[elementId] != text; + }; + + $ax.updateRadioButtonSelected = function(group, elementId) { + var old = radioGroupToSelectedElementId[group]; + radioGroupToSelectedElementId[group] = elementId; + return old; + }; + + $ax.hasRadioButtonSelectedChanged = function(group, elementId) { + return radioGroupToSelectedElementId[group] != elementId; + }; + })(); + + //Recursively populates fullPathArray with: + // [ { idPath, scriptId }, ... ] + //for every scriptId in the object + //also populates an object of scriptId -> path + var _pathToScriptIdHelper = function(currentPath, currentChain, fullPathArray, scriptIdToPath) { + for(var key in currentPath) { + if(key != "scriptId") { + var nextPath = currentPath[key]; + _pathToScriptIdHelper(nextPath, currentChain.concat(key), fullPathArray, scriptIdToPath); + nextPath.parent = currentPath; + nextPath.uniqueId = key; + } else { + fullPathArray[fullPathArray.length] = { idPath: currentChain, scriptId: currentPath.scriptId }; + scriptIdToPath[currentPath.scriptId] = currentPath; + } + } + }; + + $ax.public.loadCurrentPage = $ax.loadCurrentPage = function(pageData) { + $ax.pageData = _pageData = pageData; + _initializePageData(); + }; + + $ax.public.loadDocument = $ax.loadDocument = function(document) { + $ax.document = document; + _initializeDocumentData(); + }; + + + /** + Navigates to a page + + + */ + $ax.public.navigate = $ax.navigate = function(to) { //url, includeVariables, type) { + var targetUrl; + if(typeof (to) === 'object') { + includeVariables = to.includeVariables; + targetUrl = !includeVariables ? to.url : $ax.globalVariableProvider.getLinkUrl(to.url); + + if(to.target == "new") { + window.open(targetUrl, ""); + } else if(to.target == "popup") { + var features = _getPopupFeatures(to.popupOptions); + window.open(targetUrl, "", features); + } else { + var targetLocation = window.location; + if(to.target == "current") { + } else if(to.target == "parent") { + if(!top.opener) return; + targetLocation = top.opener.window.location; + } else if(to.target == "parentFrame") { + targetLocation = parent.location; + } else if(to.target == "frame") { + // targetLocation = to.frame.contentWindow.location; + $(to.frame).attr('src', targetUrl || 'about:blank'); + return; + } + + if (!_needsReload(targetLocation, to.url)) { + targetLocation.href = targetUrl || 'about:blank'; + } else { + targetLocation.href = $axure.utils.getReloadPath() + "#" + encodeURI(targetUrl); + } + } + } else { + $ax.navigate({ + url: to, + target: "current", + includeVariables: arguments[1] + }); + } + }; + + var _needsReload = function(oldLocation, newBaseUrl) { + var reload = false; + try { + var oldUrl = oldLocation.href; + var oldBaseUrl = oldUrl.split("#")[0]; + var lastslash = oldBaseUrl.lastIndexOf("/"); + if(lastslash > 0) { + oldBaseUrl = oldBaseUrl.substring(lastslash + 1, oldBaseUrl.length); + if(oldBaseUrl == encodeURI(newBaseUrl)) { + reload = true; + } + } + } catch(e) { + } + return reload; + }; + + var _getPopupFeatures = function(options) { + var defaultOptions = { + toolbar: true, + scrollbars: true, + location: true, + status: true, + menubar: true, + directories: true, + resizable: true, + centerwindow: true, + left: -1, + top: -1, + height: -1, + width: -1 + }; + + var selectedOptions = $.extend({}, defaultOptions, options); + + var optionsList = []; + optionsList.push('toolbar=' + (selectedOptions.toolbar ? 'yes' : 'no')); + optionsList.push('scrollbars=' + (selectedOptions.scrollbars ? 'yes' : 'no')); + optionsList.push('location=' + (selectedOptions.location ? 'yes' : 'no')); + optionsList.push('status=' + (selectedOptions.status ? 'yes' : 'no')); + optionsList.push('menubar=' + (selectedOptions.menubar ? 'yes' : 'no')); + optionsList.push('directories=' + (selectedOptions.directories ? 'yes' : 'no')); + optionsList.push('resizable=' + (selectedOptions.resizable ? 'yes' : 'no')); + + if(selectedOptions.centerwindow == false) { + if(selectedOptions.left > -1) { + optionsList.push('left=' + selectedOptions.left); + } + + if(selectedOptions.top > -1) { + optionsList.push('top=' + selectedOptions.top); + } + } + + var height = 0; + var width = 0; + if(selectedOptions.height > 0) { + optionsList.push('height=' + selectedOptions.height); + height = selectedOptions.height; + } + + if(selectedOptions.width > 0) { + optionsList.push('width=' + selectedOptions.width); + width = selectedOptions.width; + } + + var features = optionsList.join(','); + if(selectedOptions.centerwindow) { + var winl = (window.screen.width - width) / 2; + var wint = (window.screen.height - height) / 2; + features = features + ',left=' + winl + ',top=' + wint; + } + + return features; + }; + + /** + Closes a window + + + */ + $ax.public.closeWindow = $ax.closeWindow = function() { + parent.window.close(); + }; + + /** + Goes back + + + */ + $ax.public.back = $ax.back = function() { + window.history.go(-1); + }; + + /** + Reloads the current page. + # includeVariables: true if it should re-include the variables when the page is reloaded + */ + $ax.public.reload = $ax.reload = function(includeVariables) { + var targetUrl = (includeVariables === false) + ? $axure.utils.getReloadPath() + "#" + encodeURI($ax.pageData.url) + : $axure.utils.getReloadPath() + "#" + encodeURI($ax.globalVariableProvider.getLinkUrl($ax.pageData.url)); + window.location.href = targetUrl; + }; + + /** + Sets a variable. + # name: The name of the global variable to set + # value: The value that should be set + */ + $ax.public.setGlobalVariable = $ax.setGlobalVariable = function(name, value) { + if(!name || !value) { + return; + } + + $ax.globalVariableProvider.setVariableValue(name, value); + }; + + /** + Gets the value of a global variable + # name: The name of the global variable value to get + */ + $ax.public.getGlobalVariable = $ax.getGlobalVariable = function(name) { + $ax.globalVariableProvider.getVariableValue(name); + }; + + $ax.getObjectFromElementIdDisregardHex = function (elementId) { + var elementIdInput = elementId.charAt(0) == '#' ? elementId.substring(1) : elementId; + return this.getObjectFromElementId(elementIdInput); + } + + + $ax.getTypeFromElementId = function(elementId) { + var obj = this.getObjectFromElementIdDisregardHex(elementId); + return obj && obj.type; + }; + + $ax.getNumFromPx = function(pxNum) { + return Number(pxNum.replace('px', '')); + } + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/drag.js b/code/page/resources/scripts/axure/drag.js new file mode 100644 index 0000000..2eefeda --- /dev/null +++ b/code/page/resources/scripts/axure/drag.js @@ -0,0 +1,256 @@ +$axure.internal(function($ax) { + var widgetDragInfo = new Object(); + var _drag = {}; + $ax.drag = _drag; + + $ax.drag.GetWidgetDragInfo = function() { + return $.extend({}, widgetDragInfo); + }; + + $ax.drag.StartDragWidget = function(event, id) { + $ax.setjBrowserEvent(jQuery.Event(event)); + if(event.donotdrag) return; + + var x, y; + var tg; + if(IE_10_AND_BELOW) { + x = window.event.clientX + window.document.documentElement.scrollLeft + window.document.body.scrollLeft; + y = window.event.clientY + window.document.documentElement.scrollTop + window.document.body.scrollTop; + tg = window.event.srcElement; + } else { + if(event.changedTouches) { + x = event.changedTouches[0].pageX; + y = event.changedTouches[0].pageY; + } else { + x = event.pageX; + y = event.pageY; + event.preventDefault(); + } + tg = event.target; + } + + widgetDragInfo.hasStarted = false; + widgetDragInfo.widgetId = id; + widgetDragInfo.cursorStartX = x; + widgetDragInfo.cursorStartY = y; + widgetDragInfo.lastX = x; + widgetDragInfo.lastY = y; + widgetDragInfo.currentX = x; + widgetDragInfo.currentY = y; + + widgetDragInfo.movedWidgets = new Object(); + widgetDragInfo.startTime = (new Date()).getTime(); + widgetDragInfo.targetWidget = tg; + + var movedownName = IE_10_AND_BELOW && $ax.features.supports.windowsMobile ? + $ax.features.eventNames.mouseDownName : $ax.features.eventNames.mouseMoveName; + $ax.event.addEvent(document, movedownName, _dragWidget, true); + $ax.event.addEvent(document, $ax.features.eventNames.mouseUpName, _stopDragWidget, true); + + $ax.legacy.SuppressBubble(event); + }; + + var _dragWidget = function(event) { + $ax.setjBrowserEvent(jQuery.Event(event)); + + var x, y; + if(IE_10_AND_BELOW) { + x = window.event.clientX + window.document.documentElement.scrollLeft + window.document.body.scrollLeft; + y = window.event.clientY + window.document.documentElement.scrollTop + window.document.body.scrollTop; + } else { + if(event.changedTouches) { + x = event.changedTouches[0].pageX; + y = event.changedTouches[0].pageY; + //allow scroll (defaults) if only swipe events have cases and delta x is less than 5px and not blocking scrolling + var deltaX = x - widgetDragInfo.currentX; + var target = window.document.getElementById(widgetDragInfo.widgetId); + if($ax.event.hasSyntheticEvent(widgetDragInfo.widgetId, "onDrag") || $ax.event.hasSyntheticEvent(widgetDragInfo.widgetId, "onSwipeUp") || + $ax.event.hasSyntheticEvent(widgetDragInfo.widgetId, "onSwipeDown") || (deltaX * deltaX) > 25 + || ($ax.document.configuration.preventScroll && $ax.legacy.GetScrollable(target) == window.document.body)) { + event.preventDefault(); + } + } else { + x = event.pageX; + y = event.pageY; + } + } + widgetDragInfo.xDelta = x - widgetDragInfo.currentX; + widgetDragInfo.yDelta = y - widgetDragInfo.currentY; + widgetDragInfo.lastX = widgetDragInfo.currentX; + widgetDragInfo.lastY = widgetDragInfo.currentY; + widgetDragInfo.currentX = x; + widgetDragInfo.currentY = y; + + widgetDragInfo.currentTime = (new Date()).getTime(); + + $ax.legacy.SuppressBubble(event); + + if(!widgetDragInfo.hasStarted) { + widgetDragInfo.hasStarted = true; + $ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onDragStart"); + + widgetDragInfo.oldBodyCursor = window.document.body.style.cursor; + window.document.body.style.cursor = 'move'; + var widget = window.document.getElementById(widgetDragInfo.widgetId); + widgetDragInfo.oldCursor = widget.style.cursor; + widget.style.cursor = 'move'; + } + + $ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onDrag"); + }; + + var _suppressClickAfterDrag = function(event) { + _removeSuppressEvents(); + + $ax.legacy.SuppressBubble(event); + }; + + var _removeSuppressEvents = function () { + if(IE_10_AND_BELOW) { + $ax.event.removeEvent(event.srcElement, 'click', _suppressClickAfterDrag, undefined, true); + $ax.event.removeEvent(widgetDragInfo.targetWidget, 'mousemove', _removeSuppressEvents, undefined, true); + } else { + $ax.event.removeEvent(document, "click", _suppressClickAfterDrag, true); + $ax.event.removeEvent(document, 'mousemove', _removeSuppressEvents, true); + } + }; + + var _stopDragWidget = function(event) { + $ax.setjBrowserEvent(jQuery.Event(event)); + + var tg; + + + var movedownName = IE_10_AND_BELOW && $ax.features.supports.windowsMobile ? + $ax.features.eventNames.mouseDownName : $ax.features.eventNames.mouseMoveName; + $ax.event.removeEvent(document, movedownName, _dragWidget, true); + $ax.event.removeEvent(document, $ax.features.eventNames.mouseUpName, _stopDragWidget, true); + + tg = IE_10_AND_BELOW ? window.event.srcElement : event.target; + + if(widgetDragInfo.hasStarted) { + widgetDragInfo.currentTime = (new Date()).getTime(); + $ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onDragDrop"); + + if($ax.globalVariableProvider.getVariableValue('totaldragx') < -30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) { + $ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeLeft"); + } + + if($ax.globalVariableProvider.getVariableValue('totaldragx') > 30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) { + $ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeRight"); + } + + var totalDragY = $ax.globalVariableProvider.getVariableValue('totaldragy'); + if(totalDragY < -30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) { + $ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeUp"); + } + + if(totalDragY > 30 && $ax.globalVariableProvider.getVariableValue('dragtime') < 1000) { + $ax.event.raiseSyntheticEvent(widgetDragInfo.widgetId, "onSwipeDown"); + } + + window.document.body.style.cursor = widgetDragInfo.oldBodyCursor; + var widget = window.document.getElementById(widgetDragInfo.widgetId); + // It may be null if OnDragDrop filtered out the widget + if(widget != null) widget.style.cursor = widgetDragInfo.oldCursor; + + if(widgetDragInfo.targetWidget == tg && !event.changedTouches) { + // suppress the click after the drag on desktop browsers + if(IE_10_AND_BELOW && widgetDragInfo.targetWidget) { + $ax.event.addEvent(widgetDragInfo.targetWidget, 'click', _suppressClickAfterDrag, true, true); + $ax.event.addEvent(widgetDragInfo.targetWidget, "onmousemove", _removeSuppressEvents, true, true); + } else { + $ax.event.addEvent(document, "click", _suppressClickAfterDrag, true); + $ax.event.addEvent(document, "mousemove", _removeSuppressEvents, true); + + } + } + } + + widgetDragInfo.hasStarted = false; + widgetDragInfo.movedWidgets = new Object(); + + return false; + }; + + $ax.drag.GetDragX = function() { + if(widgetDragInfo.hasStarted) return widgetDragInfo.xDelta; + return 0; + }; + + $ax.drag.GetDragY = function() { + if(widgetDragInfo.hasStarted) return widgetDragInfo.yDelta; + return 0; + }; + + $ax.drag.GetTotalDragX = function() { + if(widgetDragInfo.hasStarted) return widgetDragInfo.currentX - widgetDragInfo.cursorStartX; + return 0; + }; + + $ax.drag.GetTotalDragY = function() { + if(widgetDragInfo.hasStarted) return widgetDragInfo.currentY - widgetDragInfo.cursorStartY; + return 0; + }; + + $ax.drag.GetDragTime = function() { + if(widgetDragInfo.hasStarted) return widgetDragInfo.currentTime - widgetDragInfo.startTime; + return 600000; + }; + + $ax.drag.LogMovedWidgetForDrag = function (id, dragInfo) { + dragInfo = dragInfo || widgetDragInfo; + if(dragInfo.hasStarted) { + var containerIndex = id.indexOf('_container'); + if(containerIndex != -1) id = id.substring(0, containerIndex); + + // If state or other non-widget id, this should not be dragged, and should exit out to avoid exceptions. + if(!$obj(id)) return; + + var query = $ax('#' + id); + //var x = query.left(); + //var y = query.top(); + var viewportLocation = query.viewportLocation(); + var x = viewportLocation.left; + var y = viewportLocation.top; + + var movedWidgets = dragInfo.movedWidgets; + if(!movedWidgets[id]) { + movedWidgets[id] = new Location(x, y); + } + } + }; + + var Location = function(x, y) { + this.x = x; + this.y = y; + }; + $ax.drag.location = Location; + + var Rectangle = $ax.drag.Rectangle = function(x, y, width, height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.right = x + width; + this.bottom = y + height; + }; + + Rectangle.prototype.IntersectsWith = function(rect) { + if(this.Invalid()) return false; + if(rect.length) { + for(var i = 0; i < rect.length; i++) if(!rect[i].Invalid && this.IntersectsWith(rect[i])) return true; + return false; + } + if(rect.Invalid()) return false; + return this.x < rect.right && this.right > rect.x && this.y < rect.bottom && this.bottom > rect.y; + }; + + Rectangle.prototype.Invalid = function() { + return this.x == -1 && this.y == -1 && this.width == -1 && this.height == -1; + }; + + Rectangle.prototype.Move = function(x, y) { + return new Rectangle(x, y, this.width, this.height); + }; +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/events.js b/code/page/resources/scripts/axure/events.js new file mode 100644 index 0000000..78592cf --- /dev/null +++ b/code/page/resources/scripts/axure/events.js @@ -0,0 +1,1975 @@ +// ******* Features MANAGER ******** // + +$axure.internal(function($ax) { + var _features = $ax.features = {}; + var _supports = _features.supports = {}; + _supports.touchstart = typeof window.ontouchstart !== 'undefined'; + _supports.touchmove = typeof window.ontouchmove !== 'undefined'; + _supports.touchend = typeof window.ontouchend !== 'undefined'; + + _supports.mobile = _supports.touchstart && _supports.touchend && _supports.touchmove; + // Got this from http://stackoverflow.com/questions/11381673/javascript-solution-to-detect-mobile-browser + var check = navigator.userAgent.match(/Android/i) + || navigator.userAgent.match(/webOS/i) + || navigator.userAgent.match(/iPhone/i) + || navigator.userAgent.match(/iPad/i) + || navigator.userAgent.match(/iPod/i) + || navigator.userAgent.match(/BlackBerry/i) + || navigator.userAgent.match(/Tablet PC/i) + || navigator.userAgent.match(/Windows Phone/i); + + _supports.windowsMobile = navigator.userAgent.match(/Tablet PC/i) || navigator.userAgent.match(/Windows Phone/i); + + if(!check && _supports.mobile) { + _supports.touchstart = false; + _supports.touchmove = false; + _supports.touchend = false; + _supports.mobile = false; + } + + var _eventNames = _features.eventNames = {}; + _eventNames.mouseDownName = _supports.touchstart ? 'touchstart' : 'mousedown'; + _eventNames.mouseUpName = _supports.touchend ? 'touchend' : 'mouseup'; + _eventNames.mouseMoveName = _supports.touchmove ? 'touchmove' : 'mousemove'; +}); + +// ******* EVENT MANAGER ******** // +$axure.internal(function ($ax) { + var isConsoleTracing = false + var isPageLoading = true; + var savedMessages = []; + + // Every time Debug begins/ends tracing or a new Debug.js file finishes loading this value will be updated + $axure.messageCenter.addStateListener("isTracing", function (key, value) { + isConsoleTracing = value; + isPageLoading = false; + + if (isConsoleTracing) { + for (var i = 0; i < savedMessages.length; i++) { + $ax.messageCenter.postMessage(savedMessages[i]["message"], savedMessages[i]["data"]); + } + } + + savedMessages = []; + }); + + var postMessage = function (message, data) { + // While page is still loading, we do not know if Console is set to trace, so save messages until load is finished and trace status can be determined + if (isPageLoading) { + savedMessages.push({ 'message': message, 'data': data }); + } else if (isConsoleTracing) { + $ax.messageCenter.postMessage(message, data); + } + } + + var _objectIdToEventHandlers = {}; + + var _jBrowserEvent = undefined; + $ax.setjBrowserEvent = function(event) { + _jBrowserEvent = event; + }; + + $ax.getjBrowserEvent = function() { + return _jBrowserEvent; + }; + + var _event = {}; + $ax.event = _event; + + //initilize state + _event.mouseOverObjectId = ''; + _event.mouseDownObjectId = ''; + _event.mouseOverIds = []; + + var EVENT_NAMES = ['mouseenter', 'mouseleave', 'contextmenu', 'change', 'focus', 'blur']; + + + // Tap, double tap, and touch move, or synthetic. + if(!$ax.features.supports.mobile) { + EVENT_NAMES[EVENT_NAMES.length] = 'click'; + EVENT_NAMES[EVENT_NAMES.length] = 'dblclick'; + EVENT_NAMES[EVENT_NAMES.length] = 'mousemove'; + } + + // add the event names for the touch events + EVENT_NAMES[EVENT_NAMES.length] = $ax.features.eventNames.mouseDownName; + EVENT_NAMES[EVENT_NAMES.length] = $ax.features.eventNames.mouseUpName; + + for(var i = 0; i < EVENT_NAMES.length; i++) { + var eventName = EVENT_NAMES[i]; + //we need the function here to circumvent closure modifying eventName + _event[eventName] = (function(event_Name) { + return function(elementId, fn) { + var elementIdQuery = $jobj(elementId); + var type = $ax.getTypeFromElementId(elementId); + + //we need specially track link events so we can enable and disable them along with + //their parent widgets + if(elementIdQuery.is('a')) _attachCustomObjectEvent(elementId, event_Name, fn); + //see notes below + else if($ax.IsTreeNodeObject(type)) _attachTreeNodeEvent(elementId, event_Name, fn); + else if ($ax.IsImageFocusable(type) && (event_Name == 'focus' || event_Name == 'blur')) { + var suitableChild; + var imgChild = $ax.repeater.applySuffixToElementId(elementId, '_img'); + var divChild = $ax.repeater.applySuffixToElementId(elementId, '_div'); + + for (var j = 0; j < elementIdQuery[0].children.length; j++) { + if (elementIdQuery[0].children[j].id == imgChild) suitableChild = imgChild; + if (!suitableChild && elementIdQuery[0].children[j].id == divChild) suitableChild = divChild; + } + if(!suitableChild) suitableChild = imgChild; + _attachDefaultObjectEvent($jobj(suitableChild), elementId, event_Name, fn); + } else { + var inputId = $ax.INPUT(elementId); + var isInput = $jobj(inputId).length != 0; + var id = isInput && (event_Name == 'focus' || event_Name == 'blur') ? inputId : elementId; + _attachDefaultObjectEvent($jobj(id), elementId, event_Name, fn); + } + }; + })(eventName); + } + + var AXURE_TO_JQUERY_EVENT_NAMES = { + 'onMouseOver': 'mouseenter', + 'onMouseOut': 'mouseleave', + 'onContextMenu': 'contextmenu', + 'onChange': 'change', + 'onFocus': 'focus', + 'onLostFocus': 'blur' + }; + + // Tap, double tap, and touch move, or synthetic. + if(!$ax.features.supports.mobile) { + AXURE_TO_JQUERY_EVENT_NAMES.onClick = 'click'; + AXURE_TO_JQUERY_EVENT_NAMES.onDoubleClick = 'dblclick'; + AXURE_TO_JQUERY_EVENT_NAMES.onMouseMove = 'mousemove'; + } + + AXURE_TO_JQUERY_EVENT_NAMES.onMouseDown = $ax.features.eventNames.mouseDownName; + AXURE_TO_JQUERY_EVENT_NAMES.onMouseUp = $ax.features.eventNames.mouseUpName; + //for dp, if mouse entered without leaving, don't fire mouse enter again + var mouseEnterGuard = {}; + var _attachEvents = function (diagramObject, elementId, doMouseEnterGuard) { + + var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input'); + var id = $jobj(inputId).length ? inputId : elementId; + + for(var eventName in diagramObject.interactionMap) { + var jQueryEventName = AXURE_TO_JQUERY_EVENT_NAMES[eventName]; + if(!jQueryEventName) continue; + + _event[jQueryEventName](id, + //this is needed to escape closure + (function(axEventObject) { + return function (e) { + if(e.type == 'mouseenter' && doMouseEnterGuard) { + if(mouseEnterGuard[elementId]) return; + else mouseEnterGuard[elementId] = true; + } + + $ax.setjBrowserEvent(e); + // console.log(axEventObject.description); + var eventInfo = $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), false, elementId); + _handleEvent(elementId, eventInfo, axEventObject); + }; + })(diagramObject.interactionMap[eventName]) + ); + + if(jQueryEventName.toLowerCase() == 'mouseenter' && doMouseEnterGuard) { + $jobj(elementId).on('mouseleave touchend', function() { + mouseEnterGuard[elementId] = false; + }); + } + } + + }; + + var _descriptionToKey = { 'OnFocus': 'onFocus', 'OnLostFocus': 'onLostFocus' }; + var _createProxies = function(diagramObject, elementId) { + var createFocus = _needsProxy(diagramObject, elementId, 'onFocus'); + var createLostFocus = _needsProxy(diagramObject, elementId, 'onLostFocus'); + + if(!createFocus && !createLostFocus) return; + + if(!diagramObject.interactionMap) diagramObject.interactionMap = {}; + if(createFocus) diagramObject.interactionMap.onFocus = { proxy: true, description: 'OnFocus' }; + if(createLostFocus) diagramObject.interactionMap.onLostFocus = { proxy: true, description: 'OnLostFocus' }; + } + + var preventDefaultEvents = ['OnContextMenu', 'OnKeyUp', 'OnKeyDown', 'OnPageContextMenu', 'OnPageKeyUp', 'OnPageKeyDown']; + var allowBubble = ['OnFocus', 'OnResize', 'OnMouseOut', 'OnMouseOver']; + + var _canClick = true; + var _startScroll = []; + var _setCanClick = function(canClick) { + _canClick = canClick; + if(_canClick) _startScroll = [$(window).scrollLeft(), $(window).scrollTop()]; + }; + + var _getCanClick = function() { + var endScroll = [$(window).scrollLeft(), $(window).scrollTop()]; + return _canClick && _startScroll[0] == endScroll[0] && _startScroll[1] == endScroll[1]; + }; + + //var _notAllowedInvisible = function (type) { + // $ax.getTypeFromElementId(elementId); + + // return !$ax.public.fn.IsReferenceDiagramObject(type) && !$ax.public.fn.IsLayer(type); + //} + + + var _notAllowedInvisible = function (id) { + var type = $ax.getTypeFromElementId(id); + if ($ax.public.fn.IsReferenceDiagramObject(type) || $ax.public.fn.IsLayer(type)) return false; + return !($ax.public.fn.IsVector(type) && _hasCompoundImage(id)); + } + + var _hasCompoundImage = function (id) { + var query = $jobj(id); + return $ax.public.fn.isCompoundVectorHtml(query[0]); + } + + var _suppressedEvents = {}; // Suppressed for next occurance. + var _blockedEvents = {}; // Blocked until unblocked. + _event.addSuppressedEvent = function(id, event) { + if(!_suppressedEvents[id]) _suppressedEvents[id] = []; + var events = _suppressedEvents[id]; + if(events.indexOf(event) != -1) return; + events.push(event); + } + + _event.blockEvent = function(id, event) { + if(!_blockedEvents[id]) _blockedEvents[id] = {}; + var events = _blockedEvents[id]; + if(events[event]) ++events[event]; + else events[event] = 1; + return function() { _unblockEvent(id, event); }; + } + + var _isSuppressedEvent = function(id, event) { + var suppressedEvents = _suppressedEvents[id]; + var blockedEvents = _blockedEvents[id]; + return (suppressedEvents && suppressedEvents.indexOf(event) != -1) || (blockedEvents && blockedEvents[event]); + } + + var _removeSuppressedEvent = function(id, event) { + var events = _suppressedEvents[id]; + if(!events) return; + if(events.length == 1) { + delete _suppressedEvents[id]; + } else { + var eventIndex = events.indexOf(event); + for(var i = eventIndex + 1; i < events.length; i++) events[i - 1] = events[i]; + events.pop(); + } + } + var _unblockEvent = function(id, event) { + var events = _blockedEvents[id]; + if(events) { + if(--events[event] > 0) return; + } + _removeSuppressedEvent(id, event); + } + + var _unblockEvent = function(id, event) { + var events = _blockedEvents[id]; + if(events) { + if(--events[event] > 0) return; + } + _removeSuppressedEvent(id, event); + } + + var eventNesting = 0; + var eventNestingTime = new Date().getTime(); + + var _handleEvent = $ax.event.handleEvent = function (elementId, eventInfo, axEventObject, skipShowDescriptions, synthetic) { + var eventDescription = axEventObject.description; + if(_enteredWidgets[elementId] && eventDescription == 'OnMouseEnter') return; // Suppress entering a widget when already in widget (ie only) + if(_isSuppressedEvent(elementId, eventDescription)) { + _removeSuppressedEvent(elementId, eventDescription); + return; + } + + if(axEventObject.proxy) { + var firingId = _widgetToFocusParent[elementId]; + if(firingId) { + var firingObj = $obj(firingId); + var nextEventObj = firingObj.interactionMap && firingObj.interactionMap[_descriptionToKey[eventDescription]]; + if(!nextEventObj) nextEventObj = axEventObject; + _handleEvent(firingId, eventInfo, nextEventObj, skipShowDescriptions, synthetic); + } + return; + } +// var x = JSON.stringify(eventInfo); +// var y = JSON.stringify(axEventObject); + + var fireTime = new Date().getTime(); + + if(fireTime - eventNestingTime > 100) { + eventNestingTime = fireTime; + eventNesting = 0; + } + + if(eventNesting === 0) { + $ax.recording.maybeRecordEvent(elementId, eventInfo, axEventObject, fireTime); + } + + eventNesting += 1; + + if (!synthetic && !_getCanClick() && (eventDescription == 'OnClick' || eventDescription == 'OnPageClick')) return; + // If you are supposed to suppress, do that right away. + if(suppressedEventStatus[eventDescription]) { + return; + } + + var currentEvent = $ax.getjBrowserEvent(); + if(!synthetic && currentEvent && currentEvent.originalEvent && currentEvent.originalEvent.handled && !eventInfo.isMasterEvent) return; + if(!synthetic && elementId && !$ax.style.getObjVisible(elementId) && _notAllowedInvisible(elementId)) return; + + //if debug + var axObj = $obj(elementId); + var axObjLabel = axObj ? axObj.label : eventInfo.label; + var axObjType = axObj ? axObj.friendlyType : eventInfo.friendlyType; + if (!skipShowDescriptions || eventDescription == 'OnPageLoad') postMessage('axEvent', { 'label': axObjLabel, 'type': axObjType, 'event': axEventObject }); + + var bubble = true; + var showCaseDescriptions = !skipShowDescriptions && _shouldShowCaseDescriptions(axEventObject); + if(!showCaseDescriptions) { + //handle case descriptions + var caseGroups = []; + var currentCaseGroup = []; + caseGroups[0] = currentCaseGroup; + + // Those refreshes not after a wait + var guaranteedRefreshes = {}; + + var caseGroupIndex = 0; + for(var i = 0; i < axEventObject.cases.length; i++) { + var currentCase = axEventObject.cases[i]; + if(currentCase.isNewIfGroup && i != 0) { + caseGroupIndex++; + currentCaseGroup = []; + caseGroups[caseGroups.length] = currentCaseGroup; + // Joon: Isn't caseGroups.length always equal to caseGroupIndex? + } + currentCaseGroup[currentCaseGroup.length] = currentCase; + + for(var j = 0; j < currentCase.actions.length; j++) { + var action = currentCase.actions[j]; + if(action.action == 'wait') break; + if(action.action != 'refreshRepeater') continue; + for(var k = 0; k < action.repeatersToRefresh.length; k++) { + var id = $ax.getElementIdsFromPath(action.repeatersToRefresh[k], eventInfo)[0]; + if(id) guaranteedRefreshes[id] = caseGroupIndex; + } + } + } + + for(var i = 0; i < caseGroups.length; i++) { + var groupRefreshes = []; + for(var key in guaranteedRefreshes) { + if(guaranteedRefreshes[key] == i) groupRefreshes[groupRefreshes.length] = key; + } + bubble = _handleCaseGroup(eventInfo, caseGroups[i], groupRefreshes) && bubble; + } + } else { + _showCaseDescriptions(elementId, eventInfo, axEventObject, synthetic); + bubble = false; + } + + // If not handled, synthetically bubble if you can + if(bubble && _widgetToFocusParent[elementId]) { + firingId = _widgetToFocusParent[elementId]; + if(firingId) { + firingObj = $obj(firingId); + nextEventObj = firingObj.interactionMap && firingObj.interactionMap[_descriptionToKey[axEventObject.description]]; + if(!nextEventObj) nextEventObj = axEventObject; + _handleEvent(firingId, eventInfo, nextEventObj, skipShowDescriptions, synthetic); + } + return; + } + + // Only trigger a supression if it handled this event + if(!bubble && suppressingEvents[eventDescription]) { + suppressedEventStatus[suppressingEvents[eventDescription]] = true; + } + + $ax.action.flushAllResizeMoveActions(eventInfo); + + // This should not be needed anymore. All refreshes should be inserted, or handled earlier. + var repeaters = $ax.deepCopy($ax.action.repeatersToRefresh); + while($ax.action.repeatersToRefresh.length) $ax.action.repeatersToRefresh.pop(); + for(i = 0; i < repeaters.length; i++) $ax.repeater.refreshRepeater(repeaters[i], eventInfo); + + if(currentEvent && currentEvent.originalEvent) { + currentEvent.originalEvent.handled = !synthetic && !bubble && allowBubble.indexOf(eventDescription) == -1; + //currentEvent.originalEvent.donotdrag = currentEvent.donotdrag || (!bubble && eventDescription == 'OnMouseDown'); + + // Prevent default if necessary + if(currentEvent.originalEvent.handled && preventDefaultEvents.indexOf(eventDescription) != -1) { + currentEvent.preventDefault(); + } + } + + eventNesting -= 1; + + if(!showCaseDescriptions) postMessage('axEventComplete'); + + }; + + var _handleScrollEvent = function (elementId, eventInfo, originalEvent, scrolledUp, scrolledDown, interactionMap, skipShowDescription, synthetic) { + if (!interactionMap) return; + if (interactionMap.onScroll) _handleEvent(elementId, eventInfo, interactionMap.onScroll, skipShowDescription, synthetic); + + var wasHandled = originalEvent.handled; + if (interactionMap.onScrollUp && scrolledUp) { + originalEvent.handled = false; + _handleEvent(elementId, eventInfo, interactionMap.onScrollUp, skipShowDescription, synthetic); + } else if (interactionMap.onScrollDown && scrolledDown) { + originalEvent.handled = false; + _handleEvent(elementId, eventInfo, interactionMap.onScrollDown, skipShowDescription, synthetic); + } + originalEvent.handled |= wasHandled; + } + + var _showCaseDescriptions = function(elementId, eventInfo, axEventObject, synthetic) { + + if(axEventObject.cases.length == 0) return true; + + var linksId = elementId + "linkBox"; + $('#' + linksId).remove(); + + var $container = $("
      "); + + if(!_isEventSimulating(axEventObject)) { + var copy = $ax.eventCopy(eventInfo); + for(var i = 0; i < axEventObject.cases.length; i++) { + var $link = $(""); + $link.click(function(j) { + return function () { + var currentCase = axEventObject.cases[j]; + postMessage('axCase', { 'item': currentCase.description, 'description': currentCase.conditionString, 'color': currentCase.caseColorHex }) + for(var k = 0; k < currentCase.actions.length; k++) { + var currentAction = currentCase.actions[k]; + + // Only use action's direct description if no action info descriptions exist + postMessage('axAction', { 'name': currentAction.displayName }); + //postMessage('axAction', { 'item': currentAction.description, 'description': (Object.keys(currentAction.actionInfoDescriptions).length > 0 ? "" : currentAction.description) }); + + for (var target in currentAction.actionInfoDescriptions) { + var infoDescriptions = currentAction.actionInfoDescriptions[target]; + for (var shortDescription in infoDescriptions) { + postMessage('axInfo', { 'item': target, 'description': shortDescription, 'longDescription': infoDescriptions[shortDescription] }); + } + } + } + postMessage('axEventComplete'); + + var bubble = $ax.action.dispatchAction(copy, axEventObject.cases[j].actions); + $ax.action.flushAllResizeMoveActions(copy); + $('#' + linksId).remove(); + return bubble; + }; + } (i) + ); + + $container.append($link); + } + } else { + var fullDescription = axEventObject.description + ":
      "; + for(var i = 0; i < axEventObject.cases.length; i++) { + var currentCase = axEventObject.cases[i]; + fullDescription += "  " + currentCase.description.replace(/
      /g, '
        ') + ":
      "; + for(var j = 0; j < currentCase.actions.length; j++) { + fullDescription += "    " + currentCase.actions[j].description.replace(/
      /g, '
            ') + "
      "; + } + } + fullDescription = fullDescription.substring(0, fullDescription.length - 4); + + var $link = $(""); + $link.click(function() { + _handleEvent(elementId, eventInfo, axEventObject, true, synthetic); + postMessage('axEventComplete'); + $('#' + linksId).remove(); + return; + }); + $container.append($link); + } + $container.mouseleave(function(e) { $ax.legacy.SuppressBubble(e); }); + $('body').append($container); + _showCaseLinks(eventInfo, linksId); + }; + + var _showCaseLinks = function(eventInfo, linksId) { + var links = window.document.getElementById(linksId); + + links.style.top = eventInfo.pageY; + + var left = eventInfo.pageX; + links.style.left = left; + $ax.visibility.SetVisible(links, true); + $ax.legacy.BringToFront(linksId, true); + // Switch to using jquery if this is still needed. Really old legacy code, likely for a browser no longer supported. + //$ax.legacy.RefreshScreen(); + }; + + + var _shouldShowCaseDescriptions = function(axEventObject) { + if($ax.document.configuration.linkStyle == "alwaysDisplayTargets") return true; + if($ax.document.configuration.linkStyle == "neverDisplayTargets") return false; + if(axEventObject.cases.length == 0) return false; + if(_isEventSimulating(axEventObject)) return false; + if(axEventObject.cases.length >= 2) return true; + return false; + }; + + var _isEventSimulating = function(axEventObject) { + for(var i = 0; i < axEventObject.cases.length; i++) { + if(axEventObject.cases[i].condition) return true; + } + return false; + }; + + var _handleCaseGroup = function(eventInfo, caseGroup, groupRefreshes) { + for(var i = 0; i < caseGroup.length; i++) { + var currentCase = caseGroup[i]; + if(!currentCase.condition || _processCondition(currentCase.condition, eventInfo)) { + postMessage('axCase', { 'item': currentCase.description, 'description': currentCase.conditionString, 'color': currentCase.caseColorHex }) + + for(var j = 0; j < currentCase.actions.length; j++) { + var currentAction = currentCase.actions[j]; + if (currentAction.action != 'refreshRepeater') { + // Only use action's direct description if no action info descriptions exist + postMessage('axAction', { 'name': currentAction.displayName }); + //postMessage('axAction', { 'item': currentAction.description, 'description': (Object.keys(currentAction.actionInfoDescriptions).length > 0 ? "" : currentAction.description) }); + + for (var target in currentAction.actionInfoDescriptions) { + var infoDescriptions = currentAction.actionInfoDescriptions[target]; + for (var shortDescription in infoDescriptions) { + postMessage('axInfo', { 'item': target, 'description': shortDescription, 'longDescription': infoDescriptions[shortDescription] }); + } + } + } + } + + for(var j = 0; j < currentCase.actions.length; j++) { + var action = currentCase.actions[j]; + if(action.action == 'wait') break; + if(action.action != 'refreshRepeater') continue; + for(var k = 0; k < action.repeatersToRefresh.length; k++) { + var id = $ax.getElementIdsFromPath(action.repeatersToRefresh[i], eventInfo)[i]; + if(id) { + var index = groupRefreshes.indexOf(id); + if(index != -1) $ax.splice(groupRefreshes, index); + } + } + } + + // Any guaranteed refreshes that aren't accounted for must be run still. + $ax.action.tryRefreshRepeaters(groupRefreshes, eventInfo); + + $ax.action.dispatchAction(eventInfo, currentCase.actions); + return false; + } + } + + // Any guaranteed refreshes that aren't accounted for must be run still. + $ax.action.tryRefreshRepeaters(groupRefreshes, eventInfo); + return true; + }; + + var _processCondition = function(expr, eventInfo) { + return $ax.expr.evaluateExpr(expr, eventInfo); + }; + + var _attachTreeNodeEvent = function(elementId, eventName, fn) { + //we need to set the cursor here because we want to make sure that every tree node has the default + //cursor set and then it's overridden if it has a click + if(eventName == 'click') window.document.getElementById(elementId).style.cursor = 'pointer'; + + _attachCustomObjectEvent(elementId, eventName, fn); + }; + + var _attachDefaultObjectEvent = function(elementIdQuery, elementId, eventName, fn) { + var func = function() { + if(!$ax.style.IsWidgetDisabled(elementId)) return fn.apply(this, arguments); + return true; + }; + + var bind = !elementIdQuery[eventName]; + if(bind) elementIdQuery.bind(eventName, func); + else elementIdQuery[eventName](func); + }; + + var _attachCustomObjectEvent = function(elementId, eventName, fn) { + var handlers = _objectIdToEventHandlers[elementId]; + if(!handlers) _objectIdToEventHandlers[elementId] = handlers = {}; + + var fnList = handlers[eventName]; + if(!fnList) handlers[eventName] = fnList = []; + + fnList[fnList.length] = fn; + }; + + var _fireObjectEvent = function(elementId, event, originalArgs) { + var element = window.document.getElementById(elementId); + + var handlerList = _objectIdToEventHandlers[elementId] && _objectIdToEventHandlers[elementId][event]; + if(handlerList) { + for(var i = 0; i < handlerList.length; i++) handlerList[i].apply(element, originalArgs); + } + + eventNesting -= 1; + + }; + + var _layerToFocusableWidget = {}; + var _widgetToFocusParent = {}; + _event.layerMapFocus = function(layer, elementId) { + var mainObj = layer.objs[0]; + // If first child non existant return + if (!mainObj) return; + + var mainId = $ax.getElementIdFromPath([mainObj.id], { relativeTo: elementId }); + _widgetToFocusParent[mainId] = elementId; + + // If first child is a layer, call recursively + if ($ax.public.fn.IsLayer(mainObj.type)) { + _event.layerMapFocus(mainObj, mainId); + var baseId = _layerToFocusableWidget[mainId]; + if(baseId) _layerToFocusableWidget[elementId] = baseId; + return; + } + + _layerToFocusableWidget[elementId] = mainId; + } + + var _needsProxy = function(obj, id, proxyName) { + // layers don't need on focus ever, proxies will handle them + if ($ax.public.fn.IsLayer(obj.type)) return false; + // If you already focus you don't need to force yourself to proxy. + if(obj.interactionMap && obj.interactionMap[proxyName]) return false; + + var parentId = _widgetToFocusParent[id]; + if(parentId) return _needsProxyHelper(parentId, proxyName); + return false; + } + + var _needsProxyHelper = function(id, proxyName) { + var obj = $obj(id); + if(obj.interactionMap && obj.interactionMap[proxyName]) return true; + + var parentId = _widgetToFocusParent[id]; + if(parentId) return _needsProxyHelper(parentId, proxyName); + return false; + } + + //for button shapes and images the img is focusable instead of the div to get better outlines + // For layers, we remember who their proxy is. + $ax.event.getFocusableWidgetOrChildId = function (elementId) { + var mappedId = _layerToFocusableWidget[elementId]; + if (mappedId) elementId = mappedId; + + var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input'); + var inputQuery = $jobj(inputId); + if(inputQuery.length > 0) return inputId; + + var imgId = $ax.repeater.applySuffixToElementId(elementId, '_img'); + var imgQuery = $jobj(imgId); + if (imgQuery.length > 0) return imgId; + + var divId = $ax.repeater.applySuffixToElementId(elementId, '_div'); + var divQuery = $jobj(divId); + if (divQuery.length > 0) return divId; + + return elementId; + }; + + var _enteredWidgets = {}; + + // key is the suppressing event, and the value is the event that is supressed + var suppressingEvents = {}; + // key is the event that will cancel the suppression, and value is the event that was being suppressed + var cancelSuppressions = {}; + // suppressed event maps to true if it is supressed + var suppressedEventStatus = {}; + + var initSuppressingEvents = function () { + suppressingEvents['OnLongClick'] = 'OnClick'; + cancelSuppressions['onMouseDown'] = 'OnClick'; + + // Have to cancel suppressed event here. Only works for non-synthetic events currently + for(var key in cancelSuppressions) { + var jEventName = AXURE_TO_JQUERY_EVENT_NAMES[key]; + if(!jEventName) continue; + $('body').bind(jEventName, function () { + suppressedEventStatus[cancelSuppressions[key]] = false; + }); + } + }; + + // TODO: It may be a good idea to split this into multiple functions, or at least pull out more similar functions into private methods + var _initializeObjectEvents = function(query, refreshType) { + query.each(function (dObj, elementId) { + if (dObj == null) return; // TODO: Update expo items that pass here to potentially remove this logic + var $element = $jobj(elementId); + var itemId = $ax.repeater.getItemIdFromElementId(elementId); + + // Focus has to be done before on focus fires + // Set up focus + if ($ax.public.fn.IsTextArea(dObj.type) || $ax.public.fn.IsTextBox(dObj.type) || $ax.public.fn.IsCheckBox(dObj.type) || $ax.public.fn.IsRadioButton(dObj.type) || + $ax.public.fn.IsListBox(dObj.type) || $ax.public.fn.IsComboBox(dObj.type) || $ax.public.fn.IsButton(dObj.type) || + (dObj.tabbable && ($ax.public.fn.IsImageBox(dObj.type) || $ax.public.fn.IsVector(dObj.type) || $ax.IsTreeNodeObject(dObj.type) || $ax.public.fn.IsTableCell(dObj.type)))) { + var focusObj = $jobj($ax.event.getFocusableWidgetOrChildId(elementId)); + focusObj.focus(function() { + window.lastFocusedControl = elementId; + $ax.style.SetWidgetFocused(elementId, true); + }); + focusObj.blur(function() { + $ax.style.SetWidgetFocused(elementId, false); + }); + } + // [MAS: Supressing events were here] + _createProxies(dObj, elementId); + var isDynamicPanel = $ax.public.fn.IsDynamicPanel(dObj.type); + if(dObj.interactionMap) { + _attachEvents(dObj, elementId, isDynamicPanel); + }; + + + + if (IE || $axure.browser.isEdge) { + $element.mouseenter(function() { + _enteredWidgets[elementId] = true; + }).mouseleave(function() { + _enteredWidgets[elementId] = false; + }); + } + + _attachIxStyleEvents(dObj, elementId, $element); + + var $axElement = $ax('#' + elementId); + // Base case is set up selected disabled based on the default in the axobj, for non, repeaters and resetting repeaters + var itemReset = refreshType == $ax.repeater.refreshType.reset; + if(!itemId || itemReset) { + //initialize disabled elements, do this first before selected, cause if a widget is disabled, we don't want to apply selected style anymore + if ($ax.public.fn.IsVector(dObj.type) || $ax.public.fn.IsImageBox(dObj.type) || isDynamicPanel || $ax.public.fn.IsLayer(dObj.type) + || $ax.public.fn.IsTextBox(dObj.type) || $ax.public.fn.IsTextArea(dObj.type) || $ax.public.fn.IsComboBox(dObj.type) || $ax.public.fn.IsListBox(dObj.type) + || $ax.public.fn.IsCheckBox(dObj.type) || $ax.public.fn.IsRadioButton(dObj.type)) { + + if (dObj.disabled) $axElement.enabled(false); + + // Initialize selected elements + if(dObj.selected) $axElement.selected(true); + } + } else if(refreshType == $ax.repeater.refreshType.preEval) { + // Otherwise everything should be set up correctly by pre-eval, want to set up selected disabled dictionaries (and disabled status) + // Disabled layer/dynamic panel don't have the disabled class, but they do have the disabled attr written out, so use that in that case + if ($element.hasClass('disabled') || + (($ax.IsLayer(dObj.type) || $ax.IsDynamicPanel(dObj.type)) && $element.attr('disabled'))) $axElement.enabled(false); + if($element.hasClass('selected')) $axElement.selected(true); + } else { + // Persist means we want to leave it as is, but we want to make sure we use selected based off of the backing data, and not some class that exists because of the reset + $element.removeClass('selected'); + } + + //if(OS_MAC && WEBKIT) { + // if ($ax.public.fn.IsComboBox(dObj.type) && dObj.disabled) { + // $jobj($ax.INPUT(elementId)).css('color', 'grayText'); + // } + //}; + + // Initialize Placeholders. Right now this is text boxes and text areas. + // Also, the assuption is being made that these widgets with the placeholder, have no other styles (this may change...) + var hasPlaceholder = dObj.placeholderText == '' ? true : Boolean(dObj.placeholderText); + if(($ax.public.fn.IsTextArea(dObj.type) || $ax.public.fn.IsTextBox(dObj.type)) && hasPlaceholder) { + // This is needed to initialize the placeholder state + var inputJobj = $jobj($ax.INPUT(elementId)); + inputJobj.bind('focus', function () { + if(dObj.HideHintOnFocused) { + var id = this.id; + var inputIndex = id.indexOf('_input'); + if (inputIndex == -1) return; + var inputId = id.substring(0, inputIndex); + + if (!$ax.placeholderManager.isActive(inputId)) return; + $ax.placeholderManager.updatePlaceholder(inputId, false, true); + } + $ax.placeholderManager.moveCaret(this.id); + }).bind('mouseup', function() { + $ax.placeholderManager.moveCaret(this.id); + }).bind('blur', function() { + var id = this.id; + var inputIndex = id.indexOf('_input'); + if(inputIndex == -1) return; + var inputId = id.substring(0, inputIndex); + + if($jobj(id).val()) return; + $ax.placeholderManager.updatePlaceholder(inputId, true); + }); + + if(ANDROID) { + //input fires before keyup, to avoid flicker, supported in ie9 and above + inputJobj.bind('input', function() { + if(!dObj.HideHintOnFocused) { //hide on type + var id = this.id; + var inputIndex = id.indexOf('_input'); + if(inputIndex == -1) return; + var inputId = id.substring(0, inputIndex); + + if($ax.placeholderManager.isActive(inputId)) { + $ax.placeholderManager.updatePlaceholder(inputId, false, true); + } else if(!$jobj(id).val()) { + $ax.placeholderManager.updatePlaceholder(inputId, true, false); + $ax.placeholderManager.moveCaret(id, 0); + } + } + }); + } else { + inputJobj.bind('keydown', function() { + if(!dObj.HideHintOnFocused) { + var id = this.id; + var inputIndex = id.indexOf('_input'); + if(inputIndex == -1) return; + var inputId = id.substring(0, inputIndex); + + if(!$ax.placeholderManager.isActive(inputId)) return; + $ax.placeholderManager.updatePlaceholder(inputId, false, true); + } + }).bind('keyup', function(e) { + var id = this.id; + var inputIndex = id.indexOf('_input'); + if(inputIndex == -1) return; + var inputId = id.substring(0, inputIndex); + + if($ax.placeholderManager.isActive(inputId)) return; + if(!dObj.HideHintOnFocused && !$jobj(id).val()) { + $ax.placeholderManager.updatePlaceholder(inputId, true); + $ax.placeholderManager.moveCaret(id, 0); + } + + //prevents triggering player shortcuts + e.preventDefault(); + }); + } + + $ax.placeholderManager.registerPlaceholder(elementId, dObj.placeholderText, inputJobj.attr('type') == 'password'); + $ax.placeholderManager.updatePlaceholder(elementId, !($jobj($ax.repeater.applySuffixToElementId(elementId, '_input')).val())); + } + + // Initialize assigned submit buttons + if(dObj.submitButton) { + $element.keyup(function(e) { + if(e.keyCode == '13') { + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + var path = $ax.deepCopy(dObj.submitButton.path); + path[path.length] = dObj.submitButton.id; + var itemNum = $ax.repeater.getItemIdFromElementId(elementId); + var submitId = $ax.getScriptIdFromPath(path, scriptId); + + if(itemNum && $ax.getParentRepeaterFromScriptId(submitId) == $ax.getParentRepeaterFromScriptId(scriptId)) { + submitId = $ax.repeater.createElementId(submitId, itemNum); + } + var inputId = $ax.INPUT(submitId); + if($jobj(inputId).length) submitId = inputId; + + $ax.setjBrowserEvent(e); + $ax.event.fireClick(submitId); + } + }).keydown(function(e) { + if(e.keyCode == '13') { + e.preventDefault(); + } + }); + } + + // Don't drag after mousing down on a plain text object + if ($ax.public.fn.IsTextArea(dObj.type) || $ax.public.fn.IsTextBox(dObj.type) || $ax.public.fn.IsListBox(dObj.type) || + $ax.public.fn.IsComboBox(dObj.type) || $ax.public.fn.IsCheckBox(dObj.type) || $ax.public.fn.IsRadioButton(dObj.type)) { + $element.bind($ax.features.eventNames.mouseDownName, function(event) { + event.originalEvent.donotdrag = true; + }); + } + + $element.bind($ax.features.eventNames.mouseDownName, function() { _setCanClick(true); }); + if (isDynamicPanel) { + $element.children().scroll(function () { _setCanClick(false); }); + } + + //initialize tree node cursors to default so they will override their parent + if ($ax.public.fn.IsTreeNodeObject(dObj.type) && !(dObj.interactionMap && dObj.interactionMap.onClick)) { + $element.css('cursor', 'default'); + } + + //initialize widgets that are clickable to have the pointer over them when hovering + if($ax.event.HasClick(dObj)) { + if($element) $element.css('cursor', 'pointer'); + } + + // TODO: not sure if we need this. It appears to be working without + //initialize panels for DynamicPanels + if (isDynamicPanel) { + $element.children().each(function() { + var parts = this.id.split('_'); + var state = parts[parts.length - 1].substring(5); + if(state != 0) $ax.visibility.SetVisible(this, false); + }); + } + + //initialize TreeNodes + if ($ax.public.fn.IsTreeNodeObject(dObj.type)) { + if($element.hasClass('treeroot')) return; + + var childrenId = elementId + '_children'; + var children = $element.children('[id="' + childrenId + '"]:first'); + if(children.length > 0) { + var plusMinusId = 'u' + (parseInt($ax.repeater.getScriptIdFromElementId(elementId).substring(1)) + 1); + if(itemId) plusMinusId = $ax.repeater.createElementId(plusMinusId, itemId); + if(!$jobj(plusMinusId).children().first().is('img')) plusMinusId = ''; + $ax.tree.InitializeTreeNode(elementId, plusMinusId, childrenId); + } + $element.click(function() { $ax.tree.SelectTreeNode(elementId, true); }); + } + + //initialize submenus + if ($ax.public.fn.IsMenuObject(dObj.type)) { + if($element.hasClass('sub_menu')) { + var tableCellElementId = $ax.getElementIdFromPath([dObj.parentCellId], { relativeTo: elementId }); + $ax.menu.InitializeSubmenu(elementId, tableCellElementId); + } + } + + // Attach handles for dynamic panels that propagate styles to inner items. + if ((isDynamicPanel || $ax.public.fn.IsLayer(dObj.type)) && dObj.propagate) { + $element.mouseenter(function() { + dynamicPanelMouseOver(this.id); + }).mouseleave(function() { + dynamicPanelMouseLeave(this.id); + }).bind($ax.features.eventNames.mouseDownName, function() { + dynamicPanelMouseDown(this.id); + }).bind($ax.features.eventNames.mouseUpName, function() { + dynamicPanelMouseUp(this.id); + }); + } + + // These are the dynamic panel functions for propagating rollover styles and mouse down styles to inner objects + var dynamicPanelMouseOver = function(elementId, fromChild) { + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent) { + dynamicPanelMouseOver(parent.id, true); + if(parent.direct) return; + } + if($.inArray(elementId, _event.mouseOverIds) != -1) return; + // If this event is coming from a child, don't mark that it's actually entered. + // Only mark that this has been entered if this event has naturally been triggered. (For reason see mouseleave) + if(!fromChild) _event.mouseOverIds[_event.mouseOverIds.length] = elementId; + if(elementId == _event.mouseOverObjectId) return; + _event.mouseOverObjectId = elementId; + $ax.dynamicPanelManager.propagateMouseOver(elementId, true); + }; + var dynamicPanelMouseLeave = function(elementId, fromChild) { + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent) { + dynamicPanelMouseLeave(parent.id, true); + if(parent.direct) return; + } + var index = $.inArray(elementId, _event.mouseOverIds); + // If index != -1, this has been natuarally entered. If naturally entered, then leaving child should not trigger leaving, + // but instead wait for natural mouse leave. If natural mouse enter never triggered, natural mouse leave won't so do this now. + if((index != -1) && fromChild) return; + $ax.splice(_event.mouseOverIds, index, 1); + + if(elementId == _event.mouseOverObjectId) { + _event.mouseOverObjectId = ''; + } + $ax.dynamicPanelManager.propagateMouseOver(elementId, false); + }; + + //attach handlers for button shape and tree node mouse over styles + // TODO: Can this really be removed? Trees seem to work with out (the generic hover case works for it). + // query.filter(function(obj) { + // return $ax.public.fn.IsVector(obj.type) && $ax.public.fn.IsTreeNodeObject(obj.parent.type) && + // obj.parent.style && obj.parent.style.stateStyles && + // obj.parent.style.stateStyles.mouseOver; + // }).mouseenter(function() { + // $ax.style.SetWidgetHover(this.id, true); + // }).mouseleave(function() { + // $ax.style.SetWidgetHover(this.id, false); + // }); + + //handle treeNodeObject events and prevent them from bubbling up. this is necessary because otherwise + //both a sub menu and it's parent would get a click + if ($ax.public.fn.IsTreeNodeObject(dObj.type)) { + $element.click(function() { + //todo -- this was bubbling, but then selecting a child tree node would bubble and select the parent (don't know if there is a better way) + _fireObjectEvent(this.id, 'click', arguments); + return false; + }).each(function() { + if(!this.style.cursor) { + this.style.cursor = 'default'; + } + }); + } + + // Synthetic events + + var map = dObj.interactionMap; + // Attach synthetic drag and swipe events + if(map && (map.onDragStart || map.onDrag || map.onDragDrop || map.onSwipeLeft || map.onSwipeRight || map.onSwipeUp || map.onSwipeDown)) { + $element.bind($ax.features.eventNames.mouseDownName, + function (e) { + if (!e.originalEvent.donotdrag) $ax.registerTouchCount(e); + $ax.drag.StartDragWidget(e.originalEvent, elementId); + }); + } + + // Attach dynamic panel synthetic scroll event + if (isDynamicPanel && map && (map.onScroll || map.onScrollUp || map.onScrollDown)) { + var diagrams = dObj.diagrams; + for(var i = 0; i < diagrams.length; i++) { + var panelId = $ax.repeater.applySuffixToElementId(elementId, '_state' + i); + (function(id) { + if ($('#' + id).data('lastScrollTop') == undefined) $('#' + id).data('lastScrollTop', '0'); + _attachDefaultObjectEvent($('#' + id), elementId, 'scroll', function(e) { + $ax.setjBrowserEvent(e); + var currentEvent = $ax.getjBrowserEvent(); + var eventInfoFromEvent = $ax.getEventInfoFromEvent(currentEvent, false, elementId); + + var currentTop = $('#' + id).scrollTop(); + var lastTop = $('#' + id).data('lastScrollTop'); + + _handleScrollEvent(elementId, eventInfoFromEvent, currentEvent.originalEvent, currentTop < lastTop, currentTop > lastTop, map); + $('#' + id).data('lastScrollTop', currentTop); + }); + })(panelId); + } + } + + // Attach synthetic hover event + if (map && map.onMouseHover) { + var MIN_HOVER_HOLD_TIME = 1000; + + // So when the timeout fires, you know whether it is the same mouseenter that is active or not. + var hoverMouseCount = 0; + // Update eventInfo regularly, so position is accurate. + var hoverEventInfo; + + $element.mouseenter(function(e) { + $ax.setjBrowserEvent(e); + hoverEventInfo = $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), false, elementId); + (function(currCount) { + window.setTimeout(function() { + if(currCount == hoverMouseCount) _raiseSyntheticEvent(elementId, 'onMouseHover', false, hoverEventInfo, true); + }, MIN_HOVER_HOLD_TIME); + })(hoverMouseCount); + }).mouseleave(function(e) { + $ax.setjBrowserEvent(e); + hoverMouseCount++; + }).mousemove(function(e) { + $ax.setjBrowserEvent(e); + hoverEventInfo = $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), false, elementId); + }); + } + + // Attach synthetic tap and hold event. + if (map && map.onLongClick) { + var MIN_LONG_CLICK_HOLD_TIME = 750; + + // So when the timeout fires, you know whether it is the same mousedown that is active or not. + var longClickMouseCount = 0; + + $element.bind($ax.features.eventNames.mouseDownName, function(e) { + (function(currCount) { + $ax.setjBrowserEvent(e); + var eventInfo = $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), false, elementId); + window.setTimeout(function() { + if(currCount == longClickMouseCount) _raiseSyntheticEvent(elementId, 'onLongClick', false, eventInfo, true); + }, MIN_LONG_CLICK_HOLD_TIME); + if(e.preventDefault) e.preventDefault(); + })(longClickMouseCount); + }).bind($ax.features.eventNames.mouseUpName, function(e) { + $ax.setjBrowserEvent(e); + longClickMouseCount++; + }); + }; + + + // Attach synthetic onSelectionChange event to droplist and listbox elements + if ($ax.event.HasSelectionChanged(dObj)) { + $element.bind('change', function(e) { + $ax.setjBrowserEvent(e); + _raiseSyntheticEvent(elementId, 'onSelectionChange'); + }); + }; + + // Highjack key up and key down to keep track of state of keyboard. + if($ax.event.HasKeyUpOrDown(dObj)) _event.initKeyEvents($element); + + // Attach synthetic onTextChange event to textbox and textarea elements + if ($ax.event.HasTextChanged(dObj)) { + var element = $jobj($ax.INPUT(elementId)); + $ax.updateElementText(elementId, element.val()); + //Key down needed because when holding a key down, key up only fires once, but keydown fires repeatedly. + //Key up because last mouse down will only show the state before the last character. + element.bind('keydown', function(e) { + $ax.setjBrowserEvent(e); + $ax.event.TryFireTextChanged(elementId); + }).bind('keyup', function(e) { + $ax.setjBrowserEvent(e); + $ax.event.TryFireTextChanged(elementId); + }); + }; + + // Attach synthetic onCheckedChange event to radiobutton and checkbox elements + if ($ax.public.fn.IsCheckBox(dObj.type) || $ax.public.fn.IsRadioButton(dObj.type)) { + var input = $jobj($ax.INPUT(elementId)); + if($ax.public.fn.IsRadioButton(dObj.type)) { + var radioGroupName = input.attr('name'); + if(input.prop('selected')) { + $ax.updateRadioButtonSelected(radioGroupName, elementId); + } + var onClick = function() { + if(radioGroupName !== elementId) { + var radioGroup = $("input[name='" + radioGroupName + "']").parent(); + for(var i = 0; i < radioGroup.length; i++) { + $ax.style.SetWidgetSelected(radioGroup[i].id, false, true); + } + } + $ax.style.SetWidgetSelected(elementId, true, true); + }; + } else { + onClick = function () { + $ax.style.SetWidgetSelected(elementId, !$ax.style.IsWidgetSelected(elementId), true); + }; + } + input.click(onClick); + + //$element.bind('change', function(e) { + // $ax.setjBrowserEvent(e); + // var eTarget = e.target || e.srcElement; + // _tryFireCheckedChanged(elementId, eTarget.selected); + //}); + }; + + var hasTap = map && (map.onClick || map.onDoubleClick); + var hasMove = map && map.onMouseMove; + _event.initMobileEvents(hasTap ? $element : $(), + hasMove ? $element : $(), elementId); + + + //attach link alternate styles + if(dObj.type == 'hyperlink') { + $element.mouseenter(function() { + var linkId = this.id; + if(_event.mouseOverIds.indexOf(linkId) != -1) return true; + _event.mouseOverIds[_event.mouseOverIds.length] = linkId; + var mouseOverObjectId = _event.mouseOverObjectId; + if(mouseOverObjectId && $ax.style.IsWidgetDisabled(mouseOverObjectId)) return true; + + $ax.style.SetLinkHover(linkId); + + var bubble = _fireObjectEvent(linkId, 'mouseenter', arguments); + + $ax.annotation.updateLinkLocations($ax.GetParentIdFromLink(linkId)); + return bubble; + }).mouseleave(function() { + var linkId = this.id; + $ax.splice(_event.mouseOverIds, _event.mouseOverIds.indexOf(linkId), 1); + var mouseOverObjectId = _event.mouseOverObjectId; + if(mouseOverObjectId && $ax.style.IsWidgetDisabled(mouseOverObjectId)) return true; + + $ax.style.SetLinkNotHover(linkId); + + var bubble = _fireObjectEvent(linkId, 'mouseleave', arguments); + + $ax.annotation.updateLinkLocations($ax.GetParentIdFromLink(linkId)); + return bubble; + }).bind($ax.features.eventNames.mouseDownName, function() { + var linkId = this.id; + var mouseOverObjectId = _event.mouseOverObjectId; + if($ax.style.IsWidgetDisabled(mouseOverObjectId)) return undefined; + + if(mouseOverObjectId) $ax.style.SetWidgetMouseDown(mouseOverObjectId, true); + $ax.style.SetLinkMouseDown(linkId); + + $ax.annotation.updateLinkLocations($ax.GetParentIdFromLink(linkId)); + + return false; + }).bind($ax.features.eventNames.mouseUpName, function() { + var linkId = this.id; + var mouseOverObjectId = _event.mouseOverObjectId; + if(mouseOverObjectId && $ax.style.IsWidgetDisabled(mouseOverObjectId)) return; + + if(mouseOverObjectId) $ax.style.SetWidgetMouseDown(mouseOverObjectId, false); + $ax.style.SetLinkNotMouseDown(linkId); + + $ax.annotation.updateLinkLocations($ax.GetParentIdFromLink(linkId)); + + }).click(function() { + var elementId = this.id; + var mouseOverObjectId = _event.mouseOverObjectId; + if(mouseOverObjectId && $ax.style.IsWidgetDisabled(mouseOverObjectId)) return undefined; + + return _fireObjectEvent(elementId, 'click', arguments); + }); + } + + // Init inline frames + if (dObj.type == 'inlineFrame') { + var target = dObj.target; + var url = ''; + if(target.includeVariables && target.url) { + var origSrc = target.url; + url = origSrc.toLowerCase().indexOf('http://') == -1 ? $ax.globalVariableProvider.getLinkUrl(origSrc) : origSrc; + + } else if(target.urlLiteral) { + url = $ax.expr.evaluateExpr(target.urlLiteral, $ax.getEventInfoFromEvent(undefined, true, elementId), true); + } + if(url) $jobj($ax.INPUT(elementId)).attr('src', url); + }; + }); + } + $ax.initializeObjectEvents = _initializeObjectEvents; + + $axure.initializeObjectEvents = function (query, refreshType, _) { + //_initializeObjectEvents($ax(query), refreshType); + _initializeObjectEvents($ax(query), $ax.repeater.refreshType.persist); + } + + $ax.event.updateIxStyleEvents = function(elementId) { + _dettachIxStyleEvents(elementId); + _attachIxStyleEvents($ax.getObjectFromElementId(elementId), elementId, $jobj(elementId), true); + } + + function clearMouseDownIxStyle(e) { + if(_event.mouseDownObjectId) { + $('#' + _event.mouseDownObjectId).trigger( + { type: "mouseup", + checkMouseOver: e.data && e.data.checkMouseOver + } + ); + } + } + + var _dettachIxStyleEvents = function(elementId) { + var $element = $jobj(elementId); + $element.off('mouseenter.ixStyle') + .off('mouseleave.ixStyle') + .off($ax.features.eventNames.mouseDownName + '.ixStyle') + .off($ax.features.eventNames.mouseUpName + '.ixStyle'); + } + + var _attachIxStyleEvents = function(dObj, elementId, $element, ignoreHasIxStyles) { + //attach button shape alternate styles + var isDynamicPanel = $ax.public.fn.IsDynamicPanel(dObj.type); + var needsMouseFilter = (ignoreHasIxStyles || $ax.event.HasIxStyles(dObj)) + && dObj.type != 'hyperlink' && !$ax.public.fn.IsLayer(dObj.type) && !isDynamicPanel && dObj.type != $ax.constants.TEXT_TYPE && + !$ax.public.fn.IsRepeater(dObj.type) //&& !$ax.public.fn.IsCheckBox(dObj.type) && !$ax.public.fn.IsRadioButton(dObj.type) + && !$ax.public.fn.IsTreeNodeObject(dObj.type); + if(needsMouseFilter) { + //$element.mouseenter(function () { + $element.on('mouseenter.ixStyle', function () { + var elementId = this.id; + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent && parent.direct) return; + if($.inArray(elementId, _event.mouseOverIds) != -1) return; + _event.mouseOverIds[_event.mouseOverIds.length] = elementId; + + if(elementId == _event.mouseOverObjectId) return; + _event.mouseOverObjectId = elementId; + $ax.style.SetWidgetHover(elementId, true); + $ax.annotation.updateLinkLocations(elementId); + //}).mouseleave(function () { + }).on('mouseleave.ixStyle', function () { + var elementId = this.id; + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent && parent.direct) return; + $ax.splice(_event.mouseOverIds, $.inArray(elementId, _event.mouseOverIds), 1); + + if(elementId == _event.mouseOverObjectId) { + _event.mouseOverObjectId = ''; + } + $ax.style.SetWidgetHover(elementId, false); + $ax.annotation.updateLinkLocations(elementId); + }); + + //$element.bind($ax.features.eventNames.mouseDownName, function () { + $element.on($ax.features.eventNames.mouseDownName + '.ixStyle', function () { + var elementId = this.id; + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent) { + dynamicPanelMouseDown(parent.id); + if(parent.direct) return; + } + _event.mouseDownObjectId = elementId; + //since we don't do mouse capture, it's possible that the mouseup not get triggered later + //in that case, detect the mouseup on document and dragend + $(document).one("mouseup", {checkMouseOver: true}, clearMouseDownIxStyle); + $("#" + elementId).one("dragend", clearMouseDownIxStyle); + + $ax.style.SetWidgetMouseDown(this.id, true); + $ax.annotation.updateLinkLocations(elementId); + //}).bind($ax.features.eventNames.mouseUpName, function () { + }).on($ax.features.eventNames.mouseUpName + '.ixStyle', function (e) { + var elementId = this.id; + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent) { + dynamicPanelMouseUp(parent.id); + if(parent.direct) return; + } + + $(document).off("mouseup", clearMouseDownIxStyle); + + if(_event.mouseDownObjectId) { + $("#" + _event.mouseDownObjectId).off("dragend", clearMouseDownIxStyle); + _event.mouseDownObjectId = ''; + } + if(!$ax.style.ObjHasMouseDown(elementId)) return; + + $ax.style.SetWidgetMouseDown(elementId, false, e.checkMouseOver); + $ax.annotation.updateLinkLocations(elementId); + + //there used to be something we needed to make images click, because swapping out the images prevents the click + // this is a note that we can eventually delete. + }); + + } + }; + + var dynamicPanelMouseDown = function (elementId) { + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent) { + dynamicPanelMouseDown(parent.id); + if(parent.direct) return; + } + _event.mouseDownObjectId = elementId; + $ax.dynamicPanelManager.propagateMouseDown(elementId, true); + }; + + var dynamicPanelMouseUp = function (elementId) { + var parent = $ax.dynamicPanelManager.parentHandlesStyles(elementId); + if(parent) { + dynamicPanelMouseUp(parent.id); + if(parent.direct) return; + } + _event.mouseDownObjectId = ''; + $ax.dynamicPanelManager.propagateMouseDown(elementId, false); + }; + + // Handle key up and key down events + (function() { + var _keyState = {}; + _keyState.ctrl = false; + _keyState.alt = false; + _keyState.shift = false; + _keyState.keyCode = 0; + $ax.event.keyState = function() { + return $ax.deepCopy(_keyState); + }; + + var modifierCodes = [16, 17, 18]; + var clearKeyCode = false; + $ax.event.initKeyEvents = function($query) { + $query.keydown(function (e) { + if(clearKeyCode) { + clearKeyCode = false; + _keyState.keyCode = 0; + } + var elementId = this.id; + + _keyState.ctrl = e.ctrlKey; + + _keyState.alt = e.altKey; + + _keyState.shift = e.shiftKey; + + // If a modifier was pressed, then don't set the keyCode; + if(modifierCodes.indexOf(e.keyCode) == -1) _keyState.keyCode = e.keyCode; + + $ax.setjBrowserEvent(e); + if (!elementId) fireEventThroughContainers('onKeyDown', undefined, false, [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE, $ax.constants.REPEATER], + [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.LAYER_TYPE]); + else _raiseSyntheticEvent(elementId, 'onKeyDown', false, undefined, true); + }); + $query.keyup(function(e) { + var elementId = this.id; + + if (modifierCodes.indexOf(e.keyCode) == -1) clearKeyCode = true; + else if (clearKeyCode) { + clearKeyCode = false; + _keyState.keyCode = 0; + } + + $ax.setjBrowserEvent(e); + // Fire event before updating modifiers. + if (!elementId) fireEventThroughContainers('onKeyUp', undefined, false, [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE, $ax.constants.REPEATER], + [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.LAYER_TYPE]); + else _raiseSyntheticEvent(elementId, 'onKeyUp', false, undefined, true); + + //check if the key is handled before triggering player shortcuts + if(!e.isDefaultPrevented() && !elementId) { + switch(e.which) { + case 188: + $ax.messageCenter.postMessage('previousPage'); + break; + case 190: + $ax.messageCenter.postMessage('nextPage'); + break; + default: + return; // exit this handler for other keys + } + } + + }); + }; + })(); + + // Handle adding mobile events + (function() { + // NOTE: Multi touch is NOT handled currently. + var CLICK_THRESHOLD_PX = 25; + var CLICK_THRESHOLD_PX_SQ = CLICK_THRESHOLD_PX * CLICK_THRESHOLD_PX; + var DBLCLICK_THRESHOLD_MS = 500; + + // Location in page coordinates + var tapDownLoc; + var lastClickEventTime; + + _event.initMobileEvents = function($tapQuery, $moveQuery, elementId) { + if(!$ax.features.supports.mobile) return; + + // Handle touch start + $tapQuery.bind('touchstart', function(e) { + // We do NOT support multiple touches. This isn't necessarily the touch we want. + var touch = e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]; + if(!touch) return; + + tapDownLoc = [touch.pageX, touch.pageY]; + + var time = (new Date()).getTime(); + if(time - lastClickEventTime < DBLCLICK_THRESHOLD_MS) { + var dObj = elementId === '' ? $ax.pageData.page : $ax.getObjectFromElementId(elementId); + var axEventObject = dObj && dObj.interactionMap && dObj.interactionMap['onDoubleClick']; + if(axEventObject) e.preventDefault(); //for Chrome on Android + } + }).bind('touchend', function(e) { + var touch = e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]; + if(!touch || !tapDownLoc || $ax.style.IsWidgetDisabled(elementId)) return; + + var tapUpLoc = [touch.pageX, touch.pageY]; + var xDiff = tapUpLoc[0] - tapDownLoc[0]; + var yDiff = tapUpLoc[1] - tapDownLoc[1]; + + if((xDiff * xDiff + yDiff * yDiff) < CLICK_THRESHOLD_PX_SQ) { + $ax.setjBrowserEvent(e); + _raiseSyntheticEvent(elementId, 'onClick', false, undefined, true); + + var time = (new Date()).getTime(); + if(time - lastClickEventTime < DBLCLICK_THRESHOLD_MS) { + _raiseSyntheticEvent(elementId, 'onDoubleClick', false, undefined, true); + if(e.originalEvent && e.originalEvent.handled) e.preventDefault(); //for iOS + } + lastClickEventTime = time; + } + }); + + // Handles touch move + $moveQuery.bind('touchmove', function(e) { + $ax.setjBrowserEvent(e); + _raiseSyntheticEvent(elementId, 'onMouseMove', false, undefined, true); + if(e.originalEvent && e.originalEvent.handled) e.preventDefault(); + }); + }; + })(); + + // Handle adding device independent click events to non-widgets + (function() { + var CLICK_THRESHOLD_PX = 25; + var CLICK_THRESHOLD_PX_SQ = CLICK_THRESHOLD_PX * CLICK_THRESHOLD_PX; + + // Location in page cooridinates + var tapDownLoc; + + _event.attachClick = function(query, clickHandler) { + if(!$ax.features.supports.mobile) { + query.click(clickHandler); + return; + } + + $(query).bind('touchstart', function(e) { + // We do NOT support multiple touches. This isn't necessarily the touch we want. + var touch = e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]; + if(!touch) return; + + tapDownLoc = [touch.pageX, touch.pageY]; + }); + + $(query).bind('touchend', function(e) { + var touch = e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]; + if(!touch) return; + + var tapUpLoc = [touch.pageX, touch.pageY]; + var xDiff = tapUpLoc[0] - tapDownLoc[0]; + var yDiff = tapUpLoc[1] - tapDownLoc[1]; + + if((xDiff * xDiff + yDiff * yDiff) < CLICK_THRESHOLD_PX_SQ) { + clickHandler(); + } + }); + }; + })(); + + // Handle firing device independent click events on widgets + (function() { + _event.fireClick = function(elementId) { + if(!$ax.features.supports.mobile) { + $('#' + elementId).click(); + return; + } + _raiseSyntheticEvent(elementId, 'onClick', false, undefined, true); + }; + })(); + + var _mouseLocation = $ax.mouseLocation = { x: 0, y: 0 }; + var _lastmouseLocation = $ax.lastMouseLocation = { x: 0, y: 0 }; + + var _updateMouseLocation = function(e, end) { + if(!e) return; + + if(IE_10_AND_BELOW && typeof (e.type) == 'unknown') return; + if(e.type != 'mousemove' && e.type != 'touchstart' && e.type != 'touchmove' && e.type != 'touchend') return; + + var newX; + var newY; + if(IE_10_AND_BELOW) { + newX = e.clientX + $('html').scrollLeft(); + newY = e.clientY + $('html').scrollTop(); + } else { + newX = e.pageX; + newY = e.pageY; + } + //var body = $('body'); + //if(body.css('position') == 'relative') newX = Math.round(newX - Number(body.css('left').replace('px', '')) - Math.max(0, ($(window).width() - body.width()) / 2)); + + if(_mouseLocation.x == newX && _mouseLocation.y == newY) return; + + _lastmouseLocation.x = _mouseLocation.x; + _lastmouseLocation.y = _mouseLocation.y; + _mouseLocation.x = newX; + _mouseLocation.y = newY; + + $ax.geometry.tick(_mouseLocation.x, _mouseLocation.y, end); + }; + _event.updateMouseLocation = _updateMouseLocation; + + var _leavingState = function(stateId) { + var mouseOverIds = _event.mouseOverIds; + if(mouseOverIds.length == 0) return; + + var stateQuery = $jobj(stateId); + for(var i = mouseOverIds.length - 1; i >= 0; i--) { + var id = mouseOverIds[i]; + if(stateQuery.find('#' + id).length) { + $ax.splice(mouseOverIds, $.inArray(id, mouseOverIds), 1); + $ax.style.SetWidgetMouseDown(id, false); + $ax.style.SetWidgetHover(id, false); + } + } + + }; + _event.leavingState = _leavingState; + + var _raiseSelectedEvents = function(elementId, value) { + $ax.event.raiseSyntheticEvent(elementId, 'onSelectedChange'); + if(value) $ax.event.raiseSyntheticEvent(elementId, 'onSelect'); + else $ax.event.raiseSyntheticEvent(elementId, 'onUnselect'); + }; + $ax.event.raiseSelectedEvents = _raiseSelectedEvents; + + var _raiseSyntheticEvent = function(elementId, eventName, skipShowDescription, eventInfo, nonSynthetic) { + // Empty string used when this is an event directly on the page. + var dObj = elementId === '' ? $ax.pageData.page : $ax.getObjectFromElementId(elementId); + var axEventObject = dObj && dObj.interactionMap && dObj.interactionMap[eventName]; + if(!axEventObject) return; + + eventInfo = eventInfo || $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), skipShowDescription, elementId); + // $ax.recording.maybeRecordEvent(elementId, eventInfo, axEventObject, new Date().getTime()); + _handleEvent(elementId, eventInfo, axEventObject, false, !nonSynthetic); + }; + $ax.event.raiseSyntheticEvent = _raiseSyntheticEvent; + + var _hasSyntheticEvent = function(scriptId, eventName) { + var dObj = $ax.getObjectFromScriptId(scriptId); + var axEventObject = dObj && dObj.interactionMap && dObj.interactionMap[eventName]; + return Boolean(axEventObject); + }; + $ax.event.hasSyntheticEvent = _hasSyntheticEvent; + + var _addEvent = function (target, eventType, handler, useCapture) { + //this return value is only for debug purpose + var succeed = undefined; + if(target.attachEvent) { + if($ax.features.supports.windowsMobile) { + succeed = target.attachEvent(eventType, handler); + } else { + succeed = target.attachEvent('on' + eventType, handler); + } + } else if(target.addEventListener) { + target.addEventListener(eventType, handler, useCapture); + succeed = true; + } + + return succeed; + } + $ax.event.addEvent = _addEvent; + + var _removeEvent = function(target, eventType, handler, useCapture, skipCheckingWindowsMobile) { + //this return value is only for debug purpose + var succeed = undefined; + + if(target.detachEvent) { + if(!skipCheckingWindowsMobile && $ax.features.supports.windowsMobile) { + succeed = target.detachEvent(eventType, handler); + } else { + succeed = target.detachEvent('on' + eventType, handler); + } + } else if(target.removeEventListener) { + target.removeEventListener(eventType, handler, useCapture); + succeed = true; + } + + return succeed; + } + $ax.event.removeEvent = _removeEvent; + + var _initialize = function() { + $ax.repeater.loadRepeaters(); + + // Make sure key events for page are initialized first. That way they will update the value of key pressed before any other events occur. + _event.initKeyEvents($(window)); + + initSuppressingEvents(); + + // Anything with an item id is in a repeater and should be handled by that repeater. + _initializeObjectEvents($ax(function(obj, elementId) { return !$ax.repeater.getItemIdFromElementId(elementId); })); + + //finally, process the pageload + _pageLoad(); + // _loadDynamicPanelsAndMasters(); + // $ax.repeater.init(); + + // and wipe out the basic links. + $('.basiclink').click(function() { + return false; + }); + }; + _event.initialize = _initialize; + + $ax.event.HasIxStyles = function(diagramObject) { + if(diagramObject.style.stateStyles) return true; + if(diagramObject.adaptiveStyles) { + for(var viewId in diagramObject.adaptiveStyles) { + if(diagramObject.adaptiveStyles[viewId].stateStyles) return true; + } + } + return false; + }; + + $ax.event.HasTextChanged = function(diagramObject) { + if (!$ax.public.fn.IsTextBox(diagramObject.type) && !$ax.public.fn.IsTextArea(diagramObject.type)) return false; + var map = diagramObject.interactionMap; + return map && map.onTextChange; + }; + + $ax.event.TryFireTextChanged = function(elementId) { + var query = $jobj($ax.repeater.applySuffixToElementId(elementId, '_input')); + if(!$ax.hasElementTextChanged(elementId, query.val())) return; + $ax.updateElementText(elementId, query.val()); + + $ax.event.raiseSyntheticEvent(elementId, 'onTextChange'); + }; + + $ax.event.HasSelectionChanged = function(diagramObject) { + if (!$ax.public.fn.IsListBox(diagramObject.type) && !$ax.public.fn.IsComboBox(diagramObject.type)) return false; + var map = diagramObject.interactionMap; + return map && map.onSelectionChange; + }; + + $ax.event.HasKeyUpOrDown = function (diagramObject) { + if($ax.public.fn.IsTextBox(diagramObject.type) || $ax.public.fn.IsTextArea(diagramObject.type)) return true; + var map = diagramObject.interactionMap; + return map && (map.onKeyUp || map.onKeyDown); + }; + + $ax.event.HasCheckedChanged = function(diagramObject) { + if (!$ax.public.fn.IsCheckBox(diagramObject.type) && !$ax.public.fn.IsRadioButton(diagramObject.type)) return false; + var map = diagramObject.interactionMap; + return map && map.onSelectedChange; + }; + + $ax.event.HasClick = function (diagramObject) { + var map = diagramObject.interactionMap; + return map && map.onClick; + }; + + var _tryFireCheckedChanged = $ax.event.TryFireCheckChanged = function(elementId, value) { + var isRadio = $ax.public.fn.IsRadioButton($obj(elementId).type); + if(isRadio) { + if(!value) { + $ax.updateRadioButtonSelected($jobj($ax.INPUT(elementId)).attr('name'), undefined); + } else { + var last = $ax.updateRadioButtonSelected($jobj($ax.INPUT(elementId)).attr('name'), elementId); + + // If no change, this should not fire + if(last == elementId) return; + + // Initially selecting one, last may be undefined + if(last) { + //here last is the previouse selected elementid + $ax.event.raiseSelectedEvents(last, false); + } + } + } + + $ax.event.raiseSelectedEvents(elementId, value); + }; + + //onload everything now, not only dp and master + var _loadDynamicPanelsAndMasters = function(objects, path, itemId) { + fireEventThroughContainers('onLoad', objects, true, [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE], + [$ax.constants.ALL_TYPE], path, itemId); + }; + $ax.loadDynamicPanelsAndMasters = _loadDynamicPanelsAndMasters; + + var _viewChangePageAndMasters = function(forceSwitchTo) { + fireEventThroughContainers('onAdaptiveViewChange', undefined, true, [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE], + [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE]); + _postAdaptiveViewChanged(forceSwitchTo); + }; + $ax.viewChangePageAndMasters = _viewChangePageAndMasters; + + //if forceSwitchTo is true, we will also update the checkmark in sitemap.js + var _postAdaptiveViewChanged = function(forceSwitchTo) { + //only trigger adaptive view changed if the window is on the mainframe. Also triggered on init, even if default. + try { + if(window.name == 'mainFrame' || + (!CHROME_5_LOCAL && window.parent.$ && window.parent.$('#mainFrame').length > 0)) { + var data = { + viewId: $ax.adaptive.currentViewId, + forceSwitchTo: forceSwitchTo + }; + $axure.messageCenter.postMessage('adaptiveViewChange', data); + } + } catch(e) { } + }; + $ax.postAdaptiveViewChanged = _postAdaptiveViewChanged; + + var _postResize = $ax.postResize = function(e) { + $ax.setjBrowserEvent(e); + return fireEventThroughContainers('onResize', undefined, false, [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE, $ax.constants.REPEATER], + [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE]); + }; + + //fire events for table, menu and tree, including its sub items + var _fireEventsForTableMenuAndTree = function (object, event, skipShowDescription, eventInfo, path, synthetic) { + if (!path) path = []; + var pathCopy = path.slice(); + + pathCopy[path.length] = object.id; + var scriptId = $ax.getScriptIdFromPath(pathCopy); + $ax.event.raiseSyntheticEvent(scriptId, event, skipShowDescription, eventInfo, !synthetic); + + if(object.objects) { + for(var index = 0; index < object.objects.length; index++) { + var subObj = object.objects[index]; + if ($ax.public.fn.IsTableCell(subObj.type)) { + pathCopy[path.length] = subObj.id; + scriptId = $ax.getScriptIdFromPath(pathCopy); + $ax.event.raiseSyntheticEvent(scriptId, event, skipShowDescription, eventInfo, !synthetic); + } else if ($ax.public.fn.IsTable(object.type) || $ax.public.fn.IsMenuObject(object.type) || $ax.public.fn.IsTreeNodeObject(object.type)) { + _fireEventsForTableMenuAndTree(subObj, event, skipShowDescription, eventInfo, path, synthetic); + } + } + } + } + + //remember the scroll bar position, so we can detect scroll up/down + var lastScrollTop; + + var fireEventForPageOrMaster = function (elementId, eventName, interactionMap, isPage, skipShowDescription, synthetic) { + if(!interactionMap) return; + + var axEvent = interactionMap[eventName]; + var scrolling = eventName === "onScroll"; + if (scrolling && !axEvent) axEvent = interactionMap.onScrollUp || interactionMap.onScrollDown; + + if (axEvent) { + var currentEvent = $ax.getjBrowserEvent(); + var eventInfo = $ax.getEventInfoFromEvent(currentEvent, skipShowDescription, elementId); + + if(isPage) { + eventInfo.label = $ax.pageData.page.name; + eventInfo.friendlyType = 'Page'; + } else eventInfo.isMasterEvent = true; + + if(scrolling) _handleScrollEvent(elementId, eventInfo, currentEvent.originalEvent, _event.windowScrollingUp, _event.windowScrollingDown, interactionMap, skipShowDescription, synthetic); + else _handleEvent(elementId, eventInfo, axEvent, skipShowDescription, synthetic); + } + } + // Filters include page, referenceDiagramObject, dynamicPanel, and repeater. + var _callFilterCheck = function(callFilter, type) { + for(var index = 0; index < callFilter.length; index++) { + var currentType = callFilter[index]; + if(currentType === $ax.constants.ALL_TYPE || currentType === type) return true; + } + return false; + }; + + var fireEventThroughContainers = function(eventName, objects, synthetic, searchFilter, callFilter, path, itemId) { + // TODO: may want to pass in this as a parameter. At that point, may want to convert some of them to an option parameter. For now this is the only case + var skipShowDescription = eventName == 'onLoad'; + + // If objects undefined, load page + if(!objects) { + if(_callFilterCheck(callFilter, $ax.constants.PAGE_TYPE)) { + //if scrolling, set direction, later master will know + if(eventName === "onScroll") { + var currentScrollTop = ((SAFARI && IOS) || SHARE_APP) ? $('#ios-safari-html').scrollTop() : $(window).scrollTop(); + _event.windowScrollingUp = currentScrollTop < lastScrollTop; + _event.windowScrollingDown = currentScrollTop > lastScrollTop; + } + + fireEventForPageOrMaster('', eventName, $ax.pageData.page.interactionMap, true, skipShowDescription, synthetic); + } + if(searchFilter.indexOf($ax.constants.PAGE_TYPE) != -1) fireEventThroughContainers(eventName, $ax.pageData.page.diagram.objects, synthetic, searchFilter, callFilter); + //reset and save scrolling info at the end + if(currentScrollTop) { + lastScrollTop = currentScrollTop; + _event.windowScrollingUp = undefined; + _event.windowScrollingDown = undefined; + } + + return; + } + + if(!path) path = []; + + var pathCopy = []; + for(var j = 0; j < path.length; j++) pathCopy[j] = path[j]; + + for(var i = 0; i < objects.length; i++) { + var obj = objects[i]; + pathCopy[path.length] = obj.id; + if (!$ax.public.fn.IsReferenceDiagramObject(obj.type) && !$ax.public.fn.IsDynamicPanel(obj.type) && !$ax.public.fn.IsRepeater(obj.type) && !$ax.public.fn.IsLayer(obj.type)) { + if(_callFilterCheck(callFilter)) { //fire current event for all types + if ($ax.public.fn.IsTable(obj.type) || $ax.public.fn.IsMenuObject(obj.type) || $ax.public.fn.IsTreeNodeObject(obj.type)) { + _fireEventsForTableMenuAndTree(obj, eventName, skipShowDescription, undefined, path, !synthetic); + } else { + var scriptId = $ax.getScriptIdFromPath(pathCopy); + if(scriptId && itemId) scriptId = $ax.repeater.createElementId(scriptId, itemId); + $ax.event.raiseSyntheticEvent(scriptId, eventName, skipShowDescription, undefined, !synthetic); + } + } + continue; + } + + var objId = $ax.getScriptIdFromPath(pathCopy); + // If limboed, move on to next item + if(!objId) continue; + if(itemId) objId = $ax.repeater.createElementId(objId, itemId); + + if($ax.public.fn.IsReferenceDiagramObject(obj.type)) { + if(_callFilterCheck(callFilter, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE)) { + fireEventForPageOrMaster(objId, eventName, $ax.pageData.masters[obj.masterId].interactionMap, false, skipShowDescription, synthetic); + } + if(searchFilter.indexOf($ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE) != -1) fireEventThroughContainers(eventName, $ax.pageData.masters[obj.masterId].diagram.objects, synthetic, searchFilter, callFilter, pathCopy, itemId); + } else if($ax.public.fn.IsDynamicPanel(obj.type)) { + if(_callFilterCheck(callFilter, $ax.constants.DYNAMIC_PANEL_TYPE)) $ax.event.raiseSyntheticEvent(objId, eventName, skipShowDescription, undefined, !synthetic); + + if(searchFilter.indexOf($ax.constants.DYNAMIC_PANEL_TYPE) != -1) { + var diagrams = obj.diagrams; + for(var j = 0; j < diagrams.length; j++) { + fireEventThroughContainers(eventName, diagrams[j].objects, synthetic, searchFilter, callFilter, path, itemId); + } + } + } else if($ax.public.fn.IsRepeater(obj.type)) { + // TODO: possible an option for repeater item? Now fires overall for the repeater + if(_callFilterCheck(callFilter, $ax.constants.REPEATER)) $ax.event.raiseSyntheticEvent(objId, eventName, skipShowDescription, undefined, !synthetic); + if(searchFilter.indexOf($ax.constants.REPEATER) != -1) { + var itemIds = $ax.getItemIdsForRepeater(objId); + for(var j = 0; j < itemIds.length; j++) { + fireEventThroughContainers(eventName, obj.objects, synthetic, searchFilter, callFilter, path, itemIds[j]); + } + } + } else if($ax.public.fn.IsLayer(obj.type)) { + if(_callFilterCheck(callFilter, $ax.constants.LAYER_TYPE)) $ax.event.raiseSyntheticEvent(objId, eventName, skipShowDescription, undefined, !synthetic); + + if(obj.objs && obj.objs.length > 0) { + fireEventThroughContainers(eventName, obj.objs, synthetic, searchFilter, callFilter, path, itemId); + } + } + } + + eventNesting -= 1; + + }; // FOCUS stuff + (function() { + + })(); + + + var _pageLoad = function() { + + // Map of axure event names to pair of what it should attach to, and what the jquery event name is. + var PAGE_AXURE_TO_JQUERY_EVENT_NAMES = { + 'onScroll': [window, 'scroll'], + 'onScrollUp': [window, 'scrollup'], + 'onScrollDown': [window, 'scrolldown'], + //'onResize': [window, 'resize'], + 'onContextMenu': [window, 'contextmenu'] + }; + + var $win = $(window); + if(!$ax.features.supports.mobile) { + PAGE_AXURE_TO_JQUERY_EVENT_NAMES.onClick = ['html', 'click']; + PAGE_AXURE_TO_JQUERY_EVENT_NAMES.onDoubleClick = ['html', 'dblclick']; + PAGE_AXURE_TO_JQUERY_EVENT_NAMES.onMouseMove = ['html', 'mousemove']; + } else { + _event.initMobileEvents($win, $win, ''); + + $win.bind($ax.features.eventNames.mouseDownName, _updateMouseLocation); + $win.bind($ax.features.eventNames.mouseUpName, function(e) { _updateMouseLocation(e, true); }); + } + + $win.scroll(function () { _setCanClick(false); }); + $win.bind($ax.features.eventNames.mouseDownName, function () { _setCanClick(true); }); + + $win.bind($ax.features.eventNames.mouseMoveName, _updateMouseLocation); + $win.scroll($ax.flyoutManager.reregisterAllFlyouts); + + for(key in PAGE_AXURE_TO_JQUERY_EVENT_NAMES) { + if(!PAGE_AXURE_TO_JQUERY_EVENT_NAMES.hasOwnProperty(key)) continue; + (function(axureName) { + var jqueryEventNamePair = PAGE_AXURE_TO_JQUERY_EVENT_NAMES[axureName]; + var actionName = jqueryEventNamePair[1]; + + if(actionName == "scrollup" || actionName == "scrolldown") return; + + var jObj = jqueryEventNamePair[0]; + if ((SAFARI && IOS) || SHARE_APP) jObj = '#ios-safari-html'; + + $(jObj)[actionName](function (e) { + $ax.setjBrowserEvent(e); + return fireEventThroughContainers(axureName, undefined, false, [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE, $ax.constants.DYNAMIC_PANEL_TYPE, $ax.constants.REPEATER], + [$ax.constants.PAGE_TYPE, $ax.constants.REFERENCE_DIAGRAM_OBJECT_TYPE]); + }); + })(key); + } + + eventNesting -= 1; + lastScrollTop = 0; + }; + _event.pageLoad = _pageLoad; + + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/expr.js b/code/page/resources/scripts/axure/expr.js new file mode 100644 index 0000000..9e9c245 --- /dev/null +++ b/code/page/resources/scripts/axure/expr.js @@ -0,0 +1,579 @@ +// ******* Expr MANAGER ******** // +$axure.internal(function($ax) { + var _expr = $ax.expr = {}; + var _binOpHandlers = { + '&&': function(left, right) { return _binOpOverride(left, right, function(left) { return $ax.getBool(left) && $ax.getBool(right()); }); }, + '||': function(left, right) { return _binOpOverride(left, right, function(left) { return $ax.getBool(left) || $ax.getBool(right()); }); }, + '==': function(left, right) { return isEqual(left, right, true); }, + '!=': function(left, right) { return !isEqual(left, right, true); }, + '>': function(left, right) { return _binOpNum(left, right, function(left, right) { return left > right; }); }, + '<': function(left, right) { return _binOpNum(left, right, function(left, right) { return left < right; }); }, + '>=': function(left, right) { return _binOpNum(left, right, function(left, right) { return left >= right; }); }, + '<=': function(left, right) { return _binOpNum(left, right, function(left, right) { return left <= right; }); } + }; + + var checkOps = function(left, right) { + return left == undefined || right == undefined; + }; + + var isEqual = function (left, right, isFunction) { + if (isFunction) { + //if left and right is function, then get the value + //otherwise left and right should be already the value we want + left = left(); + right = right(); + } + + if(checkOps(left, right)) return false; + + if(left instanceof Date && right instanceof Date) { + if(left.getMilliseconds() != right.getMilliseconds()) return false; + if(left.getSeconds() != right.getSeconds()) return false; + if(left.getMinutes() != right.getMinutes()) return false; + if(left.getHours() != right.getHours()) return false; + if(left.getDate() != right.getDate()) return false; + if(left.getMonth() != right.getMonth()) return false; + if(left.getYear() != right.getYear()) return false; + return true; + } + + if(left instanceof Object && right instanceof Object) { + var prop; + // Go through all of lefts properties and compare them to rights. + for(prop in left) { + if(!left.hasOwnProperty(prop)) continue; + // If left has a property that the right doesn't they are not equal. + if(!right.hasOwnProperty(prop)) return false; + // If any of their properties are not equal, they are not equal. + if(!isEqual(left[prop], right[prop], false)) return false; + } + + for(prop in right) { + // final check to make sure right doesn't have some extra properties that make them not equal. + if(left.hasOwnProperty(prop) != right.hasOwnProperty(prop)) return false; + } + + return true; + } + return $ax.getBool(left) == $ax.getBool(right); + }; + + var _binOpOverride = function(left, right, func) { + left = left(); + if(left == undefined) return false; + var res = func(left, right); + return res == undefined ? false : res; + }; + + var _binOpNum = function(left, right, func) { + var left = left(); + var right = right(); + if(checkOps(left, right)) return false; + + return func(left, Number(right)); + }; + + var _exprHandlers = {}; + _exprHandlers.array = function(expr, eventInfo) { + var returnVal = []; + for(var i = 0; i < expr.items.length; i++) { + returnVal[returnVal.length] = _evaluateExpr(expr.items[i], eventInfo); + } + return returnVal; + }; + + _exprHandlers.binaryOp = function(expr, eventInfo) { + var left = function() { return expr.leftExpr && _evaluateExpr(expr.leftExpr, eventInfo); }; + var right = function() { return expr.rightExpr && _evaluateExpr(expr.rightExpr, eventInfo); }; + + if(left == undefined || right == undefined) return false; + return _binOpHandlers[expr.op](left, right); + }; + + _exprHandlers.block = function(expr, eventInfo) { + var subExprs = expr.subExprs; + for(var i = 0; i < subExprs.length; i++) { + _evaluateExpr(subExprs[i], eventInfo); //ignore the result + } + }; + + _exprHandlers.booleanLiteral = function(expr) { + return expr.value; + }; + + _exprHandlers.nullLiteral = function() { return null; }; + + _exprHandlers.pathLiteral = function(expr, eventInfo) { + if(expr.isThis) return [eventInfo.srcElement]; + if(expr.isFocused && window.lastFocusedControl) { + $ax('#' + window.lastFocusedControl).focus(); + return [window.lastFocusedControl]; + } + if(expr.isTarget) return [eventInfo.targetElement]; + + return $ax.getElementIdsFromPath(expr.value, eventInfo); + }; + + _exprHandlers.panelDiagramLiteral = function(expr, eventInfo) { + var elementIds = $ax.getElementIdsFromPath(expr.panelPath, eventInfo); + var elementIdsWithSuffix = []; + var suffix = '_state' + expr.panelIndex; + for(var i = 0; i < elementIds.length; i++) { + elementIdsWithSuffix[i] = $ax.repeater.applySuffixToElementId(elementIds[i], suffix); + } + return String($jobj(elementIdsWithSuffix).data('label')); + }; + + _exprHandlers.fcall = function(expr, eventInfo) { + var oldTarget = eventInfo.targetElement; + var targets = []; + var fcallArgs = []; + var exprArgs = expr.arguments; + for(var i = 0; i < expr.arguments.length; i++) { + var exprArg = exprArgs[i]; + var fcallArg = ''; + if(targets.length) { + for(var j = 0; j < targets.length; j++) { + if(exprArg == null) { + fcallArgs[j][i] = null; + continue; + } + eventInfo.targetElement = targets[j]; + fcallArg = _evaluateExpr(exprArg, eventInfo); + if(typeof (fcallArg) == 'undefined') return ''; + fcallArgs[j][i] = fcallArg; + } + } else { + if(exprArg == null) { + fcallArgs[i] = null; + continue; + } + fcallArg = _evaluateExpr(exprArg, eventInfo); + if(typeof (fcallArg) == 'undefined') return ''; + fcallArgs[i] = fcallArg; + } + + // We do support null exprArgs... + // TODO: This makes 2 assumptions that may change in the future. 1. The pathLiteral is the always the first arg. 2. there is always only 1 pathLiteral + if(exprArg && exprArg.exprType == 'pathLiteral') { + targets = fcallArg; + + // fcallArgs is now an array of an array of args + for(j = 0; j < targets.length; j++) fcallArgs[j] = [[fcallArg[j]]]; + } + } + + // we want to preserve the target element from outside this function. + eventInfo.targetElement = oldTarget; + + var retval = ''; + if(targets.length) { + // Go backwards so retval is the first item. + for(i = targets.length - 1; i >= 0; i--) { + var args = fcallArgs[i]; + // Add event info to the end + args[args.length] = eventInfo; + retval = _exprFunctions[expr.functionName].apply(this, args); + } + } else fcallArgs[fcallArgs.length] = eventInfo; + return targets.length ? retval : _exprFunctions[expr.functionName].apply(this, fcallArgs); + }; + + _exprHandlers.globalVariableLiteral = function(expr) { + return expr.variableName; + }; + + _exprHandlers.keyPressLiteral = function(expr) { + var keyInfo = {}; + keyInfo.keyCode = expr.keyCode; + keyInfo.ctrl = expr.ctrl; + keyInfo.alt = expr.alt; + keyInfo.shift = expr.shift; + + return keyInfo; + }; + + _exprHandlers.adaptiveViewLiteral = function(expr) { + return expr.id; + }; + + _exprHandlers.optionLiteral = function(expr) { + return expr.value; + } + + var _substituteSTOs = function(expr, eventInfo) { + //first evaluate the local variables + var scope = {}; + for(var varName in expr.localVariables) { + scope[varName] = $ax.expr.evaluateExpr(expr.localVariables[varName], eventInfo); + } + + // TODO: [ben] Date and data object (obj with info for url or image) both need to return non-strings. + var i = 0; + var retval; + var retvalString = expr.value.replace(/\[\[(?!\[)(.*?)\]\](?=\]*)/g, function(match) { + var sto = expr.stos[i++]; + if(sto.sto == 'error') return match; + try { + var result = $ax.evaluateSTO(sto, scope, eventInfo); + } catch(e) { + return match; + } + + if((result instanceof Object) && i == 1 && expr.value.substring(0, 2) == '[[' && + expr.value.substring(expr.value.length - 2) == ']]') { + // If the result was an object, this was the first result, and the whole thing was this expresion. + retval = result; + } + return ((result instanceof Object) && (result.label || result.text)) || result; + }); + // If more than one group returned, the object is not valid + if(i != 1) retval = false; + return retval || retvalString; + }; + + _exprHandlers.htmlLiteral = function (expr, eventInfo) { + eventInfo.htmlLiteral = true; + var html = _substituteSTOs(expr, eventInfo); + eventInfo.htmlLiteral = false + return html; + }; + + _exprHandlers.stringLiteral = function(expr, eventInfo) { + return _substituteSTOs(expr, eventInfo); + }; + + var _exprFunctions = {}; + + _exprFunctions.SetCheckState = function(elementIds, value) { + var toggle = value == 'toggle'; + var boolValue = Boolean(value) && value != 'false'; + + for(var i = 0; i < elementIds.length; i++) { + var query = $ax('#' + elementIds[i]); + query.selected(toggle ? !query.selected() : boolValue); + } + }; + + _exprFunctions.SetSelectedOption = function(elementIds, value) { + for(var i = 0; i < elementIds.length; i++) { + var elementId = elementIds[i]; + var obj = $jobj($ax.INPUT(elementId)); + + if(obj.val() == value) return; + obj.val(value); + + if($ax.event.HasSelectionChanged($ax.getObjectFromElementId(elementId))) $ax.event.raiseSyntheticEvent(elementId, 'onSelectionChange'); + } + }; + + _exprFunctions.SetGlobalVariableValue = function(varName, value) { + $ax.globalVariableProvider.setVariableValue(varName, value); + }; + + _exprFunctions.SetWidgetFormText = function(elementIds, value) { + for(var i = 0; i < elementIds.length; i++) { + var elementId = elementIds[i]; + var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input'); + + var obj = $jobj(inputId); + if(obj.val() == value || (value == '' && $ax.placeholderManager.isActive(elementId))) return; + obj.val(value); + $ax.placeholderManager.updatePlaceholder(elementId, !value); + if($ax.event.HasTextChanged($ax.getObjectFromElementId(elementId))) $ax.event.TryFireTextChanged(elementId); + } + }; + + _exprFunctions.SetFocusedWidgetText = function(elementId, value) { + if(window.lastFocusedControl) { + var elementId = window.lastFocusedControl; + var type = $obj(elementId).type; + if ($ax.public.fn.IsTextBox(type) || $ax.public.fn.IsTextArea(type)) _exprFunctions.SetWidgetFormText([elementId], value); + else _exprFunctions.SetWidgetRichText([elementId], value, true); + } + }; + + _exprFunctions.GetRtfElementHeight = function(rtfElement) { + if(rtfElement.innerHTML == '') rtfElement.innerHTML = ' '; + return rtfElement.offsetHeight; + }; + + _exprFunctions.SetWidgetRichText = function(ids, value, plain) { + // Converts dates, widgetinfo, and the like to strings. + value = _exprFunctions.ToString(value); + + //Replace any newlines with line breaks + var finalValue = value.replace(/\r\n/g, '
      ').replace(/\n/g, '
      '); + + for(var i = 0; i < ids.length; i++) { + var id = ids[i]; + + // If calling this on button shape, get the id of the rich text panel inside instead + if($obj(id).type !== $ax.constants.LINK_TYPE) id = $ax.GetTextPanelId(id, true); + + var element = window.document.getElementById(id); + $ax.visibility.SetVisible(element, value != ''); + + $ax.style.transformTextWithVerticalAlignment(id, function() { + var spans = $jobj(id).find('span'); + if(plain) { + // Can't set value as text because '
      ' doesn't actually do a line break + // Can't set vaule as html because it doesn't like '<' and ignores all after it + // Create tags yourself + var lines = value.split(/\r\n|\n/); + //if we are dealing with only one line, just reuse the old one + if(spans.length === 1 && lines.length === 1) { + $(spans[0]).text(value); + return; + } + + // Wrap in span and p, style them accordingly. + var span = $(''); + if(spans.length > 0) { + span.attr('style', $(spans[0]).attr('style')); + span.attr('id', $(spans[0]).attr('id')); + } + + if(lines.length == 1) span.text(value); + else { + for(var i = 0; i < lines.length; i++) { + if(i != 0) span.append($('
      ')); + var line = lines[i]; + if(line.length == 0) continue; + + var subSpan = $(''); + subSpan.text(line); + span.append(subSpan); + } + } + + var ps = $jobj(id).find('p'); + if(ps && ps.length) { + ps[0].innerHTML = $('
      ').append(span).html();; + if(ps.length > 1) { + for(var i = 1; i < ps.length; i++) { + $(ps[i]).remove(); + } + } + } else { + var p = $('

      '); + p.append(span); + element.innerHTML = $('
      ').append(p).html(); + } + } else element.innerHTML = finalValue; + }); + + if(!plain) $ax.style.CacheOriginalText(id, true); + } + }; + + _exprFunctions.GetCheckState = function(ids) { + return $ax('#' + ids[0]).selected(); + }; + + _exprFunctions.GetDisabledState = function (ids) { + return !$ax('#' + ids[0]).enabled(); + }; + + _exprFunctions.GetSelectedOption = function (ids) { + var inputs = $jobj($ax.INPUT(ids[0])); + return inputs.length ? inputs[0].value : ''; + }; + + _exprFunctions.GetNum = function(str) { + //Setting a GlobalVariable to some blank text then setting a widget to the value of that variable would result in 0 not "" + //I have fixed this another way so commenting this should be fine now + //if (!str) return ""; + return isNaN(str) ? str : Number(str); + }; + + _exprFunctions.GetGlobalVariableValue = function(id) { + return $ax.globalVariableProvider.getVariableValue(id); + }; + + _exprFunctions.GetGlobalVariableLength = function(id) { + return _exprFunctions.GetGlobalVariableValue(id).length; + }; + + _exprFunctions.GetWidgetText = function(ids) { + if($ax.placeholderManager.isActive(ids[0])) return ''; + var input = $ax.INPUT(ids[0]); + return $ax('#' + ($jobj(input).length ? input : ids[0])).text(); + }; + + _exprFunctions.GetFocusedWidgetText = function() { + if(window.lastFocusedControl) { + return $ax('#' + window.lastFocusedControl).text(); + } else { + return ""; + } + }; + + _exprFunctions.GetWidgetValueLength = function(ids) { + var id = ids[0]; + if(!id) return undefined; + if($ax.placeholderManager.isActive(id)) return 0; + var obj = $jobj($ax.INPUT(id)); + if(!obj.length) obj = $jobj(id); + var val = obj[0].value || _exprFunctions.GetWidgetText([id]); + return val.length; + }; + + _exprFunctions.GetPanelState = function(ids) { + var id = ids[0]; + if(!id) return undefined; + var stateId = $ax.visibility.GetPanelState(id); + return stateId && String($jobj(stateId).data('label')); + }; + + _exprFunctions.GetWidgetVisibility = function(ids) { + var id = ids[0]; + if(!id) return undefined; + return $ax.visibility.IsIdVisible(id); + }; + + // ***************** Validation Functions ***************** // + + _exprFunctions.IsValueAlpha = function(val) { + var isAlphaRegex = new RegExp("^[a-z\\s]+$", "gi"); + return isAlphaRegex.test(val); + }; + + _exprFunctions.IsValueNumeric = function(val) { + var isNumericRegex = new RegExp("^[0-9,\\.\\s]+$", "gi"); + return isNumericRegex.test(val); + }; + + _exprFunctions.IsValueAlphaNumeric = function(val) { + var isAlphaNumericRegex = new RegExp("^[0-9a-z\\s]+$", "gi"); + return isAlphaNumericRegex.test(val); + }; + + _exprFunctions.IsValueOneOf = function(val, values) { + for(var i = 0; i < values.length; i++) { + var option = values[i]; + if(val == option) return true; + } + //by default, return false + return false; + }; + + _exprFunctions.IsValueNotAlpha = function(val) { + return !_exprFunctions.IsValueAlpha(val); + }; + + _exprFunctions.IsValueNotNumeric = function(val) { + return !_exprFunctions.IsValueNumeric(val); + }; + + _exprFunctions.IsValueNotAlphaNumeric = function(val) { + return !_exprFunctions.IsValueAlphaNumeric(val); + }; + + _exprFunctions.IsValueNotOneOf = function(val, values) { + return !_exprFunctions.IsValueOneOf(val, values); + }; + + _exprFunctions.GetKeyPressed = function(eventInfo) { + return eventInfo.keyInfo; + }; + + _exprFunctions.GetCursorRectangles = function() { + var rects = new Object(); + rects.lastRect = new $ax.drag.Rectangle($ax.lastMouseLocation.x, $ax.lastMouseLocation.y, 1, 1); + rects.currentRect = new $ax.drag.Rectangle($ax.mouseLocation.x, $ax.mouseLocation.y, 1, 1); + return rects; + }; + + _exprFunctions.GetWidgetRectangles = function (elementIds, eventInfo) { + var elementId = elementIds[0]; + var rects = new Object(); + var jObj = $jobj(elementId); + var invalid = jObj.length == 0; + var parent = jObj; + // Or are in valid if no obj can be found, or if it is not visible. + while(parent.length != 0 && !parent.is('body')) { + if(parent.css('display') == 'none') { + invalid = true; + break; + } + parent = parent.parent(); + } + if(invalid) { + rects.lastRect = rects.currentRect = new $ax.drag.Rectangle(-1, -1, -1, -1); + return rects; + } + + var axObj = $ax('#' + elementId); + var boundingRect = axObj.viewportBoundingRect(); + rects.lastRect = new $ax.drag.Rectangle( + boundingRect.left, + boundingRect.top, + boundingRect.width, + boundingRect.height); + //rects.lastRect = new $ax.drag.Rectangle( + // axObj.left(), + // axObj.top(), + // axObj.width(), + // axObj.height()); + + rects.currentRect = rects.lastRect; + return rects; + }; + + _exprFunctions.GetWidget = function(elementId) { + return $ax.getWidgetInfo(elementId[0]); + }; + + _exprFunctions.GetAdaptiveView = function (eventInfo) { + if (eventInfo && eventInfo.srcElement) { + var id = eventInfo.srcElement; + var diagramObject = $ax.getObjectFromElementId(id); + if (diagramObject.owner.type == 'Axure:Master') { + var viewIdChain = $ax.style.getViewIdChain($ax.adaptive.currentViewId || '', id, diagramObject); + if (viewIdChain.length > 0) return viewIdChain[viewIdChain.length - 1]; + else return '19e82109f102476f933582835c373474'; + } + } + return $ax.adaptive.currentViewId || ''; + }; + + _exprFunctions.IsEntering = function(movingRects, targetRects) { + return !movingRects.lastRect.IntersectsWith(targetRects.currentRect) && movingRects.currentRect.IntersectsWith(targetRects.currentRect); + }; + + _exprFunctions.IsLeaving = function(movingRects, targetRects) { + return movingRects.lastRect.IntersectsWith(targetRects.currentRect) && !movingRects.currentRect.IntersectsWith(targetRects.currentRect); + }; + + var _IsOver = _exprFunctions.IsOver = function(movingRects, targetRects) { + return movingRects.currentRect.IntersectsWith(targetRects.currentRect); + }; + + _exprFunctions.IsNotOver = function(movingRects, targetRects) { + return !_IsOver(movingRects, targetRects); + }; + + _exprFunctions.ValueContains = function(inputString, value) { + return inputString.indexOf(value) > -1; + }; + + _exprFunctions.ValueNotContains = function(inputString, value) { + return !_exprFunctions.ValueContains(inputString, value); + }; + + _exprFunctions.ToString = function(value) { + if(value.isWidget) { + return value.text; + } + return String(value); + }; + + var _evaluateExpr = $ax.expr.evaluateExpr = function(expr, eventInfo, toString) { + if(expr === undefined || expr === null) return undefined; + var result = _exprHandlers[expr.exprType](expr, eventInfo); + return toString ? _exprFunctions.ToString(result) : result; + }; + + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/flyout.js b/code/page/resources/scripts/axure/flyout.js new file mode 100644 index 0000000..e98303f --- /dev/null +++ b/code/page/resources/scripts/axure/flyout.js @@ -0,0 +1,286 @@ +// ******* Flyout MANAGER ******** // +$axure.internal(function($ax) { + var _flyoutManager = $ax.flyoutManager = {}; + + var getFlyoutLabel = function(panelId) { + return panelId + '_flyout'; + }; + + var _unregisterPanel = function(panelId, keepShown) { + $ax.geometry.unregister(getFlyoutLabel(panelId)); + if(panelToSrc[panelId]) { + $ax.style.RemoveRolloverOverride(panelToSrc[panelId]); + delete panelToSrc[panelId]; + } + if(!keepShown) { + $ax.action.addAnimation(panelId, $ax.action.queueTypes.fade, function() { + $ax('#' + panelId).hide(); + }); + } + }; + _flyoutManager.unregisterPanel = _unregisterPanel; + + var genPoint = $ax.geometry.genPoint; + + var _updateFlyout = function(panelId) { + var label = getFlyoutLabel(panelId); + if(!$ax.geometry.polygonRegistered(label)) return; + var info = $ax.geometry.getPolygonInfo(label); + var rects = info && info.rects; + + var targetWidget = $ax.getWidgetInfo(panelId); + rects.target = $ax.geometry.genRect(targetWidget); + + // Src will stay the same, just updating + $ax.flyoutManager.registerFlyout(rects, panelId, panelToSrc[panelId]); + + if(!$ax.geometry.checkInsideRegion(label)) _unregisterPanel(panelId); + }; + _flyoutManager.updateFlyout = _updateFlyout; + + var panelToSrc = {}; + var _registerFlyout = function(rects, panelId, srcId) { + var label = _getFlyoutLabel(panelId); + var callback = function(info) { + // If leaving object or already outside it, then unregister, otherwise just return + if(!info.exiting && !info.outside) return; + _unregisterPanel(panelId); + }; + var points = []; + + var lastSrcId = panelToSrc[panelId]; + if(lastSrcId != srcId) { + if(lastSrcId) $ax.style.RemoveRolloverOverride(lastSrcId); + if(srcId) { + $ax.style.AddRolloverOverride(srcId); + panelToSrc[panelId] = srcId; + } else delete panelToSrc[panelId]; + } + + // rects should be one or two rectangles + if(!rects.src) { + var rect = rects.target; + points.push(genPoint(rect.Left(), rect.Top())); + points.push(genPoint(rect.Right(), rect.Top())); + points.push(genPoint(rect.Right(), rect.Bottom())); + points.push(genPoint(rect.Left(), rect.Bottom())); + } else { + var r0 = rects.src; + var r1 = rects.target; + + // Right left of right, left right of left, top below top, bottom above bottom + var rlr = r0.Right() <= r1.Right(); + var lrl = r0.Left() >= r1.Left(); + var tbt = r0.Top() >= r1.Top(); + var bab = r0.Bottom() <= r1.Bottom(); + + var info = { rlr: rlr, lrl: lrl, tbt: tbt, bab: bab }; + + if((rlr && lrl) || (tbt && bab)) { + points = getSmallPolygon(r0, r1, info); + } else { + points = getLargePolygon(r0, r1, info); + } + } + + $ax.geometry.registerPolygon(label, points, callback, { rects: rects }); + }; + _flyoutManager.registerFlyout = _registerFlyout; + + var _getFlyoutLabel = function(panelId) { + return panelId + '_flyout'; + }; + + var _reregisterAllFlyouts = function() { + for(var panelId in panelToSrc) _reregisterFlyout(panelId); + }; + _flyoutManager.reregisterAllFlyouts = _reregisterAllFlyouts; + + var _reregisterFlyout = function(panelId) { + var rects = $ax.geometry.getPolygonInfo(getFlyoutLabel(panelId)).rects; + _registerFlyout(rects, panelId, panelToSrc[panelId]); + }; + + // This is the reduced size polygon connecting r0 to r1 by means of horizontal or vertical lines. + var getSmallPolygon = function(r0, r1, info) { + var points = []; + + // NOTE: currently I make the assumption that if horizontal/vertical connecting lines from the src hit the target + // Meaning if horizontal, rlr and lrl are true, and if vertical, tbt and bab are true. + + var r0Left = r0.Left(); + var r0Right = r0.Right(); + var r0Top = r0.Top(); + var r0Bottom = r0.Bottom(); + var r1Left = r1.Left(); + var r1Right = r1.Right(); + var r1Top = r1.Top(); + var r1Bottom = r1.Bottom(); + + points.push(genPoint(r1Left, r1Top)); + + if(!info.tbt) { + points.push(genPoint(r0Left, r1Top)); + points.push(genPoint(r0Left, r0Top)); + points.push(genPoint(r0Right, r0Top)); + points.push(genPoint(r0Right, r1Top)); + } + + points.push(genPoint(r1Right, r1Top)); + + if(!info.rlr) { + points.push(genPoint(r1Right, r0Top)); + points.push(genPoint(r0Right, r0Top)); + points.push(genPoint(r0Right, r0Bottom)); + points.push(genPoint(r1Right, r0Bottom)); + } + + points.push(genPoint(r1Right, r1Bottom)); + + if(!info.bab) { + points.push(genPoint(r0Right, r1Bottom)); + points.push(genPoint(r0Right, r0Bottom)); + points.push(genPoint(r0Left, r0Bottom)); + points.push(genPoint(r0Left, r1Bottom)); + } + + points.push(genPoint(r1Left, r1Bottom)); + + if(!info.lrl) { + points.push(genPoint(r1Left, r0Bottom)); + points.push(genPoint(r0Left, r0Bottom)); + points.push(genPoint(r0Left, r0Top)); + points.push(genPoint(r1Left, r0Top)); + } + + return points; + }; + + // This is the original algorithm that connects the most extream corners to make polygon + var getLargePolygon = function(r0, r1, info) { + var points = []; + + var r0Left = r0.Left(); + var r0Right = r0.Right(); + var r0Top = r0.Top(); + var r0Bottom = r0.Bottom(); + var r1Left = r1.Left(); + var r1Right = r1.Right(); + var r1Top = r1.Top(); + var r1Bottom = r1.Bottom(); + + // Top lefts + if(info.tbt) { + if(!info.lrl) points.push(genPoint(r0Left, r0Top)); + points.push(genPoint(r1Left, r1Top)); + } else { + if(info.lrl) points.push(genPoint(r1Left, r1Top)); + points.push(genPoint(r0Left, r0Top)); + } + + // Top rights + if(info.tbt) { + points.push(genPoint(r1Right, r1Top)); + if(!info.rlr) points.push(genPoint(r0Right, r0Top)); + } else { + points.push(genPoint(r0Right, r0Top)); + if(info.rlr) points.push(genPoint(r1Right, r1Top)); + } + + // Bottom rights + if(info.bab) { + if(!info.rlr) points.push(genPoint(r0Right, r0Bottom)); + points.push(genPoint(r1Right, r1Bottom)); + } else { + if(info.rlr) points.push(genPoint(r1Right, r1Bottom)); + points.push(genPoint(r0Right, r0Bottom)); + } + + // Bottom Lefts + if(info.bab) { + points.push(genPoint(r1Left, r1Bottom)); + if(!info.lrl) points.push(genPoint(r0Left, r0Bottom)); + } else { + points.push(genPoint(r0Left, r0Bottom)); + if(info.lrl) points.push(genPoint(r1Left, r1Bottom)); + } + return points; + }; +}); + +// ******* Placeholder Manager ********* // + +$axure.internal(function($ax) { + var _placeholderManager = $ax.placeholderManager = {}; + var idToPlaceholderInfo = {}; + + var _registerPlaceholder = function(elementId, text, password) { + idToPlaceholderInfo[elementId] = { text: text, password: password, active: false }; + }; + _placeholderManager.registerPlaceholder = _registerPlaceholder; + + _placeholderManager.refreshPlaceholder = function (elementId) { + var info = idToPlaceholderInfo[elementId]; + if (!info || !info.active) return; + $ax.style.SetWidgetPlaceholder(elementId, true, info.text, info.password); + } + + var _updatePlaceholder = function(elementId, active, clearText) { + var inputId = $ax.repeater.applySuffixToElementId(elementId, '_input'); + + var info = idToPlaceholderInfo[elementId]; + if(!info || info.active == active) return; + info.active = active; + + if(active) var text = info.text; + else if(!ANDROID) text = clearText ? '' : document.getElementById(inputId).value; + else { + var currentText = document.getElementById(inputId).value; + if(!clearText) text = currentText; + else if(currentText == info.text) text = ""; + else { + var lastIndex = currentText.lastIndexOf(info.text); + //here i am assuming the text is always inserted in front + text = currentText.substring(0, lastIndex); + } + } + + $ax.style.SetWidgetPlaceholder(elementId, active, text, info.password); + }; + _placeholderManager.updatePlaceholder = _updatePlaceholder; + + var _isActive = function(elementId) { + var info = idToPlaceholderInfo[elementId]; + return Boolean(info && info.active); + }; + _placeholderManager.isActive = _isActive; + + var _selectRange = function(elementId, start, end) { + $jobj(elementId).each(function() { + if(this.setSelectionRange) { + var validTypes = ["text", "search", "url", "tel", "password"]; + if(this.tagName.toLowerCase() != "input" || validTypes.indexOf(this.type) > -1) { + this.focus(); + this.setSelectionRange(start, end); + } + } else if(this.createTextRange) { + var range = this.createTextRange(); + range.collapse(true); + range.moveEnd('character', end); + range.moveStart('character', start); + range.select(); + } + }); + }; + _placeholderManager.selectRange = _selectRange; + + var _moveCaret = function(id, index) { + var inputIndex = id.indexOf('_input'); + if(inputIndex == -1) return; + var inputId = id.substring(0, inputIndex); + + if(!_isActive(inputId)) return; + _selectRange(id, index, index); + }; + _placeholderManager.moveCaret = _moveCaret; +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/geometry.js b/code/page/resources/scripts/axure/geometry.js new file mode 100644 index 0000000..437e87e --- /dev/null +++ b/code/page/resources/scripts/axure/geometry.js @@ -0,0 +1,301 @@ +// ******* Region MANAGER ******** // +$axure.internal(function($ax) { + var _geometry = $ax.geometry = {}; + var regionMap = {}; + var regionList = []; + + var _unregister = function(label) { + var regionIndex = regionList.indexOf(label); + if(regionIndex != -1) { + var end = $ax.splice(regionList, regionIndex + 1); + $ax.splice(regionList, regionIndex, regionList.length - regionIndex); + regionList = regionList.concat(end); + } + delete regionMap[label]; + }; + _geometry.unregister = _unregister; + + var clear = function() { + regionMap = {}; + regionList = []; + }; + + var _polygonRegistered = function(label) { + return Boolean(regionMap[label]); + }; + _geometry.polygonRegistered = _polygonRegistered; + + // Must be counterclockwise, or enter/exit will be wrong + var _registerPolygon = function(label, points, callback, info) { + var regionIndex = regionList.indexOf(label); + if(regionIndex == -1) regionList.push(label); + regionMap[label] = { points: points, callback: callback, info: info }; + }; + _geometry.registerPolygon = _registerPolygon; + + var _getPolygonInfo = function(label) { + if(!_polygonRegistered(label)) return undefined; + return regionMap[label].info; + }; + _geometry.getPolygonInfo = _getPolygonInfo; + + + + var _genRect = function(info, roundHalfPixel) { + var x = info.pagex(); + var y = info.pagey(); + var w = info.width(); + var h = info.height(); + + if(roundHalfPixel) { + if(x % 1 != 0) { + x = Math.floor(x); + w++; + } + if(y % 1 != 0) { + y = Math.floor(y); + h++; + } + } + + var r = x + w; + var b = y + h; + + var rect = { + X: function() { return x; }, + Y: function() { return y; }, + Wigth: function() { return w; }, + Height: function() { return h; }, + Left: function() { return x; }, + Right: function() { return r; }, + Top: function() { return y; }, + Bottom: function() { return b; } + }; + return rect; + }; + _geometry.genRect = _genRect; + + var _genPoint = function(x, y) { + return { x: x, y: y }; + }; + _geometry.genPoint = _genPoint; + + var oldPoint = _genPoint(0, 0); + _geometry.tick = function(x, y, end) { + var lastPoint = oldPoint; + var nextPoint = oldPoint = _genPoint(x, y); + var line = { p1: lastPoint, p2: nextPoint }; + if(!regionList.length) return; + + for(var i = 0; i < regionList.length; i++) { + var region = regionMap[regionList[i]]; + var points = region.points; + if(!region.checked) { + if(!_checkInside(points, $ax.mouseLocation)) { + region.callback({ outside: true }); + continue; + } + region.checked = true; + } + for(var j = 0; j < points.length; j++) { + var startSegment = points[j]; + var endSegment = points[(j + 1) % points.length]; + var intersectInfo = linesIntersect(line, { p1: startSegment, p2: endSegment }); + if(intersectInfo) { + region.callback(intersectInfo); + break; + } + } + } + + if(end) clear(); + }; + + // Info if the one line touches the other (even barely), false otherwise + // Info includes point, if l1 is entering or exiting l2, and any ties that happened, or parallel info + var linesIntersect = function(l1, l2) { + var retval = {}; + var ties = {}; + + var l1p1 = l1.p1.x < l1.p2.x || (l1.p1.x == l1.p2.x && l1.p1.y < l1.p2.y) ? l1.p1 : l1.p2; + var l1p2 = l1.p1.x < l1.p2.x || (l1.p1.x == l1.p2.x && l1.p1.y < l1.p2.y) ? l1.p2 : l1.p1; + var m1 = (l1p2.y - l1p1.y) / (l1p2.x - l1p1.x); + + var l2p1 = l2.p1.x < l2.p2.x || (l2.p1.x == l2.p2.x && l2.p1.y < l2.p2.y) ? l2.p1 : l2.p2; + var l2p2 = l2.p1.x < l2.p2.x || (l2.p1.x == l2.p2.x && l2.p1.y < l2.p2.y) ? l2.p2 : l2.p1; + var m2 = (l2p2.y - l2p1.y) / (l2p2.x - l2p1.x); + + var l1Vert = l1.p1.x == l1.p2.x; + var l2Vert = l2.p1.x == l2.p2.x; + if(l1Vert || l2Vert) { + if(l1Vert && l2Vert) { + // If the lines don't follow the same path, return + if(l1p1.x != l2p1.x) return false; + // if they never meet, return + if(l1p2.y < l2p1.y || l1p1.y > l2p2.y) return false; + var firstVert = l1p1.y >= l2p1.y ? l1p1 : l2p1; + var secondVert = l1p2.y <= l2p2.y ? l1p2 : l2p2; + // First is from the perspective of l1 + retval.parallel = { + first: l1p1 == l1.p1 ? firstVert : secondVert, + second: l1p2 == l1.p2 ? secondVert : firstVert, + sameDirection: (l1p1 == l1.p1) == (l2p1 == l2.p1) + }; + + return retval; + } + + var x1 = l2Vert ? l1p1.x : l2p1.x; + var x2 = l2Vert ? l1p2.x : l2p2.x; + var xVert = l2Vert ? l2p1.x : l1p1.x; + + var y = l2Vert ? l1p1.y + (xVert - x1) * m1 : l2p1.y + (xVert - x1) * m2; + var y1 = l2Vert ? l2p1.y : l1p1.y; + var y2 = l2Vert ? l2p2.y : l1p2.y; + if(xVert >= x1 && xVert <= x2 && y >= y1 && y <= y2) { + retval.point = { x: xVert, y: y }; + retval.exiting = l2Vert == (y1 == (l2Vert ? l2.p1.y : l1.p1.y)) == (x1 == (l2Vert ? l1.p1.x : l2.p1.x)); + retval.entering = !retval.exiting; + + // Calculate ties + if(x1 == xVert) { + ties[l2Vert ? 'l1' : 'l2'] = (x1 == (l2Vert ? l1.p1.x : l2.p1.x)) ? 'start' : 'end'; + retval.ties = ties; + } else if(x2 == xVert) { + ties[l2Vert ? 'l1' : 'l2'] = (x2 == (l2Vert ? l1.p2.x : l2.p2.x)) ? 'end' : 'start'; + retval.ties = ties; + } + if(y1 == y) { + ties[l2Vert ? 'l2' : 'l1'] = (y1 == (l2Vert ? l2.p1.y : l1.p1.y)) ? 'start' : 'end'; + retval.ties = ties; + } else if(y2 == y) { + ties[l2Vert ? 'l2' : 'l1'] = (y2 == (l2Vert ? l2.p2.y : l1.p2.y)) ? 'end' : 'start'; + retval.ties = ties; + } + + return retval; + } + return false; + } + // If here, no vertical lines + + if(m1 == m2) { + // If the lines don't follow the same path, return + if(l1p1.y != (l2p1.y + (l1p1.x - l2p1.x) * m1)) return false; + // if they never meet, return + if(l1p2.x < l2p1.x || l1p1.x > l2p2.x) return false; + var first = l1p1.x >= l2p1.x ? l1p1 : l2p1; + var second = l1p2.x <= l2p2.x ? l1p2 : l2p2; + // First is from the perspective of l1 + retval.parallel = { + first: l1p1 == l1.p1 ? first : second, + second: l1p2 == l1.p2 ? second : first, + sameDirection: (l1p1 == l1.p1) == (l2p1 == l2.p1) + }; + + return retval; + } + + var x = (l2p1.y - l2p1.x * m2 - l1p1.y + l1p1.x * m1) / (m1 - m2); + + // Check if x is out of bounds + if(x >= l1p1.x && x <= l1p2.x && x >= l2p1.x && x <= l2p2.x) { + var y = l1p1.y + (x - l1p1.x) * m1; + retval.point = { x: x, y: y }; + retval.entering = m1 > m2 == (l1p1 == l1.p1) == (l2p1 == l2.p1); + retval.exiting = !retval.entering; + + // Calculate ties + if(l1.p1.x == x) { + ties.l1 = 'start'; + retval.ties = ties; + } else if(l1.p2.x == x) { + ties.l1 = 'end'; + retval.ties = ties; + } + if(l2.p1.x == x) { + ties.l2 = 'start'; + retval.ties = ties; + } else if(l2.p2.x == x) { + ties.l2 = 'end'; + retval.ties = ties; + } + + return retval; + } + return false; + }; + + var _checkInsideRegion = function(label, point) { + if(!_polygonRegistered(label)) return false; + + return _checkInside(regionMap[label].points, point || $ax.mouseLocation); + }; + _geometry.checkInsideRegion = _checkInsideRegion; + + // Returns true if point is inside the polygon, including ties + var _checkInside = function(polygon, point) { + // Make horizontal line wider than the polygon, with the y of point to test location + var firstX = polygon[0].x; + var secondX = firstX; + var i; + for(i = 1; i < polygon.length; i++) { + var polyX = polygon[i].x; + firstX = Math.min(firstX, polyX); + secondX = Math.max(secondX, polyX); + } + var line = { + p1: _genPoint(--firstX, point.y), + p2: _genPoint(++secondX, point.y) + }; + + // If entered true, with closest intersection says you are inside the polygon. + var entered = false; + // Closest is the closest intersection to the left of the point + var closest = line.p1.x; + // This is for if intersections hit the same point, to find out which is correct + var cos = -2; + + var getCos = function(line) { + var x = line.p2.x - line.p1.x; + var y = line.p2.y - line.p1.y; + return x / Math.sqrt(x * x + y * y); + }; + + for(i = 0; i < polygon.length; i++) { + var polyLine = { p1: polygon[i], p2: polygon[(i + 1) % polygon.length] }; + var intersectInfo = linesIntersect(line, polyLine); + if(!intersectInfo) continue; + + if(intersectInfo.parallel) { + // Only really care about this if it actually touches the point + if(intersectInfo.parallel.first.x <= point.x && intersectInfo.parallel.second.x >= point.x) return true; + continue; + } + + var intersectionX = intersectInfo.point.x; + if(intersectionX > point.x || intersectionX < closest) continue; + if(intersectionX == point.x) return true; + + // If closer than last time, reset cosine. + if(intersectionX != closest) cos = -2; + + // For getting cosine, need to possibly reverse the direction of polyLine. + if(intersectInfo.ties) { + // Tie must be on l2, if the ties is end, reverse so cosine indicates how close the angle is to that of 'point' from here. + if(intersectInfo.ties.l2 == 'end') polyLine = { p1: polyLine.p2, p2: polyLine.p1 }; + } else { + // It is on both side, so you can take the larger one + if(polyLine.p1.x > polyLine.p2.x) polyLine = { p1: polyLine.p2, p2: polyLine.p1 }; + } + var currCos = getCos(polyLine); + if(currCos > cos) { + cos = currCos; + closest = intersectionX; + entered = intersectInfo.entering; + } + } + return entered; + }; + _geometry.checkInside = _checkInside; +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/globals.js b/code/page/resources/scripts/axure/globals.js new file mode 100644 index 0000000..0c5c4e8 --- /dev/null +++ b/code/page/resources/scripts/axure/globals.js @@ -0,0 +1,7 @@ +$axure.internal(function($ax) { + var _globals = $ax.globals = {}; + + $ax.globals.MaxZIndex = 1000; + $ax.globals.MinZIndex = -1000; + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/ie.js b/code/page/resources/scripts/axure/ie.js new file mode 100644 index 0000000..cd99447 --- /dev/null +++ b/code/page/resources/scripts/axure/ie.js @@ -0,0 +1,344 @@ + +//// ******* Internet Explorer MANAGER ******** // +////this is to handle all the stupid IE Stuff +//$axure.internal(function($ax) { +// if(!IE_10_AND_BELOW) return; + +// var _ieColorManager = {}; +// if(Number(BROWSER_VERSION) < 9) $ax.ieColorManager = _ieColorManager; + +// var _applyIEFixedPosition = function() { +// if(Number(BROWSER_VERSION) >= 7) return; + +// $axure(function(diagramObject) { return diagramObject.fixedVertical; }).$() +// .appendTo($('body')) +// .css('position', 'absolute').css('margin-left', 0 + 'px').css('margin-top', 0 + 'px'); + +// var handleScroll = function() { +// $axure(function(diagramObject) { return diagramObject.fixedVertical; }) +// .each(function(diagramObject, elementId) { +// var win = $(window); +// var windowWidth = win.width(); +// var windowHeight = win.height(); +// var windowScrollLeft = win.scrollLeft(); +// var windowScrollTop = win.scrollTop(); + +// var newLeft = 0; +// var newTop = 0; +// var elementQuery = $('#' + elementId); +// var elementAxQuery = $ax('#' + elementId); +// var width = elementAxQuery.width(); +// var height = elementAxQuery.height(); + +// var horz = diagramObject.fixedHorizontal; +// if(horz == 'left') { +// newLeft = windowScrollLeft + diagramObject.fixedMarginHorizontal; +// } else if(horz == 'center') { +// newLeft = windowScrollLeft + ((windowWidth - width) / 2) + diagramObject.fixedMarginHorizontal; +// } else if(horz == 'right') { +// newLeft = windowScrollLeft + windowWidth - width - diagramObject.fixedMarginHorizontal; +// } + +// var vert = diagramObject.fixedVertical; +// if(vert == 'top') { +// newTop = windowScrollTop + diagramObject.fixedMarginVertical; +// } else if(vert == 'middle') { +// newTop = windowScrollTop + ((windowHeight - height) / 2) + diagramObject.fixedMarginVertical; +// } else if(vert == 'bottom') { +// newTop = windowScrollTop + windowHeight - height - diagramObject.fixedMarginVertical; +// } +// elementQuery.css('top', newTop + 'px').css('left', newLeft + 'px'); +// }); +// }; + +// $(window).scroll(handleScroll); +// $axure.resize(handleScroll); +// handleScroll(); +// }; + +// var _applyBackground = function() { +// if(Number(BROWSER_VERSION) >= 9) return; + +// var styleChain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId); +// var argb = _getArgb($ax.pageData.page, styleChain); +// var hexColor = _getHexColor(argb, false); +// if(hexColor) $('body').css('background-color', hexColor); + +// _applyBackgroundToQuery($ax('*')); +// }; + +// var _applyBackgroundToQuery = function(query) { +// if(Number(BROWSER_VERSION) >= 9) return; + +// var styleChain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId); +// query.each(function(obj, elementId) { +// if ($ax.public.fn.IsDynamicPanel(obj.type)) { +// var stateCount = obj.diagrams.length; +// for(var j = 0; j < stateCount; j++) { +// var stateId = $ax.repeater.applySuffixToElementId(elementId, '_state' + j); +// var argb = _getArgb(obj.diagrams[j], styleChain); +// var hexColor = _getHexColor(argb, true); +// if(hexColor) $jobj(stateId).css('background-color', hexColor); +// } +// } else if ($ax.public.fn.IsRepeater(obj.type)) { + +// } +// }); +// }; +// _ieColorManager.applyBackground = _applyBackgroundToQuery; + +// var _getArgb = function(diagram, styleChain) { +// var argb = undefined; +// for(var i = 0; i < styleChain.length && !argb; i++) { +// var style = diagram.adaptiveStyles[styleChain[i]]; +// argb = style.fill && style.fill.color; +// } +// if(!argb) argb = diagram.style.fill.color; +// return argb; +// }; + +// var gMult = 256; +// var rMult = gMult * 256; +// var aMult = rMult * 256; + +// var _getHexColor = function(argb, allowWhite) { +// var a = Math.floor(argb / aMult); +// argb -= a * aMult; + +// var r = Math.floor(argb / rMult); +// argb -= r * rMult; + +// var g = Math.floor(argb / gMult); +// var b = argb - g * gMult; + +// return _getColorFromArgb(a, r, g, b, allowWhite); +// }; + +// var _getColorFromArgb = function(a, r, g, b, allowWhite) { +// if(Number(BROWSER_VERSION) >= 9) return undefined; + +// //convert the color with alpha to a color with no alpha (assuming white background) +// r = Math.min((r * a) / 255 + 255 - a, 255); +// g = Math.min((g * a) / 255 + 255 - a, 255); +// b = Math.min((b * a) / 255 + 255 - a, 255); + +// if(a == 0) return undefined; +// if(!allowWhite && (r == 255 && g == 255 && b == 255)) return undefined; + +// var color = '#'; +// color += Math.floor(r / 16).toString(16); +// color += Math.floor(r % 16).toString(16); +// color += Math.floor(g / 16).toString(16); +// color += Math.floor(g % 16).toString(16); +// color += Math.floor(b / 16).toString(16); +// color += Math.floor(b % 16).toString(16); +// return color; +// }; +// _ieColorManager.getColorFromArgb = _getColorFromArgb; + +// var getIEOffset = function(transform, rect) { +// var translatedVertexes = [ +// $axure.utils.Vector2D(0, 0), //we dont translate, so the orgin is fixed +// transform.mul($axure.utils.Vector2D(0, rect.height)), +// transform.mul($axure.utils.Vector2D(rect.width, 0)), +// transform.mul($axure.utils.Vector2D(rect.width, rect.height))]; + +// var minX = 0, minY = 0, maxX = 0, maxY = 0; +// $.each(translatedVertexes, function(index, p) { +// minX = Math.min(minX, p.x); +// minY = Math.min(minY, p.y); +// maxX = Math.max(maxX, p.x); +// maxY = Math.max(maxY, p.y); +// }); + +// return $axure.utils.Vector2D( +// (maxX - minX - rect.width) / 2, +// (maxY - minY - rect.height) / 2); +// }; + +// var _filterFromTransform = function(transform) { +// return "progid:DXImageTransform.Microsoft.Matrix(M11=" + transform.m11 + +// ", M12=" + transform.m12 + ", M21=" + transform.m21 + +// ", M22=" + transform.m22 + ", SizingMethod='auto expand')"; +// }; + +// var _applyIERotation = function() { +// if(Number(BROWSER_VERSION) >= 9) return; + +// $axure(function(diagramObject) { +// return ((diagramObject.style.rotation && Math.abs(diagramObject.style.rotation) > 0.1) +// || (diagramObject.style.textRotation && Math.abs(diagramObject.style.textRotation) > 0.1)) +// && !diagramObject.isContained; +// }).each(function(diagramObject, elementId) { +// var rotation = diagramObject.style.rotation || 0; +// var $element = $('#' + elementId); +// var axElement = $ax('#' + elementId); +// var width = axElement.width(); +// var height = axElement.height(); +// var originX = width / 2; +// var originY = height / 2; + +// var shapeIeOffset; +// $element.children().each(function() { +// var $child = $(this); +// var axChild = $ax('#' + $child.attr('id')); +// var childWidth = axChild.width(); +// var childHeight = axChild.height() + $child.position().top; +// var centerX = $child.position().left + (childWidth / 2); +// var centerY = $child.position().top + (childHeight / 2); +// var deltaX = centerX - originX; +// var deltaY = centerY - originY; + +// var effectiveRotation = rotation; +// var textObject = $ax.getObjectFromElementId($child.attr('id')); +// if(textObject) { +// if(textObject.style.textRotation) effectiveRotation = textObject.style.textRotation; +// else return; +// } + +// var transform = $ax.utils.Matrix2D.identity().rotate(effectiveRotation); +// var filter = _filterFromTransform(transform); + +// $child.css('filter', filter) +// .width(childWidth + 1) +// .height(childHeight + 1); + +// var p = transform.mul($ax.utils.Vector2D(deltaX, deltaY)); +// var ieOffset = getIEOffset(transform, { width: childWidth, height: childHeight }); +// if(!textObject) { +// shapeIeOffset = ieOffset; +// } else { +// // This is a close approximation, but not exact +// if(diagramObject.style.verticalAlignment != 'top') ieOffset.y -= shapeIeOffset.y + Math.abs(shapeIeOffset.x); +// } + +// $child.css("margin-left", -ieOffset.x - deltaX + p.x).css("margin-top", -ieOffset.y - deltaY + p.y); +// }); +// }); +// }; + +// var _fixIEStretchBackground = function() { +// if(Number(BROWSER_VERSION) >= 9) return; +// var pageStyle = $ax.adaptive.getPageStyle(); +// if(!pageStyle.imageRepeat || pageStyle.imageRepeat == 'auto') return; + +// $('body').css('background-image', 'none'); +// var viewId = $ax.adaptive.currentViewId; +// var imageInfo = viewId ? $ax.pageData.viewIdToBackgroundImageInfo && $ax.pageData.viewIdToBackgroundImageInfo[viewId] : $ax.pageData.defaultBackgroundImageInfo; +// if(imageInfo && imageInfo.path) { +// if($('#bg_img').length == 0) $('body').append(''); +// $('#bg_img').attr('src', imageInfo.path).css('position', 'fixed').css('z-index', '-10000'); +// _resizeIEBackground(); +// } else $('#bg_img').remove(); +// }; + +// var _resizeIEBackground = function() { +// if(Number(BROWSER_VERSION) >= 9) return; +// //var page = $ax.pageData.page; +// var viewId = $ax.adaptive.currentViewId; +// var pageStyle = $ax.adaptive.getPageStyle(); +// if(!$ax.pageData.defaultBackgroundImageInfo && !$ax.pageData.viewIdToBackgroundImageInfo) return; +// var imageInfo = viewId ? $ax.pageData.viewIdToBackgroundImageInfo[viewId] : $ax.pageData.defaultBackgroundImageInfo; +// if(!imageInfo) return; +// var imageWidth = imageInfo.width; +// var imageHeight = imageInfo.height; +// var windowWidth = $(window).width(); +// var windowHeight = $(window).height(); +// var isCover = pageStyle.imageRepeat == 'cover'; + +// var wRatio = windowWidth / imageWidth; +// var hRatio = windowHeight / imageHeight; +// var ratio = wRatio; +// if(isCover) { +// if(hRatio > wRatio) ratio = hRatio; +// } else { +// if(hRatio < wRatio) ratio = hRatio; +// } +// var width = imageWidth * ratio; +// var height = imageHeight * ratio; + +// var left = '0px'; +// if((isCover && width > windowWidth) || (!isCover && width < windowWidth)) { +// if(pageStyle.imageHorizontalAlignment == 'center') { +// left = ((windowWidth - width) / 2) + 'px'; +// } else if(pageStyle.imageHorizontalAlignment == 'far') { +// left = (windowWidth - width) + 'px'; +// } +// } + +// var top = '0px'; +// if((isCover && height > windowHeight) || (!isCover && height < windowHeight)) { +// if(pageStyle.imageVerticalAlignment == 'center') { +// top = ((windowHeight - height) / 2) + 'px'; +// } else if(pageStyle.imageVerticalAlignment == 'far') { +// top = (windowHeight - height) + 'px'; +// } +// } + +// $('#bg_img').css('top', top).css('left', left).css('width', width).css('height', height); +// }; + +// var _fixAllPngs = function() { +// if(!(/MSIE ((5\.5)|6)/.test(window.navigator.userAgent) && window.navigator.platform == "Win32")) return; + +// $('img[src$=".png"]').each(function() { +// if(!this.complete) { +// this.onload = function() { $axure.utils.fixPng(this); }; +// } else { +// $axure.utils.fixPng(this); +// } +// }); +// }; + +// var _fixInputSize = function() { +// if(Number(BROWSER_VERSION) >= 8 || window.navigator.userAgent.indexOf("Trident/4.0") > -1) return; +// var inputs = $('input').not(':input[type=button], :input[type=submit], :input[type=radio], :input[type=checkbox]'); +// inputs.each(function() { +// var $input = $(this); +// var axInput = $ax('#' + $input.attr('id')); +// $input.css('height', (axInput.height() - 4 + 'px')).css('width', (axInput.width() - 2 + 'px')); +// }); + +// var textAreas = $($ax.constants.TEXT_AREA_TYPE); +// textAreas.each(function() { +// var $textArea = $(this); +// var axText = $ax('#' + $textArea.attr('id')); +// $textArea.css('height', (axText.height() - 6 + 'px')).css('width', (axText.width() - 6 + 'px')); +// }); +// }; + +// var _fixInputBackground = function() { +// var inputs = $('input').not(':input[type=button], :input[type=submit], :input[type=radio], :input[type=checkbox]'); +// inputs = inputs.add($($ax.constants.TEXT_AREA_TYPE)); +// inputs.each(function() { +// var $input = $(this); +// if($input.css('background-color') == 'transparent') { +// $input.css('background-image', 'url(../../transparent.gif)'); +// } else { +// $input.css('background-image', ''); +// } +// }); +// }; + +// $(document).ready(function() { +// _fixIEStretchBackground(); +// _applyIEFixedPosition(); +// $axure.resize(function() { +// _resizeIEBackground(); +// }); +// $ax.adaptive.bind('viewChanged', function() { +// _fixIEStretchBackground(); +// _applyBackground(); +// _fixInputBackground(); +// }); + + +// _fixAllPngs(); +// _applyIERotation(); +// _applyBackground(); +// _fixInputSize(); +// _fixInputBackground(); +// }); + + +//}); diff --git a/code/page/resources/scripts/axure/init.temp.js b/code/page/resources/scripts/axure/init.temp.js new file mode 100644 index 0000000..a6869f1 --- /dev/null +++ b/code/page/resources/scripts/axure/init.temp.js @@ -0,0 +1,326 @@ +$axure.internal(function($ax) { + + $(window.document).ready(function () { + + //var readyStart = (new Date()).getTime(); + + //this is because the page id is not formatted as a guid + var pageId = $ax.pageData.page.packageId; + + var pageData = { + id: pageId, + pageName: $ax.pageData.page.name, + location: window.location.toString(), + notes: $ax.pageData.page.notes, + widgetNotes: $ax.pageData.page.annotations, + //clipToView: $ax.pageData.clipToView, + defaultAdaptiveView: $ax.pageData.defaultAdaptiveView, + adaptiveViews: $ax.pageData.adaptiveViews, + masterNotes: [] + }; + + var fnPrefix = ''; + function pushNextPrefix() { + if (fnPrefix.length == 0) fnPrefix = 'A'; + else fnPrefix = fnPrefix[0] == 'Z' ? 'A'.repeat(fnPrefix.length + 1) : String.fromCharCode(fnPrefix.charCodeAt(0) + 1).repeat(fnPrefix.length); + } + + function populateNotes(pageForNotes) { + for (var master in pageForNotes.masters) { + //var master = pageForNotes.masters[i]; + var masterData = pageForNotes.masters[master]; + var hasWidgetNotes = masterData.annotations && masterData.annotations.length > 0; + if ((master.notes && !$.isEmptyObject(masterData.notes)) || hasWidgetNotes) { + if(hasWidgetNotes) pushNextPrefix(); + var m = {}; + m.pageName = masterData.name; + m.notes = masterData.notes; + m.widgetNotes = masterData.annotations; + pageData.masterNotes.push(m); + if(hasWidgetNotes) populateOwnerToFn(m.widgetNotes); + } + populateNotes(master); + } + } + + var ownerToFns = {}; + function populateOwnerToFn(widgetNotes) { + if(typeof widgetNotes == 'undefined') return false; + for (var i = 0; i < widgetNotes.length; i++) { + var widgetNote = widgetNotes[i]; + widgetNote['fn'] = fnPrefix + widgetNote['fn']; + var fn = widgetNote['fn']; + var ownerId = widgetNote['ownerId']; + if (ownerId !== undefined && ownerId.length > 0) { + var ownerLabels = ownerToFns[ownerId]; + if (ownerLabels == undefined) ownerLabels = []; + ownerLabels.push(fn); + ownerToFns[ownerId] = ownerLabels; + } + } + } + + populateOwnerToFn(pageData.widgetNotes); + populateNotes($ax.pageData); + pageData.ownerToFns = ownerToFns; + + $ax.pageData.notesData = pageData; + + //var anns = []; + //$ax('*').each(function (dObj, elementId) { + // pushAnnotation(dObj, elementId); + //}); + + //function pushAnnotation(dObj, elementId) { + // var ann = dObj.annotation; + // if(ann) { + // ann = $ax.deepCopy(ann); + // ann["id"] = elementId; + // ann["label"] = dObj.label + " (" + dObj.friendlyType + ")"; + // anns.push(ann); + // } + + // if(dObj.type === 'repeater' && dObj.objects) { + // //if it's repeater, save the id as repeaterId@scriptId + // for(var i = 0, len = dObj.objects.length; i < len; i++) { + // var child = dObj.objects[i]; + // var scriptId = $ax.getScriptIdFromPath([child.id], elementId); + // pushAnnotation(child, elementId + '@' + scriptId); + // } + // } + //} + + //pageData.widgetNotes = anns; + + //only trigger the page.data setting if the window is on the mainframe + var isMainFrame = false; + try { + if(window.name == 'mainFrame' || + (!CHROME_5_LOCAL && window.parent.$ && window.parent.$('#mainFrame').length > 0)) { + isMainFrame = true; + + $ax.messageCenter.addMessageListener(function(message, data) { + if(message == 'finishInit') { + _processTempInit(); + } + }); + + $axure.messageCenter.setState('page.data', pageData); + window.focus(); + } + } catch(e) { } + + //attach here for chrome local + //$(window).on('load', function() { + // $ax.style.initializeObjectTextAlignment($ax('*')); + //}); + + if(!isMainFrame) _processTempInit(); + }); + + var touchCount = 0; + var lastTouch = Date.now(); + var _registerTouchCount = $ax.registerTouchCount = function (e) { + var now = Date.now(); + if (now - lastTouch < 375) { + if (++touchCount === 3) { + $(':input').blur(); + $ax.messageCenter.postMessage('tripleClick', true); + e.preventDefault(); + }; + } else { + touchCount = 1; + } + lastTouch = now; + }; + + // Block IOS stalling second tap. + // Stop third click from also clicking mobile card + var _clearTouchCount = $ax.clearTouchCount = function (e) { + if (touchCount === 3) { + touchCount = 0; + e.preventDefault(); + } + }; + + var _processTempInit = function() { + //var start = (new Date()).getTime(); + //var end = (new Date()).getTime(); + //window.alert('elapsed ' + (end - start)); + + $('iframe').each(function() { + var origSrc = $(this).attr('basesrc'); + + var $this = $(this); + if(origSrc) { + var newSrcUrl = origSrc.toLowerCase().indexOf('http://') == -1 ? $ax.globalVariableProvider.getLinkUrl(origSrc) : origSrc; + $this.attr('src', newSrcUrl); + } + + if(IOS) { + $this.parent().css('overflow', 'auto').css('-webkit-overflow-scrolling', 'touch').css('-ms-overflow-x', 'hidden').css('overflow-x', 'hidden'); + } + }); + + $axure.messageCenter.addMessageListener(function(message, data) { + if(message == 'setGlobalVar') { + $ax.globalVariableProvider.setVariableValue(data.globalVarName, data.globalVarValue, true); + } + }); + + window.lastFocusedClickable = null; + var _lastFocusedClickableSelector = 'input, a'; + var shouldOutline = true; + + $ax(function (dObj) { return dObj.tabbable; }).each(function (dObj, elementId) { + if ($ax.public.fn.IsLayer(dObj.type)) $ax.event.layerMapFocus(dObj, elementId); + var focusableId = $ax.event.getFocusableWidgetOrChildId(elementId); + var $focusable = $('#' + focusableId); + $focusable.attr("tabIndex", 0); + if($focusable.is('div') || $focusable.is('img')) { + $focusable.bind($ax.features.eventNames.mouseDownName, function() { + shouldOutline = false; + }); + attachFocusAndBlur($focusable); + } + }); + + $(window.document).bind($ax.features.eventNames.mouseUpName, function() { + shouldOutline = true; + }); + + attachFocusAndBlur($(_lastFocusedClickableSelector)); + + function attachFocusAndBlur($query) { + $query.focus(function () { + if(shouldOutline) { + $(this).css('outline', ''); + } else { + $(this).css('outline', 'none'); + } + window.lastFocusedClickable = this; + }).blur(function () { + if(window.lastFocusedClickable == this) window.lastFocusedClickable = null; + }); + } + + $(window.document).bind('keyup', function (e) { + switch(e.which) { + case 13: + case 32: + if(window.lastFocusedClickable) $(window.lastFocusedClickable).click(); + break; + default: return; // exit this handler for other keys + } + }); + + //if($ax.document.configuration.hideAddress) { + // $(window).on('load', function() { + // window.setTimeout(function() { + // window.scrollTo(0, 0.9); + // }, 0); + // }); + //} + + //if($ax.document.configuration.preventScroll) { + // $(window.document).bind('touchmove', function(e) { + // var inScrollable = $ax.legacy.GetScrollable(e.target) != window.document.body; + // if(!inScrollable) { + // e.preventDefault(); + // } + // }); + + // $ax(function(diagramObject) { + // return $ax.public.fn.IsDynamicPanel(diagramObject.type) && diagramObject.scrollbars != 'none'; + // }).$().children().bind('touchstart', function() { + // var target = this; + // var top = target.scrollTop; + // if(top <= 0) target.scrollTop = 1; + // if(top + target.offsetHeight >= target.scrollHeight) target.scrollTop = target.scrollHeight - target.offsetHeight - 1; + // }); + //} + + if(OS_MAC && WEBKIT) { + $ax(function(diagramObject) { + return $ax.public.fn.IsComboBox(diagramObject.type); + }).each(function(obj, id) { + $jobj($ax.INPUT(id)).css('-webkit-appearance', 'menulist-button'); + }); + } + + if($ax.features.supports.mobile) { + $('html').first().on('touchstart', _registerTouchCount); + $('html').first().on('touchend', _clearTouchCount); + + // Stop pinch zoom (stopping all gestures for now) + // Gesturestart is only supported in Safari + if (SAFARI) { + document.addEventListener("gesturestart", function (e) { + e.preventDefault(); + }); + } + } + + $ax.annotation.initialize(); + + $ax.legacy.BringFixedToFront(); + $ax.event.initialize(); + $ax.style.initialize(); + $ax.visibility.initialize(); + $ax.repeater.initialize(); + $ax.dynamicPanelManager.initialize(); //needs to be called after visibility is initialized + $ax.adaptive.initialize(); + $ax.loadDynamicPanelsAndMasters(); + $ax.adaptive.loadFinished(); + var start = (new Date()).getTime(); + $ax.repeater.initRefresh(); + var end = (new Date()).getTime(); + console.log('loadTime: ' + (end - start) / 1000); + $ax.style.prefetch(); + + $(window).resize(); + + //var readyEnd = (new Date()).getTime(); + //window.alert('elapsed ' + (readyEnd - readyStart)); + }; +}); + +/* extend canvas */ +var gv_hasCanvas = false; +(function() { + var _canvas = document.createElement('canvas'), proto, abbrev; + if(gv_hasCanvas = !!(_canvas.getContext && _canvas.getContext('2d')) && typeof (CanvasGradient) !== 'undefined') { + function chain(func) { + return function() { + return func.apply(this, arguments) || this; + }; + } + + with(proto = CanvasRenderingContext2D.prototype) for(var func in abbrev = { + a: arc, + b: beginPath, + n: clearRect, + c: clip, + p: closePath, + g: createLinearGradient, + f: fill, + j: fillRect, + z: function(s) { this.fillStyle = s; }, + l: lineTo, + w: function(w) { this.lineWidth = w; }, + m: moveTo, + q: quadraticCurveTo, + h: rect, + r: restore, + o: rotate, + s: save, + x: scale, + y: function(s) { this.strokeStyle = s; }, + u: setTransform, + k: stroke, + i: strokeRect, + t: translate + }) proto[func] = chain(abbrev[func]); + CanvasGradient.prototype.a = chain(CanvasGradient.prototype.addColorStop); + } +})(); diff --git a/code/page/resources/scripts/axure/ios.js b/code/page/resources/scripts/axure/ios.js new file mode 100644 index 0000000..15333b7 --- /dev/null +++ b/code/page/resources/scripts/axure/ios.js @@ -0,0 +1,91 @@ +$axure.internal(function ($ax) { + if ((IOS && SAFARI) || SHARE_APP) { + var outerHtml = document.documentElement; + outerHtml.id = 'ios-safari'; + var html = document.createElement('html'); + html.id = 'ios-safari-html'; + outerHtml.appendChild(html); + var body = document.body; + html.appendChild(body); + Object.defineProperty(document, 'body', { + get: function () { + return body; + } + }); + var fixedBody = document.createElement('body'); + fixedBody.id = 'ios-safari-fixed'; + outerHtml.appendChild(fixedBody); + var fixedBase = document.createElement('div'); + fixedBase.id = 'base-fixed'; + fixedBody.appendChild(fixedBase); + + var isDevice = false; + var deviceWidth = 0; + var updateHtmlWidth = function (panelWidthOffset, scale, height, scaleN) { + var iosSafHtml = $('#ios-safari-html'); + iosSafHtml.css('overflow', ''); + iosSafHtml.css('overflow-x', ''); + iosSafHtml.css('height', ''); + if (isDevice) { + iosSafHtml.width(deviceWidth / scaleN); + iosSafHtml.css('overflow-x', 'hidden'); + } else { + var isLandscape = window.orientation != 0 && window.orientation != 180; + var mobileWidth = isLandscape ? window.screen.height : window.screen.width + iosSafHtml.width((mobileWidth - panelWidthOffset) / scaleN); + } + if (scale == 1) { + iosSafHtml.css('overflow-x', 'hidden'); + iosSafHtml.css('height', (height / scaleN) + 'px'); + } else if (scale == 2) iosSafHtml.css('overflow', 'hidden'); + }; + + updateHtmlWidth(0); + + $axure('*').each(function (obj, element) { + if (obj && obj.fixedVertical && obj.fixedKeepInFront) { + var parent = $axure('#' + element).getParents(false, ['item', 'state'])[0]; + if (!parent) { + $('#base-fixed').append($('#' + element)); + } + } + }); + + $axure.messageCenter.addMessageListener(function (message, data) { + if (message == "setContentScale") { + updateHtmlWidth(data.panelWidthOffset, data.scale, data.viewportHeight, data.scaleN); + } else if (message == "setDeviceMode") { + isDevice = data.device && !data.scaleToWidth; + if (isDevice) deviceWidth = data.width; + updateHtmlWidth(0); + } + }); + + + $('#ios-safari-html').scroll(function () { + $axure.updateWindowInfo(); + }); + + var scrollStartY; + var maxScrollY + var touchStart; + $axure('*').each(function (obj, element) { + if (obj && obj.scrollbars && obj.scrollbars.toLowerCase() != 'none') { + if (obj.scrollbars == 'horizontalAsNeeded') return; + + $('#' + element).on('touchstart', function (e) { + touchStart = e.pageY; + var stateId = $ax.visibility.GetPanelState($('#' + element).attr('id')); + scrollStartY = $('#' + stateId).scrollTop(); + maxScrollY = $('#' + stateId)[0].scrollHeight - $('#' + stateId).height(); + }); + + $('#' + element).on('touchmove', function (e) { + if (maxScrollY <= 0) return false; + if (scrollStartY == 0 && e.pageY > touchStart) e.preventDefault(); + if (scrollStartY == maxScrollY && e.pageY < touchStart) e.preventDefault(); + }); + } + }); + } +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/jquery.nicescroll.min.js b/code/page/resources/scripts/axure/jquery.nicescroll.min.js new file mode 100644 index 0000000..cfa5e75 --- /dev/null +++ b/code/page/resources/scripts/axure/jquery.nicescroll.min.js @@ -0,0 +1 @@ +!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(function(e){"use strict";var o=!1,t=!1,r=0,i=2e3,s=0,n=e,l=document,a=window,c=n(a),d=[];var u=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||!1,h=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.mozCancelAnimationFrame||!1;if(u)a.cancelAnimationFrame||(h=function(e){});else{var p=0;u=function(e,o){var t=(new Date).getTime(),r=Math.max(0,16-(t-p)),i=a.setTimeout(function(){e(t+r)},r);return p=t+r,i},h=function(e){a.clearTimeout(e)}}var m,f,g,v=a.MutationObserver||a.WebKitMutationObserver||!1,w=Date.now||function(){return(new Date).getTime()},b={zindex:"auto",cursoropacitymin:0,cursoropacitymax:1,cursorcolor:"#424242",cursorwidth:"6px",cursorborder:"1px solid #fff",cursorborderradius:"5px",scrollspeed:40,mousescrollstep:27,touchbehavior:!1,emulatetouch:!1,hwacceleration:!0,usetransition:!0,boxzoom:!1,dblclickzoom:!0,gesturezoom:!0,grabcursorenabled:!0,autohidemode:!0,background:"",iframeautoresize:!0,cursorminheight:32,preservenativescrolling:!0,railoffset:!1,railhoffset:!1,bouncescroll:!0,spacebarenabled:!0,railpadding:{top:0,right:0,left:0,bottom:0},disableoutline:!0,horizrailenabled:!0,railalign:"right",railvalign:"bottom",enabletranslate3d:!0,enablemousewheel:!0,enablekeyboard:!0,smoothscroll:!0,sensitiverail:!0,enablemouselockapi:!0,cursorfixedheight:!1,directionlockdeadzone:6,hidecursordelay:400,nativeparentscrolling:!0,enablescrollonselection:!0,overflowx:!0,overflowy:!0,cursordragspeed:.3,rtlmode:"auto",cursordragontouch:!1,oneaxismousemode:"auto",scriptpath:(f=l.currentScript||!!(m=l.getElementsByTagName("script")).length&&m[m.length-1],g=f?f.src.split("?")[0]:"",g.split("/").length>0?g.split("/").slice(0,-1).join("/")+"/":""),preventmultitouchscrolling:!0,disablemutationobserver:!1,enableobserver:!0,scrollbarid:!1},y=!1,x=function(e,p){var m=this;this.version="3.7.6",this.name="nicescroll",this.me=p;var f=n("body"),g=this.opt={doc:f,win:!1};if(n.extend(g,b),g.snapbackspeed=80,e)for(var x in g)void 0!==e[x]&&(g[x]=e[x]);if(g.disablemutationobserver&&(v=!1),this.doc=g.doc,this.iddoc=this.doc&&this.doc[0]&&this.doc[0].id||"",this.ispage=/^BODY|HTML/.test(g.win?g.win[0].nodeName:this.doc[0].nodeName),this.haswrapper=!1!==g.win,this.win=g.win||(this.ispage?c:this.doc),this.docscroll=this.ispage&&!this.haswrapper?c:this.win,this.body=f,this.viewport=!1,this.isfixed=!1,this.iframe=!1,this.isiframe="IFRAME"==this.doc[0].nodeName&&"IFRAME"==this.win[0].nodeName,this.istextarea="TEXTAREA"==this.win[0].nodeName,this.forcescreen=!1,this.canshowonmouseevent="scroll"!=g.autohidemode,this.onmousedown=!1,this.onmouseup=!1,this.onmousemove=!1,this.onmousewheel=!1,this.onkeypress=!1,this.ongesturezoom=!1,this.onclick=!1,this.onscrollstart=!1,this.onscrollend=!1,this.onscrollcancel=!1,this.onzoomin=!1,this.onzoomout=!1,this.view=!1,this.page=!1,this.scroll={x:0,y:0},this.scrollratio={x:0,y:0},this.cursorheight=20,this.scrollvaluemax=0,"auto"==g.rtlmode){var z=this.win[0]==a?this.body:this.win,k=z.css("writing-mode")||z.css("-webkit-writing-mode")||z.css("-ms-writing-mode")||z.css("-moz-writing-mode");"horizontal-tb"==k||"lr-tb"==k||""===k?(this.isrtlmode="rtl"==z.css("direction"),this.isvertical=!1):(this.isrtlmode="vertical-rl"==k||"tb"==k||"tb-rl"==k||"rl-tb"==k,this.isvertical="vertical-rl"==k||"tb"==k||"tb-rl"==k)}else this.isrtlmode=!0===g.rtlmode,this.isvertical=!1;if(this.scrollrunning=!1,this.scrollmom=!1,this.observer=!1,this.observerremover=!1,this.observerbody=!1,!1!==g.scrollbarid)this.id=g.scrollbarid;else do{this.id="ascrail"+i++}while(l.getElementById(this.id));this.rail=!1,this.cursor=!1,this.cursorfreezed=!1,this.selectiondrag=!1,this.zoom=!1,this.zoomactive=!1,this.hasfocus=!1,this.hasmousefocus=!1,this.railslocked=!1,this.locked=!1,this.hidden=!1,this.cursoractive=!0,this.wheelprevented=!1,this.overflowx=g.overflowx,this.overflowy=g.overflowy,this.nativescrollingarea=!1,this.checkarea=0,this.events=[],this.saved={},this.delaylist={},this.synclist={},this.lastdeltax=0,this.lastdeltay=0,this.detected=function(){if(y)return y;var e=l.createElement("DIV"),o=e.style,t=navigator.userAgent,r=navigator.platform,i={};return i.haspointerlock="pointerLockElement"in l||"webkitPointerLockElement"in l||"mozPointerLockElement"in l,i.isopera="opera"in a,i.isopera12=i.isopera&&"getUserMedia"in navigator,i.isoperamini="[object OperaMini]"===Object.prototype.toString.call(a.operamini),i.isie="all"in l&&"attachEvent"in e&&!i.isopera,i.isieold=i.isie&&!("msInterpolationMode"in o),i.isie7=i.isie&&!i.isieold&&(!("documentMode"in l)||7===l.documentMode),i.isie8=i.isie&&"documentMode"in l&&8===l.documentMode,i.isie9=i.isie&&"performance"in a&&9===l.documentMode,i.isie10=i.isie&&"performance"in a&&10===l.documentMode,i.isie11="msRequestFullscreen"in e&&l.documentMode>=11,i.ismsedge="msCredentials"in a,i.ismozilla="MozAppearance"in o,i.iswebkit=!i.ismsedge&&"WebkitAppearance"in o,i.ischrome=i.iswebkit&&"chrome"in a,i.ischrome38=i.ischrome&&"touchAction"in o,i.ischrome22=!i.ischrome38&&i.ischrome&&i.haspointerlock,i.ischrome26=!i.ischrome38&&i.ischrome&&"transition"in o,i.cantouch="ontouchstart"in l.documentElement||"ontouchstart"in a,i.hasw3ctouch=!!a.PointerEvent&&(navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0),i.hasmstouch=!i.hasw3ctouch&&(a.MSPointerEvent||!1),i.ismac=/^mac$/i.test(r),i.isios=i.cantouch&&/iphone|ipad|ipod/i.test(r),i.isios4=i.isios&&!("seal"in Object),i.isios7=i.isios&&"webkitHidden"in l,i.isios8=i.isios&&"hidden"in l,i.isios10=i.isios&&a.Proxy,i.isandroid=/android/i.test(t),i.haseventlistener="addEventListener"in e,i.trstyle=!1,i.hastransform=!1,i.hastranslate3d=!1,i.transitionstyle=!1,i.hastransition=!1,i.transitionend=!1,i.trstyle="transform",i.hastransform="transform"in o||function(){for(var e=["msTransform","webkitTransform","MozTransform","OTransform"],t=0,r=e.length;t=1?this.ed:this.st+this.df*o|0},update:function(e,o){return this.st=this.getNow(),this.ed=e,this.spd=o,this.ts=w(),this.df=this.ed-this.st,this}},this.ishwscroll){this.doc.translate={x:0,y:0,tx:"0px",ty:"0px"},T.hastranslate3d&&T.isios&&this.doc.css("-webkit-backface-visibility","hidden"),this.getScrollTop=function(e){if(!e){var o=M();if(o)return 16==o.length?-o[13]:-o[5];if(m.timerscroll&&m.timerscroll.bz)return m.timerscroll.bz.getNow()}return m.doc.translate.y},this.getScrollLeft=function(e){if(!e){var o=M();if(o)return 16==o.length?-o[12]:-o[4];if(m.timerscroll&&m.timerscroll.bh)return m.timerscroll.bh.getNow()}return m.doc.translate.x},this.notifyScrollEvent=function(e){var o=l.createEvent("UIEvents");o.initUIEvent("scroll",!1,!1,a,1),o.niceevent=!0,e.dispatchEvent(o)};var L=this.isrtlmode?1:-1;T.hastranslate3d&&g.enabletranslate3d?(this.setScrollTop=function(e,o){m.doc.translate.y=e,m.doc.translate.ty=-1*e+"px",m.doc.css(T.trstyle,"translate3d("+m.doc.translate.tx+","+m.doc.translate.ty+",0)"),o||m.notifyScrollEvent(m.win[0])},this.setScrollLeft=function(e,o){m.doc.translate.x=e,m.doc.translate.tx=e*L+"px",m.doc.css(T.trstyle,"translate3d("+m.doc.translate.tx+","+m.doc.translate.ty+",0)"),o||m.notifyScrollEvent(m.win[0])}):(this.setScrollTop=function(e,o){m.doc.translate.y=e,m.doc.translate.ty=-1*e+"px",m.doc.css(T.trstyle,"translate("+m.doc.translate.tx+","+m.doc.translate.ty+")"),o||m.notifyScrollEvent(m.win[0])},this.setScrollLeft=function(e,o){m.doc.translate.x=e,m.doc.translate.tx=e*L+"px",m.doc.css(T.trstyle,"translate("+m.doc.translate.tx+","+m.doc.translate.ty+")"),o||m.notifyScrollEvent(m.win[0])})}else this.getScrollTop=function(){return m.docscroll.scrollTop()},this.setScrollTop=function(e){m.docscroll.scrollTop(e)},this.getScrollLeft=function(){return m.hasreversehr?m.detected.ismozilla?m.page.maxw-Math.abs(m.docscroll.scrollLeft()):m.page.maxw-m.docscroll.scrollLeft():m.docscroll.scrollLeft()},this.setScrollLeft=function(e){return setTimeout(function(){if(m)return m.hasreversehr&&(e=m.detected.ismozilla?-(m.page.maxw-e):m.page.maxw-e),m.docscroll.scrollLeft(e)},1)};this.getTarget=function(e){return!!e&&(e.target?e.target:!!e.srcElement&&e.srcElement)},this.hasParent=function(e,o){if(!e)return!1;for(var t=e.target||e.srcElement||e||!1;t&&t.id!=o;)t=t.parentNode||!1;return!1!==t};var C={thin:1,medium:3,thick:5};function N(e,o,t){var r=e.css(o),i=parseFloat(r);if(isNaN(i)){var s=3==(i=C[r]||0)?t?m.win.outerHeight()-m.win.innerHeight():m.win.outerWidth()-m.win.innerWidth():1;return m.isie8&&i&&(i+=1),s?i:0}return i}this.getDocumentScrollOffset=function(){return{top:a.pageYOffset||l.documentElement.scrollTop,left:a.pageXOffset||l.documentElement.scrollLeft}},this.getOffset=function(){if(m.isfixed){var e=m.win.offset(),o=m.getDocumentScrollOffset();return e.top-=o.top,e.left-=o.left,e}var t=m.win.offset();if(!m.viewport)return t;var r=m.viewport.offset();return{top:t.top-r.top,left:t.left-r.left}},this.updateScrollBar=function(e){var o,t;if(m.ishwscroll)m.rail.css({height:m.win.innerHeight()-(g.railpadding.top+g.railpadding.bottom)}),m.railh&&m.railh.css({width:m.win.innerWidth()-(g.railpadding.left+g.railpadding.right)});else{var r=m.getOffset();if((o={top:r.top,left:r.left-(g.railpadding.left+g.railpadding.right)}).top+=N(m.win,"border-top-width",!0),o.left+=m.rail.align?m.win.outerWidth()-N(m.win,"border-right-width")-m.rail.width:N(m.win,"border-left-width"),(t=g.railoffset)&&(t.top&&(o.top+=t.top),t.left&&(o.left+=t.left)),m.railslocked||m.rail.css({top:o.top,left:o.left,height:(e?e.h:m.win.innerHeight())-(g.railpadding.top+g.railpadding.bottom)}),m.zoom&&m.zoom.css({top:o.top+1,left:1==m.rail.align?o.left-20:o.left+m.rail.width+4}),m.railh&&!m.railslocked){o={top:r.top,left:r.left},(t=g.railhoffset)&&(t.top&&(o.top+=t.top),t.left&&(o.left+=t.left));var i=m.railh.align?o.top+N(m.win,"border-top-width",!0)+m.win.innerHeight()-m.railh.height:o.top+N(m.win,"border-top-width",!0),s=o.left+N(m.win,"border-left-width");m.railh.css({top:i-(g.railpadding.top+g.railpadding.bottom),left:s,width:m.railh.width})}}},this.doRailClick=function(e,o,t){var r,i,s,n;m.railslocked||(m.cancelEvent(e),"pageY"in e||(e.pageX=e.clientX+l.documentElement.scrollLeft,e.pageY=e.clientY+l.documentElement.scrollTop),o?(r=t?m.doScrollLeft:m.doScrollTop,s=t?(e.pageX-m.railh.offset().left-m.cursorwidth/2)*m.scrollratio.x:(e.pageY-m.rail.offset().top-m.cursorheight/2)*m.scrollratio.y,m.unsynched("relativexy"),r(0|s)):(r=t?m.doScrollLeftBy:m.doScrollBy,s=t?m.scroll.x:m.scroll.y,n=t?e.pageX-m.railh.offset().left:e.pageY-m.rail.offset().top,i=t?m.view.w:m.view.h,r(s>=n?i:-i)))},m.newscrolly=m.newscrollx=0,m.hasanimationframe="requestAnimationFrame"in a,m.hascancelanimationframe="cancelAnimationFrame"in a,m.hasborderbox=!1,this.init=function(){if(m.saved.css=[],T.isoperamini)return!0;if(T.isandroid&&!("hidden"in l))return!0;g.emulatetouch=g.emulatetouch||g.touchbehavior,m.hasborderbox=a.getComputedStyle&&"border-box"===a.getComputedStyle(l.body)["box-sizing"];var e={"overflow-y":"hidden"};if((T.isie11||T.isie10)&&(e["-ms-overflow-style"]="none"),m.ishwscroll&&(this.doc.css(T.transitionstyle,T.prefixstyle+"transform 0ms ease-out"),T.transitionend&&m.bind(m.doc,T.transitionend,m.onScrollTransitionEnd,!1)),m.zindex="auto",m.ispage||"auto"!=g.zindex?m.zindex=g.zindex:m.zindex=function(){var e=m.win;if("zIndex"in e)return e.zIndex();for(;e.length>0;){if(9==e[0].nodeType)return!1;var o=e.css("zIndex");if(!isNaN(o)&&0!==o)return parseInt(o);e=e.parent()}return!1}()||"auto",!m.ispage&&"auto"!=m.zindex&&m.zindex>s&&(s=m.zindex),m.isie&&0===m.zindex&&"auto"==g.zindex&&(m.zindex="auto"),!m.ispage||!T.isieold){var i=m.docscroll;m.ispage&&(i=m.haswrapper?m.win:m.doc),m.css(i,e),m.ispage&&(T.isie11||T.isie)&&m.css(n("html"),e),!T.isios||m.ispage||m.haswrapper||m.css(f,{"-webkit-overflow-scrolling":"touch"});var d=n(l.createElement("div"));d.css({position:"relative",top:0,float:"right",width:g.cursorwidth,height:0,"background-color":g.cursorcolor,border:g.cursorborder,"background-clip":"padding-box","-webkit-border-radius":g.cursorborderradius,"-moz-border-radius":g.cursorborderradius,"border-radius":g.cursorborderradius}),d.addClass("nicescroll-cursors"),m.cursor=d;var u=n(l.createElement("div"));u.attr("id",m.id),u.addClass("nicescroll-rails nicescroll-rails-vr");var h,p,w=["left","right","top","bottom"];for(var b in w)p=w[b],(h=g.railpadding[p]||0)&&u.css("padding-"+p,h+"px");u.append(d),u.width=Math.max(parseFloat(g.cursorwidth),d.outerWidth()),u.css({width:u.width+"px",zIndex:m.zindex,background:g.background,cursor:"default"}),u.visibility=!0,u.scrollable=!0,u.align="left"==g.railalign?0:1,m.rail=u,m.rail.drag=!1;var y,x=!1;if(!g.boxzoom||m.ispage||T.isieold||(x=l.createElement("div"),m.bind(x,"click",m.doZoom),m.bind(x,"mouseenter",function(){m.zoom.css("opacity",g.cursoropacitymax)}),m.bind(x,"mouseleave",function(){m.zoom.css("opacity",g.cursoropacitymin)}),m.zoom=n(x),m.zoom.css({cursor:"pointer",zIndex:m.zindex,backgroundImage:"url("+g.scriptpath+"zoomico.png)",height:18,width:18,backgroundPosition:"0 0"}),g.dblclickzoom&&m.bind(m.win,"dblclick",m.doZoom),T.cantouch&&g.gesturezoom&&(m.ongesturezoom=function(e){return e.scale>1.5&&m.doZoomIn(e),e.scale<.8&&m.doZoomOut(e),m.cancelEvent(e)},m.bind(m.win,"gestureend",m.ongesturezoom))),m.railh=!1,g.horizrailenabled&&(m.css(i,{overflowX:"hidden"}),(d=n(l.createElement("div"))).css({position:"absolute",top:0,height:g.cursorwidth,width:0,backgroundColor:g.cursorcolor,border:g.cursorborder,backgroundClip:"padding-box","-webkit-border-radius":g.cursorborderradius,"-moz-border-radius":g.cursorborderradius,"border-radius":g.cursorborderradius}),T.isieold&&d.css("overflow","hidden"),d.addClass("nicescroll-cursors"),m.cursorh=d,(y=n(l.createElement("div"))).attr("id",m.id+"-hr"),y.addClass("nicescroll-rails nicescroll-rails-hr"),y.height=Math.max(parseFloat(g.cursorwidth),d.outerHeight()),y.css({height:y.height+"px",zIndex:m.zindex,background:g.background}),y.append(d),y.visibility=!0,y.scrollable=!0,y.align="top"==g.railvalign?0:1,m.railh=y,m.railh.drag=!1),m.ispage)u.css({position:"fixed",top:0,height:"100%"}),u.css(u.align?{right:0}:{left:0}),m.body.append(u),m.railh&&(y.css({position:"fixed",left:0,width:"100%"}),y.css(y.align?{bottom:0}:{top:0}),m.body.append(y));else{if(m.ishwscroll){"static"==m.win.css("position")&&m.css(m.win,{position:"relative"});var z="HTML"==m.win[0].nodeName?m.body:m.win;n(z).scrollTop(0).scrollLeft(0),m.zoom&&(m.zoom.css({position:"absolute",top:1,right:0,"margin-right":u.width+4}),z.append(m.zoom)),u.css({position:"absolute",top:0}),u.css(u.align?{right:0}:{left:0}),z.append(u),y&&(y.css({position:"absolute",left:0,bottom:0}),y.css(y.align?{bottom:0}:{top:0}),z.append(y))}else{m.isfixed="fixed"==m.win.css("position");var k=m.isfixed?"fixed":"absolute";m.isfixed||(m.viewport=m.getViewport(m.win[0])),m.viewport&&(m.body=m.viewport,/fixed|absolute/.test(m.viewport.css("position"))||m.css(m.viewport,{position:"relative"})),u.css({position:k}),m.zoom&&m.zoom.css({position:k}),m.updateScrollBar(),m.body.append(u),m.zoom&&m.body.append(m.zoom),m.railh&&(y.css({position:k}),m.body.append(y))}T.isios&&m.css(m.win,{"-webkit-tap-highlight-color":"rgba(0,0,0,0)","-webkit-touch-callout":"none"}),g.disableoutline&&(T.isie&&m.win.attr("hideFocus","true"),T.iswebkit&&m.win.css("outline","none"))}if(!1===g.autohidemode?(m.autohidedom=!1,m.rail.css({opacity:g.cursoropacitymax}),m.railh&&m.railh.css({opacity:g.cursoropacitymax})):!0===g.autohidemode||"leave"===g.autohidemode?(m.autohidedom=n().add(m.rail),T.isie8&&(m.autohidedom=m.autohidedom.add(m.cursor)),m.railh&&(m.autohidedom=m.autohidedom.add(m.railh)),m.railh&&T.isie8&&(m.autohidedom=m.autohidedom.add(m.cursorh))):"scroll"==g.autohidemode?(m.autohidedom=n().add(m.rail),m.railh&&(m.autohidedom=m.autohidedom.add(m.railh))):"cursor"==g.autohidemode?(m.autohidedom=n().add(m.cursor),m.railh&&(m.autohidedom=m.autohidedom.add(m.cursorh))):"hidden"==g.autohidemode&&(m.autohidedom=!1,m.hide(),m.railslocked=!1),T.cantouch||m.istouchcapable||g.emulatetouch||T.hasmstouch){m.scrollmom=new S(m);m.ontouchstart=function(e){if(m.locked)return!1;if(e.pointerType&&("mouse"===e.pointerType||e.pointerType===e.MSPOINTER_TYPE_MOUSE))return!1;if(m.hasmoving=!1,m.scrollmom.timer&&(m.triggerScrollEnd(),m.scrollmom.stop()),!m.railslocked){var o=m.getTarget(e);if(o)if(/INPUT/i.test(o.nodeName)&&/range/i.test(o.type))return m.stopPropagation(e);var t="mousedown"===e.type;if(!("clientX"in e)&&"changedTouches"in e&&(e.clientX=e.changedTouches[0].clientX,e.clientY=e.changedTouches[0].clientY),m.forcescreen){var r=e;(e={original:e.original?e.original:e}).clientX=r.screenX,e.clientY=r.screenY}if(g.horizrailenabled?m.rail.drag={x:e.clientX,y:e.clientY,sx:m.scroll.x,sy:m.scroll.y,st:m.getScrollTop(),sl:m.getScrollLeft(),pt:2,dl:!1,tg:o}:m.rail.drag={x:0,y:e.clientY,sx:0,sy:m.scroll.y,st:m.getScrollTop(),sl:0,pt:2,dl:!1,tg:o},m.ispage||!g.directionlockdeadzone)m.rail.drag.dl="f";else{var i=c.width(),s=c.height(),l=m.getContentSize(),a=l.h-s,d=l.w-i;m.rail.scrollable&&!m.railh.scrollable?m.rail.drag.ck=a>0&&"v":!m.rail.scrollable&&m.railh.scrollable?m.rail.drag.ck=d>0&&"h":m.rail.drag.ck=!1}if(g.emulatetouch&&m.isiframe&&T.isie){var u=m.win.position();m.rail.drag.x+=u.left,m.rail.drag.y+=u.top}if(m.hasmoving=!1,m.lastmouseup=!1,g.horizrailenabled?m.scrollmom.reset(e.clientX,e.clientY):m.scrollmom.reset(0,e.clientY),o&&t){if(!/INPUT|SELECT|BUTTON|TEXTAREA/i.test(o.nodeName))return T.hasmousecapture&&o.setCapture(),g.emulatetouch?(o.onclick&&!o._onclick&&(o._onclick=o.onclick,o.onclick=function(e){if(m.hasmoving)return!1;o._onclick.call(this,e)}),m.cancelEvent(e)):m.stopPropagation(e);/SUBMIT|CANCEL|BUTTON/i.test(n(o).attr("type"))&&(m.preventclick={tg:o,click:!1})}}},m.ontouchend=function(e){if(!m.rail.drag)return!0;if(2==m.rail.drag.pt){if(e.pointerType&&("mouse"===e.pointerType||e.pointerType===e.MSPOINTER_TYPE_MOUSE))return!1;m.rail.drag=!1;var o="mouseup"===e.type;if(m.hasmoving&&(m.scrollmom.doMomentum(),m.lastmouseup=!0,m.hideCursor(),T.hasmousecapture&&l.releaseCapture(),o))return m.cancelEvent(e)}else if(1==m.rail.drag.pt)return m.onmouseup(e)};var E=g.emulatetouch&&m.isiframe&&!T.hasmousecapture,M=.3*g.directionlockdeadzone|0;m.ontouchmove=function(e,o){if(!m.rail.drag)return!0;if(e.targetTouches&&g.preventmultitouchscrolling&&e.targetTouches.length>1)return!0;if(e.pointerType&&("mouse"===e.pointerType||e.pointerType===e.MSPOINTER_TYPE_MOUSE))return!0;if(2==m.rail.drag.pt){var t,r;if("changedTouches"in e&&(e.clientX=e.changedTouches[0].clientX,e.clientY=e.changedTouches[0].clientY),r=t=0,E&&!o){var i=m.win.position();r=-i.left,t=-i.top}var s=e.clientY+t,n=s-m.rail.drag.y,a=e.clientX+r;g.horizrailenabled||(a=0+r);var c=a-m.rail.drag.x,d=m.rail.drag.st-n;if(m.ishwscroll&&g.bouncescroll)d<0?d=Math.round(d/2):d>m.page.maxh&&(d=m.page.maxh+Math.round((d-m.page.maxh)/2));else if(d<0?(d=0,s=0):d>m.page.maxh&&(d=m.page.maxh,s=0),0===s&&!m.hasmoving)return m.ispage||(m.rail.drag=!1),!0;var u=m.getScrollLeft();if(m.railh&&m.railh.scrollable&&(u=m.isrtlmode?c-m.rail.drag.sl:m.rail.drag.sl-c,m.ishwscroll&&g.bouncescroll?u<0?u=Math.round(u/2):u>m.page.maxw&&(u=m.page.maxw+Math.round((u-m.page.maxw)/2)):(u<0&&(u=0,a=0),u>m.page.maxw&&(u=m.page.maxw,a=0))),!m.hasmoving){if(m.rail.drag.y===e.clientY&&m.rail.drag.x===e.clientX)return m.cancelEvent(e);var h=Math.abs(n),p=Math.abs(c),f=g.directionlockdeadzone;if(m.rail.drag.ck?"v"==m.rail.drag.ck?p>f&&h<=M?m.rail.drag=!1:h>f&&(m.rail.drag.dl="v"):"h"==m.rail.drag.ck&&(h>f&&p<=M?m.rail.drag=!1:p>f&&(m.rail.drag.dl="h")):h>f&&p>f?m.rail.drag.dl="f":h>f?m.rail.drag.dl=p>M?"f":"v":p>f&&(m.rail.drag.dl=h>M?"f":"h"),!m.rail.drag.dl)return m.cancelEvent(e);g.horizrailenabled?m.triggerScrollStart(e.clientX,e.clientY,0,0,0):m.triggerScrollStart(0,e.clientY,0,0,0),m.hasmoving=!0}return m.preventclick&&!m.preventclick.click&&(m.preventclick.click=m.preventclick.tg.onclick||!1,m.preventclick.tg.onclick=m.onpreventclick),m.rail.drag.dl&&("v"==m.rail.drag.dl?u=m.rail.drag.sl:"h"==m.rail.drag.dl&&(d=m.rail.drag.st)),m.synched("touchmove",function(){m.rail.drag&&2==m.rail.drag.pt&&(m.prepareTransition&&m.resetTransition(),m.rail.scrollable&&m.setScrollTop(d),m.scrollmom.update(a,s),m.railh&&m.railh.scrollable?(m.setScrollLeft(u),m.showCursor(d,u)):m.showCursor(d),T.isie10&&l.selection.clear())}),m.cancelEvent(e)}return 1==m.rail.drag.pt?m.onmousemove(e):void 0},m.ontouchstartCursor=function(e,o){if(!m.rail.drag||3==m.rail.drag.pt){if(m.locked)return m.cancelEvent(e);m.cancelScroll(),g.horizrailenabled?m.rail.drag={x:e.touches[0].clientX,y:e.touches[0].clientY,sx:m.scroll.x,sy:m.scroll.y,pt:3,hr:!!o}:m.rail.drag={x:0,y:e.touches[0].clientY,sx:0,sy:m.scroll.y,pt:3,hr:!!o};var t=m.getTarget(e);return!m.ispage&&T.hasmousecapture&&t.setCapture(),m.isiframe&&!T.hasmousecapture&&(m.saved.csspointerevents=m.doc.css("pointer-events"),m.css(m.doc,{"pointer-events":"none"})),m.cancelEvent(e)}},m.ontouchendCursor=function(e){if(m.rail.drag){if(T.hasmousecapture&&l.releaseCapture(),m.isiframe&&!T.hasmousecapture&&m.doc.css("pointer-events",m.saved.csspointerevents),3!=m.rail.drag.pt)return;return m.rail.drag=!1,m.cancelEvent(e)}},m.ontouchmoveCursor=function(e){if(m.rail.drag){if(3!=m.rail.drag.pt)return;if(m.cursorfreezed=!0,m.rail.drag.hr){if(g.horizrailenabled){m.scroll.x=m.rail.drag.sx+(e.touches[0].clientX-m.rail.drag.x),m.scroll.x<0&&(m.scroll.x=0);var o=m.scrollvaluemaxw;m.scroll.x>o&&(m.scroll.x=o)}}else{m.scroll.y=m.rail.drag.sy+(e.touches[0].clientY-m.rail.drag.y),m.scroll.y<0&&(m.scroll.y=0);var t=m.scrollvaluemax;m.scroll.y>t&&(m.scroll.y=t)}return m.synched("touchmove",function(){m.rail.drag&&3==m.rail.drag.pt&&(m.showCursor(),m.rail.drag.hr?m.doScrollLeft(Math.round(m.scroll.x*m.scrollratio.x),g.cursordragspeed):m.doScrollTop(Math.round(m.scroll.y*m.scrollratio.y),g.cursordragspeed))}),m.cancelEvent(e)}}}if(m.onmousedown=function(e,o){if(!m.rail.drag||1==m.rail.drag.pt){if(m.railslocked)return m.cancelEvent(e);m.cancelScroll(),g.horizrailenabled?m.rail.drag={x:e.clientX,y:e.clientY,sx:m.scroll.x,sy:m.scroll.y,pt:1,hr:o||!1}:m.rail.drag={x:0,y:e.clientY,sx:0,sy:m.scroll.y,pt:1,hr:o||!1};var t=m.getTarget(e);return T.hasmousecapture&&t.setCapture(),m.isiframe&&!T.hasmousecapture&&(m.saved.csspointerevents=m.doc.css("pointer-events"),m.css(m.doc,{"pointer-events":"none"})),m.hasmoving=!1,m.cancelEvent(e)}},m.onmouseup=function(e){if(m.rail.drag)return 1!=m.rail.drag.pt||(T.hasmousecapture&&l.releaseCapture(),m.isiframe&&!T.hasmousecapture&&m.doc.css("pointer-events",m.saved.csspointerevents),m.rail.drag=!1,m.cursorfreezed=!1,m.hasmoving&&m.triggerScrollEnd(),m.cancelEvent(e))},m.onmousemove=function(e){if(m.rail.drag){if(1!==m.rail.drag.pt)return;if(T.ischrome&&0===e.which)return m.onmouseup(e);if(m.cursorfreezed=!0,g.horizrailenabled?m.hasmoving||m.triggerScrollStart(e.clientX,e.clientY,0,0,0):m.hasmoving||m.triggerScrollStart(0,e.clientY,0,0,0),m.hasmoving=!0,m.rail.drag.hr){if(g.horizrailenabled){m.scroll.x=m.rail.drag.sx+(e.clientX-m.rail.drag.x),m.scroll.x<0&&(m.scroll.x=0);var o=m.scrollvaluemaxw;m.scroll.x>o&&(m.scroll.x=o)}}else{m.scroll.y=m.rail.drag.sy+(e.clientY-m.rail.drag.y),m.scroll.y<0&&(m.scroll.y=0);var t=m.scrollvaluemax;m.scroll.y>t&&(m.scroll.y=t)}return m.synched("mousemove",function(){m.cursorfreezed&&(m.showCursor(),m.rail.drag.hr?m.scrollLeft(Math.round(m.scroll.x*m.scrollratio.x)):m.scrollTop(Math.round(m.scroll.y*m.scrollratio.y)))}),m.cancelEvent(e)}m.checkarea=0},T.cantouch||g.emulatetouch)m.onpreventclick=function(e){if(m.preventclick)return m.preventclick.tg.onclick=m.preventclick.click,m.preventclick=!1,m.cancelEvent(e)},m.onclick=!T.isios&&function(e){return!m.lastmouseup||(m.lastmouseup=!1,m.cancelEvent(e))},g.grabcursorenabled&&T.cursorgrabvalue&&(m.css(m.ispage?m.doc:m.win,{cursor:T.cursorgrabvalue}),m.css(m.rail,{cursor:T.cursorgrabvalue}));else{var L=function(e){if(m.selectiondrag){if(e){var o=m.win.outerHeight(),t=e.pageY-m.selectiondrag.top;t>0&&t=o&&(t-=o),m.selectiondrag.df=t}if(0!==m.selectiondrag.df){var r=-2*m.selectiondrag.df/6|0;m.doScrollBy(r),m.debounced("doselectionscroll",function(){L()},50)}}};m.hasTextSelected="getSelection"in l?function(){return l.getSelection().rangeCount>0}:"selection"in l?function(){return"None"!=l.selection.type}:function(){return!1},m.onselectionstart=function(e){m.ispage||(m.selectiondrag=m.win.offset())},m.onselectionend=function(e){m.selectiondrag=!1},m.onselectiondrag=function(e){m.selectiondrag&&m.hasTextSelected()&&m.debounced("selectionscroll",function(){L(e)},250)}}if(T.hasw3ctouch?(m.css(m.ispage?n("html"):m.win,{"touch-action":"none"}),m.css(m.rail,{"touch-action":"none"}),m.css(m.cursor,{"touch-action":"none"}),m.bind(m.win,"pointerdown",m.ontouchstart),m.bind(l,"pointerup",m.ontouchend),m.delegate(l,"pointermove",m.ontouchmove)):T.hasmstouch?(m.css(m.ispage?n("html"):m.win,{"-ms-touch-action":"none"}),m.css(m.rail,{"-ms-touch-action":"none"}),m.css(m.cursor,{"-ms-touch-action":"none"}),m.bind(m.win,"MSPointerDown",m.ontouchstart),m.bind(l,"MSPointerUp",m.ontouchend),m.delegate(l,"MSPointerMove",m.ontouchmove),m.bind(m.cursor,"MSGestureHold",function(e){e.preventDefault()}),m.bind(m.cursor,"contextmenu",function(e){e.preventDefault()})):T.cantouch&&(m.bind(m.win,"touchstart",m.ontouchstart,!1,!0),m.bind(l,"touchend",m.ontouchend,!1,!0),m.bind(l,"touchcancel",m.ontouchend,!1,!0),m.delegate(l,"touchmove",m.ontouchmove,!1,!0)),g.emulatetouch&&(m.bind(m.win,"mousedown",m.ontouchstart,!1,!0),m.bind(l,"mouseup",m.ontouchend,!1,!0),m.bind(l,"mousemove",m.ontouchmove,!1,!0)),(g.cursordragontouch||!T.cantouch&&!g.emulatetouch)&&(m.rail.css({cursor:"default"}),m.railh&&m.railh.css({cursor:"default"}),m.jqbind(m.rail,"mouseenter",function(){if(!m.ispage&&!m.win.is(":visible"))return!1;m.canshowonmouseevent&&m.showCursor(),m.rail.active=!0}),m.jqbind(m.rail,"mouseleave",function(){m.rail.active=!1,m.rail.drag||m.hideCursor()}),g.sensitiverail&&(m.bind(m.rail,"click",function(e){m.doRailClick(e,!1,!1)}),m.bind(m.rail,"dblclick",function(e){m.doRailClick(e,!0,!1)}),m.bind(m.cursor,"click",function(e){m.cancelEvent(e)}),m.bind(m.cursor,"dblclick",function(e){m.cancelEvent(e)})),m.railh&&(m.jqbind(m.railh,"mouseenter",function(){if(!m.ispage&&!m.win.is(":visible"))return!1;m.canshowonmouseevent&&m.showCursor(),m.rail.active=!0}),m.jqbind(m.railh,"mouseleave",function(){m.rail.active=!1,m.rail.drag||m.hideCursor()}),g.sensitiverail&&(m.bind(m.railh,"click",function(e){m.doRailClick(e,!1,!0)}),m.bind(m.railh,"dblclick",function(e){m.doRailClick(e,!0,!0)}),m.bind(m.cursorh,"click",function(e){m.cancelEvent(e)}),m.bind(m.cursorh,"dblclick",function(e){m.cancelEvent(e)})))),g.cursordragontouch&&(this.istouchcapable||T.cantouch)&&(m.bind(m.cursor,"touchstart",m.ontouchstartCursor),m.bind(m.cursor,"touchmove",m.ontouchmoveCursor),m.bind(m.cursor,"touchend",m.ontouchendCursor),m.cursorh&&m.bind(m.cursorh,"touchstart",function(e){m.ontouchstartCursor(e,!0)}),m.cursorh&&m.bind(m.cursorh,"touchmove",m.ontouchmoveCursor),m.cursorh&&m.bind(m.cursorh,"touchend",m.ontouchendCursor)),g.emulatetouch||T.isandroid||T.isios?(m.bind(T.hasmousecapture?m.win:l,"mouseup",m.ontouchend),m.onclick&&m.bind(l,"click",m.onclick),g.cursordragontouch?(m.bind(m.cursor,"mousedown",m.onmousedown),m.bind(m.cursor,"mouseup",m.onmouseup),m.cursorh&&m.bind(m.cursorh,"mousedown",function(e){m.onmousedown(e,!0)}),m.cursorh&&m.bind(m.cursorh,"mouseup",m.onmouseup)):(m.bind(m.rail,"mousedown",function(e){e.preventDefault()}),m.railh&&m.bind(m.railh,"mousedown",function(e){e.preventDefault()}))):(m.bind(T.hasmousecapture?m.win:l,"mouseup",m.onmouseup),m.bind(l,"mousemove",m.onmousemove),m.onclick&&m.bind(l,"click",m.onclick),m.bind(m.cursor,"mousedown",m.onmousedown),m.bind(m.cursor,"mouseup",m.onmouseup),m.railh&&(m.bind(m.cursorh,"mousedown",function(e){m.onmousedown(e,!0)}),m.bind(m.cursorh,"mouseup",m.onmouseup)),!m.ispage&&g.enablescrollonselection&&(m.bind(m.win[0],"mousedown",m.onselectionstart),m.bind(l,"mouseup",m.onselectionend),m.bind(m.cursor,"mouseup",m.onselectionend),m.cursorh&&m.bind(m.cursorh,"mouseup",m.onselectionend),m.bind(l,"mousemove",m.onselectiondrag)),m.zoom&&(m.jqbind(m.zoom,"mouseenter",function(){m.canshowonmouseevent&&m.showCursor(),m.rail.active=!0}),m.jqbind(m.zoom,"mouseleave",function(){m.rail.active=!1,m.rail.drag||m.hideCursor()}))),g.enablemousewheel&&(m.isiframe||m.mousewheel(T.isie&&m.ispage?l:m.win,m.onmousewheel),m.mousewheel(m.rail,m.onmousewheel),m.railh&&m.mousewheel(m.railh,m.onmousewheelhr)),m.ispage||T.cantouch||/HTML|^BODY/.test(m.win[0].nodeName)||(m.win.attr("tabindex")||m.win.attr({tabindex:++r}),m.bind(m.win,"focus",function(e){o=m.getTarget(e).id||m.getTarget(e)||!1,m.hasfocus=!0,m.canshowonmouseevent&&m.noticeCursor()}),m.bind(m.win,"blur",function(e){o=!1,m.hasfocus=!1}),m.bind(m.win,"mouseenter",function(e){t=m.getTarget(e).id||m.getTarget(e)||!1,m.hasmousefocus=!0,m.canshowonmouseevent&&m.noticeCursor()}),m.bind(m.win,"mouseleave",function(e){t=!1,m.hasmousefocus=!1,m.rail.drag||m.hideCursor()})),m.onkeypress=function(e){if(m.railslocked&&0===m.page.maxh)return!0;e=e||a.event;var r=m.getTarget(e);if(r&&/INPUT|TEXTAREA|SELECT|OPTION/.test(r.nodeName)&&(!(r.getAttribute("type")||r.type||!1)||!/submit|button|cancel/i.tp))return!0;if(n(r).attr("contenteditable"))return!0;if(m.hasfocus||m.hasmousefocus&&!o||m.ispage&&!o&&!t){var i=e.keyCode;if(m.railslocked&&27!=i)return m.cancelEvent(e);var s=e.ctrlKey||!1,l=e.shiftKey||!1,c=!1;switch(i){case 38:case 63233:m.doScrollBy(72),c=!0;break;case 40:case 63235:m.doScrollBy(-72),c=!0;break;case 37:case 63232:m.railh&&(s?m.doScrollLeft(0):m.doScrollLeftBy(72),c=!0);break;case 39:case 63234:m.railh&&(s?m.doScrollLeft(m.page.maxw):m.doScrollLeftBy(-72),c=!0);break;case 33:case 63276:m.doScrollBy(m.view.h),c=!0;break;case 34:case 63277:m.doScrollBy(-m.view.h),c=!0;break;case 36:case 63273:m.railh&&s?m.doScrollPos(0,0):m.doScrollTo(0),c=!0;break;case 35:case 63275:m.railh&&s?m.doScrollPos(m.page.maxw,m.page.maxh):m.doScrollTo(m.page.maxh),c=!0;break;case 32:g.spacebarenabled&&(l?m.doScrollBy(m.view.h):m.doScrollBy(-m.view.h),c=!0);break;case 27:m.zoomactive&&(m.doZoom(),c=!0)}if(c)return m.cancelEvent(e)}},g.enablekeyboard&&m.bind(l,T.isopera&&!T.isopera12?"keypress":"keydown",m.onkeypress),m.bind(l,"keydown",function(e){(e.ctrlKey||!1)&&(m.wheelprevented=!0)}),m.bind(l,"keyup",function(e){e.ctrlKey||!1||(m.wheelprevented=!1)}),m.bind(a,"blur",function(e){m.wheelprevented=!1}),m.bind(a,"resize",m.onscreenresize),m.bind(a,"orientationchange",m.onscreenresize),m.bind(a,"load",m.lazyResize),T.ischrome&&!m.ispage&&!m.haswrapper){var C=m.win.attr("style"),N=parseFloat(m.win.css("width"))+1;m.win.css("width",N),m.synched("chromefix",function(){m.win.attr("style",C)})}if(m.onAttributeChange=function(e){m.lazyResize(m.isieold?250:30)},g.enableobserver&&(m.isie11||!1===v||(m.observerbody=new v(function(e){if(e.forEach(function(e){if("attributes"==e.type)return f.hasClass("modal-open")&&f.hasClass("modal-dialog")&&!n.contains(n(".modal-dialog")[0],m.doc[0])?m.hide():m.show()}),m.me.clientWidth!=m.page.width||m.me.clientHeight!=m.page.height)return m.lazyResize(30)}),m.observerbody.observe(l.body,{childList:!0,subtree:!0,characterData:!1,attributes:!0,attributeFilter:["class"]})),!m.ispage&&!m.haswrapper)){var P=m.win[0];!1!==v?(m.observer=new v(function(e){e.forEach(m.onAttributeChange)}),m.observer.observe(P,{childList:!0,characterData:!1,attributes:!0,subtree:!1}),m.observerremover=new v(function(e){e.forEach(function(e){if(e.removedNodes.length>0)for(var o in e.removedNodes)if(m&&e.removedNodes[o]===P)return m.remove()})}),m.observerremover.observe(P.parentNode,{childList:!0,characterData:!1,attributes:!1,subtree:!1})):(m.bind(P,T.isie&&!T.isie9?"propertychange":"DOMAttrModified",m.onAttributeChange),T.isie9&&P.attachEvent("onpropertychange",m.onAttributeChange),m.bind(P,"DOMNodeRemoved",function(e){e.target===P&&m.remove()}))}!m.ispage&&g.boxzoom&&m.bind(a,"resize",m.resizeZoom),m.istextarea&&(m.bind(m.win,"keydown",m.lazyResize),m.bind(m.win,"mouseup",m.lazyResize)),m.lazyResize(30)}if("IFRAME"==this.doc[0].nodeName){var R=function(){var o;m.iframexd=!1;try{(o="contentDocument"in this?this.contentDocument:this.contentWindow._doc).domain}catch(e){m.iframexd=!0,o=!1}if(m.iframexd)return"console"in a&&console.log("NiceScroll error: policy restriced iframe"),!0;if(m.forcescreen=!0,m.isiframe&&(m.iframe={doc:n(o),html:m.doc.contents().find("html")[0],body:m.doc.contents().find("body")[0]},m.getContentSize=function(){return{w:Math.max(m.iframe.html.scrollWidth,m.iframe.body.scrollWidth),h:Math.max(m.iframe.html.scrollHeight,m.iframe.body.scrollHeight)}},m.docscroll=n(m.iframe.body)),!T.isios&&g.iframeautoresize&&!m.isiframe){m.win.scrollTop(0),m.doc.height("");var t=Math.max(o.getElementsByTagName("html")[0].scrollHeight,o.body.scrollHeight);m.doc.height(t)}m.lazyResize(30),m.css(n(m.iframe.body),e),T.isios&&m.haswrapper&&m.css(n(o.body),{"-webkit-transform":"translate3d(0,0,0)"}),"contentWindow"in this?m.bind(this.contentWindow,"scroll",m.onscroll):m.bind(o,"scroll",m.onscroll),g.enablemousewheel&&m.mousewheel(o,m.onmousewheel),g.enablekeyboard&&m.bind(o,T.isopera?"keypress":"keydown",m.onkeypress),T.cantouch?(m.bind(o,"touchstart",m.ontouchstart),m.bind(o,"touchmove",m.ontouchmove)):g.emulatetouch&&(m.bind(o,"mousedown",m.ontouchstart),m.bind(o,"mousemove",function(e){return m.ontouchmove(e,!0)}),g.grabcursorenabled&&T.cursorgrabvalue&&m.css(n(o.body),{cursor:T.cursorgrabvalue})),m.bind(o,"mouseup",m.ontouchend),m.zoom&&(g.dblclickzoom&&m.bind(o,"dblclick",m.doZoom),m.ongesturezoom&&m.bind(o,"gestureend",m.ongesturezoom))};this.doc[0].readyState&&"complete"===this.doc[0].readyState&&setTimeout(function(){R.call(m.doc[0],!1)},500),m.bind(this.doc,"load",R)}},this.showCursor=function(e,o){if(m.cursortimeout&&(clearTimeout(m.cursortimeout),m.cursortimeout=0),m.rail){if(m.autohidedom&&(m.autohidedom.stop().css({opacity:g.cursoropacitymax}),m.cursoractive=!0),m.rail.drag&&1==m.rail.drag.pt||(void 0!==e&&!1!==e&&(m.scroll.y=e/m.scrollratio.y|0),void 0!==o&&(m.scroll.x=o/m.scrollratio.x|0)),m.cursor.css({height:m.cursorheight,top:m.scroll.y}),m.cursorh){var t=m.hasreversehr?m.scrollvaluemaxw-m.scroll.x:m.scroll.x;m.cursorh.css({width:m.cursorwidth,left:!m.rail.align&&m.rail.visibility?t+m.rail.width:t}),m.cursoractive=!0}m.zoom&&m.zoom.stop().css({opacity:g.cursoropacitymax})}},this.hideCursor=function(e){m.cursortimeout||m.rail&&m.autohidedom&&(m.hasmousefocus&&"leave"===g.autohidemode||(m.cursortimeout=setTimeout(function(){m.rail.active&&m.showonmouseevent||(m.autohidedom.stop().animate({opacity:g.cursoropacitymin}),m.zoom&&m.zoom.stop().animate({opacity:g.cursoropacitymin}),m.cursoractive=!1),m.cursortimeout=0},e||g.hidecursordelay)))},this.noticeCursor=function(e,o,t){m.showCursor(o,t),m.rail.active||m.hideCursor(e)},this.getContentSize=m.ispage?function(){return{w:Math.max(l.body.scrollWidth,l.documentElement.scrollWidth),h:Math.max(l.body.scrollHeight,l.documentElement.scrollHeight)}}:m.haswrapper?function(){return{w:m.doc[0].offsetWidth,h:m.doc[0].offsetHeight}}:function(){return{w:m.docscroll[0].scrollWidth,h:m.docscroll[0].scrollHeight}},this.onResize=function(e,o){if(!m||!m.win)return!1;var t=m.page.maxh,r=m.page.maxw,i=m.view.h,s=m.view.w;if(m.view={w:m.ispage?m.win.width():m.win[0].clientWidth,h:m.ispage?m.win.height():m.win[0].clientHeight},m.page=o||m.getContentSize(),m.page.maxh=Math.max(0,m.page.h-m.view.h),m.page.maxw=Math.max(0,m.page.w-m.view.w),m.page.maxh==t&&m.page.maxw==r&&m.view.w==s&&m.view.h==i){if(m.ispage)return m;var n=m.win.offset();if(m.lastposition){var l=m.lastposition;if(l.top==n.top&&l.left==n.left)return m}m.lastposition=n}return 0===m.page.maxh?(m.hideRail(),m.scrollvaluemax=0,m.scroll.y=0,m.scrollratio.y=0,m.cursorheight=0,m.setScrollTop(0),m.rail&&(m.rail.scrollable=!1)):(m.page.maxh-=g.railpadding.top+g.railpadding.bottom,m.rail.scrollable=!0),0===m.page.maxw?(m.hideRailHr(),m.scrollvaluemaxw=0,m.scroll.x=0,m.scrollratio.x=0,m.cursorwidth=0,m.setScrollLeft(0),m.railh&&(m.railh.scrollable=!1)):(m.page.maxw-=g.railpadding.left+g.railpadding.right,m.railh&&(m.railh.scrollable=g.horizrailenabled)),m.railslocked=m.locked||0===m.page.maxh&&0===m.page.maxw,m.railslocked?(m.ispage||m.updateScrollBar(m.view),!1):(m.hidden||(m.rail.visibility||m.showRail(),m.railh&&!m.railh.visibility&&m.showRailHr()),m.istextarea&&m.win.css("resize")&&"none"!=m.win.css("resize")&&(m.view.h-=20),m.cursorheight=Math.min(m.view.h,Math.round(m.view.h*(m.view.h/m.page.h))),m.cursorheight=g.cursorfixedheight?g.cursorfixedheight:Math.max(g.cursorminheight,m.cursorheight),m.cursorwidth=Math.min(m.view.w,Math.round(m.view.w*(m.view.w/m.page.w))),m.cursorwidth=g.cursorfixedheight?g.cursorfixedheight:Math.max(g.cursorminheight,m.cursorwidth),m.scrollvaluemax=m.view.h-m.cursorheight-(g.railpadding.top+g.railpadding.bottom),m.hasborderbox||(m.scrollvaluemax-=m.cursor[0].offsetHeight-m.cursor[0].clientHeight),m.railh&&(m.railh.width=m.page.maxh>0?m.rail.width:m.view.w,m.scrollvaluemaxw=m.railh.width-m.cursorwidth-(g.railpadding.left+g.railpadding.right)),m.ispage||m.updateScrollBar(m.view),m.scrollratio={x:m.page.maxw/m.scrollvaluemaxw,y:m.page.maxh/m.scrollvaluemax},m.getScrollTop()>m.page.maxh?m.doScrollTop(m.page.maxh):(m.scroll.y=m.getScrollTop()/m.scrollratio.y|0,m.scroll.x=m.getScrollLeft()/m.scrollratio.x|0,m.cursoractive&&m.noticeCursor()),m.scroll.y&&0===m.getScrollTop()&&m.doScrollTo(m.scroll.y*m.scrollratio.y|0),m)},this.resize=m.onResize;var P=0;function R(e,o,t,r){m._bind(e,o,function(r){var i={original:r=r||a.event,target:r.target||r.srcElement,type:"wheel",deltaMode:"MozMousePixelScroll"==r.type?0:1,deltaX:0,deltaZ:0,preventDefault:function(){return r.preventDefault?r.preventDefault():r.returnValue=!1,!1},stopImmediatePropagation:function(){r.stopImmediatePropagation?r.stopImmediatePropagation():r.cancelBubble=!0}};return"mousewheel"==o?(r.wheelDeltaX&&(i.deltaX=-.025*r.wheelDeltaX),r.wheelDeltaY&&(i.deltaY=-.025*r.wheelDeltaY),!i.deltaY&&!i.deltaX&&(i.deltaY=-.025*r.wheelDelta)):i.deltaY=r.detail,t.call(e,i)},r)}this.onscreenresize=function(e){clearTimeout(P);var o=!m.ispage&&!m.haswrapper;o&&m.hideRails(),P=setTimeout(function(){m&&(o&&m.showRails(),m.resize()),P=0},120)},this.lazyResize=function(e){return clearTimeout(P),e=isNaN(e)?240:e,P=setTimeout(function(){m&&m.resize(),P=0},e),m},this.jqbind=function(e,o,t){m.events.push({e:e,n:o,f:t,q:!0}),n(e).on(o,t)},this.mousewheel=function(e,o,t){var r="jquery"in e?e[0]:e;if("onwheel"in l.createElement("div"))m._bind(r,"wheel",o,t||!1);else{var i=void 0!==l.onmousewheel?"mousewheel":"DOMMouseScroll";R(r,i,o,t||!1),"DOMMouseScroll"==i&&R(r,"MozMousePixelScroll",o,t||!1)}};var Y=!1;if(T.haseventlistener){try{var _=Object.defineProperty({},"passive",{get:function(){Y=!0}});a.addEventListener("test",null,_)}catch(e){}this.stopPropagation=function(e){return!!e&&((e=e.original?e.original:e).stopPropagation(),!1)},this.cancelEvent=function(e){return e.cancelable&&e.preventDefault(),e.stopImmediatePropagation(),e.preventManipulation&&e.preventManipulation(),!1}}else Event.prototype.preventDefault=function(){this.returnValue=!1},Event.prototype.stopPropagation=function(){this.cancelBubble=!0},a.constructor.prototype.addEventListener=l.constructor.prototype.addEventListener=Element.prototype.addEventListener=function(e,o,t){this.attachEvent("on"+e,o)},a.constructor.prototype.removeEventListener=l.constructor.prototype.removeEventListener=Element.prototype.removeEventListener=function(e,o,t){this.detachEvent("on"+e,o)},this.cancelEvent=function(e){return(e=e||a.event)&&(e.cancelBubble=!0,e.cancel=!0,e.returnValue=!1),!1},this.stopPropagation=function(e){return(e=e||a.event)&&(e.cancelBubble=!0),!1};this.delegate=function(e,o,t,r,i){var s=d[o]||!1;s||(s={a:[],l:[],f:function(e){for(var o=s.l,t=!1,r=o.length-1;r>=0;r--)if(!1===(t=o[r].call(e.target,e)))return!1;return t}},m.bind(e,o,s.f,r,i),d[o]=s),m.ispage?(s.a=[m.id].concat(s.a),s.l=[t].concat(s.l)):(s.a.push(m.id),s.l.push(t))},this.undelegate=function(e,o,t,r,i){var s=d[o]||!1;if(s&&s.l)for(var n=0,l=s.l.length;n0)return t;o=!!o.parentNode&&o.parentNode}return!1},this.triggerScrollStart=function(e,o,t,r,i){if(m.onscrollstart){var s={type:"scrollstart",current:{x:e,y:o},request:{x:t,y:r},end:{x:m.newscrollx,y:m.newscrolly},speed:i};m.onscrollstart.call(m,s)}},this.triggerScrollEnd=function(){if(m.onscrollend){var e=m.getScrollLeft(),o=m.getScrollTop(),t={type:"scrollend",current:{x:e,y:o},end:{x:e,y:o}};m.onscrollend.call(m,t)}};var I=0,O=0,H=0,B=1;function X(e,o,t,r){m.scrollrunning||(m.newscrolly=m.getScrollTop(),m.newscrollx=m.getScrollLeft(),H=w());var i=w()-H;if(H=w(),i>350?B=1:B+=(2-B)/10,o=o*B|0,e=e*B|0){if(r)if(e<0){if(m.getScrollLeft()>=m.page.maxw)return!0}else if(m.getScrollLeft()<=0)return!0;var s=e>0?1:-1;O!==s&&(m.scrollmom&&m.scrollmom.stop(),m.newscrollx=m.getScrollLeft(),O=s),m.lastdeltax-=e}if(o){if(function(){var e=m.getScrollTop();if(o<0){if(e>=m.page.maxh)return!0}else if(e<=0)return!0}()){if(g.nativeparentscrolling&&t&&!m.ispage&&!m.zoomactive)return!0;var n=m.view.h>>1;m.newscrolly<-n?(m.newscrolly=-n,o=-1):m.newscrolly>m.page.maxh+n?(m.newscrolly=m.page.maxh+n,o=1):o=0}var l=o>0?1:-1;I!==l&&(m.scrollmom&&m.scrollmom.stop(),m.newscrolly=m.getScrollTop(),I=l),m.lastdeltay-=o}(o||e)&&m.synched("relativexy",function(){var e=m.lastdeltay+m.newscrolly;m.lastdeltay=0;var o=m.lastdeltax+m.newscrollx;m.lastdeltax=0,m.rail.drag||m.doScrollPos(o,e)})}var D=!1;function A(e,o,t){var r,i;if(!t&&D)return!0;(0===e.deltaMode?(r=-e.deltaX*(g.mousescrollstep/54)|0,i=-e.deltaY*(g.mousescrollstep/54)|0):1===e.deltaMode&&(r=-e.deltaX*g.mousescrollstep*50/80|0,i=-e.deltaY*g.mousescrollstep*50/80|0),o&&g.oneaxismousemode&&0===r&&i)&&(r=i,i=0,t&&(r<0?m.getScrollLeft()>=m.page.maxw:m.getScrollLeft()<=0)&&(i=r,r=0));if(m.isrtlmode&&(r=-r),!X(r,i,t,!0))return D=!1,e.stopImmediatePropagation(),e.preventDefault();t&&(D=!0)}if(this.onmousewheel=function(e){if(m.wheelprevented||m.locked)return!1;if(m.railslocked)return m.debounced("checkunlock",m.resize,250),!1;if(m.rail.drag)return m.cancelEvent(e);if("auto"===g.oneaxismousemode&&0!==e.deltaX&&(g.oneaxismousemode=!1),g.oneaxismousemode&&0===e.deltaX&&!m.rail.scrollable)return!m.railh||!m.railh.scrollable||m.onmousewheelhr(e);var o=w(),t=!1;if(g.preservenativescrolling&&m.checkarea+600m.page.maxh&&(o=m.page.maxh+(o-m.page.maxh)/2|0),e<0?e=e/2|0:e>m.page.maxw&&(e=m.page.maxw+(e-m.page.maxw)/2|0)):(o<0?o=0:o>m.page.maxh&&(o=m.page.maxh),e<0?e=0:e>m.page.maxw&&(e=m.page.maxw)),m.scrollrunning&&e==m.newscrollx&&o==m.newscrolly)return!1;m.newscrolly=o,m.newscrollx=e;var s=m.getScrollTop(),n=m.getScrollLeft(),l={};l.x=e-n,l.y=o-s;var a=0|Math.sqrt(l.x*l.x+l.y*l.y),c=m.prepareTransition(a);m.scrollrunning||(m.scrollrunning=!0,m.triggerScrollStart(n,s,e,o,c),m.cursorupdate.start()),m.scrollendtrapped=!0,T.transitionend||(m.scrollendtrapped&&clearTimeout(m.scrollendtrapped),m.scrollendtrapped=setTimeout(m.onScrollTransitionEnd,c)),m.setScrollTop(m.newscrolly),m.setScrollLeft(m.newscrollx)},this.cancelScroll=function(){if(!m.scrollendtrapped)return!0;var e=m.getScrollTop(),o=m.getScrollLeft();return m.scrollrunning=!1,T.transitionend||clearTimeout(T.transitionend),m.scrollendtrapped=!1,m.resetTransition(),m.setScrollTop(e),m.railh&&m.setScrollLeft(o),m.timerscroll&&m.timerscroll.tm&&clearInterval(m.timerscroll.tm),m.timerscroll=!1,m.cursorfreezed=!1,m.cursorupdate.stop(),m.showCursor(e,o),m},this.onScrollTransitionEnd=function(){if(m.scrollendtrapped){var e=m.getScrollTop(),o=m.getScrollLeft();if(e<0?e=0:e>m.page.maxh&&(e=m.page.maxh),o<0?o=0:o>m.page.maxw&&(o=m.page.maxw),e!=m.newscrolly||o!=m.newscrollx)return m.doScrollPos(o,e,g.snapbackspeed);m.scrollrunning&&m.triggerScrollEnd(),m.scrollrunning=!1,m.scrollendtrapped=!1,m.resetTransition(),m.timerscroll=!1,m.setScrollTop(e),m.railh&&m.setScrollLeft(o),m.cursorupdate.stop(),m.noticeCursor(!1,e,o),m.cursorfreezed=!1}}}else this.doScrollLeft=function(e,o){var t=m.scrollrunning?m.newscrolly:m.getScrollTop();m.doScrollPos(e,t,o)},this.doScrollTop=function(e,o){var t=m.scrollrunning?m.newscrollx:m.getScrollLeft();m.doScrollPos(t,e,o)},this.doScrollPos=function(e,o,t){var r=m.getScrollTop(),i=m.getScrollLeft();((m.newscrolly-r)*(o-r)<0||(m.newscrollx-i)*(e-i)<0)&&m.cancelScroll();var s=!1;if(m.bouncescroll&&m.rail.visibility||(o<0?(o=0,s=!0):o>m.page.maxh&&(o=m.page.maxh,s=!0)),m.bouncescroll&&m.railh.visibility||(e<0?(e=0,s=!0):e>m.page.maxw&&(e=m.page.maxw,s=!0)),m.scrollrunning&&m.newscrolly===o&&m.newscrollx===e)return!0;m.newscrolly=o,m.newscrollx=e,m.dst={},m.dst.x=e-i,m.dst.y=o-r,m.dst.px=i,m.dst.py=r;var n=0|Math.sqrt(m.dst.x*m.dst.x+m.dst.y*m.dst.y),l=m.getTransitionSpeed(n);m.bzscroll={};var a=s?1:.58;m.bzscroll.x=new E(i,m.newscrollx,l,0,0,a,1),m.bzscroll.y=new E(r,m.newscrolly,l,0,0,a,1);w();var c=function(){if(m.scrollrunning){var e=m.bzscroll.y.getPos();m.setScrollLeft(m.bzscroll.x.getNow()),m.setScrollTop(m.bzscroll.y.getNow()),e<=1?m.timer=u(c):(m.scrollrunning=!1,m.timer=0,m.triggerScrollEnd())}};m.scrollrunning||(m.triggerScrollStart(i,r,e,o,l),m.scrollrunning=!0,m.timer=u(c))},this.cancelScroll=function(){return m.timer&&h(m.timer),m.timer=0,m.bzscroll=!1,m.scrollrunning=!1,m};else this.doScrollLeft=function(e,o){var t=m.getScrollTop();m.doScrollPos(e,t,o)},this.doScrollTop=function(e,o){var t=m.getScrollLeft();m.doScrollPos(t,e,o)},this.doScrollPos=function(e,o,t){var r=e>m.page.maxw?m.page.maxw:e;r<0&&(r=0);var i=o>m.page.maxh?m.page.maxh:o;i<0&&(i=0),m.synched("scroll",function(){m.setScrollTop(i),m.setScrollLeft(r)})},this.cancelScroll=function(){};this.doScrollBy=function(e,o){X(0,e)},this.doScrollLeftBy=function(e,o){X(e,0)},this.doScrollTo=function(e,o){var t=o?Math.round(e*m.scrollratio.y):e;t<0?t=0:t>m.page.maxh&&(t=m.page.maxh),m.cursorfreezed=!1,m.doScrollTop(e)},this.checkContentSize=function(){var e=m.getContentSize();e.h==m.page.h&&e.w==m.page.w||m.resize(!1,e)},m.onscroll=function(e){m.rail.drag||m.cursorfreezed||m.synched("scroll",function(){m.scroll.y=Math.round(m.getScrollTop()/m.scrollratio.y),m.railh&&(m.scroll.x=Math.round(m.getScrollLeft()/m.scrollratio.x)),m.noticeCursor()})},m.bind(m.docscroll,"scroll",m.onscroll),this.doZoomIn=function(e){if(!m.zoomactive){m.zoomactive=!0,m.zoomrestore={style:{}};var o=["position","top","left","zIndex","backgroundColor","marginTop","marginBottom","marginLeft","marginRight"],t=m.win[0].style;for(var r in o){var i=o[r];m.zoomrestore.style[i]=void 0!==t[i]?t[i]:""}m.zoomrestore.style.width=m.win.css("width"),m.zoomrestore.style.height=m.win.css("height"),m.zoomrestore.padding={w:m.win.outerWidth()-m.win.width(),h:m.win.outerHeight()-m.win.height()},T.isios4&&(m.zoomrestore.scrollTop=c.scrollTop(),c.scrollTop(0)),m.win.css({position:T.isios4?"absolute":"fixed",top:0,left:0,zIndex:s+100,margin:0});var n=m.win.css("backgroundColor");return(""===n||/transparent|rgba\(0, 0, 0, 0\)|rgba\(0,0,0,0\)/.test(n))&&m.win.css("backgroundColor","#fff"),m.rail.css({zIndex:s+101}),m.zoom.css({zIndex:s+102}),m.zoom.css("backgroundPosition","0 -18px"),m.resizeZoom(),m.onzoomin&&m.onzoomin.call(m),m.cancelEvent(e)}},this.doZoomOut=function(e){if(m.zoomactive)return m.zoomactive=!1,m.win.css("margin",""),m.win.css(m.zoomrestore.style),T.isios4&&c.scrollTop(m.zoomrestore.scrollTop),m.rail.css({"z-index":m.zindex}),m.zoom.css({"z-index":m.zindex}),m.zoomrestore=!1,m.zoom.css("backgroundPosition","0 0"),m.onResize(),m.onzoomout&&m.onzoomout.call(m),m.cancelEvent(e)},this.doZoom=function(e){return m.zoomactive?m.doZoomOut(e):m.doZoomIn(e)},this.resizeZoom=function(){if(m.zoomactive){var e=m.getScrollTop();m.win.css({width:c.width()-m.zoomrestore.padding.w+"px",height:c.height()-m.zoomrestore.padding.h+"px"}),m.onResize(),m.setScrollTop(Math.min(m.page.maxh,e))}},this.init(),n.nicescroll.push(this)},S=function(e){var o=this;this.nc=e,this.lastx=0,this.lasty=0,this.speedx=0,this.speedy=0,this.lasttime=0,this.steptime=0,this.snapx=!1,this.snapy=!1,this.demulx=0,this.demuly=0,this.lastscrollx=-1,this.lastscrolly=-1,this.chkx=0,this.chky=0,this.timer=0,this.reset=function(e,t){o.stop(),o.steptime=0,o.lasttime=w(),o.speedx=0,o.speedy=0,o.lastx=e,o.lasty=t,o.lastscrollx=-1,o.lastscrolly=-1},this.update=function(e,t){var r=w();o.steptime=r-o.lasttime,o.lasttime=r;var i=t-o.lasty,s=e-o.lastx,n=o.nc.getScrollTop()+i,l=o.nc.getScrollLeft()+s;o.snapx=l<0||l>o.nc.page.maxw,o.snapy=n<0||n>o.nc.page.maxh,o.speedx=s,o.speedy=i,o.lastx=e,o.lasty=t},this.stop=function(){o.nc.unsynched("domomentum2d"),o.timer&&clearTimeout(o.timer),o.timer=0,o.lastscrollx=-1,o.lastscrolly=-1},this.doSnapy=function(e,t){var r=!1;t<0?(t=0,r=!0):t>o.nc.page.maxh&&(t=o.nc.page.maxh,r=!0),e<0?(e=0,r=!0):e>o.nc.page.maxw&&(e=o.nc.page.maxw,r=!0),r?o.nc.doScrollPos(e,t,o.nc.opt.snapbackspeed):o.nc.triggerScrollEnd()},this.doMomentum=function(e){var t=w(),r=e?t+e:o.lasttime,i=o.nc.getScrollLeft(),s=o.nc.getScrollTop(),n=o.nc.page.maxh,l=o.nc.page.maxw;o.speedx=l>0?Math.min(60,o.speedx):0,o.speedy=n>0?Math.min(60,o.speedy):0;var a=r&&t-r<=60;(s<0||s>n||i<0||i>l)&&(a=!1);var c=!(!o.speedy||!a)&&o.speedy,d=!(!o.speedx||!a)&&o.speedx;if(c||d){var u=Math.max(16,o.steptime);if(u>50){var h=u/50;o.speedx*=h,o.speedy*=h,u=50}o.demulxy=0,o.lastscrollx=o.nc.getScrollLeft(),o.chkx=o.lastscrollx,o.lastscrolly=o.nc.getScrollTop(),o.chky=o.lastscrolly;var p=o.lastscrollx,m=o.lastscrolly,f=function(){var e=w()-t>600?.04:.02;o.speedx&&(p=Math.floor(o.lastscrollx-o.speedx*(1-o.demulxy)),o.lastscrollx=p,(p<0||p>l)&&(e=.1)),o.speedy&&(m=Math.floor(o.lastscrolly-o.speedy*(1-o.demulxy)),o.lastscrolly=m,(m<0||m>n)&&(e=.1)),o.demulxy=Math.min(1,o.demulxy+e),o.nc.synched("domomentum2d",function(){if(o.speedx){o.nc.getScrollLeft();o.chkx=p,o.nc.setScrollLeft(p)}if(o.speedy){o.nc.getScrollTop();o.chky=m,o.nc.setScrollTop(m)}o.timer||(o.nc.hideCursor(),o.doSnapy(p,m))}),o.demulxy<1?o.timer=setTimeout(f,u):(o.stop(),o.nc.hideCursor(),o.doSnapy(p,m))};f()}else o.doSnapy(o.nc.getScrollLeft(),o.nc.getScrollTop())}},z=e.fn.scrollTop;e.cssHooks.pageYOffset={get:function(e,o,t){var r=n.data(e,"__nicescroll")||!1;return r&&r.ishwscroll?r.getScrollTop():z.call(e)},set:function(e,o){var t=n.data(e,"__nicescroll")||!1;return t&&t.ishwscroll?t.setScrollTop(parseInt(o)):z.call(e,o),this}},e.fn.scrollTop=function(e){if(void 0===e){var o=this[0]&&n.data(this[0],"__nicescroll")||!1;return o&&o.ishwscroll?o.getScrollTop():z.call(this)}return this.each(function(){var o=n.data(this,"__nicescroll")||!1;o&&o.ishwscroll?o.setScrollTop(parseInt(e)):z.call(n(this),e)})};var k=e.fn.scrollLeft;n.cssHooks.pageXOffset={get:function(e,o,t){var r=n.data(e,"__nicescroll")||!1;return r&&r.ishwscroll?r.getScrollLeft():k.call(e)},set:function(e,o){var t=n.data(e,"__nicescroll")||!1;return t&&t.ishwscroll?t.setScrollLeft(parseInt(o)):k.call(e,o),this}},e.fn.scrollLeft=function(e){if(void 0===e){var o=this[0]&&n.data(this[0],"__nicescroll")||!1;return o&&o.ishwscroll?o.getScrollLeft():k.call(this)}return this.each(function(){var o=n.data(this,"__nicescroll")||!1;o&&o.ishwscroll?o.setScrollLeft(parseInt(e)):k.call(n(this),e)})};var T=function(e){var o=this;if(this.length=0,this.name="nicescrollarray",this.each=function(e){return n.each(o,e),o},this.push=function(e){o[o.length]=e,o.length++},this.eq=function(e){return o[e]},e)for(var t=0;t1?n(e,r):s,i.win=r}!("doc"in i)||"win"in i||(i.win=r);var l=r.data("__nicescroll")||!1;l||(i.doc=i.doc||r,l=new x(i,r),r.data("__nicescroll",l)),t.push(l)}),1===t.length?t[0]:t},a.NiceScroll={getjQuery:function(){return e}},n.nicescroll||(n.nicescroll=new T,n.nicescroll.options=b)}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/legacy.js b/code/page/resources/scripts/axure/legacy.js new file mode 100644 index 0000000..a46148a --- /dev/null +++ b/code/page/resources/scripts/axure/legacy.js @@ -0,0 +1,166 @@ +//stored on each browser event +var windowEvent; + +$axure.internal(function($ax) { + var _legacy = {}; + $ax.legacy = _legacy; + + var Forms = window.document.getElementsByTagName("FORM"); + for(var i = 0; i < Forms.length; i++) { + var Form = Forms[i]; + Form.onclick = $ax.legacy.SuppressBubble; + } + + $ax.legacy.SuppressBubble = function(event) { + if(IE_10_AND_BELOW) { + window.event.cancelBubble = true; + window.event.returnValue = false; + } else { + if(event) { + event.stopPropagation(); + } + } + }; + + $ax.legacy.BringToFront = function(id, skipFixed) { + _bringToFrontHelper(id); + if(!skipFixed) $ax.legacy.BringFixedToFront(); + }; + + var _bringToFrontHelper = function(id) { + var target = window.document.getElementById(id); + if(target == null) return; + $ax.globals.MaxZIndex = $ax.globals.MaxZIndex + 1; + target.style.zIndex = $ax.globals.MaxZIndex; + }; + + $ax.legacy.BringFixedToFront = function() { + $ax(function(diagramObject) { return diagramObject.fixedKeepInFront; }).each(function(diagramObject, scriptId) { + _bringToFrontHelper(scriptId); + }); + }; + + $ax.legacy.SendToBack = function(id) { + var target = window.document.getElementById(id); + if(target == null) return; + target.style.zIndex = $ax.globals.MinZIndex = $ax.globals.MinZIndex - 1; + }; + + $ax.legacy.RefreshScreen = function() { + var oldColor = window.document.body.style.backgroundColor; + var setColor = (oldColor == "rgb(0,0,0)") ? "#FFFFFF" : "#000000"; + window.document.body.style.backgroundColor = setColor; + window.document.body.style.backgroundColor = oldColor; + }; + + $ax.legacy.getAbsoluteLeft = function(currentNode, elementId) { + var oldDisplay = currentNode.css('display'); + var displaySet = false; + if(oldDisplay == 'none') { + currentNode.css('display', ''); + displaySet = true; + } + var left = currentNode.offset().left; + + // Special Layer code + if($ax.getTypeFromElementId(elementId) == 'layer') { + var first = true; + var children = currentNode.children(); + for(var i = 0; i < children.length; i++) { + var child = $(children[i]); + var subDisplaySet = false; + if(child.css('display') == 'none') { + child.css('display', ''); + subDisplaySet = true; + } + if(first) left = child.offset().left; + else left = Math.min(child.offset().left, left); + first = false; + + if(subDisplaySet) child.css('display', 'none'); + } + } + + if (displaySet) currentNode.css('display', oldDisplay); + + return $axure.fn.bodyToWorld(left, true); + }; + + $ax.legacy.getAbsoluteTop = function(currentNode, elementId) { + var oldDisplay = currentNode.css('display'); + var displaySet = false; + if(oldDisplay == 'none') { + currentNode.css('display', ''); + displaySet = true; + } + var top = currentNode.offset().top; + + // Special Layer code + if ($ax.getTypeFromElementId(elementId) == 'layer') { + var first = true; + var children = currentNode.children(); + for (var i = 0; i < children.length; i++) { + var child = $(children[i]); + var subDisplaySet = false; + if (child.css('display') == 'none') { + child.css('display', ''); + subDisplaySet = true; + } + if (first) top = child.offset().top; + else top = Math.min(child.offset().top, top); + first = false; + + if (subDisplaySet) child.css('display', 'none'); + } + } + + if(displaySet) currentNode.css('display', oldDisplay); + return top; + }; + + // ****************** Annotation and Link Functions ****************** // + + $ax.legacy.GetAnnotationHtml = function(annJson) { + var retVal = ""; + for(var noteName in annJson) { + if(noteName != "label" && noteName != "id") { + retVal += "
      " + noteName + "
      "; + retVal += "
      " + linkify(annJson[noteName]) + "
      "; + } + } + return retVal; + + function linkify(text) { + var urlRegex = /(\b(((https?|ftp|file):\/\/)|(www\.))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; + return text.replace(urlRegex, function (url, b, c) { + var url2 = (c == 'www.') ? 'http://' + url : url; + return '' + url + ''; + }); + } + }; + + + $ax.legacy.GetScrollable = function(target) { + var $target = $(target); + var last = $target; + // Start past inital target. Can't scroll to target in itself, must be some ancestor. + var current = last.parent(); + + while(!current.is('body') && !current.is('html')) { + var elementId = current.attr('id'); + var diagramObject = elementId && $ax.getObjectFromElementId(elementId); + if (diagramObject && $ax.public.fn.IsDynamicPanel(diagramObject.type) && diagramObject.scrollbars != 'none') { + //returns the panel diagram div which handles scrolling + return $ax.dynamicPanelManager.getShownState(current.attr('id'))[0]; + } + last = current; + current = current.parent(); + } + // Need to do this because of ie + if(IE_10_AND_BELOW) return window.document.documentElement; + else return window.document.body; + }; + + + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/math.js b/code/page/resources/scripts/axure/math.js new file mode 100644 index 0000000..cf2f75d --- /dev/null +++ b/code/page/resources/scripts/axure/math.js @@ -0,0 +1,554 @@ +$axure.internal(function($ax) { + $ax.public.fn.matrixMultiply = function(matrix, vector) { + if(!matrix.tx) matrix.tx = 0; + if(!matrix.ty) matrix.ty = 0; + var outX = matrix.m11 * vector.x + matrix.m12 * vector.y + matrix.tx; + var outY = matrix.m21 * vector.x + matrix.m22 * vector.y + matrix.ty; + return { x: outX, y: outY }; + } + + $ax.public.fn.matrixInverse = function(matrix) { + if(!matrix.tx) matrix.tx = 0; + if(!matrix.ty) matrix.ty = 0; + + var determinant = matrix.m11*matrix.m22 - matrix.m12*matrix.m21; + //var threshold = (M11 * M11 + M22 *M22 + M12 *M12+ M21 *M21) / 100000; + //if(determinant.DeltaEquals(0, threshold) && determinant < 0.01) { + // return Invalid; + //} + return { + m11 : matrix.m22/determinant, + m12 : -matrix.m12/determinant, + tx : (matrix.ty*matrix.m12 - matrix.tx*matrix.m22)/determinant, + m21: -matrix.m21 / determinant, + m22: matrix.m11 / determinant, + ty: (matrix.tx * matrix.m21 - matrix.ty * matrix.m11) / determinant + }; + } + + + $ax.public.fn.matrixMultiplyMatrix = function (matrix1, matrix2) { + if (!matrix1.tx) matrix1.tx = 0; + if (!matrix1.ty) matrix1.ty = 0; + if (!matrix2.tx) matrix2.tx = 0; + if (!matrix2.ty) matrix2.ty = 0; + + return { + m11: matrix1.m12*matrix2.m21 + matrix1.m11*matrix2.m11, + m12: matrix1.m12*matrix2.m22 + matrix1.m11*matrix2.m12, + tx: matrix1.m12 * matrix2.ty + matrix1.m11 * matrix2.tx + matrix1.tx, + m21: matrix1.m22 * matrix2.m21 + matrix1.m21 * matrix2.m11, + m22: matrix1.m22 * matrix2.m22 + matrix1.m21 * matrix2.m12, + ty: matrix1.m22 * matrix2.ty + matrix1.m21 * matrix2.tx + matrix1.ty, + }; + } + + + $ax.public.fn.transformFromElement = function (element) { + var st = window.getComputedStyle(element, null); + + var tr = st.getPropertyValue("-webkit-transform") || + st.getPropertyValue("-moz-transform") || + st.getPropertyValue("-ms-transform") || + st.getPropertyValue("-o-transform") || + st.getPropertyValue("transform"); + + if (tr.indexOf('none') < 0) { + var matrix = tr.split('(')[1]; + matrix = matrix.split(')')[0]; + matrix = matrix.split(','); + for (var l = 0; l < matrix.length; l++) { + matrix[l] = Number(matrix[l]); + } + + } else { matrix = [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]; } + + return matrix; + // matrix[0] = cosine, matrix[1] = sine. + // Assuming the element is still orthogonal. + } + + $ax.public.fn.vectorMinus = function(vector1, vector2) { return { x: vector1.x - vector2.x, y: vector1.y - vector2.y }; } + + $ax.public.fn.vectorPlus = function (vector1, vector2) { return { x: vector1.x + vector2.x, y: vector1.y + vector2.y }; } + + $ax.public.fn.vectorMidpoint = function (vector1, vector2) { return { x: (vector1.x + vector2.x) / 2.0, y: (vector1.y + vector2.y) / 2.0 }; } + + $ax.public.fn.fourCornersToBasis = function (fourCorners) { + return { + widthVector: $ax.public.fn.vectorMinus(fourCorners.widgetTopRight, fourCorners.widgetTopLeft), + heightVector: $ax.public.fn.vectorMinus(fourCorners.widgetBottomLeft, fourCorners.widgetTopLeft) + }; + } + + $ax.public.fn.matrixString = function(m11, m21, m12, m22, tx, ty) { + return "Matrix(" + m11 + "," + m21 + "," + m12 + "," + m22 + ", " + tx + ", " + ty + ")"; + } + + //$ax.public.fn.getWidgetBoundingRect = function (widgetId) { + // var emptyRect = { left: 0, top: 0, centerPoint: { x: 0, y: 0 }, width: 0, height: 0 }; + // var element = document.getElementById(widgetId); + // if (!element) return emptyRect; + + // var object = $obj(widgetId); + // if (object && object.type && $ax.public.fn.IsLayer(object.type)) { + // var layerChildren = _getLayerChildrenDeep(widgetId); + // if (!layerChildren) return emptyRect; + // else return _getBoundingRectForMultipleWidgets(layerChildren); + // } + // return _getBoundingRectForSingleWidget(widgetId); + //}; + + var _getLayerChildrenDeep = $ax.public.fn.getLayerChildrenDeep = function (layerId, includeLayers, includeHidden) { + var deep = []; + var children = $ax('#' + layerId).getChildren()[0].children; + for (var index = 0; index < children.length; index++) { + var childId = children[index]; + if(!includeHidden && !$ax.visibility.IsIdVisible(childId)) continue; + if ($ax.public.fn.IsLayer($obj(childId).type)) { + if (includeLayers) deep.push(childId); + var recursiveChildren = _getLayerChildrenDeep(childId, includeLayers, includeHidden); + for (var j = 0; j < recursiveChildren.length; j++) deep.push(recursiveChildren[j]); + } else deep.push(childId); + } + return deep; + }; + + //var _getBoundingRectForMultipleWidgets = function (widgetsIdArray, relativeToPage) { + // if (!widgetsIdArray || widgetsIdArray.constructor !== Array) return undefined; + // if (widgetsIdArray.length == 0) return { left: 0, top: 0, centerPoint: { x: 0, y: 0 }, width: 0, height: 0 }; + // var widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[0], relativeToPage, true); + // var boundingRect = { left: widgetRect.left, right: widgetRect.right, top: widgetRect.top, bottom: widgetRect.bottom }; + + // for (var index = 1; index < widgetsIdArray.length; index++) { + // widgetRect = _getBoundingRectForSingleWidget(widgetsIdArray[index], relativeToPage); + // boundingRect.left = Math.min(boundingRect.left, widgetRect.left); + // boundingRect.top = Math.min(boundingRect.top, widgetRect.top); + // boundingRect.right = Math.max(boundingRect.right, widgetRect.right); + // boundingRect.bottom = Math.max(boundingRect.bottom, widgetRect.bottom); + // } + + // boundingRect.centerPoint = { x: (boundingRect.right + boundingRect.left) / 2.0, y: (boundingRect.bottom + boundingRect.top) / 2.0 }; + // boundingRect.width = boundingRect.right - boundingRect.left; + // boundingRect.height = boundingRect.bottom - boundingRect.top; + // return boundingRect; + //}; + + //var _getBoundingRectForSingleWidget = function (widgetId, relativeToPage, justSides) { + // var element = document.getElementById(widgetId); + // var boundingRect, tempBoundingRect, position; + // var displayChanged = _displayHackStart(element); + + // if (_isCompoundVectorHtml(element)) { + // //tempBoundingRect = _getCompoundImageBoundingClientSize(widgetId); + // //position = { left: tempBoundingRect.left, top: tempBoundingRect.top }; + // position = $(element).position(); + // tempBoundingRect = {}; + // tempBoundingRect.left = position.left; //= _getCompoundImageBoundingClientSize(widgetId); + // tempBoundingRect.top = position.top; + // tempBoundingRect.width = Number(element.getAttribute('data-width')); + // tempBoundingRect.height = Number(element.getAttribute('data-height')); + // } else { + // var boundingElement = element; + // if($ax.dynamicPanelManager.isIdFitToContent(widgetId)) { + // var stateId = $ax.visibility.GetPanelState(widgetId); + // if(stateId != '') boundingElement = document.getElementById(stateId); + // } + // tempBoundingRect = boundingElement.getBoundingClientRect(); + + // var jElement = $(element); + // position = jElement.position(); + // if(jElement.css('position') == 'fixed') { + // position.left += Number(jElement.css('margin-left').replace("px", "")); + // position.top += Number(jElement.css('margin-top').replace("px", "")); + // } + // } + + // var layers = $ax('#' + widgetId).getParents(true, ['layer'])[0]; + // var flip = ''; + // var mirrorWidth = 0; + // var mirrorHeight = 0; + // for (var i = 0; i < layers.length; i++) { + + // //should always be 0,0 + // var layerPos = $jobj(layers[i]).position(); + // position.left += layerPos.left; + // position.top += layerPos.top; + + // var outer = $ax.visibility.applyWidgetContainer(layers[i], true, true); + // if (outer.length) { + // var outerPos = outer.position(); + // position.left += outerPos.left; + // position.top += outerPos.top; + // } + + // //when a group is flipped we find the unflipped position + // var inner = $jobj(layers[i] + '_container_inner'); + // var taggedFlip = inner.data('flip'); + // if (inner.length && taggedFlip) { + // //only account for flip if transform is applied + // var matrix = taggedFlip && (inner.css("-webkit-transform") || inner.css("-moz-transform") || + // inner.css("-ms-transform") || inner.css("-o-transform") || inner.css("transform")); + // if (matrix !== 'none') { + // flip = taggedFlip; + // mirrorWidth = $ax.getNumFromPx(inner.css('width')); + // mirrorHeight = $ax.getNumFromPx(inner.css('height')); + // } + // } + // } + // //Now account for flip + // if (flip == 'x') position.top = mirrorHeight - position.top - element.getBoundingClientRect().height; + // else if (flip == 'y') position.left = mirrorWidth - position.left - element.getBoundingClientRect().width; + + // boundingRect = { + // left: position.left, + // right: position.left + tempBoundingRect.width, + // top: position.top, + // bottom: position.top + tempBoundingRect.height + // }; + + // _displayHackEnd(displayChanged); + // if (justSides) return boundingRect; + + // boundingRect.width = boundingRect.right - boundingRect.left; + // boundingRect.height = boundingRect.bottom - boundingRect.top; + + // boundingRect.centerPoint = { + // x: boundingRect.width / 2 + boundingRect.left, + // y: boundingRect.height / 2 + boundingRect.top + // }; + + // return boundingRect; + //}; + + var _getPointAfterRotate = $ax.public.fn.getPointAfterRotate = function (angleInDegrees, pointToRotate, centerPoint) { + var displacement = $ax.public.fn.vectorMinus(pointToRotate, centerPoint); + var rotationMatrix = $ax.public.fn.rotationMatrix(angleInDegrees); + rotationMatrix.tx = centerPoint.x; + rotationMatrix.ty = centerPoint.y; + return $ax.public.fn.matrixMultiply(rotationMatrix, displacement); + }; + + $ax.public.fn.getBoundingSizeForRotate = function(width, height, rotation) { + // point to rotate around doesn't matter since we just care about size, if location matter we need more args and location matters. + + var origin = { x: 0, y: 0 }; + + var corner1 = { x: width, y: 0 }; + var corner2 = { x: 0, y: height }; + var corner3 = { x: width, y: height }; + + corner1 = _getPointAfterRotate(rotation, corner1, origin); + corner2 = _getPointAfterRotate(rotation, corner2, origin); + corner3 = _getPointAfterRotate(rotation, corner3, origin); + + var left = Math.min(0, corner1.x, corner2.x, corner3.x); + var right = Math.max(0, corner1.x, corner2.x, corner3.x); + var top = Math.min(0, corner1.y, corner2.y, corner3.y); + var bottom = Math.max(0, corner1.y, corner2.y, corner3.y); + + return { width: right - left, height: bottom - top }; + } + + $ax.public.fn.getBoundingRectForRotate = function (boundingRect, rotation) { + var centerPoint = boundingRect.centerPoint; + var corner1 = { x: boundingRect.left, y: boundingRect.top }; + var corner2 = { x: boundingRect.right, y: boundingRect.top }; + var corner3 = { x: boundingRect.right, y: boundingRect.bottom }; + var corner4 = { x: boundingRect.left, y: boundingRect.bottom }; + corner1 = _getPointAfterRotate(rotation, corner1, centerPoint); + corner2 = _getPointAfterRotate(rotation, corner2, centerPoint); + corner3 = _getPointAfterRotate(rotation, corner3, centerPoint); + corner4 = _getPointAfterRotate(rotation, corner4, centerPoint); + + var left = Math.min(corner1.x, corner2.x, corner3.x, corner4.x); + var right = Math.max(corner1.x, corner2.x, corner3.x, corner4.x); + var top = Math.min(corner1.y, corner2.y, corner3.y, corner4.y); + var bottom = Math.max(corner1.y, corner2.y, corner3.y, corner4.y); + + return { left: left, top: top, width: right - left, height: bottom - top }; + } + + + //$ax.public.fn.getPositionRelativeToParent = function (elementId) { + // var element = document.getElementById(elementId); + // var list = _displayHackStart(element); + // var position = $(element).position(); + // _displayHackEnd(list); + // return position; + //}; + + //var _displayHackStart = $ax.public.fn.displayHackStart = function (element) { + // // TODO: Options: 1) stop setting display none. Big change for this late in the game. 2) Implement our own bounding. + // // TODO: 3) Current method is look for any parents that are set to none, and and temporarily unblock. Don't like it, but it works. + // var parent = element; + // var displays = []; + // while (parent) { + // if (parent.style.display == 'none') { + // displays.push(parent); + // //use block to overwrites default hidden objects' display + // parent.style.display = 'block'; + // } + // parent = parent.parentElement; + // } + + // return displays; + //}; + + //var _displayHackEnd = $ax.public.fn.displayHackEnd = function (displayChangedList) { + // for (var i = 0; i < displayChangedList.length; i++) displayChangedList[i].style.display = 'none'; + //}; + + + var _isCompoundVectorHtml = $ax.public.fn.isCompoundVectorHtml = function(hElement) { + return hElement.hasAttribute('compoundmode') && hElement.getAttribute('compoundmode') == "true"; + } + + $ax.public.fn.removeCompound = function (jobj) { if(_isCompoundVectorHtml(jobj[0])) jobj.removeClass('compound'); } + $ax.public.fn.restoreCompound = function (jobj) { if (_isCompoundVectorHtml(jobj[0])) jobj.addClass('compound'); } + + $ax.public.fn.compoundIdFromComponent = function(id) { + + var pPos = id.indexOf('p'); + var dashPos = id.indexOf('-'); + if (pPos < 1) return id; + else if (dashPos < 0) return id.substring(0, pPos); + else return id.substring(0, pPos) + id.substring(dashPos); + } + + $ax.public.fn.l2 = function (x, y) { return Math.sqrt(x * x + y * y); } + + $ax.public.fn.convertToSingleImage = function (jobj) { + if(!jobj[0]) return; + + var widgetId = jobj[0].id; + var object = $obj(widgetId); + + if ($ax.public.fn.IsLayer(object.type)) { + var recursiveChildren = _getLayerChildrenDeep(widgetId, true); + for (var j = 0; j < recursiveChildren.length; j++) + $ax.public.fn.convertToSingleImage($jobj(recursiveChildren[j])); + return; + } + + //var layer = + + if(!_isCompoundVectorHtml(jobj[0])) return; + + + $('#' + widgetId).removeClass("compound"); + $('#' + widgetId + '_img').removeClass("singleImg"); + jobj[0].setAttribute('compoundmode', 'false'); + + var components = object.compoundChildren; + delete object.generateCompound; + for (var i = 0; i < components.length; i++) { + var componentJobj = $jobj($ax.public.fn.getComponentId(widgetId, components[i])); + componentJobj.css('display', 'none'); + componentJobj.css('visibility', 'hidden'); + } + } + + + $ax.public.fn.getContainerDimensions = function(query) { + // returns undefined if no containers found. + var containerDimensions; + for (var i = 0; i < query[0].children.length; i++) { + var node = query[0].children[i]; + if (node.id.indexOf(query[0].id) >= 0 && node.id.indexOf('container') >= 0) { + containerDimensions = node.style; + } + } + return containerDimensions; + } + + + $ax.public.fn.rotationMatrix = function (angleInDegrees) { + var angleInRadians = angleInDegrees * (Math.PI / 180); + var cosTheta = Math.cos(angleInRadians); + var sinTheta = Math.sin(angleInRadians); + + return { m11: cosTheta, m12: -sinTheta, m21: sinTheta, m22: cosTheta, tx: 0.0, ty: 0.0 }; + } + + $ax.public.fn.GetFieldFromStyle = function (query, field) { + var raw = query[0].style[field]; + if (!raw) raw = query.css(field); + return Number(raw.replace('px', '')); + } + + + $ax.public.fn.setTransformHowever = function (transformString) { + return { + '-webkit-transform': transformString, + '-moz-transform': transformString, + '-ms-transform': transformString, + '-o-transform': transformString, + 'transform': transformString + }; + } + + $ax.public.fn.getCornersFromComponent = function (id) { + var element = document.getElementById(id); + var matrix = element ? $ax.public.fn.transformFromElement(element) : [1.0, 0.0, 0.0, 1.0, 0.0, 0.0]; + var currentMatrix = { m11: matrix[0], m21: matrix[1], m12: matrix[2], m22: matrix[3], tx: matrix[4], ty: matrix[5] }; + var dimensions = {}; + var axObj = $ax('#' + id); + var viewportLocation = axObj.offsetLocation(); + dimensions.left = viewportLocation.left; + dimensions.top = viewportLocation.top; + //dimensions.left = axObj.left(true); + //dimensions.top = axObj.top(true); + var size = axObj.size(); + dimensions.width = size.width; + dimensions.height = size.height; + //var transformMatrix1 = { m11: 1, m12: 0, m21: 0, m22: 1, tx: -invariant.x, ty: -invariant.y }; + //var transformMatrix2 = { m11: 1, m12: 0, m21: 0, m22: 1, tx: 500, ty: 500 }; + + var halfWidth = dimensions.width * 0.5; + var halfHeight = dimensions.height * 0.5; + //var preTransformTopLeft = { x: -halfWidth, y: -halfHeight }; + //var preTransformBottomLeft = { x: -halfWidth, y: halfHeight }; + var preTransformTopRight = { x: halfWidth, y: -halfHeight }; + var preTransformBottomRight = { x: halfWidth, y: halfHeight }; + + return { + //relativeTopLeft: $ax.public.fn.matrixMultiply(currentMatrix, preTransformTopLeft), + //relativeBottomLeft: $ax.public.fn.matrixMultiply(currentMatrix, preTransformBottomLeft), + relativeTopRight: $ax.public.fn.matrixMultiply(currentMatrix, preTransformTopRight), + relativeBottomRight: $ax.public.fn.matrixMultiply(currentMatrix, preTransformBottomRight), + centerPoint: { x: dimensions.left + halfWidth, y: dimensions.top + halfHeight } + //originalDimensions: dimensions, + //transformShift: { x: matrix[4], y: matrix[5] } + } + } + + + + $ax.public.fn.inversePathLengthFunction = function (pathFunction) { + // these are for computing the inverse functions of path integrals. + + var makeDivisionNode = function(node1, node2) { + var param = 0.5 * (node1.Param + node2.Param); + var inBetweenNode = { + LowerStop: node1, + HigherStop: node2, + Param: param, + Position: pathFunction(param), + Cumulative: 0.0 + }; + var lowerDisplacement = $ax.public.fn.vectorMinus(node1.Position, inBetweenNode.Position); + inBetweenNode.LowerInterval = { + Length: $ax.public.fn.l2(lowerDisplacement.x, lowerDisplacement.y), + Node: inBetweenNode, + IsHigher: false + }; + var higherDisplacement = $ax.public.fn.vectorMinus(node2.Position, inBetweenNode.Position); + inBetweenNode.HigherInterval = { + Length: $ax.public.fn.l2(higherDisplacement.x, higherDisplacement.y), + Node: inBetweenNode, + IsHigher: true + }; + return inBetweenNode; + }; + + var expandLower = function(node) { + node.LowerChild = makeDivisionNode(node.LowerStop, node); + node.LowerChild.Parent = node; + }; + + var expandHigher = function(node) { + node.HigherChild = makeDivisionNode(node, node.HigherStop); + node.HigherChild.Parent = node; + }; + + // for this function, cumulative is a global variable + var cumulative = 0.0; + var labelCumulativeLength = function(node) { + if(!node.LowerChild) { + node.LowerStop.Cumulative = cumulative; + cumulative += node.LowerInterval.Length; + node.Cumulative = cumulative; + } else labelCumulativeLength(node.LowerChild); + + if(!node.HigherChild) { + node.Cumulative = cumulative; + cumulative += node.HigherInterval.Length; + node.HigherStop.Cumulative = cumulative; + } else labelCumulativeLength(node.HigherChild); + }; + + var getIntervalFromPathLength = function(node, length) { + if(length < node.Cumulative) { + return node.LowerChild ? getIntervalFromPathLength(node.LowerChild, length) : node.LowerInterval; + } else return node.HigherChild ? getIntervalFromPathLength(node.HigherChild, length) : node.HigherInterval; + }; + + var intervalLowerEnd = function(interval) { + return interval.IsHigher ? interval.Node : interval.Node.LowerStop; + }; + + var intervalHigherEnd = function(interval) { + return interval.IsHigher ? interval.Node.HigherStop : interval.Node; + }; + + var getParameterFromPathLength = function (node, length) { + var interval = getIntervalFromPathLength(node, length); + var lowerNode = intervalLowerEnd(interval); + var higherNode = intervalHigherEnd(interval); + return lowerNode.Param + (higherNode.Param - lowerNode.Param) * (length - lowerNode.Cumulative) / (higherNode.Cumulative - lowerNode.Cumulative); + }; + + var insertIntoSortedList = function (longer, shorter, toInsert) { + while (true) { + if (!longer) { + longer = shorter; + shorter = shorter.NextLongest; + continue; + } else if (!shorter) longer.NextLongest = toInsert; + else { + if (longer.Length >= toInsert.Length && shorter.Length <= toInsert.Length) { + longer.NextLongest = toInsert; + toInsert.NextLongest = shorter; + } else { + longer = shorter; + shorter = shorter.NextLongest; + continue; + } + } + break; + } + } + var head = {Param: 0.0, Position: pathFunction(0.0) }; + var tail = { Param: 1.0, Position: pathFunction(1.0) }; + var root = makeDivisionNode(head, tail); + var currentCurveLength = root.LowerInterval.Length + root.HigherInterval.Length; + var longestInterval; + if (root.LowerInterval.Length < root.HigherInterval.Length) { + longestInterval = root.HigherInterval; + longestInterval.NextLongest = root.LowerInterval; + } else { + longestInterval = root.LowerInterval; + longestInterval.NextLongest = root.HigherInterval; + } + while (longestInterval.Length * 100.0 > currentCurveLength) { + var newNode; + if (longestInterval.IsHigher) { + expandHigher(longestInterval.Node); + newNode = longestInterval.Node.HigherChild; + } else { + expandLower(longestInterval.Node); + newNode = longestInterval.Node.LowerChild; + } + currentCurveLength += (newNode.LowerInterval.Length + newNode.HigherInterval.Length - longestInterval.Length); + insertIntoSortedList(null, longestInterval, newNode.LowerInterval); + insertIntoSortedList(null, longestInterval, newNode.HigherInterval); + longestInterval = longestInterval.NextLongest; + } + labelCumulativeLength(root); + + return function(lengthParam) { + return getParameterFromPathLength(root, lengthParam * cumulative); + }; + } +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/model.js b/code/page/resources/scripts/axure/model.js new file mode 100644 index 0000000..ffc0a10 --- /dev/null +++ b/code/page/resources/scripts/axure/model.js @@ -0,0 +1,53 @@ +// ******* Object Model ******** // +$axure.internal(function($ax) { + var _implementations = {}; + + var _initializeObject = function(type, obj) { + $.extend(obj, _implementations[type]); + }; + $ax.initializeObject = _initializeObject; + + var _model = $ax.model = {}; + + _model.idsInRdoToHideOrLimbo = function(rdoId, scriptIds) { + var rdoScriptId = $ax.repeater.getScriptIdFromElementId(rdoId); + var path = $ax.getPathFromScriptId(rdoScriptId); + + if(!scriptIds) scriptIds = []; + + var rdo = $ax.getObjectFromElementId(rdoId); + var master = $ax.pageData.masters[rdo.masterId]; + var masterChildren = master.diagram.objects; + for(var i = 0; i < masterChildren.length; i++) { + var obj = masterChildren[i]; + var objScriptIds = obj.scriptIds; + for(var j = 0; j < objScriptIds.length; j++) { + var scriptId = objScriptIds[j]; + // Anything in a layer is already handled by the layer + if($ax.getLayerParentFromElementId(scriptId)) continue; + + // Make sure in same rdo + var elementPath = $ax.getPathFromScriptId(scriptId); + + // This is because last part of path is for the obj itself. + elementPath.pop(); + if(elementPath.length != path.length) continue; + var samePath = true; + for(var k = 0; k < path.length; k++) { + if(elementPath[k] != path[k]) { + samePath = false; + break; + } + } + if(!samePath) continue; + + if($ax.public.fn.IsReferenceDiagramObject(obj.type)) _model.idsInRdoToHideOrLimbo(scriptId, scriptIds); + else if(scriptIds.indexOf(scriptId) == -1) scriptIds.push(scriptId); + + break; + } + } + return scriptIds; + }; + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/move.js b/code/page/resources/scripts/axure/move.js new file mode 100644 index 0000000..f6be801 --- /dev/null +++ b/code/page/resources/scripts/axure/move.js @@ -0,0 +1,463 @@ +$axure.internal(function($ax) { + var _move = {}; + $ax.move = _move; + + var widgetMoveInfo = {}; + //register and return move info, also create container for rootlayer if needed + $ax.move.PrepareForMove = function (id, x, y, to, options, jobj, rootLayer, skipContainerForRootLayer) { + var fixedInfo = jobj ? {} : $ax.dynamicPanelManager.getFixedInfo(id); + + var widget = $jobj(id); + var query = $ax('#' + id); + var isLayer = $ax.getTypeFromElementId(id) == $ax.constants.LAYER_TYPE; + if(!rootLayer) { + rootLayer = _move.getRootLayer(id); + if (rootLayer && !skipContainerForRootLayer) { + $ax.visibility.pushContainer(rootLayer, false); + if (isLayer) widget = $ax.visibility.applyWidgetContainer(id, true); + } + } + if (!jobj) jobj = widget; + + var horzProp = 'left'; + var vertProp = 'top'; + var offsetLocation = to ? query.offsetLocation() : undefined; + var horzX = to ? x - offsetLocation.x : x; + var vertY = to ? y - offsetLocation.y : y; + //var horzX = to ? x - query.locRelativeIgnoreLayer(false) : x; + //var vertY = to ? y - query.locRelativeIgnoreLayer(true) : y; + + if (fixedInfo.horizontal == 'right') { + horzProp = 'right'; + horzX = to ? $(window).width() - x - $ax.getNumFromPx(jobj.css('right')) - query.width() : -x; + var leftChanges = -horzX; + } else if(fixedInfo.horizontal == 'center') { + horzProp = 'margin-left'; + if (to) horzX = x - $(window).width() / 2; + } + + if (fixedInfo.vertical == 'bottom') { + vertProp = 'bottom'; + vertY = to ? $(window).height() - y - $ax.getNumFromPx(jobj.css('bottom')) - query.height() : -y; + var topChanges = -vertY; + } else if (fixedInfo.vertical == 'middle') { + vertProp = 'margin-top'; + if (to) vertY = y - $(window).height() / 2; + } + + //todo currently this always save the info, which is not needed for compound vector children and maybe some other cases + //let's optimize it later, only register if registerid is valid.. + widgetMoveInfo[id] = { + x: leftChanges === undefined ? horzX : leftChanges, + y: topChanges === undefined ? vertY : topChanges, + options: options + }; + + return { + horzX: horzX, + vertY: vertY, + horzProp: horzProp, + vertProp: vertProp, + rootLayer: rootLayer, + jobj: jobj + }; + }; + $ax.move.GetWidgetMoveInfo = function() { + return $.extend({}, widgetMoveInfo); + }; + + _move.getRootLayer = function (id) { + var isLayer = $ax.getTypeFromElementId(id) == $ax.constants.LAYER_TYPE; + var rootLayer = isLayer ? id : ''; + + var parentIds = $ax('#' + id).getParents(true, '*')[0]; + for(var i = 0; i < parentIds.length; i++) { + var parentId = parentIds[i]; + // Keep climbing up layers until you hit a non-layer. At that point you have your root layer + if($ax.public.fn.IsLayer($ax.getTypeFromElementId(parentId))) rootLayer = parentId; + else break; + } + + return rootLayer; + }; + + $ax.move.MoveWidget = function (id, x, y, options, to, animationCompleteCallback, shouldFire, jobj, skipOnMoveEvent) { + var moveInfo = $ax.move.PrepareForMove(id, x, y, to, options, jobj); + $ax.drag.LogMovedWidgetForDrag(id, options.dragInfo); + + var object = $obj(id); + if(object && $ax.public.fn.IsLayer(object.type)) { + var childrenIds = $ax.public.fn.getLayerChildrenDeep(id, true); + //don't push container when register moveinfo for child + if(!skipOnMoveEvent) { + for(var i = 0; i < childrenIds.length; i++) $ax.move.PrepareForMove(childrenIds[i], x, y, to, options, null, moveInfo.rootLayer, true); + } + } + + //if(!moveInfo) moveInfo = _getMoveInfo(id, x, y, to, options, jobj); + + jobj = moveInfo.jobj; + + _moveElement(id, options, animationCompleteCallback, shouldFire, jobj, moveInfo); + + if(skipOnMoveEvent) return; + $ax.event.raiseSyntheticEvent(id, "onMove"); + if(childrenIds) { + for(var i = 0; i < childrenIds.length; i++) $ax.event.raiseSyntheticEvent(childrenIds[i], 'onMove'); + } + }; + + var _moveElement = function (id, options, animationCompleteCallback, shouldFire, jobj, moveInfo){ + var cssStyles = {}; + + if(!$ax.dynamicPanelManager.isPercentWidthPanel($obj(id))) cssStyles[moveInfo.horzProp] = '+=' + moveInfo.horzX; + cssStyles[moveInfo.vertProp] = '+=' + moveInfo.vertY; + + $ax.visibility.moveMovedLocation(id, moveInfo.horzX, moveInfo.vertY); + + // I don't think root layer is necessary anymore after changes to layer container structure. + // Wait to try removing it until more stable. + var rootLayer = moveInfo.rootLayer; + + var query = $addAll(jobj, id); + var completeCount = query.length; + var completeAnimation = function() { + completeCount--; + if(completeCount == 0 && rootLayer) $ax.visibility.popContainer(rootLayer, false); + if(animationCompleteCallback) animationCompleteCallback(); + if(shouldFire) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move); + }; + if(options.easing==='none') { + query.animate(cssStyles, { duration: 0, queue: false }); + + if(rootLayer) $ax.visibility.popContainer(rootLayer, false); + if(animationCompleteCallback) animationCompleteCallback(); + //if this widget is inside a layer, we should just remove the layer from the queue + if(shouldFire) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move); + } else if (options.trajectory === 'straight' || moveInfo.horzX === 0 || moveInfo.vertY === 0) { + query.animate(cssStyles, { + duration: options.duration, easing: options.easing, queue: false, complete: completeAnimation}); + } else { + var initialHorzProp = $ax.getNumFromPx(query.css(moveInfo.horzProp)); + var initialVertProp = $ax.getNumFromPx(query.css(moveInfo.vertProp)); + var state = { parameter: 0 }; + var ellipseArcFunctionY = function(param) { + return { + x: initialHorzProp + (1.0 - Math.cos(param * Math.PI * 0.5)) * moveInfo.horzX, + y: initialVertProp + Math.sin(param * Math.PI * 0.5) * moveInfo.vertY + }; + }; + var ellipseArcFunctionX = function (param) { + return { + x: initialHorzProp + Math.sin(param * Math.PI * 0.5) * moveInfo.horzX, + y: initialVertProp + (1.0 - Math.cos(param * Math.PI * 0.5)) * moveInfo.vertY + }; + }; + var ellipseArcFunction = (moveInfo.horzX > 0) ^ (moveInfo.vertY > 0) ^ options.trajectory === 'arcClockwise' + ? ellipseArcFunctionX : ellipseArcFunctionY; + var inverseFunction = $ax.public.fn.inversePathLengthFunction(ellipseArcFunction); + $(state).animate({ parameter: 1.0 }, { + duration: options.duration, easing: options.easing, queue: false, + step: function (now) { + var newPos = ellipseArcFunction(inverseFunction(now)); + var changeFields = {}; + changeFields[moveInfo.horzProp] = newPos.x; + changeFields[moveInfo.vertProp] = newPos.y; + query.css(changeFields); + }, + complete: completeAnimation}); + } + + // //moveinfo is used for moving 'with this' + // var moveInfo = new Object(); + // moveInfo.x = horzX; + // moveInfo.y = vertY; + // moveInfo.options = options; + // widgetMoveInfo[id] = moveInfo; + + + }; + + _move.nopMove = function(id, options) { + var moveInfo = new Object(); + moveInfo.x = 0; + moveInfo.y = 0; + moveInfo.options = {}; + moveInfo.options.easing = 'none'; + moveInfo.options.duration = 0; + widgetMoveInfo[id] = moveInfo; + + // Layer move using container now. + var obj = $obj(id); + if($ax.public.fn.IsLayer(obj.type)) if(options.onComplete) options.onComplete(); + + $ax.event.raiseSyntheticEvent(id, "onMove"); + }; + + //rotationDegree: total degree to rotate + //centerPoint: the center of the circular path + + + var _noRotateOnlyMove = function (id, moveDelta, rotatableMove, fireAnimationQueue, easing, duration, completionCallback) { + moveDelta.x += rotatableMove.x; + moveDelta.y += rotatableMove.y; + if (moveDelta.x == 0 && moveDelta.y == 0) { + if(fireAnimationQueue) { + $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.rotate); + $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move); + } + if (completionCallback) completionCallback(); + } else { + $jobj(id).animate({ top: '+=' + moveDelta.y, left: '+=' + moveDelta.x }, { + duration: duration, + easing: easing, + queue: false, + complete: function () { + if(fireAnimationQueue) { + $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move); + $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.rotate); + } + if (completionCallback) completionCallback(); + } + }); + } + } + + + _move.circularMove = function (id, degreeDelta, centerPoint, moveDelta, rotatableMove, resizeOffset, options, fireAnimationQueue, completionCallback, willDoRotation) { + var elem = $jobj(id); + if(!willDoRotation) elem = $addAll(elem, id); + + var moveInfo = $ax.move.PrepareForMove(id, moveDelta.x, moveDelta.y, false, options); + // If not rotating, still need to check moveDelta and may need to handle that. + if (degreeDelta === 0) { + _noRotateOnlyMove(id, moveDelta, rotatableMove, fireAnimationQueue, options.easing, options.duration, completionCallback); + return; + } + + var stepFunc = function(newDegree) { + var deg = newDegree - rotation.degree; + var widgetCenter = $ax('#' + id).offsetBoundingRect().centerPoint; + //var widgetCenter = $ax.public.fn.getWidgetBoundingRect(id).centerPoint; + //console.log("widget center of " + id + " x " + widgetCenter.x + " y " + widgetCenter.y); + var widgetNewCenter = $axure.fn.getPointAfterRotate(deg, widgetCenter, centerPoint); + + // Start by getting the move not related to rotation, and make sure to update center point to move with it. + var ratio = deg / degreeDelta; + + var xdelta = (moveDelta.x + rotatableMove.x) * ratio; + var ydelta = (moveDelta.y + rotatableMove.y) * ratio; + if(resizeOffset) { + var resizeShift = {}; + resizeShift.x = resizeOffset.x * ratio; + resizeShift.y = resizeOffset.y * ratio; + $axure.fn.getPointAfterRotate(rotation.degree, resizeShift, { x: 0, y: 0 }); + xdelta += resizeShift.x; + ydelta += resizeShift.y; + } + centerPoint.x += xdelta; + centerPoint.y += ydelta; + + // Now for the move that is rotatable, it must be rotated + rotatableMove = $axure.fn.getPointAfterRotate(deg, rotatableMove, { x: 0, y: 0 }); + + // Now add in circular move to the mix. + xdelta += widgetNewCenter.x - widgetCenter.x; + ydelta += widgetNewCenter.y - widgetCenter.y; + + $ax.visibility.moveMovedLocation(id, xdelta, ydelta); + + if(xdelta < 0) elem.css('left', '-=' + -xdelta); + else if(xdelta > 0) elem.css('left', '+=' + xdelta); + + if(ydelta < 0) elem.css('top', '-=' + -ydelta); + else if(ydelta > 0) elem.css('top', '+=' + ydelta); + }; + + var onComplete = function() { + if(fireAnimationQueue) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.move); + if(completionCallback) completionCallback(); + if(moveInfo.rootLayer) $ax.visibility.popContainer(moveInfo.rootLayer, false); + var isPercentWidthPanel = $ax.dynamicPanelManager.isPercentWidthPanel($obj(id)); + if(isPercentWidthPanel) { + $ax.dynamicPanelManager.updatePanelPercentWidth(id); + $ax.dynamicPanelManager.updatePanelContentPercentWidth(id); + } + if(elem.css('position') == 'fixed') { + if(!isPercentWidthPanel) elem.css('left', ''); + elem.css('top', ''); + } + }; + + var rotation = { degree: 0 }; + + if(!options.easing || options.easing === 'none' || options.duration <= 0) { + stepFunc(degreeDelta); + onComplete(); + } else { + $(rotation).animate({ degree: degreeDelta }, { + duration: options.duration, + easing: options.easing, + queue: false, + step: stepFunc, + complete: onComplete + }); + } + }; + + //rotate a widget by degree, center is 50% 50% + _move.rotate = function (id, degree, easing, duration, to, shouldFire, completionCallback) { + var currentDegree = _move.getRotationDegree(id); + if(to) degree = degree - currentDegree; + + if(degree === 0) { + if (shouldFire) $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.rotate); + return; + } + + var query = $jobj(id); + var stepFunc = function(now) { + var degreeDelta = now - rotation.degree; + var newDegree = currentDegree + degreeDelta; + query.css($ax.public.fn.setTransformHowever("rotate(" + newDegree + "deg)")); + currentDegree = newDegree; + }; + + var onComplete = function() { + if(shouldFire) { + $ax.action.fireAnimationFromQueue($ax.public.fn.compoundIdFromComponent(id), $ax.action.queueTypes.rotate); + } + if(completionCallback) completionCallback(); + + $ax.annotation.adjustIconLocation(id); + }; + + var rotation = { degree: 0 }; + + $ax.visibility.setRotatedAngle(id, currentDegree + degree); + + //if no animation, setting duration to 1, to prevent RangeError in rotation loops without animation + if(!easing || easing === 'none' || duration <= 0) { + stepFunc(degree); + onComplete(); + } else { + $(rotation).animate({ degree: degree }, { + duration: duration, + easing: easing, + queue: false, + step: stepFunc, + complete: onComplete + }); + } + }; + + _move.compoundRotateAround = function (id, degreeDelta, centerPoint, moveDelta, rotatableMove, resizeOffset, easing, duration, fireAnimationQueue, completionCallback) { + if (degreeDelta === 0) { + _noRotateOnlyMove($ax.public.fn.compoundIdFromComponent(id), moveDelta, rotatableMove, fireAnimationQueue, easing, duration, completionCallback, $ax.action.queueTypes.rotate); + return; + } + var elem = $jobj(id); + var rotation = { degree: 0 }; + + if (!easing || easing === 'none' || duration <= 0) { + duration = 1; + easing = 'linear'; //it doesn't matter anymore here... + } + + var originalWidth = $ax.getNumFromPx(elem.css('width')); + var originalHeight = $ax.getNumFromPx(elem.css('height')); + var originalLeft = $ax.getNumFromPx(elem.css('left')); + var originalTop = $ax.getNumFromPx(elem.css('top')); + + $(rotation).animate({ degree: degreeDelta }, { + duration: duration, + easing: easing, + queue: false, + step: function (newDegree) { + var transform = $ax.public.fn.transformFromElement(elem[0]); + var originalCenter = { x: originalLeft + 0.5 * originalWidth, y: originalTop + 0.5 * originalHeight}; + var componentCenter = { x: originalCenter.x + transform[4], y: originalCenter.y + transform[5] }; + var deg = newDegree - rotation.degree; + var ratio = deg / degreeDelta; + var xdelta = (moveDelta.x + rotatableMove.x) * ratio; + var ydelta = (moveDelta.y + rotatableMove.y) * ratio; + if (resizeOffset) { + var resizeShift = {}; + resizeShift.x = resizeOffset.x * ratio; + resizeShift.y = resizeOffset.y * ratio; + $axure.fn.getPointAfterRotate(rotation.degree, resizeShift, { x: 0, y: 0 }); + xdelta += resizeShift.x; + ydelta += resizeShift.y; + } + + var rotationMatrix = $ax.public.fn.rotationMatrix(deg); + var compositionTransform = $ax.public.fn.matrixMultiplyMatrix(rotationMatrix, + { m11: transform[0], m21: transform[1], m12: transform[2], m22: transform[3] }); + + //console.log("widget center of " + id + " x " + widgetCenter.x + " y " + widgetCenter.y); + var widgetNewCenter = $axure.fn.getPointAfterRotate(deg, componentCenter, centerPoint); + var newMatrix = $ax.public.fn.matrixString(compositionTransform.m11, compositionTransform.m21, compositionTransform.m12, compositionTransform.m22, + widgetNewCenter.x - originalCenter.x + xdelta, widgetNewCenter.y - originalCenter.y + ydelta); + elem.css($ax.public.fn.setTransformHowever(newMatrix)); + }, + complete: function () { + if (fireAnimationQueue) { + $ax.action.fireAnimationFromQueue(elem.parent()[0].id, $ax.action.queueTypes.rotate); + } + + if(completionCallback) completionCallback(); + } + }); + }; + + _move.getRotationDegreeFromElement = function(element) { + if(element == null) return NaN; + + var transformString = element.style['transform'] || + element.style['-o-transform'] || + element.style['-ms-transform'] || + element.style['-moz-transform'] || + element.style['-webkit-transform']; + + if(transformString) { + var rotateRegex = /rotate\(([-?0-9]+)deg\)/; + var degreeMatch = rotateRegex.exec(transformString); + if(degreeMatch && degreeMatch[1]) return parseFloat(degreeMatch[1]); + } + + if(window.getComputedStyle) { + var st = window.getComputedStyle(element, null); + } else { + console.log('rotation is not supported for ie 8 and below in this version of axure rp'); + return 0; + } + + var tr = st.getPropertyValue("transform") || + st.getPropertyValue("-o-transform") || + st.getPropertyValue("-ms-transform") || + st.getPropertyValue("-moz-transform") || + st.getPropertyValue("-webkit-transform"); + + if(!tr || tr === 'none') return 0; + var values = tr.split('(')[1]; + values = values.split(')')[0], + values = values.split(','); + + var a = values[0]; + var b = values[1]; + + var radians = Math.atan2(b, a); + if(radians < 0) { + radians += (2 * Math.PI); + } + + return radians * (180 / Math.PI); + }; + + _move.getRotationDegree = function(elementId) { + if($ax.public.fn.IsLayer($obj(elementId).type)) { + return $jobj(elementId).data('layerDegree'); + } + return _move.getRotationDegreeFromElement(document.getElementById(elementId)); + } +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/recording.js b/code/page/resources/scripts/axure/recording.js new file mode 100644 index 0000000..f5fb140 --- /dev/null +++ b/code/page/resources/scripts/axure/recording.js @@ -0,0 +1,94 @@ +// ******* Recording MANAGER ******** // + +$axure.internal(function($ax) { + var _recording = $ax.recording = {}; + + $ax.recording.recordEvent = function(element, eventInfo, axEventObject, timeStamp) { + + var elementHtml = $jobj(element); + var className = elementHtml.attr('class'); + var inputValue; + + if(className === 'ax_checkbox') { + inputValue = elementHtml.find('#' + element + '_input')[0].checked; + eventInfo.inputType = className; + eventInfo.inputValue = inputValue; + } + + if(className === 'ax_text_field') { + inputValue = elementHtml.find('#' + element + '_input').val(); + eventInfo.inputType = className; + eventInfo.inputValue = inputValue; + } + + + var scriptId = $ax.repeater.getScriptIdFromElementId(element); + var diagramObjectPath = $ax.getPathFromScriptId(scriptId); + var form = { + recordingId: $ax.recording.recordingId, + elementID: element, + eventType: axEventObject.description, + 'eventInfo': eventInfo, + // eventObject: axEventObject, + 'timeStamp': timeStamp, + 'path': diagramObjectPath +// , +// 'trigger': function() { +// $ax.event.handleEvent(element, eventInfo, axEventObject); +// return false; +// } + }; + + $ax.messageCenter.postMessage('logEvent', form); + }; + + + $ax.recording.maybeRecordEvent = function(element, eventInfo, axEventObject, timeStamp) { + }; + + + $ax.recording.recordingId = ""; + $ax.recording.recordingName = ""; + + $ax.messageCenter.addMessageListener(function(message, data) { + if(message === 'startRecording') { + $ax.recording.maybeRecordEvent = $ax.recording.recordEvent; + $ax.recording.recordingId = data.recordingId; + $ax.recording.recordingName = data.recordingName; + } else if(message === 'stopRecording') { + $ax.recording.maybeRecordEvent = function(element, eventInfo, axEventObject, timeStamp) { + }; + + } + else if(message === 'playEvent') { + + var eventType = makeFirstLetterLower(data.eventType); + var inputElement; + + var dObj = data.element === '' ? $ax.pageData.page : $ax.getObjectFromElementId(data.element); + if(!data.axEventObject) { + data.axEventObject = dObj && dObj.interactionMap && dObj.interactionMap[eventType]; + } + + data.eventInfo.thiswidget = $ax.getWidgetInfo(data.element); + data.eventInfo.item = $ax.getItemInfo(data.element); + + if(data.eventInfo.inputType && data.eventInfo.inputType === 'ax_checkbox') { + inputElement = $jobj(data.element + '_input'); + inputElement[0].checked = data.eventInfo.inputValue; + } + + if(data.eventInfo.inputType && data.eventInfo.inputType === 'ax_text_field') { + inputElement = $jobj(data.element + '_input'); + inputElement.val(data.eventInfo.inputValue); + } + + $ax.event.handleEvent(data.element, data.eventInfo, data.axEventObject, false, true); + } + }); + + var makeFirstLetterLower = function(eventName) { + return eventName.substr(0, 1).toLowerCase() + eventName.substr(1); + }; + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/repeater.js b/code/page/resources/scripts/axure/repeater.js new file mode 100644 index 0000000..648fd59 --- /dev/null +++ b/code/page/resources/scripts/axure/repeater.js @@ -0,0 +1,2309 @@ + +// ******* Repeater MANAGER ******** // +$axure.internal(function($ax) { + var _repeaterManager = {}; + $ax.repeater = _repeaterManager; + + var _refreshType = _repeaterManager.refreshType = { + reset: 1, + persist: 2, + preEval: 3 + }; + + //This is a mapping of current editItems + var repeaterToEditItems = {}; + //This is a mapping of current filters + var repeaterToFilters = {}; + // This is a mapping of current sorts + var repeaterToSorts = {}; + // This is a mapping of repeater page info + var repeaterToPageInfo = {}; + + //Hopefully this can be simplified, but for now I think 3 are needed. + //This is the data set that is owned by this repeater. The repeater may or may not reference this data set, and others can reference it. + var repeaterToLocalDataSet = {}; + //This is the data set referenced by the repeater. It is not a copy of the local data set, but a reference to a local data set (or eventually a global data set could be referenced). + var repeaterToCurrentDataSet = {}; + //This is a copy of the current data set, that is replaced whenever a set or refresh is done. + var repeaterToActiveDataSet = {}; + var _loadRepeaters = function() { + $ax(function(obj) { + return $ax.public.fn.IsRepeater(obj.type); + }).each(function(obj, repeaterId) { + repeaterToLocalDataSet[repeaterId] = $ax.deepCopy(obj.data); + repeaterToLocalDataSet[repeaterId].props = obj.dataProps; + repeaterToEditItems[repeaterId] = []; + + _initPageInfo(obj, repeaterId); + + _setRepeaterDataSet(repeaterId, repeaterId); + var initialItemIds = obj.repeaterPropMap.itemIds; + for (var i = 0; i < initialItemIds.length; i++) $ax.addItemIdToRepeater(initialItemIds[i], repeaterId); + $ax.visibility.initRepeater(repeaterId); + }); + }; + _repeaterManager.loadRepeaters = _loadRepeaters; + + var fullRefresh = {}; + var repeatersReady = false; + var _initRepeaters = function () { + repeatersReady = true; + $ax(function(obj, repeaterId) { + return $ax.public.fn.IsRepeater(obj.type); + }).each(function(obj, repeaterId) { + _refreshRepeater(repeaterId, undefined, _refreshType.reset, !fullRefresh[repeaterId]); + //// Fix selected and default if necessary + //var states = obj.evaluatedStates[repeaterId]; + //if(!states) return; // If there are no evaluated states the repeater id key could not be mapped to an array of states. + + //for(var i = 0; i < states.length; i++) { + // var state = states[i]; + + // $ax.style.SetWidgetEnabled(state.id, true); // So selected will take place. If disabled, selected wouldn't happen. + // $ax.style.SetWidgetSelected(state.id, state.selected); + // $ax.style.SetWidgetEnabled(state.id, !state.disabled); + //} + }); + }; + _repeaterManager.initRefresh = _initRepeaters; + + var repeatersHaveNewDataSet = []; + var _setRepeaterDataSet = function(repeaterId, dataSetId) { + //TODO: No idea about how global data sets will be handled... + repeaterToCurrentDataSet[repeaterId] = repeaterToLocalDataSet[dataSetId]; + repeaterToActiveDataSet[repeaterId] = getActiveDataSet(repeaterId); + repeaterToFilters[repeaterId] = []; + repeaterToSorts[repeaterId] = []; + + + // Not using this currently + // if(repeatersHaveNewDataSet.indexOf(repeaterId) == -1) repeatersHaveNewDataSet[repeatersHaveNewDataSet.length] = repeaterId; + }; + _repeaterManager.setDataSet = _setRepeaterDataSet; + + var _refreshRepeater = function(repeaterId, eventInfo, refreshType, itemsPregen) { + if(!refreshType) refreshType = _refreshType.reset; // Set default + if(!repeatersReady) { + fullRefresh[repeaterId] = true; + return; + } + + // Reset selected/disabled dictionaries upon reset, if necessary (reset must, persist can't, and preeval doesn't care because it hasn't been set up yet. + if(refreshType == _refreshType.reset) $ax.style.clearStateForRepeater(repeaterId); + + // Don't show if you have a parent rdos thats limboed. + var rdoPath = $ax.getPathFromScriptId(repeaterId); + // Check each parent rdo through appropriate views to see if you are limboed + while (rdoPath.length > 0) { + if(!$ax.getScriptIdFromPath(rdoPath)) { + removeItems(repeaterId); + return; + } + + $ax.splice(rdoPath, rdoPath.length - 1, 1); + } + + $ax.action.refreshStart(repeaterId); + $ax.style.ClearCacheForRepeater(repeaterId); + + if($ax.visibility.limboIds[repeaterId]) { + removeItems(repeaterId); + $ax.dynamicPanelManager.fitParentPanel(repeaterId); + return; + } + + // Remove delete map if there is one at this point + if(eventInfo && eventInfo.repeaterDeleteMap) delete eventInfo.repeaterDeleteMap[repeaterId]; + var path = $ax.getPathFromScriptId(repeaterId); + path.pop(); + + if(eventInfo) { + eventInfo = $ax.eventCopy(eventInfo); + } + + var obj = $ax.getObjectFromScriptId(repeaterId); + var propMap = obj.repeaterPropMap; + + //If there is no wrap, then set it to be above the number of rows + var viewId = $ax.adaptive.currentViewId || ''; + var wrap = _getAdaptiveProp(propMap, 'wrap', viewId, repeaterId, obj); + var vertical = _getAdaptiveProp(propMap, 'vertical', viewId, repeaterId, obj); + //var offset = propMap[viewId]; + var offset = propMap[_getViewIdFromPageViewId(viewId, repeaterId, obj)]; + + // Right now pregen only works for default adaptive view + if(viewId) itemsPregen = false; + var orderedIds = []; + if(itemsPregen) { + var repeaterChildren = $jobj(repeaterId).children(); + // Start at 1 to skip script div child + for(var i = 1; i < repeaterChildren.length; i++) { + orderedIds.push(_getItemIdFromElementId($(repeaterChildren[i]).attr('id'))); + } + } else orderedIds = getOrderedIds(repeaterId, eventInfo); + var ids = []; + var background = _getAdaptiveProp(propMap, 'backColor', viewId, repeaterId, obj); + var hasAltColor = _getAdaptiveProp(propMap, 'hasAltColor', viewId, repeaterId, obj); + var altColor = hasAltColor ? _getAdaptiveProp(propMap, 'altColor', viewId, repeaterId, obj) : undefined; + var useAlt = false; + + if(itemsPregen) { + var start = 0; + var end = orderedIds.length; + } else { + var bounds = _getVisibleDataBounds(repeaterToPageInfo[repeaterId], itemsPregen ? obj.data.length : orderedIds.length); + start = bounds[0]; + end = bounds[1]; + } + + var repeaterObj = $jobj(repeaterId); + var preevalMap = {}; + + var shownCount = end - start; + var primaryCount = wrap == -1 ? shownCount : Math.min(shownCount, wrap); + var secondaryCount = wrap == -1 ? 1 : Math.ceil(shownCount / wrap); + var widthCount = vertical ? secondaryCount : primaryCount; + var heightCount = vertical ? primaryCount : secondaryCount; + var paddingTop = _getAdaptiveProp(propMap, 'paddingTop', viewId, repeaterId, obj); + var paddingLeft = _getAdaptiveProp(propMap, 'paddingLeft', viewId, repeaterId, obj); + var paddingY = paddingTop + _getAdaptiveProp(propMap, 'paddingBottom', viewId, repeaterId, obj); + var paddingX = paddingLeft + _getAdaptiveProp(propMap, 'paddingRight', viewId, repeaterId, obj); + + var spacingX = _getAdaptiveProp(propMap, 'horizontalSpacing', viewId, repeaterId, obj); + var xOffset = offset.width + spacingX; + var spacingY = _getAdaptiveProp(propMap, 'verticalSpacing', viewId, repeaterId, obj); + var yOffset = offset.height + spacingY; + var repeaterSize = { width: paddingX, height: paddingY }; + repeaterSize.width += offset.width + (widthCount - 1) * xOffset; + repeaterSize.height += offset.height + (heightCount - 1) * yOffset; + $ax.visibility.setResizedSize(repeaterId, repeaterSize.width, repeaterSize.height); + + if(itemsPregen) { + var templateIds = [repeaterId]; + var processScriptIds = function (full, prop, id) { + if(id.indexOf('_') <= 0 && id.indexOf('p') == -1) templateIds.push('u' + id); + }; + $('#' + repeaterId + '_script').html().replace(/(id|for)="?u([0-9]+(p([0-9]){3})?(_[_a-z0-9]*)?)"?/g, processScriptIds); + for(var i = 0; i < templateIds.length; i++) { + for(var j = 0; j < orderedIds.length; j++) { + ids.push(_createElementId(templateIds[i], orderedIds[j])); + } + } + + for(var pos = start; pos < end; pos++) { + var itemId = orderedIds[pos]; + itemElementId = _createElementId(repeaterId, itemId); + var jobj = $jobj(itemElementId); + if(jobj.hasClass('preeval')) refreshType = _refreshType.preEval; + for(var i = 0; i < templateIds.length; i++) $ax.initializeObjectEvents($ax('#' + _createElementId(templateIds[i], itemId)), refreshType); + if(refreshType == _refreshType.preEval) { + preevalMap[itemId] = true; + jobj.removeClass('preeval'); + } + + $ax.visibility.setResizedSize(itemElementId, $ax.getNumFromPx(jobj.css('width')), $ax.getNumFromPx(jobj.css('height'))); + $ax.visibility.setMovedLocation(itemElementId, $ax.getNumFromPx(jobj.css('left')), $ax.getNumFromPx(jobj.css('top'))); + } + } else { + var html = $('#' + repeaterId + '_script').html(); + + var div = $('
      '); + div.html(html); + div.find('.' + $ax.visibility.HIDDEN_CLASS).removeClass($ax.visibility.HIDDEN_CLASS); + div.find('.' + $ax.visibility.UNPLACED_CLASS).removeClass($ax.visibility.UNPLACED_CLASS); + div.css({ + width: offset.width, + height: offset.height + }); + + _applyColorCss(background, div); + var altDiv = div; + if(hasAltColor) altDiv = _applyColorCss(altColor, div.clone()); + + // Hide repeater, if shown, while updating. + var shown = $ax.visibility.IsIdVisible(repeaterId); + if(shown) document.getElementById(repeaterId).style.visibility = 'hidden'; + + //clean up old items as late as possible + removeItems(repeaterId); + resetItemSizes(repeaterId, offset, bounds, orderedIds, vertical, wrap); + + var i = 0; + var startTop = paddingTop; + var startLeft = paddingLeft; + if(repeaterObj.css('box-sizing') == 'border-box') { + startTop -= $ax.getNumFromPx(repeaterObj.css('border-top-width')) || 0; + startLeft -= $ax.getNumFromPx(repeaterObj.css('border-left-width')) || 0; + } + var top = startTop; + var left = startLeft; + for(pos = start; pos < end; pos++) { + itemId = orderedIds[pos]; + + var itemElementId = _createElementId(repeaterId, itemId); + $ax.addItemIdToRepeater(itemId, repeaterId); + + ids.push(itemElementId); + var processId = function(full, prop, id) { + var elementId = _createElementId('u' + id, itemId); + //If there is a suffix (ex. _img), then don't push the id. + if (id.indexOf('_') <= 0 && id.indexOf('p') == -1) ids.push(elementId); + return prop + '="' + elementId + '"'; + }; + + var copy = (useAlt ? altDiv : div).clone(); + useAlt = !useAlt; + copy.attr('id', itemElementId); + copy.html(div.html().replace(/(id|for)="?u([0-9]+(p([0-9]){3})?(_[_a-z0-9]*)?)"?/g, processId)); + if(obj.repeaterPropMap.isolateRadio) { + var radioButtons = copy.find(':radio'); + for(var radioIndex = 0; radioIndex < radioButtons.length; radioIndex++) { + var radio = $(radioButtons[radioIndex]); + var oldName = radio.attr('name') || ''; + // Can't use create element id because there could be an underscore in name + if(oldName) radio.attr('name', oldName + '-' + itemId); + } + } + + + copy.css({ + 'position': 'absolute', + 'top': top + 'px', + 'left': left + 'px', + 'width': obj.width + 'px', + 'height': obj.height + 'px' + }); + $('#' + repeaterId).append(copy); + $ax.visibility.setResizedSize(itemElementId, offset.width, offset.height); + $ax.visibility.setMovedLocation(itemElementId, left, top); + + i++; + if(wrap != -1 && i % wrap == 0) { + if(vertical) { + top = startTop; + left += xOffset; + } else { + left = startLeft; + top += yOffset; + } + } else if (vertical) top += yOffset; + else left += xOffset; + } + + repeaterObj.css(repeaterSize); + + // Had to move this here because it sets up cursor: pointer on inline links, + // but must be done before style cached when adaptive view is set. + // TODO: Should be able to combine this with initialization done in pregen items. Just need to have ids and template ids be the same. + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + var childJobj = $jobj(id); + if (obj.repeaterPropMap.isolateSelection && childJobj.attr('selectiongroup')) { + childJobj.attr('selectiongroup', _createElementId(childJobj.attr('selectiongroup'), _getItemIdFromElementId(id))); + } + $ax.initializeObjectEvents($ax('#' + id), refreshType); + } + } + + var query = _getItemQuery(repeaterId); + if(viewId) $ax.adaptive.applyView(viewId, query); + else $ax.visibility.resetLimboAndHiddenToDefaults(_getItemQuery(repeaterId, preevalMap)); + + $ax.annotation.createFootnotes(query, true); + + for(var index = 0; index < ids.length; index++) { + id = ids[index]; + + if ($ax.ieColorManager) $ax.ieColorManager.applyBackground($ax('#' + id)); + //$ax.style.initializeObjectTextAlignment($ax('#' + id)); + $ax.applyHighlight($ax('#' + id), true); + } + + $ax.messageCenter.startCombineEventMessages(); + $ax.cacheRepeaterInfo(repeaterId, $ax.getWidgetInfo(repeaterId)); + + //$ax.style.startSuspendTextAlignment(); + // Now load + for(pos = start; pos < end; pos++) { + itemId = orderedIds[pos]; + itemElementId = _createElementId(repeaterId, itemId); + if(!preevalMap[orderedIds[pos]]) $ax.event.raiseSyntheticEvent(itemElementId, 'onItemLoad', true); + $ax.loadDynamicPanelsAndMasters(obj.objects, path, itemId); + } + //$ax.style.resumeSuspendTextAlignment(); + + $ax.removeCachedRepeaterInfo(repeaterId); + $ax.messageCenter.endCombineEventMessages(); + + // Reshow repeater if it was originally shown (load is complete by now) + if(shown && !itemsPregen) document.getElementById(repeaterId).style.visibility = 'inherit'; + + $ax.dynamicPanelManager.fitParentPanel(repeaterId); + + // Need to reapply the state style after refresh for text styles, and for applying a non-default style that wasn't reset for certain refreshes (adaptive changed for example). This could be way more selective but doing a safe change for the moment + if(refreshType != _refreshType.preEval) $ax.style.updateStateClass(repeaterId); + + // Right now we assume only one refresh at a time. If we can manually trigger refreshes, that may possibly change. + $ax.action.refreshEnd(); + }; + _repeaterManager.refreshRepeater = _refreshRepeater; + + var _getItemQuery = function(repeaterId, preevalMap) { + var query = $ax(function (diagramObject, elementId) { + // Also need to check that this in not preeval + if(preevalMap) { + var itemId = _getItemIdFromElementId(elementId); + if(preevalMap[itemId]) return false; + } + + // All objects with the repeater as their parent, except the repeater itself. + var scriptId = _getScriptIdFromElementId(elementId); + return $ax.getParentRepeaterFromScriptId(scriptId) == repeaterId && scriptId != repeaterId; + }); + + return query; + } + + _repeaterManager.refreshAllRepeaters = function() { + $ax('*').each(function(diagramObject, elementId) { + if(!$ax.public.fn.IsRepeater(diagramObject.type)) return; + if($ax.visibility.isElementIdLimboOrInLimboContainer(elementId)) return; + _initPageInfo(diagramObject, elementId); + _refreshRepeater(elementId, $ax.getEventInfoFromEvent($ax.getjBrowserEvent()), _refreshType.persist); + }); + }; + + _repeaterManager.refreshRepeaters = function(ids, eventInfo) { + for(var i = 0; i < ids.length; i++) _refreshRepeater(ids[i], eventInfo); + }; + + var _initPageInfo = function(obj, elementId) { + var pageInfo = {}; + var map = obj.repeaterPropMap; + + var currentViewId = $ax.adaptive.currentViewId || ''; + var itemsPerPage = _getAdaptiveProp(map, 'itemsPerPage', currentViewId, elementId, obj); + if(itemsPerPage == -1) pageInfo.noLimit = true; + else { + pageInfo.itemsPerPage = itemsPerPage; + pageInfo.currPage = _getAdaptiveProp(map, 'currPage', currentViewId, elementId, obj); + } + repeaterToPageInfo[elementId] = pageInfo; + }; + + _repeaterManager.initialize = function() { + $ax(function (obj) { + return $ax.public.fn.IsRepeater(obj.type); + }).each(function (obj, repeaterId) { + _initPregen(repeaterId); + }); + } + + var _initPregen = function(repeaterId) { + var obj = $ax.getObjectFromScriptId(repeaterId); + var propMap = obj.repeaterPropMap; + + //If there is no wrap, then set it to be above the number of rows + var viewId = $ax.adaptive.currentViewId || ''; + var wrap = _getAdaptiveProp(propMap, 'wrap', viewId, repeaterId, obj); + var vertical = _getAdaptiveProp(propMap, 'vertical', viewId, repeaterId, obj); + + var orderedIds = []; + var ids = []; + var background = _getAdaptiveProp(propMap, 'backColor', viewId, repeaterId, obj); + var hasAltColor = _getAdaptiveProp(propMap, 'hasAltColor', viewId, repeaterId, obj); + var altColor = hasAltColor ? _getAdaptiveProp(propMap, 'altColor', viewId, repeaterId, obj) : undefined; + var useAlt = false; + + var bounds = _getVisibleDataBounds(repeaterToPageInfo[repeaterId], obj.data.length); + var start = bounds[0]; + var end = bounds[1]; + + // Starts empty + if(start == end) { + $ax.action.refreshEnd(repeaterId); + return; + } + var unprocessedBaseIds = $jobj($ax.repeater.createElementId(repeaterId, start + 1)).html().match(/(id|for)="?u([0-9]+)/g); + var baseIds = []; + if(unprocessedBaseIds) { + for(var i = 0; i < unprocessedBaseIds.length; i++) { + var val = unprocessedBaseIds[i].split('=')[1].substr(1); + if(baseIds.indexOf(val) == -1) baseIds.push(val); + } + } + + for(var itemNum = start; itemNum < end; itemNum++) { + ids.push($ax.repeater.createElementId(repeaterId, itemNum + 1)); + for(i = 0; i < baseIds.length; i++) ids.push($ax.repeater.createElementId(baseIds[i], itemNum + 1)); + var itemId = itemNum + 1; + orderedIds[itemNum] = itemId; + + var itemDiv = $jobj($ax.repeater.createElementId(repeaterId, itemNum + 1)); + _applyColorCss(useAlt ? altColor : background, itemDiv); + if(hasAltColor) useAlt = !useAlt; + } + + resetItemSizes(repeaterId, undefined, bounds, orderedIds, vertical, wrap); + }; + + var _applyColorCss = function(json, div) { + var args = json.r + ', ' + json.g + ', ' + json.b; + var background = json.a == 0 ? '' : json.a == 1 ? 'rgb(' + args + ')' : 'rgba(' + args + ', ' + json.a + ')'; + if($ax.ieColorManager && json.a != 0 && json.a != 1) { + var ieColor = $ax.ieColorManager.getColorFromArgb(json.a * 255, json.r, json.g, json.b, true); + if(ieColor) background = ieColor; + } + div.css('background-color', background); + return div; + }; + + var _getViewIdFromPageViewId = function (pageViewId, id, diagramObject) { + if (diagramObject.owner.type != 'Axure:Master') { + return pageViewId; + } else { + var parentRdoId = $ax('#' + id).getParents(true, ['rdo'])[0][0]; + var rdoState = $ax.style.generateState(parentRdoId); + var rdoStyle = $ax.style.computeFullStyle(parentRdoId, rdoState, pageViewId); + var viewOverride = rdoStyle.viewOverride; + return viewOverride; + } + } + + var _getAdaptiveProp = _repeaterManager.getAdaptiveProp = function (map, prop, viewId, repeaterId, repeaterObj) { + var viewChain = $ax.style.getViewIdChain(viewId, repeaterId, repeaterObj); + + for(var i = viewChain.length - 1; i >= 0; i--) { + viewId = viewChain[i]; + var viewProps = map[viewId]; + if(viewProps.hasOwnProperty(prop)) return viewProps[prop]; + } + + var base = repeaterObj.owner.type != 'Axure:Master' ? map[''] : map['19e82109f102476f933582835c373474']; + if(base.hasOwnProperty(prop)) return base[prop]; + return map['default'][prop]; + }; + + _repeaterManager.getItemCount = function(repeaterId) { + var data = repeaterToActiveDataSet[repeaterId].length; + var info = repeaterToPageInfo[repeaterId]; + if(!info.noLimit) { + var start = Math.min(data, info.itemsPerPage * info.currPage); + var end = Math.min(data, start + info.itemsPerPage); + data = end - start; + } + return data; + }; + + _repeaterManager.setDisplayProps = function(obj, repeaterId, itemIndex) { + var data = repeaterToActiveDataSet[repeaterId]; + var info = repeaterToPageInfo[repeaterId]; + var start = 0; + var end = data.length; + if(!info.noLimit) { + start = Math.min(end, info.itemsPerPage * (info.currPage - 1)); + end = Math.min(end, start + info.itemsPerPage); + } + var count = end - start; + var index = -1; + for(var i = 0; i < count; i++) { + if(data[start + i].index == itemIndex) index = i + 1; + } + if(index == -1) return; + obj.index = index; + obj.isfirst = index == 1; + obj.islast = index == end - start; + obj.iseven = index % 2 == 0; + obj.isodd = index % 2 == 1; + }; + + var _getVisibleDataBounds = function(pageInfo, count) { + var retval = [0, count]; + if(!pageInfo.noLimit) { + var end = pageInfo.itemsPerPage * pageInfo.currPage; + var start = end - pageInfo.itemsPerPage; + + // If past the end, move to last page + if(start >= count) { + pageInfo.currPage = Math.floor((count - 1) / pageInfo.itemsPerPage) + 1; + if(pageInfo.currPage <= 0) pageInfo.currPage = 1; + + end = pageInfo.itemsPerPage * pageInfo.currPage; + start = end - pageInfo.itemsPerPage; + } + end = Math.min(end, count); + retval[0] = start; + retval[1] = end; + } + return retval; + }; + + _repeaterManager.getVisibleDataCount = function(repeaterId) { + var bounds = _getVisibleDataBounds(repeaterToPageInfo[repeaterId], repeaterToActiveDataSet[repeaterId].length); + return bounds[1] - bounds[0]; + }; + + _repeaterManager.getDataCount = function(repeaterId) { + return repeaterToCurrentDataSet[repeaterId].length; + }; + + var _getFilteredDataCount = _repeaterManager.getFilteredDataCount = function(repeaterId) { + return repeaterToActiveDataSet[repeaterId].length; + }; + + _repeaterManager.getPageCount = function(repeaterId) { + var info = repeaterToPageInfo[repeaterId]; + return info.noLimit ? 1 : Math.ceil(_getFilteredDataCount(repeaterId) / info.itemsPerPage); + }; + + _repeaterManager.getPageIndex = function(repeaterId) { + var info = repeaterToPageInfo[repeaterId]; + return info.noLimit ? 1 : info.currPage; + }; + + var getActiveDataSet = function(repeaterId) { + var active = $ax.deepCopy(repeaterToCurrentDataSet[repeaterId]); + // Set up 1 indexing each item. + for(var i = 0; i < active.length; i++) active[i].index = i + 1; + return active; + }; + + var getOrderedIds = function(repeaterId, eventInfo) { + var data = repeaterToActiveDataSet[repeaterId] = getActiveDataSet(repeaterId); + + // Filter first so less to sort + applyFilter(repeaterId, data, eventInfo); + + // Sort next + var sorts = repeaterToSorts[repeaterId] || []; + if(sorts.length != 0 && data.length > 1) { + // TODO: Make this generic and factor out if we want to use it elsewhere... + // Compare is a function that takes 2 arguments, and returns a number. A high number means the second should go first + // Otherwise the first stays first. + var mergesort = function(list, start, end, compare) { + var middle = Math.floor((start + end) / 2); + if(middle - start > 1) mergesort(list, start, middle, compare); + if(end - middle > 1) mergesort(list, middle, end, compare); + var index1 = start; + var index2 = middle; + var tempList = []; + while(index1 < middle && index2 < end) { + tempList[tempList.length] = list[compare(list[index1], list[index2]) > 0 ? index2++ : index1++]; + } + while(index1 < middle) tempList[tempList.length] = list[index1++]; + while(index2 < end) tempList[tempList.length] = list[index2++]; + + // transfer from temp list to the real list. + for(var i = 0; i < tempList.length; i++) list[start + i] = tempList[i]; + }; + // Compare is the tie breaking function to us if necessary. + var getComparator = function(columnName, ascending, type, compare) { + // If this needs to be sped up, break up into several smaller functions conditioned off of type + return function(row1, row2) { + // If column undefined have it be empty string, NaN, or invalid date + //// If column undefined, no way to measure this, so call it a tie. + //if(row1[columnName] === undefined || row2[columnName] === undefined) return 0; + + var text1 = (row1[columnName] && row1[columnName].text) || ''; + var text2 = (row2[columnName] && row2[columnName].text) || ''; + + // This means we are case insensitive, so lowercase everything to kill casing + if(type == 'Text') { + text1 = text1.toLowerCase(); + text2 = text2.toLowerCase(); + } + + //If tied, go to tie breaker + if(text1 == text2) { + if(compare) return compare(row1, row2); + // Actually a tie. + return 0; + } + if(type == 'Text' || type == 'Text (Case Sensitive)') { + if(text1 < text2 ^ ascending) return 1; + else return -1; + } else if(type == 'Number') { + var num1 = text1 == '' ? NaN : Number(text1); + var num2 = text2 == '' ? NaN : Number(text2); + + if(isNaN(num1) && isNaN(num2)) return 0; + if(isNaN(num1) || isNaN(num2)) return isNaN(num1) ? 1 : -1; + if(num1 < num2 ^ ascending) return 1; + else return -1; + } else if(type == 'Date - YYYY-MM-DD' || type == 'Date - MM/DD/YYYY') { + var func = type == 'Date - YYYY-MM-DD' ? getDate1 : getDate2; + var date1 = func(text1); + var date2 = func(text2); + if(!date1.valid && !date2.valid) return 0; + if(!date1.valid || !date2.valid) return date1.valid ? -1 : 1; + var diff = date2.year - date1.year; + if(diff == 0) diff = date2.month - date1.month; + if(diff == 0) diff = date2.day - date1.day; + if(diff == 0) return 0; + return diff > 0 ^ ascending ? 1 : -1; + } + console.log('unhandled sort type'); + return 0; + }; + }; + var compareFunc = null; + for(var i = 0; i < sorts.length; i++) compareFunc = getComparator(sorts[i].columnName, sorts[i].ascending, sorts[i].sortType, compareFunc); + + mergesort(data, 0, data.length, compareFunc); + } + + var ids = []; + for(i = 0; i < data.length; i++) ids[i] = data[i].index; + + return ids; + }; + + var getDate1 = function(text) { + var date = { valid: false }; + var sections = text.split('-'); + if(sections.length == 1) sections = text.split('/'); + if(sections.length != 3) return date; + date.year = Number(sections[0]); + date.month = Number(sections[1]); + date.day = Number(sections[2]); + date.valid = !isNaN(date.year); + date.valid &= !isNaN(date.month) && date.month > 0 && date.month <= 12; + date.valid &= !isNaN(date.day) && date.day > 0 && date.day <= daysPerMonth(date.month, date.year); + return date; + }; + + var getDate2 = function(text) { + var date = { valid: false }; + var sections = text.split('-'); + if(sections.length == 1) sections = text.split('/'); + if(sections.length != 3) return date; + date.month = Number(sections[0]); + date.day = Number(sections[1]); + date.year = Number(sections[2]); + date.valid = !isNaN(date.year); + date.valid &= !isNaN(date.month) && date.month > 0 && date.month <= 12; + date.valid &= !isNaN(date.day) && date.day > 0 && date.day <= daysPerMonth(date.month, date.year); + return date; + }; + + var daysPerMonth = function(month, year) { + if(month == 9 || month == 4 || month == 6 || month == 11) return 30; + if(month != 2) return 31; + + if(year % 4 != 0) return 28; + if(year % 100 != 0) return 29; + return year % 400 == 0 ? 29 : 28; + }; + + var applyFilter = function(repeaterId, data, eventInfo) { + var dataFiltered = []; + var filters = repeaterToFilters[repeaterId] || []; + if (filters.length != 0) { + if(!eventInfo) eventInfo = $ax.getBasicEventInfo(); + var oldTarget = eventInfo.targetElement; + var oldSrc = eventInfo.srcElement; + var oldThis = eventInfo.thiswidget; + var oldItem = eventInfo.item; + + var idToWidgetInfo = {}; + + outer: + for(var i = 1; i <= data.length; i++) { + for(var j = 0; j < filters.length; j++) { + eventInfo.targetElement = _createElementId(repeaterId, i); + eventInfo.srcElement = filters[j].thisId; + if(!idToWidgetInfo[eventInfo.srcElement]) idToWidgetInfo[eventInfo.srcElement] = $ax.getWidgetInfo(eventInfo.srcElement); + eventInfo.thiswidget = idToWidgetInfo[eventInfo.srcElement]; + eventInfo.item = $ax.getItemInfo(eventInfo.srcElement); + + if($ax.expr.evaluateExpr(filters[j].filter, eventInfo) != 'true') continue outer; + } + dataFiltered[dataFiltered.length] = data[i - 1]; + } + + for(i = 0; i < dataFiltered.length; i++) data[i] = dataFiltered[i]; + while(data.length > dataFiltered.length) data.pop(); + + eventInfo.targetElement = oldTarget; + eventInfo.srcElement = oldSrc; + eventInfo.thiswidget = oldThis; + eventInfo.item = oldItem; + } + }; + + var _addFilter = function(repeaterId, removeOtherFilters, label, filter, thisId) { + if(removeOtherFilters) _removeFilter(repeaterId); + + var filterList = repeaterToFilters[repeaterId]; + if(!filterList) repeaterToFilters[repeaterId] = filterList = []; + + var filterObj = { filter: filter, thisId: thisId }; + if(label) filterObj.label = label; + filterList[filterList.length] = filterObj; + }; + _repeaterManager.addFilter = _addFilter; + + var _removeFilter = function(repeaterId, label) { + var filterList = repeaterToFilters[repeaterId]; + // If no list, nothing to remove + if(!filterList) return; + + // If no label, remove everything + if(!label) { + repeaterToFilters[repeaterId] = []; + return; + } + + for(var i = filterList.length - 1; i >= 0; i--) { + var filterObj = filterList[i]; + if(filterObj.label && filterObj.label == label) $ax.splice(filterList, i, 1); + } + }; + _repeaterManager.removeFilter = _removeFilter; + + var _addSort = function(repeaterId, label, columnName, ascending, toggle, sortType) { + var sortList = repeaterToSorts[repeaterId]; + if(!sortList) repeaterToSorts[repeaterId] = sortList = []; + + for(var i = 0; i < sortList.length; i++) { + if(columnName == sortList[i].columnName) { + var lastSortObj = $ax.splice(sortList, i, 1)[0]; + if(toggle) ascending = !lastSortObj.ascending; + break; + } + } + + var sortObj = { columnName: columnName, ascending: ascending, sortType: sortType }; + + if(label) sortObj.label = label; + sortList[sortList.length] = sortObj; + }; + _repeaterManager.addSort = _addSort; + + var _removeSort = function(repeaterId, label) { + var sortList = repeaterToSorts[repeaterId]; + // If no list, nothing to remove + if(!sortList) return; + + // If no label, remove everything + if(!label) { + repeaterToSorts[repeaterId] = []; + return; + } + + for(var i = sortList.length - 1; i >= 0; i--) { + var sortObj = sortList[i]; + if(sortObj.label && sortObj.label == label) $ax.splice(sortList, i, 1); + } + }; + _repeaterManager.removeSort = _removeSort; + + var _setRepeaterToPage = function(repeaterId, type, value, eventInfo) { + var pageInfo = repeaterToPageInfo[repeaterId]; + // page doesn't matter if there is no limit. + if(pageInfo.noLimit) return; + + var dataSet = repeaterToActiveDataSet[repeaterId]; + if(!dataSet) dataSet = repeaterToCurrentDataSet[repeaterId]; + var lastPage = Math.max(1, Math.ceil(dataSet.length / pageInfo.itemsPerPage)); + + if(type == 'Value') { + var val = Number($ax.expr.evaluateExpr(value, eventInfo)); + // if invalid, default to 1, otherwise, clamp the value + if(isNaN(val)) val = 1; + else if(val < 1) val = 1; + else if(val > lastPage) val = lastPage; + + pageInfo.currPage = val; + } else if(type == 'Previous') { + if(pageInfo.currPage > 1) pageInfo.currPage--; + } else if(type == 'Next') { + if(pageInfo.currPage < lastPage) pageInfo.currPage++; + } else if(type == 'Last') { + pageInfo.currPage = lastPage; + } else { + console.log('Unknown type'); + } + }; + _repeaterManager.setRepeaterToPage = _setRepeaterToPage; + + var _setNoItemLimit = function(repeaterId) { + var pageInfo = repeaterToPageInfo[repeaterId]; + delete pageInfo.currPage; + delete pageInfo.itemsPerPage; + pageInfo.noLimit = true; + }; + _repeaterManager.setNoItemLimit = _setNoItemLimit; + + var _setItemLimit = function(repeaterId, value, eventInfo) { + var pageInfo = repeaterToPageInfo[repeaterId]; + + if(pageInfo.noLimit) { + pageInfo.noLimit = false; + pageInfo.currPage = 1; + } + + var oldTarget = eventInfo.targetElement; + eventInfo.targetElement = repeaterId; + var itemLimit = Number($ax.expr.evaluateExpr(value, eventInfo)); + eventInfo.targetElement = oldTarget; + if(isNaN(itemLimit)) itemLimit = 20; + else if(itemLimit < 1) itemLimit = 1; + pageInfo.itemsPerPage = itemLimit; + }; + _repeaterManager.setItemLimit = _setItemLimit; + + var removeItems = function(repeaterId) { + var elementIds = $ax.getChildElementIdsForRepeater(repeaterId); + var itemId = $ax.getItemIdsForRepeater(repeaterId); + for(var i = 0; i < itemId.length; i++) $jobj(_createElementId(repeaterId, itemId[i])).remove(); + $ax.visibility.clearLimboAndHiddenIds(elementIds); + $ax.visibility.clearMovedAndResizedIds(elementIds); + $ax.clearItemsForRepeater(repeaterId); + }; + + var repeaterSizes = {}; + var resetItemSizes = function (repeaterId, itemSize, bounds, ids, vertical, wrap) { + var calcItem = !itemSize; + if(calcItem) itemSize = {}; + + var repeaterMap = {}; + repeaterMap.vert = vertical; + var sizesMap = {}; + var sizes = []; + var currSizes = wrap == -1 ? sizes : []; + for(var i = 0; i + bounds[0] < bounds[1]; i++) { + var itemId = ids[i + bounds[0]]; + if(calcItem) { + var itemJobj = $jobj(_createElementId(repeaterId, itemId)); + itemSize.width = $ax.getNumFromPx(itemJobj.css('width')); + itemSize.height = $ax.getNumFromPx(itemJobj.css('height')); + } + + var size = { itemId: itemId, width: itemSize.width, height: itemSize.height }; + currSizes.push(size); + sizesMap[size.itemId] = size; + if(currSizes.length == wrap) { + sizes.push(currSizes); + currSizes = []; + } + } + if (wrap != -1 && currSizes.length > 0) sizes.push(currSizes); + repeaterMap.sizes = sizes; + repeaterMap.sizesMap = sizesMap; + repeaterSizes[repeaterId] = repeaterMap; + }; + + _repeaterManager.getItemSize = function(repeaterId, itemId) { + var repeaterSize = repeaterSizes[repeaterId]; + if (!repeaterSize) return false; + return repeaterSize.sizesMap[itemId]; + } + + _repeaterManager.setItemSize = function (repeaterId, itemId, width, height) { + var repeaterSize = repeaterSizes[repeaterId]; + if(!repeaterSize) return false; + var size = repeaterSize.sizesMap[itemId]; + var deltaX = width - size.width; + var deltaY = height - size.height; + if(!deltaX && !deltaY) return false; + + repeaterSize.resized = true; + + if(deltaX) _pushItems(repeaterId, itemId, deltaX, false, true); + if(deltaY) _pushItems(repeaterId, itemId, deltaY, true, true); + + if(deltaX || deltaY) $ax.event.raiseSyntheticEvent(_createElementId(repeaterId, itemId), 'onItemResize'); + + return true; + } + + var _pushItems = _repeaterManager.pushItems = function (repeaterId, itemId, delta, vertical, suppressFire) { + if(delta == 0) return; + + // Update repeater item size + var prop = vertical ? 'height' : 'width'; + var itemElementId = _createElementId(repeaterId, itemId); + var itemObj = $jobj(itemElementId); + itemObj.css(prop, $ax.getNumFromPx(itemObj.css(prop)) + delta); + $ax.visibility.setResizedSize(itemElementId, $ax.getNumFromPx(itemObj.css('width')), $ax.getNumFromPx(itemObj.css('height'))); + + var repeaterObj = $jobj(repeaterId); + var repeaterMap = repeaterSizes[repeaterId]; + var sizes = repeaterMap.sizes; + var wrap = sizes[0].length != undefined; + var vert = repeaterMap.vert; + + // Not wrapping, has to push in primary direction + if (!wrap && vert != vertical) { + var before = 0; + var after = 0; + var limit = 0; + for(var i = 0; i < sizes.length; i++) { + var size = sizes[i]; + if(size.itemId == itemId) { + before = size[prop]; + size[prop] += delta; + after = size[prop]; + } else { + limit = limit ? Math.max(limit, size[prop]) : size[prop]; + } + } + + // Repeater delta is because an item can increase secondary direction, but if another item is already larger, then repeater size isn't effected. + var repeaterDelta = delta; + if(sizes.length != 1) { + if(after >= limit) repeaterDelta = after - Math.max(limit, before); + else if(before > limit) repeaterDelta = limit - before; + else repeaterDelta = 0; + } + + _updateRepeaterSize(prop, repeaterObj, repeaterDelta, vert); + + if(!suppressFire) $ax.event.raiseSyntheticEvent(_createElementId(repeaterId, itemId), 'onItemResize'); + return; + } + + var index = 0; + var index2 = 0; + // Get the indices first + if(wrap) { + outer: + for(; index < sizes.length; index++) { + var innerSizes = sizes[index]; + for(index2 = 0; index2 < innerSizes.length; index2++) if(innerSizes[index2].itemId == itemId) break outer; + } + } else { + for(; index < sizes.length; index++) if(sizes[index].itemId == itemId) break; + } + // Find out who is being pushed + var itemIdsEffected = []; + if (vert == vertical) { + // To check for repeater resize, non-wrap is easy, for wrap you have to see if your new size is enough to effect the size given other col/row sizes. + repeaterDelta = delta; + if(wrap && sizes.length > 1) { + var viewId = $ax.adaptive.currentViewId || ''; + var obj = $obj(repeaterId); + var spacing = _getAdaptiveProp(obj.repeaterPropMap, (vert ? 'vertical' : 'horizontal') + 'Spacing', viewId, repeaterId, obj); + for(i = 0; i < sizes.length; i++) { + var rowColSize = 0; + var rowCol = sizes[i]; + for(var j = 0; j < rowCol.length; j++) { + if(j != 0) rowColSize += spacing; + rowColSize += rowCol[j][prop]; + } + + if(i == index) { + before = rowColSize; + after = before + delta; + } else { + limit = limit ? Math.max(limit, rowColSize) : rowColSize; + } + } + + if(after >= limit) repeaterDelta = after - Math.max(limit, before); + else if (before > limit) repeaterDelta = limit - before; + else repeaterDelta = 0; + } + + if (repeaterDelta) { + _updateRepeaterSize(prop, repeaterObj, repeaterDelta, vert); + } + + // Done the hard part, calculating/updating new repeater size. Now just resize items and find what to push. + var array = wrap ? sizes[index] : sizes; + i = wrap ? index2 : index; + array[i][prop] += delta; + + for(i++; i < array.length; i++) itemIdsEffected.push(array[i].itemId); + } else { + // Secondary push is more interesting. See how much your primary row/column is already pushing, if that changes + // then effect all rows/columns after it + + // Get the biggest one in the current row/column, ignoring the one we're changing + var biggest = 0; + var currSizes = sizes[index]; + for(i = 0; i < currSizes.length; i++) { + if (i == index2) continue; + + biggest = Math.max(biggest, currSizes[i][prop]); + } + + var beforeSize = Math.max(biggest, currSizes[index2][prop]); + currSizes[index2][prop] += delta; + var afterSize = Math.max(biggest, currSizes[index2][prop]); + + // Nothing pushed/pulled + if (afterSize == beforeSize) return; + + for(i = index + 1; i < sizes.length; i++) { + currSizes = sizes[i]; + for(j = 0; j < currSizes.length; j++) itemIdsEffected.push(currSizes[j].itemId); + } + + // Delta is only how much the whole row/column changed + delta = afterSize - beforeSize; + + // Repeater resize secondary is determined by the effective delta. + _updateRepeaterSize(prop, repeaterObj, delta, vert); + } + + for(i = 0; i < itemIdsEffected.length; i++) { + var currItemId = itemIdsEffected[i]; + var elementId = _createElementId(repeaterId, currItemId); + var loc = vertical ? 'top' : 'left'; + var jobj = $jobj(elementId); + var currVal = $ax.getNumFromPx(jobj.css(loc)); + jobj.css(loc, currVal + delta); + $ax.visibility.setMovedLocation(elementId, $ax.getNumFromPx(jobj.css('left')), $ax.getNumFromPx(jobj.css('top'))); + } + + if(!suppressFire) $ax.event.raiseSyntheticEvent(_createElementId(repeaterId, itemId), 'onItemResize'); + } + + var _updateRepeaterSize = function(prop, jobj, delta, vert) { + if (delta == 0) return; + var val = $ax.getNumFromPx(jobj.css(prop)) + delta; + var border = 0; + if(vert) border += $ax.getNumFromPx(jobj.css('border-top-width')) + $ax.getNumFromPx(jobj.css('border-bottom-width')); + else border += $ax.getNumFromPx(jobj.css('border-left-width')) + $ax.getNumFromPx(jobj.css('border-right-width')); + val += border; + jobj.css(prop, val); + $ax.visibility.setResizedSize(jobj.attr('id'), $ax.getNumFromPx(jobj.css('width')), $ax.getNumFromPx(jobj.css('height'))); + $ax.dynamicPanelManager.fitParentPanel(jobj.attr('id')); + } + + var _getDataFromDataSet = function (eventInfo, repeaterId, itemId, propName, type) { + var row = undefined; + var deleteMap = eventInfo && eventInfo.repeaterDeleteMap && eventInfo.repeaterDeleteMap[repeaterId]; + if(deleteMap) row = deleteMap.idToRow[itemId]; + + if(!row) { + var itemNum = _getRealItemId(eventInfo, repeaterId, Number(itemId)); + row = repeaterToCurrentDataSet[repeaterId][itemNum]; + } + // Default to obj with text as empty string, as we don't generate the data for empty props + var data = row[propName] || { text: '' }; + //For now text is always the default. May change this to depend on context. + switch(type) { + case 'data': return data.type == 'text' ? data.text : data + case 'img': return (data.img && data.img[$ax.adaptive.getSketchKey()]) || data.text; + default: return (type && data[type]) || data.text; + } + //return type == 'data' && data.type != 'text' ? data : (type && data[type]) || data['text']; + }; + _repeaterManager.getData = _getDataFromDataSet; + + _repeaterManager.hasData = function(id, propName) { + if(!_getItemIdFromElementId(id)) return false; + var repeaterId = $ax.getParentRepeaterFromScriptId(_getScriptIdFromElementId(id)); + return Boolean(repeaterToCurrentDataSet[repeaterId] && repeaterToCurrentDataSet[repeaterId].props.indexOf(propName) != -1); + }; + + var _getEventDeleteData = function(eventInfo, repeaterId) { + var repeaterDeleteMap = eventInfo.repeaterDeleteMap; + if(!repeaterDeleteMap) repeaterDeleteMap = eventInfo.repeaterDeleteMap = {}; + + var myDeleteMap = repeaterDeleteMap[repeaterId]; + if(!myDeleteMap) { + myDeleteMap = repeaterDeleteMap[repeaterId] = {}; + myDeleteMap.deletedIds = []; + myDeleteMap.idToRow = {}; + } + + return myDeleteMap; + }; + + var _getRealItemId = function(eventInfo, repeaterId, itemId) { + var deletedBefore = 0; + var map = eventInfo.repeaterDeleteMap && eventInfo.repeaterDeleteMap[repeaterId]; + var deletedIds = map && map.deletedIds; + if(!deletedIds) return itemId - 1; + + for(var i = 0; i < deletedIds.length; i++) if (deletedIds[i] < itemId) deletedBefore++; + return itemId - deletedBefore - 1; + } + + var _addItemToDataSet = function(repeaterId, row, itemEventInfo) { + itemEventInfo.data = true; + var oldTarget = itemEventInfo.targetElement; + itemEventInfo.targetElement = repeaterId; + var dataSet = repeaterToLocalDataSet[repeaterId]; + + for(var propName in row) { + if(!row.hasOwnProperty(propName)) continue; + var prop = row[propName]; + if(prop.type == 'literal') { + var retval = $ax.expr.evaluateExpr(prop.literal, itemEventInfo); + if(typeof (retval) == 'string' || retval instanceof Date) retval = { type: 'text', text: retval }; + row[propName] = retval; + } + } + + itemEventInfo.targetElement = oldTarget; + dataSet[dataSet.length] = row; + itemEventInfo.data = false; + }; + _repeaterManager.addItem = _addItemToDataSet; + + var _deleteItemsFromDataSet = function(repeaterId, eventInfo, type, rule) { + var dataSet = repeaterToCurrentDataSet[repeaterId]; + var deleteDataMap = _getEventDeleteData(eventInfo, repeaterId); + var items; + + // Should always be this, marked, or rule. + if(type == 'this') items = [_getItemIdFromElementId(eventInfo.srcElement)]; + else if(type == 'marked') items = $ax.deepCopy(repeaterToEditItems[repeaterId]); + else { + // This should be rule + var visibleData = repeaterToCurrentDataSet[repeaterId]; + items = []; + var oldTarget = eventInfo.targetElement; + for(var i = 0; i < visibleData.length + deleteDataMap.deletedIds.length; i++) { + var index = i + 1; + if(deleteDataMap.deletedIds.indexOf(index) != -1) continue; + + eventInfo.targetElement = _createElementId(repeaterId, index); + if($ax.expr.evaluateExpr(rule, eventInfo).toLowerCase() != 'true') continue; + items.push(index); + } + eventInfo.targetElement = oldTarget; + } + // Want them decending + items.sort(function(a, b) { return b - a; }); + var editItems = repeaterToEditItems[repeaterId]; + + for(i = 0; i < items.length; i++) { + var itemId = items[i]; + + // Don't delete already deletedItem + if(deleteDataMap.deletedIds.indexOf(itemId) != -1) continue; + + var deletedRow = $ax.splice(dataSet, _getRealItemId(eventInfo, repeaterId, itemId), 1)[0]; + deleteDataMap.deletedIds.push(itemId); + deleteDataMap.idToRow[itemId] = deletedRow; + for(var j = editItems.length - 1; j >= 0; j--) { + var editItem = editItems[j]; + if(editItem == itemId) $ax.splice(editItems, j, 1); + else if(editItem > itemId) editItems[j] = editItem - 1; + } + } + }; + _repeaterManager.deleteItems = _deleteItemsFromDataSet; + + var _updateEditItemsInDataSet = function(repeaterId, propMap, eventInfo, type, rule) { + var oldTarget = eventInfo.targetElement; + var dataSet = repeaterToCurrentDataSet[repeaterId]; + var items; + + // Should always be this, marked, or rule. + if(type == 'this') items = [_getItemIdFromElementId(eventInfo.srcElement)]; + else if(type == 'marked') items = repeaterToEditItems[repeaterId]; + else { + // This should be rule + var currData = repeaterToCurrentDataSet[repeaterId]; + items = []; + oldTarget = eventInfo.targetElement; + for(var i = 0; i < currData.length; i++) { + var index = i + 1; + eventInfo.targetElement = _createElementId(repeaterId, index); + if($ax.expr.evaluateExpr(rule, eventInfo).toLowerCase() != 'true') continue; + items.push(index); + } + eventInfo.targetElement = oldTarget; + } + + eventInfo.data = true; + for(var prop in propMap) { + if(!propMap.hasOwnProperty(prop)) continue; + for(i = 0; i < items.length; i++) { + var data = propMap[prop]; + var item = items[i]; + if(data.type == 'literal') { + eventInfo.targetElement = _createElementId(repeaterId, item); + data = $ax.expr.evaluateExpr(data.literal, eventInfo); + if(typeof (data) == 'object' && data.isWidget) data = data.text; + if(typeof (data) == 'string') data = { type: 'text', text: data }; + } + dataSet[_getRealItemId(eventInfo, repeaterId, item)][prop] = data; + } + } + eventInfo.targetElement = oldTarget; + eventInfo.data = false; + }; + _repeaterManager.updateEditItems = _updateEditItemsInDataSet; + + var _getAllItemIds = function(repeaterId) { + var retval = []; + var currDataSet = repeaterToCurrentDataSet[repeaterId]; + for(var i = 0; i < currDataSet.length; i++) retval.push(i + 1); + return retval; + }; + _repeaterManager.getAllItemIds = _getAllItemIds; + + var _addEditItemToRepeater = function(repeaterId, itemIds) { + for(var i = 0; i < itemIds.length; i++) { + var itemId = Number(itemIds[i]); + var items = repeaterToEditItems[repeaterId]; + if(items.indexOf(itemId) == -1) items[items.length] = itemId; + } + }; + _repeaterManager.addEditItems = _addEditItemToRepeater; + + var _removeEditItemFromRepeater = function(repeaterId, itemIds) { + for(var i = 0; i < itemIds.length; i++) { + var itemId = itemIds[i]; + var items = repeaterToEditItems[repeaterId]; + var index = items.indexOf(Number(itemId)); + if(index != -1) $ax.splice(items, index, 1); + } + }; + _repeaterManager.removeEditItems = _removeEditItemFromRepeater; + + _repeaterManager.isEditItem = function(repeaterId, itemId) { + var items = repeaterToEditItems[repeaterId]; + return items.indexOf(Number(itemId)) != -1; + }; + + var _createElementId = function(scriptId, itemId) { + if(!itemId) return scriptId; + var i = scriptId.indexOf('_'); + var sections = i > -1 ? [scriptId.substring(0, i), scriptId.substring(i + 1)] : [scriptId]; + var retval = sections[0] + '-' + itemId; + return sections.length > 1 ? retval + '_' + sections[1] : retval; + }; + _repeaterManager.createElementId = _createElementId; + + var _getElementId = function(scriptId, childId) { + var elementId = scriptId; + if($ax.getParentRepeaterFromScriptId(scriptId)) { + // Must be in the same item as the child + var itemId = $ax.repeater.getItemIdFromElementId(childId); + elementId = $ax.repeater.createElementId(scriptId, itemId); + } + return elementId; + }; + _repeaterManager.getElementId = _getElementId; + + var _getScriptIdFromElementId = function(elementId) { + if(!elementId) return elementId; + var sections = elementId.split('-'); + var retval = sections[0]; + if(sections.length <= 1) return retval; + sections = sections[1].split('_'); + return sections.length > 1 ? retval + '_' + sections[1] : retval; + }; + _repeaterManager.getScriptIdFromElementId = _getScriptIdFromElementId; + + var _getItemIdFromElementId = function(elementId) { + var sections = elementId.split('-'); + if(sections.length < 2) return ''; + sections = sections[1].split('_'); + return sections[0]; + }; + _repeaterManager.getItemIdFromElementId = _getItemIdFromElementId; + + // TODO: Just inline this if we keep it this way. + var _applySuffixToElementId = function(id, suffix) { + return id + suffix; + // return _createElementId(_getScriptIdFromElementId(id) + suffix, _getItemIdFromElementId(id)); + }; + _repeaterManager.applySuffixToElementId = _applySuffixToElementId; + + var _removeSuffixFromElementId = function (id) { + var suffixId = id.indexOf('_'); + if(suffixId != -1) return id.substr(0, suffixId); + + var partId = id.indexOf('p'); + if(partId != -1) return _createElementId(id.substr(0, partId), _getItemIdFromElementId(id)); // item id is after part, but before suffix + + return id; + } + _repeaterManager.removeSuffixFromElementId = _removeSuffixFromElementId; + + // var _getRepeaterSize = function(repeaterId) { + // var itemCount = ($ax.getItemIdsForRepeater(repeaterId) || []).length; + // if(itemCount == 0) return { width: 0, height: 0 }; + + // var repeater = $obj(repeaterId); + // // Width and height per item; + // var width = repeater.width; + // var height = repeater.height; + + // var viewId = $ax.adaptive.currentViewId || ''; + // var widthIncrement = width + _getAdaptiveProp(repeater.repeaterPropMap, 'horizontalSpacing', viewId); + // var heightIncrement = height + _getAdaptiveProp(repeater.repeaterPropMap, 'verticalSpacing', viewId); + + // var wrap = _getAdaptiveProp(repeater.repeaterPropMap, 'wrap', viewId); + // var vertical = _getAdaptiveProp(repeater.repeaterPropMap, 'vertical', viewId); + + // if(wrap == -1 || itemCount <= wrap) { + // if(vertical) height += heightIncrement * (itemCount - 1); + // else width += widthIncrement * (itemCount - 1); + // } else { + // var primaryDim = wrap; + // var secondaryDim = Math.ceil(itemCount / primaryDim); + + // if(vertical) { + // height += heightIncrement * (primaryDim - 1); + // width += widthIncrement * (secondaryDim - 1); + // } else { + // width += widthIncrement * (primaryDim - 1); + // height += heightIncrement * (secondaryDim - 1); + // } + // } + // return { width: width, height: height }; + // }; + // _repeaterManager.getRepeaterSize = _getRepeaterSize; + +}); + +// ******* Dynamic Panel Manager ******** // +$axure.internal(function($ax) { + // TODO: Probably a lot of the dynamic panel functions from pagescript should be moved here at some point... + var _dynamicPanelManager = $ax.dynamicPanelManager = {}; + + var _isIdFitToContent = _dynamicPanelManager.isIdFitToContent = function(id) { + var obj = $obj(id); + if (!obj || !$ax.public.fn.IsDynamicPanel(obj.type) || !obj.fitToContent) return false; + + var jpanel = $jobj(id); + return !jpanel.attr('data-notfit'); + }; + + //this function fit parent panel, also check for parent layer or repeaters + var _fitParentPanel = function (widgetId) { + + var parentLayer = getParentLayer(widgetId); + if(parentLayer) { + if(_updateLayerRectCache(parentLayer)) _fitParentPanel(parentLayer); + return; + } + + // Find parent panel if there is one. + var parentPanelInfo = getParentPanel(widgetId); + if(parentPanelInfo) { + var parentId = parentPanelInfo.parent; + _updateMobileScroll(parentId, parentPanelInfo.stateId, true); + if(_updateFitPanel(parentId, parentPanelInfo.state)) _fitParentPanel(parentId); + return; + } + + // Otherwise, try to get parent repeater + var parentRepeaterId = $ax.getParentRepeaterFromElementId(widgetId); + var repeaterObj = $obj(parentRepeaterId); + if (repeaterObj && widgetId != parentRepeaterId && repeaterObj.repeaterPropMap.fitToContent) { + var itemId = $ax.repeater.getItemIdFromElementId(widgetId); + var containerId = $ax.repeater.createElementId(parentRepeaterId, itemId); + var childrenRect = $ax('#' + containerId).childrenBoundingRect(); + $ax.repeater.setItemSize(parentRepeaterId, itemId, childrenRect.right, childrenRect.bottom); + return; + } + + $ax.adaptive.updateMobileScrollOnBody(); + }; + _dynamicPanelManager.fitParentPanel = _fitParentPanel; + + var _updateMobileScroll = _dynamicPanelManager.updateMobileScroll = function (panelId, stateId, blockResetScroll) { + if (!panelId) return false; + + // Only update scroll if panel is scrollable + if ($ax.dynamicPanelManager.isIdFitToContent(panelId)) return false; + var obj = $obj(panelId); + if (!obj || obj.scrollbars.toLowerCase() == 'none') return false; + + var stateQuery = $jobj(stateId); + $ax.adaptive.removeNiceScroll(stateQuery, blockResetScroll); + + //check if the page is in mobile mode + if (!$ax.adaptive.isDeviceMode()) { + stateQuery.css('cursor', ''); + return false; + } + + var stateContentId = stateId + '_content'; + var childrenRect = $ax('#' + stateContentId).childrenBoundingRect(); + var size = { width: childrenRect.right, height: childrenRect.bottom }; + + var $stateContent = $('#' + stateContentId); + $stateContent.css({ 'height': size.height + 'px', 'width': size.width + 'px' }); + + // Apply niceScroll and update cursor + if (obj.isExpo) { + var headerHeight = obj.headerHeight ? obj.headerHeight : 0; + var footerHeight = obj.footerHeight ? obj.footerHeight : 0; + + $ax.adaptive.addNiceScroll(stateQuery, { touchbehavior: true, bouncescroll: false, grabcursorenabled: false, railmargin: { top: headerHeight, bottom: footerHeight }, scrollbarid: stateId + "-sb" }); + stateQuery.find('.nicescroll-rails').css('margin-top', headerHeight + 'px'); + } else { + $ax.adaptive.addNiceScroll(stateQuery, { emulatetouch: true, horizrailenabled: obj.scrollbars != 'verticalAsNeeded' }, blockResetScroll); + } + + stateQuery.css('cursor', 'url(resources/css/images/touch.cur), auto'); + stateQuery.css('cursor', 'url(resources/css/images/touch.svg) 32 32, auto'); + } + + _dynamicPanelManager.initMobileScroll = function () { + var scrollable = []; + $ax('*').each(function (obj, elementId) { + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + if ($ax.public.fn.IsDynamicPanel(obj.type) && obj.scrollbars != 'None' && obj.scrollbars != 'none' && !$ax.visibility.isElementIdLimboOrInLimboContainer(scriptId)) { + scrollable[scrollable.length] = elementId; + } + }); + for (var i = scrollable.length - 1; i >= 0; i--) { + var panelId = scrollable[i]; + var stateId = $ax.repeater.applySuffixToElementId(panelId, '_state0'); + _updateMobileScroll(panelId, stateId, true); + } + }; + + + _dynamicPanelManager.initialize = function() { + $axure.resize(_handleResize); + $(window).scroll(_handleScroll); + }; + + var percentPanelToLeftCache = []; + var percentPanelsInitialized = false; + var _handleResize = function() { + if(percentPanelsInitialized) { + for(var key in percentPanelToLeftCache) { + //could optimize to only update non-contained panels + _updatePanelPercentWidth(key); + } + } else { + $ax('*').each(function(obj, elementId) { + if(_isPercentWidthPanel(obj)) _updatePanelPercentWidth(elementId); + }); + percentPanelsInitialized = true; + } + _adjustFixedCenter(); + }; + + var _isPercentWidthPanel = _dynamicPanelManager.isPercentWidthPanel = function(obj) { + return obj && $ax.public.fn.IsDynamicPanel(obj.type) && obj.percentWidth; + }; + + _dynamicPanelManager.updatePanelContentPercentWidth = function(elementId) { + // if(_isPercentWidthPanel($obj(elementId))) return; + var stateChildrenQuery = $jobj(elementId).children('.panel_state'); + stateChildrenQuery.children('.panel_state_content').each( + function() { + $(this).children('.ax_dynamic_panel').each( + function() { _updatePanelPercentWidth(this.id); } + ); + } + ); + }; + + _dynamicPanelManager.updatePercentPanelCache = function(query) { + query.each(function(obj, elementId) { + if(_isPercentWidthPanel(obj)) { + if(_updatePercentPanelToLeftCache(obj, elementId, true)) { + _updatePanelPercentWidth(elementId); + } + } + }); + }; + + var _handleScroll = function () { + _adjustFixedCenter(); + }; + + var fixedCenterPanels = []; + var fixedCenterPanelsInitialized = false; + + var _adjustFixedCenter = function () { + + if (!fixedCenterPanelsInitialized) { + $axure(function(diagramObject) { + return diagramObject.fixedHorizontal && diagramObject.fixedHorizontal == 'center' && !diagramObject.percentWidth; + }) + .each(function (diagramObject, elementId) { + fixedCenterPanels.push(elementId); + }); + fixedCenterPanelsInitialized = true; + } + + for (var i = 0; i < fixedCenterPanels.length; i++) { + var elementId = fixedCenterPanels[i]; + var boundingRect = $ax('#' + elementId).offsetBoundingRect(); + var left = boundingRect.left; + + var win = $(window); + var winWidth = win.width(); + var elementQuery = $('#' + elementId); + + if (left >= 0 && winWidth >= boundingRect.width) { + elementQuery.css('left', '50%'); + continue; + } + + var leftMargin = $ax.getNumFromPx(elementQuery.css('margin-left')); + var newLeft = -leftMargin; + elementQuery.css('left', newLeft + 'px'); + } + }; + + _dynamicPanelManager.resetFixedPanel = function(obj, domElement) { + if(obj.fixedHorizontal == 'center') domElement.style.marginLeft = ""; + if(obj.fixedVertical == 'middle') domElement.style.marginTop = ""; + }; + + _dynamicPanelManager.resetAdaptivePercentPanel = function(obj, domElement) { + if(!_isPercentWidthPanel(obj)) return; + + if(obj.fixedHorizontal == 'center') domElement.style.marginLeft = ""; + else if(obj.fixedHorizontal == 'right') domElement.style.width = ""; + }; + + var _updatePercentPanelToLeftCache = function(obj, elementId, overwrite) { + var wasUpdated = false; + var jObj = $jobj(elementId); + var axObj = $ax('#' + elementId); + if(percentPanelToLeftCache[elementId] == undefined || overwrite) { + if (obj.fixedHorizontal == 'center') percentPanelToLeftCache[elementId] = $ax.getNumFromPx(jObj.css('margin-left')); + else if (obj.fixedHorizontal == 'right') percentPanelToLeftCache[elementId] = axObj.width() + $ax.getNumFromPx(jObj.css('right')); + else percentPanelToLeftCache[elementId] = $ax.getNumFromPx(jObj.css('left')); + wasUpdated = true; + } + + if(obj.fixedHorizontal == 'right' && _isIdFitToContent(elementId)) { + //var fitWidth = getContainerSize($ax.visibility.GetPanelState(elementId) + '_content').width; + var containerId = $ax.visibility.GetPanelState(elementId) + '_content'; + var childrenRect = $ax('#' + containerId).childrenBoundingRect(); + var fitWidth = childrenRect.right; + percentPanelToLeftCache[elementId] = fitWidth + $ax.getNumFromPx(jObj.css('right')); + wasUpdated = true; + } + return wasUpdated; + }; + + var _updatePanelPercentWidth = _dynamicPanelManager.updatePanelPercentWidth = function(elementId) { + var obj = $obj(elementId); + if(!_isPercentWidthPanel(obj)) return; + + _updatePercentPanelToLeftCache(obj, elementId, false); + + var width; + var x; + + if(obj.fixedHorizontal) { + x = 0; + width = $(window).width(); + } else { + var parentPanelInfo = getParentPanel(elementId); + if(parentPanelInfo) { + var parentId = parentPanelInfo.parent; + width = $ax('#' + parentId).width(); + var parentObj = $obj(parentId); + if(parentObj.percentWidth) { + var stateId = $ax.repeater.applySuffixToElementId(parentId, '_state' + parentPanelInfo.state); + var stateContentId = stateId + '_content'; + x = -$ax.getNumFromPx($jobj(stateContentId).css('margin-left')); + } else x = 0; + } else { + var parentRepeater = $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(elementId)); + if(parentRepeater) { + var itemId = $ax.repeater.getItemIdFromElementId(elementId); + var itemContainerId = $ax.repeater.createElementId(parentRepeater, itemId); + x = 0; + width = $ax('#' + itemContainerId).width(); + } else { + var $window = $(window); + width = $window.width(); + var bodyLeft = $ax.getNumFromPx($('body').css('left')); + var bodyWidth = $ax.getNumFromPx($('body').css('width')); + var isCenter = $ax.adaptive.getPageStyle().pageAlignment == 'center'; + width = Math.max(width, bodyWidth); + x = isCenter ? -(width - bodyWidth) / 2 - bodyLeft : 0; + } + } + } + + var jObj = $jobj(elementId); + if(obj.fixedHorizontal == 'left') jObj.css('left', x + 'px'); + else if(obj.fixedHorizontal == 'center') { + jObj.css('left', x + 'px'); + jObj.css('margin-left', 0 + 'px'); + } else jObj.css('left', x + 'px'); + + jObj.css('width', width + 'px'); + + $ax.visibility.setResizedSize(elementId, width, $ax('#' + elementId).height()); + + var panelLeft = percentPanelToLeftCache[elementId]; + var stateParent = jObj; + while(stateParent.children()[0].id.indexOf($ax.visibility.CONTAINER_SUFFIX) != -1) stateParent = stateParent.children(); + var stateChildrenQuery = stateParent.children('.panel_state'); + stateChildrenQuery.css('width', width + 'px'); + + if(obj.fixedHorizontal == 'center') + stateChildrenQuery.children('.panel_state_content').css('left', '50%').css('margin-left', panelLeft + 'px'); + else if(obj.fixedHorizontal == 'right') + stateChildrenQuery.children('.panel_state_content').css('left', width - panelLeft + 'px'); + else stateChildrenQuery.children('.panel_state_content').css('margin-left', panelLeft - x + 'px'); + }; + + + _dynamicPanelManager.updateParentsOfNonDefaultFitPanels = function () { + $ax('*').each(function (diagramObject, elementId) { + if(!$ax.public.fn.IsDynamicPanel(diagramObject.type) || !diagramObject.fitToContent) return; + if($ax.visibility.isElementIdLimboOrInLimboContainer(elementId)) return; + + var stateId = $ax.visibility.GetPanelState(elementId); + if(stateId != $ax.repeater.applySuffixToElementId(elementId, '_state0')) _fitParentPanel(elementId); + }); + }; + + _dynamicPanelManager.updateAllLayerSizeCaches = function() { + var fitToContent = []; + var layers = []; + $ax('*').each(function (obj, elementId) { + var isLayer = $ax.public.fn.IsLayer(obj.type); + if(!isLayer) return; + if($ax.visibility.isElementIdLimboOrInLimboContainer(elementId)) return; + layers[layers.length] = elementId; + }); + for(var i = layers.length - 1; i >= 0; i--) { + var layerId = layers[i]; + _updateLayerRectCache(layerId); + } + }; + + //_dynamicPanelManager.updateAllFitPanelsAndLayerSizeCaches = function() { + // var fitToContent = []; + // var layers = []; + // $ax('*').each(function (obj, elementId) { + // var isFitPanel = $ax.public.fn.IsDynamicPanel(obj.type) && obj.fitToContent; + // var isLayer = $ax.public.fn.IsLayer(obj.type); + // if(!isFitPanel && !isLayer) return; + // if($ax.visibility.isElementIdLimboOrInLimboContainer(elementId)) return; + + // if(isFitPanel) { + // fitToContent[fitToContent.length] = elementId; + // } else if(isLayer) { + // layers[layers.length] = elementId; + // } + // }); + // for(var i = fitToContent.length - 1; i >= 0; i--) { + // var panelId = fitToContent[i]; + // var stateCount = $obj(panelId).diagrams.length; + // for(var j = 0; j < stateCount; j++) { + // $ax.dynamicPanelManager.setFitToContentCss(panelId, true); + // _updateFitPanel(panelId, j, true); + // } + // } + // for(var i = layers.length - 1; i >= 0; i--) { + // var layerId = layers[i]; + // _updateLayerSizeCache(layerId); + // } + //}; + + //var _getCachedLayerRect = function (elementId) { + // var element = document.getElementById(elementId); + // var rect = {}; + // rect.width = Number(element.getAttribute('data-width')); + // rect.height = Number(element.getAttribute('data-height')); + // rect.x = Number(element.getAttribute('data-left')); + // rect.y = Number(element.getAttribute('data-top')); + // return rect; + //} + + var _updateLayerRectCache = function (elementId) { + //var oldRect = _getCachedLayerRect(elementId); + + var axObj = $ax('#' + elementId); + var oldRect = axObj.offsetBoundingRect(); + + var childrenRect = axObj.childrenBoundingRect(); + var size = childrenRect.size; + var loc = childrenRect.location; + //var size = axObj.size(); + //var loc = {}; + //loc.x = axObj.locRelativeIgnoreLayer(false); + //loc.y = axObj.locRelativeIgnoreLayer(true); + + var sizeChange = oldRect.width != size.width || oldRect.height != size.height; + var locChange = oldRect.x != loc.x || oldRect.y != loc.y; + if(sizeChange || locChange) { + //var element = document.getElementById(elementId); + if(sizeChange) { + //element.setAttribute('data-width', size.width); + //element.setAttribute('data-height', size.height); + $ax.visibility.setResizedSize(elementId, size.width, size.height); + $ax.event.raiseSyntheticEvent(elementId, 'onResize'); + } + if(locChange) { + //element.setAttribute('data-left', loc.x); + //element.setAttribute('data-top', loc.y); + $ax.visibility.setMovedLocation(elementId, loc.x, loc.y); + $ax.event.raiseSyntheticEvent(elementId, 'onMove'); + } + return true; + } + return false; + } + + _dynamicPanelManager.setFitToContentCss = function(elementId, fitToContent, oldWidth, oldHeight) { + + if($ax.dynamicPanelManager.isIdFitToContent(elementId) == fitToContent) return; + + var panel = $jobj(elementId); + var stateCss; + var scrollbars = $obj(elementId).scrollbars; + + if(fitToContent) { + panel.attr('style', ''); + panel.removeAttr('data-notfit'); + stateCss = {}; + stateCss.position = 'relative'; + if(scrollbars != 'none') { + stateCss.overflow = 'visible'; + stateCss['-webkit-overflow-scrolling'] = 'visible'; + } + if(scrollbars == 'verticalAsNeeded') { + stateCss['overflow-x'] = 'visible'; + stateCss['-ms-overflow-x'] = 'visible'; + } else if(scrollbars == 'horizontalAsNeeded') { + stateCss['overflow-y'] = 'visible'; + stateCss['-ms-overflow-y'] = 'visible'; + } + panel.children().css(stateCss); + } else { + panel.attr('data-notfit', 'true'); + var panelCss = { width: oldWidth, height: oldHeight }; + stateCss = { width: oldWidth, height: oldHeight }; + panelCss.overflow = 'hidden'; + stateCss.position = 'absolute'; + if(scrollbars != 'none') { + stateCss.overflow = 'auto'; + stateCss['-webkit-overflow-scrolling'] = 'touch'; + } + if(scrollbars == 'verticalAsNeeded') { + stateCss['overflow-x'] = 'hidden'; + stateCss['-ms-overflow-x'] = 'hidden'; + } else if(scrollbars == 'horizontalAsNeeded') { + stateCss['overflow-y'] = 'hidden'; + stateCss['-ms-overflow-y'] = 'hidden'; + } + panel.css(panelCss); + panel.children().css(stateCss); + } + }; + + var _getShownStateId = function (id) { + var obj = $obj(id); + if (!obj || !$ax.public.fn.IsDynamicPanel(obj.type)) return id; + + var children = $ax.visibility.applyWidgetContainer(id, true, false, true).children(); + for (var i = 0; i < children.length; i++) { + var child = children[i]; + while ($ax.visibility.isContainer(child.id)) child = $(child).children()[0]; + if (child && child.style && child.style.display != 'none') return child.id; + } + return id; + }; + + var _getShownStateObj = function(id) { return $ax('#' + _getShownStateId(id));} + + _dynamicPanelManager.getShownState = function (id) { return $jobj(_getShownStateId(id)); }; + + var _getClamp = function(id) { + var obj = $obj(id); + if(!obj) return $ax('#' + id); + if ($ax.public.fn.IsDynamicPanel(obj.type)) return _getShownStateObj(id); + return $ax('#' + id); + }; + + var _updateFitPanel = function(panelId, stateIndex) { + if(!panelId) return false; + + // Only fit if fitToContent is true + if(!$ax.dynamicPanelManager.isIdFitToContent(panelId)) return false; + + // Traverse through children to find what size it should be. + var stateId = $ax.repeater.applySuffixToElementId(panelId, '_state' + stateIndex); + + var stateContentId = stateId + '_content'; + var stateQuery = $jobj(stateId); + + //var size = getContainerSize(stateContentId); + var childrenRect = $ax('#' + stateContentId).childrenBoundingRect(); + var size = {width: childrenRect.right, height: childrenRect.bottom}; + + // Skip if size hasn't changed + var oldWidth = stateQuery.width(); + var oldHeight = stateQuery.height(); + if(oldWidth == size.width && oldHeight == size.height) return false; + + var isPercentWidth = $obj(panelId).percentWidth; + if(!isPercentWidth) stateQuery.width(size.width); + stateQuery.height(size.height); + + //updatePercentWidth on all child panels + $jobj(stateContentId).children('.ax_dynamic_panel').each( + function() { _updatePanelPercentWidth(this.id); } + ); + + //do the following only if it is the current state + if(stateId != $ax.visibility.GetPanelState(panelId)) return false; + + //var panelQuery = $jobj(panelId); + //if (!isPercentWidth) panelQuery.attr('data-width', size.width); + //panelQuery.attr('data-height', size.height); + $ax.visibility.setResizedSize(panelId, isPercentWidth ? $ax('#' + panelId).width() : size.width, size.height); + + _adjustFixed(panelId, oldWidth, oldHeight, size.width, size.height); + + $ax.event.raiseSyntheticEvent(panelId, 'onResize'); + $ax.flyoutManager.updateFlyout(panelId); + + return true; + }; + + // widgetId is the one that crawls up masters until it finds a parent panel, targetId is the original widgetId (not the crawling master) + // finds the immediate parent panel and crawls up through masters but not repeaters + var getParentPanel = function(widgetId, path, targetId) { + path = path || $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(widgetId)); + + var obj = $obj(widgetId); + if(obj.parentDynamicPanel) { + path[path.length - 1] = obj.parentDynamicPanel; + var parentId = $ax.getScriptIdFromPath(path); + if(!parentId) return undefined; + parentId = $ax.repeater.getElementId(parentId, widgetId); + var parentObj = $obj(parentId); + var retVal = { parent: parentId }; + for(var i = 0; i < parentObj.diagrams.length; i++) { + var stateId = $ax.repeater.applySuffixToElementId(parentId, '_state' + i); + var stateQuery = $jobj(stateId); + if(stateQuery.find('#' + (targetId || widgetId)).length != 0) { + retVal.state = i; + retVal.stateId = stateId; + break; + } + } + return retVal; + } + + if(path.length == 1) return undefined; + + path.pop(); + var parentMaster = $ax.getScriptIdFromPath(path); + if(!parentMaster) return undefined; + parentMaster = $ax.repeater.getElementId(parentMaster, widgetId); + + //check if the master is in the same repeater as the widgetId widget + var parentMasterItemId = $ax.repeater.getItemIdFromElementId(parentMaster); + var widgetItemId = $ax.repeater.getItemIdFromElementId(widgetId); + if(parentMasterItemId != widgetItemId) return undefined; + + return getParentPanel(parentMaster, path, targetId || widgetId); + }; + + // finds the immediate parent layer and crawls up through masters but not repeaters or panels + var getParentLayer = function (widgetId, path) { + path = path || $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(widgetId)); + + //gets immediate parent layer only + var layerId = $ax.getLayerParentFromElementId(widgetId); + if(layerId) return layerId; + + if(path.length == 1) return undefined; + + path.pop(); + var parentMaster = $ax.getScriptIdFromPath(path); + if(!parentMaster) return undefined; + parentMaster = $ax.repeater.getElementId(parentMaster, widgetId); + + //check if the master is in the same panel as the widgetId widget + var widgetParentPanel = getParentPanel(widgetId); + if(widgetParentPanel) { + var parentMasterParentPanel = getParentPanel(parentMaster); + if(!parentMasterParentPanel || widgetParentPanel.parent != parentMasterParentPanel.parent) return undefined; + } + + //check if the master is in the same repeater as the widgetId widget + var parentMasterItemId = $ax.repeater.getItemIdFromElementId(parentMaster); + var widgetItemId = $ax.repeater.getItemIdFromElementId(widgetId); + if(parentMasterItemId != widgetItemId) return undefined; + + return getParentLayer(parentMaster, path); + }; + + //// TODO: May be a better location for this. Used currently for rdo and panel state containers + //var getContainerSize = function(containerId) { + // var containerQuery = containerId ? $jobj(containerId) : $('#base'); + // var children = containerQuery.children(); + // // Default size + // var size = { width: 0, height: 0 }; + // for(var i = 0; i < children.length; i++) { + // var child = $(children[i]); + // var childId = child.attr('id'); + // //var axChild = $ax('#' + childId).width(); + + // var childObj = $obj(childId); + // if(!childObj) { + // // On the body there are some children that should be ignored, as they are not objects. + // if(!child.hasClass('basiclink') || child.get(0).tagName.toLowerCase() != 'a') continue; + + // // Otherwise it should be a basic link + // var linkChildren = child.children(); + // if(!linkChildren.length) continue; + // child = $(linkChildren[0]); + // childId = child.attr('id'); + // childObj = $obj(childId); + // } + + // // Ignore fixed + // if(!childId || $ax.visibility.limboIds[childId] || !$ax.visibility.IsIdVisible(childId) + // || $ax.public.fn.IsDynamicPanel(childObj.type) && childObj.fixedHorizontal) continue; + + // var boundingRect = $ax.public.fn.getWidgetBoundingRect(childId); + // var position = { left: boundingRect.left, top: boundingRect.top }; + // var width = boundingRect.width; + // var height = boundingRect.height; + + // if($ax.public.fn.IsMaster(childObj.type)) { + // var masterSize = getContainerSize(childId); + // width = masterSize.width; + // height = masterSize.height; + // // } else if($ax.public.fn.IsRepeater(childObj.type)) { + // // var repeaterSize = $ax.repeater.getRepeaterSize(childId); + // // width = repeaterSize.width; + // // height = repeaterSize.height; + + // // if(width == 0 && height == 0) continue; + + // // position.left += childObj.x; + // // position.top += childObj.y; + // } else if ($ax.public.fn.IsDynamicPanel(childObj.type)) { + // if($ax.dynamicPanelManager.isIdFitToContent(childId)) { + // var stateQuery = $jobj($ax.visibility.GetPanelState(childId)); + // width = stateQuery.width(); + // height = stateQuery.height(); + // } + // } + + // size.width = Math.max(size.width, position.left + width); + // size.height = Math.max(size.height, position.top + height); + // } + + // return size; + //}; + //_dynamicPanelManager.getContainerSize = getContainerSize; + + var _adjustFixed = _dynamicPanelManager.adjustFixed = function(panelId, oldWidth, oldHeight, width, height) { + var loc = _getFixedPosition(panelId, oldWidth, oldHeight, width, height); + if(loc) { + $ax.action.addAnimation(panelId, $ax.action.queueTypes.move, function() { + $ax.move.MoveWidget(panelId, loc[0], loc[1], { easing: 'none', duration: 0 }, false, null, true); + }); + } + }; + + var _getFixedPosition = _dynamicPanelManager.getFixedPosition = function(panelId, oldWidth, oldHeight, width, height) { + var panelObj = $obj(panelId); + var x = 0; + var y = 0; + if(panelObj.fixedHorizontal == 'center') { + x = (oldWidth - width) / 2; + } + if(panelObj.fixedVertical == 'middle') { + y = (oldHeight - height) / 2; + } + return x == 0 && y == 0 ? undefined : [x, y]; + }; + + _dynamicPanelManager.getFixedInfo = function(panelId) { + var panelObj = $obj(panelId); + if (!panelObj || !$ax.public.fn.IsDynamicPanel(panelObj.type)) return {}; + var jobj = $jobj(panelId); + if(jobj.css('position') == 'absolute') return {}; + + var info = {}; + var horizontal = panelObj.fixedHorizontal; + if(!horizontal) return info; + + info.fixed = true; + info.horizontal = horizontal; + info.vertical = panelObj.fixedVertical; + + if (info.horizontal == 'left') info.x = $ax.getNumFromPx(jobj.css('left')); + else if (info.horizontal == 'center') info.x = $ax.getNumFromPx(jobj.css('margin-left')); + else if (info.horizontal == 'right') info.x = $ax.getNumFromPx(jobj.css('right')); + + if (info.vertical == 'top') info.y = $ax.getNumFromPx(jobj.css('top')); + else if (info.vertical == 'middle') info.y = $ax.getNumFromPx(jobj.css('margin-top')); + else if (info.vertical == 'bottom') info.y = $ax.getNumFromPx(jobj.css('bottom')); + + return info; + }; + + // Show isn't necessary if this is always done before toggling (which is currently true), but I don't want that + // change (if it happened) to break this. + var _compressToggle = function (id, vert, show, easing, duration) { + var layer = $ax.getTypeFromElementId(id) == $ax.constants.LAYER_TYPE; + var locProp = vert ? 'top' : 'left'; + var dimProp = vert ? 'height' : 'width'; + + var threshold; + var delta; + + threshold = $ax('#' + id)[locProp](true); + delta = layer ? $ax('#' + id)[dimProp]() : _getShownStateObj(id)[dimProp](); + + if(!show) { + // Need to make threshold bottom/right + threshold += delta; + // Delta is in the opposite direction + delta *= -1; + } + + _compress(id, vert, threshold, delta, easing, duration); + }; + _dynamicPanelManager.compressToggle = _compressToggle; + + // Used when setting state of dynamic panel + var _compressDelta = function(id, oldState, newState, vert, easing, duration) { + var oldQuery = $jobj(oldState); + var newQuery = $jobj(newState); + + var thresholdProp = vert ? 'top' : 'left'; + var thresholdOffset = vert ? 'height' : 'width'; + var threshold = $ax('#' + id)[thresholdProp](true); + threshold += oldQuery[thresholdOffset](); + + var delta = newQuery[thresholdOffset]() - oldQuery[thresholdOffset](); + + var clampOffset = vert ? 'width' : 'height'; + var clampWidth = Math.max(oldQuery[clampOffset](), newQuery[clampOffset]()); + + _compress(id, vert, threshold, delta, easing, duration, clampWidth); + }; + _dynamicPanelManager.compressDelta = _compressDelta; + + var _compress = function (id, vert, threshold, delta, easing, duration, clampWidth) { + // If below, a horizantal clamp, otherwise a vertical clamp + var clamp = { + prop: vert ? 'left' : 'top', + offset: vert ? 'width' : 'height' + }; + + // Get clamp in coords relative to parent. Account for layers farther down + if($ax.getTypeFromElementId(id) == $ax.constants.LAYER_TYPE) { + clamp.start = $ax('#' + id)[clamp.prop](true); + clamp.end = clamp.start + $ax('#' + id)[clamp.offset](); + } else { + var clampLoc = $jobj(id); + if(typeof clampWidth == 'undefined') clampWidth = _getClamp(id)[clamp.offset](); + + clamp.start = $ax.getNumFromPx(clampLoc.css(clamp.prop)); + clamp.end = clamp.start + clampWidth; + } + + // If clamps, threshold, or delta is not a number, can't compress. + if (isNaN(clamp.start) || isNaN(clamp.end) || isNaN(threshold) || isNaN(delta)) return; + + // Update clamp if fixed, to account for body position (only necessary when page centered) + if($jobj(id).css('position') == 'fixed') { + var clampDelta = $('#base').position().left; + clamp.start -= clampDelta; + clamp.end -= clampDelta; + } + + if(!easing) { + easing = 'none'; + duration = 0; + } + var parent = $ax('#' + id).getParents(false, ['item', 'state', 'layer'])[0]; + var obj = parent && $ax.getObjectFromElementId($ax.repeater.removeSuffixFromElementId(parent)); + // Go until you hit a parent item or state, or a layer that is hidden to use as parent. + // Account for layer container positions as you go. + while(obj && $ax.public.fn.IsLayer(obj.type) && $ax.visibility.IsIdVisible(parent)) { + var container = $ax.visibility.applyWidgetContainer(parent, true, true); + // If layer is using container, offset is going to be necessary + if(container.length) { + var offsetX = $ax.getNumFromPx(container.css('left')); + var offsetY = $ax.getNumFromPx(container.css('top')); + var clampProp = clamp.prop == 'left' ? offsetX : offsetY; + var threshProp = clamp.prop == 'left' ? offsetY : offsetX; + threshold += threshProp; + clamp.start += clampProp; + clamp.end += clampProp; + } + + parent = $ax('#' + parent).getParents(false, ['item', 'state', 'layer'])[0]; + obj = parent && $ax.getObjectFromElementId($ax.repeater.removeSuffixFromElementId(parent)); + } + + // Add container mid push causes strange behavior because we take container into account as we go down, but if after we accounted for it, + // a container is added, that container is not accounted for with threshold and clamp values. + var layer = obj && $ax.public.fn.IsLayer(obj.type) && parent; + if(layer) { + // If your parent layer is invisible, you want to be relative to it's container. That is true already if it has a container, + // but if you are just adding one now, then you need to offset your values + var needsOffset = !$jobj(layer + '_container').length && !$ax.visibility.IsIdVisible(layer); + $ax.visibility.pushContainer(layer, false); + if(needsOffset) { + container = $jobj(layer + '_container'); + offsetX = $ax.getNumFromPx(container.css('left')); + offsetY = $ax.getNumFromPx(container.css('top')); + clampProp = clamp.prop == 'left' ? offsetX : offsetY; + threshProp = clamp.prop == 'left' ? offsetY : offsetX; + threshold -= threshProp; + clamp.start -= clampProp; + clamp.end -= clampProp; + } + } + + // Note: If parent is body, some of these aren't widgets + if(parent && $jobj(parent + '_content').length > 0) parent = parent + '_content'; + if(parent && $jobj(parent + '_container').length > 0) parent = parent + '_container'; + _compressChildrenHelper(id, $(parent ? '#' + parent : '#base').children(), vert, threshold, delta, clamp, easing, duration); + + if(layer) $ax.visibility.popContainer(layer, false); + + // Do item push + var itemId = $ax.repeater.getItemIdFromElementId(id); + if(!itemId) return; + + var repeaterId = $ax.getParentRepeaterFromElementId(id); + // Only need to push when parent is an item directly. + if(parent != $ax.repeater.createElementId(repeaterId, itemId)) return; + + // If repeater is fit to content, then don't worry about it, it'll be handled elsewhere + if(!obj.repeaterPropMap.fitToContent) $ax.repeater.pushItems(repeaterId, itemId, delta, vert); + }; + + var _compressChildrenHelper = function (id, children, vert, threshold, delta, clamp, easing, duration, parentLayer) { + var toMove = []; + var allMove = true; + for (var i = 0; i < children.length; i++) { + var child = $(children[i]); + + // Check for basic links + if(child[0] && child[0].tagName == 'A' && child.hasClass('basiclink')) child = child.children(); + var childId = child.attr('id'); + + // TODO: Played with this a lot, went with a safer fix, but I don't like the catch all with !$obj(childId), should handle these cases explicitally. + // ann/ref suffixes should skip without turning off allMove, lightbox should be skipped, and is unclear if allMove should be turned off, I think others including container, inner_container, div, img, and text should not be hit ever. + // Don't move self, and check id to make sure it a widget and not a fixed panel + if(childId == id || !childId || childId[0] != 'u' || !$obj(childId) || $obj(childId).fixedVertical) { + // ann/ref widgets should not stop allMove, they move if their widget does, and that widget will be checked and turn this off if it doesn't move + var suffix = childId && childId.split('_')[1]; + allMove = allMove && (suffix == 'ann' || suffix == 'ref'); + continue; + } + + if ($ax.getTypeFromElementId(childId) == $ax.constants.LAYER_TYPE) { + $ax.visibility.pushContainer(childId, false); + var addSelf; + var container = $ax.visibility.applyWidgetContainer(childId, true, true); + var layerChildren = (container.length ? container : child).children(); + //if(container.length) { + var offsetX = -$ax.getNumFromPx(container.css('left')); + var offsetY = -$ax.getNumFromPx(container.css('top')); + var clampProp = clamp.prop == 'left' ? offsetX : offsetY; + var threshProp = clamp.prop == 'left' ? offsetY : offsetX; + var layerClamp = { prop: clamp.prop, offset: clamp.offset, start: clamp.start + clampProp, end: clamp.end + clampProp }; + addSelf = _compressChildrenHelper(id, layerChildren, vert, threshold + threshProp, delta, layerClamp, easing, duration, childId); + //} else addSelf = _compressChildrenHelper(id, layerChildren, vert, threshold, delta, clamp, easing, duration, childId); + + if(addSelf) toMove.push(childId); + else allMove = false; + $ax.visibility.popContainer(childId, false); + continue; + } + + var numbers = childId.substring(1).split('-'); + if(numbers.length < 1 || isNaN(Number(numbers[0])) || (numbers.length == 2 && isNaN(Number(numbers[1]))) || numbers.length > 2) continue; + + var marker, childClamp; + + var axChild = $ax('#' + childId); + var markerProp = vert ? 'top' : 'left'; + marker = Number(axChild[markerProp](true)); + childClamp = [Number(axChild[clamp.prop](true))]; + + if(parentLayer) { + var axParent = $ax('#' + parentLayer); + marker -= Number(axParent[markerProp](true)); + childClamp[0] -= Number(axParent[clamp.prop](true)); + } + + // Dynamic panels are not reporting correct size sometimes, so pull it from the state. Get shown state just returns the widget if it is not a dynamic panel. + var sizeChild = _getShownStateObj(childId); + childClamp[1] = childClamp[0] + sizeChild[clamp.offset](); + + if(isNaN(marker) || isNaN(childClamp[0]) || isNaN(childClamp[1]) || + marker < threshold || childClamp[1] <= clamp.start || childClamp[0] >= clamp.end) { + allMove = false; + continue; + } + + toMove.push(childId); + } + + if (allMove && parentLayer) { + return true; + } else { + for(var i = 0; i < toMove.length; i++) { + $ax('#' + toMove[i]).moveBy(vert ? 0 : delta, vert ? delta : 0, easing == 'none' ? {} : { duration: duration, easing: easing }); + } + } + return false; + }; + + var _parentHandlesStyles = function(id) { + var parents = $ax('#' + id).getParents(true, ['dynamicPanel', 'layer'])[0]; + if(!parents) return false; + var directParent = true; + for(var i = 0; i < parents.length; i++) { + var parentId = parents[i]; + var parentObj = $obj(parentId); + if(!parentObj.propagate) { + directParent = false; + continue; + } + return { id: parentId, direct: directParent }; + } + return false; + }; + _dynamicPanelManager.parentHandlesStyles = _parentHandlesStyles; + + var _propagateMouseOver = function(id, value) { + propagate(id, true, value); + }; + _dynamicPanelManager.propagateMouseOver = _propagateMouseOver; + + var _propagateMouseDown = function(id, value) { + propagate(id, false, value); + }; + _dynamicPanelManager.propagateMouseDown = _propagateMouseDown; + + var propagate = function(id, hover, value) { + var hoverChildren = function(children) { + if(!children) return; + for(var i = 0; i < children.length; i++) { + var elementId = children[i].id; + var obj = $obj(elementId); + if(obj == null) { + elementId = elementId.split('_')[0]; + obj = $obj(elementId); + } + if(obj == null) continue; + if (($ax.public.fn.IsDynamicPanel(obj.type) || $ax.public.fn.IsLayer(obj.type)) && !obj.propagate) continue; + + if(hover) $ax.style.SetWidgetHover(elementId, value); + else $ax.style.SetWidgetMouseDown(elementId, value); + $ax.annotation.updateLinkLocations(elementId); + + hoverChildren(children[i].children); + } + }; + hoverChildren($ax('#' + id).getChildren(true)[0].children); + }; +}); diff --git a/code/page/resources/scripts/axure/sto.js b/code/page/resources/scripts/axure/sto.js new file mode 100644 index 0000000..e9b0f86 --- /dev/null +++ b/code/page/resources/scripts/axure/sto.js @@ -0,0 +1,231 @@ + +$axure.internal(function($ax) { + var funcs = {}; + + var weekday = new Array(7); + weekday[0] = "Sunday"; + weekday[1] = "Monday"; + weekday[2] = "Tuesday"; + weekday[3] = "Wednesday"; + weekday[4] = "Thursday"; + weekday[5] = "Friday"; + weekday[6] = "Saturday"; + + funcs.getDayOfWeek = function() { + return _getDayOfWeek(this.getDay()); + }; + + var _getDayOfWeek = $ax.getDayOfWeek = function(day) { + return weekday[day]; + }; + + var month = new Array(12); + month[0] = "January"; + month[1] = "February"; + month[2] = "March"; + month[3] = "April"; + month[4] = "May"; + month[5] = "June"; + month[6] = "July"; + month[7] = "August"; + month[8] = "September"; + month[9] = "October"; + month[10] = "November"; + month[11] = "December"; + + funcs.getMonthName = function() { + return _getMonthName(this.getMonth()); + }; + + var _getMonthName = $ax.getMonthName = function(monthNum) { + return month[monthNum]; + }; + + funcs.getMonth = function() { + return this.getMonth() + 1; + }; + + funcs.addYears = function(years) { + var retVal = new Date(this.valueOf()); + retVal.setFullYear(this.getFullYear() + Number(years)); + return retVal; + }; + + funcs.addMonths = function(months) { + var retVal = new Date(this.valueOf()); + retVal.setMonth(this.getMonth() + Number(months)); + return retVal; + }; + + funcs.addDays = function(days) { + var retVal = new Date(this.valueOf()); + retVal.setDate(this.getDate() + Number(days)); + return retVal; + }; + + funcs.addHours = function(hours) { + var retVal = new Date(this.valueOf()); + retVal.setHours(this.getHours() + Number(hours)); + return retVal; + }; + + funcs.addMinutes = function(minutes) { + var retVal = new Date(this.valueOf()); + retVal.setMinutes(this.getMinutes() + Number(minutes)); + return retVal; + }; + + funcs.addSeconds = function(seconds) { + var retVal = new Date(this.valueOf()); + retVal.setSeconds(this.getSeconds() + Number(seconds)); + return retVal; + }; + + funcs.addMilliseconds = function(milliseconds) { + var retVal = new Date(this.valueOf()); + retVal.setMilliseconds(this.getMilliseconds() + Number(milliseconds)); + return retVal; + }; + + var _stoHandlers = {}; + + _stoHandlers.literal = function(sto, scope, eventInfo) { + return sto.value; + }; + + //need angle bracket syntax because var is a reserved word + _stoHandlers['var'] = function(sto, scope, eventInfo) { + // Can't us 'A || B' here, because the first value can be false, true, or empty string and still be valid. + var retVal = scope.hasOwnProperty(sto.name) ? scope[sto.name] : $ax.globalVariableProvider.getVariableValue(sto.name, eventInfo); + // Handle desired type here? + + if(retVal && retVal.exprType) { + retVal = $ax.expr.evaluateExpr(retVal, eventInfo); + } + + if((sto.desiredType == 'int' || sto.desiredType == 'float')) { + var num = new Number(retVal); + retVal = isNaN(num.valueOf()) ? retVal : num; + } + + + return retVal; + }; + + //TODO: Perhaps repeaterId can be detirmined at generation, and stored in the sto info. + _stoHandlers.item = function(sto, scope, eventInfo, prop) { + prop = prop || (eventInfo.data ? 'data' : eventInfo.link ? 'url' : eventInfo.image ? 'img' : 'text'); + var id = sto.isTarget || !$ax.repeater.hasData(eventInfo.srcElement, sto.name) ? eventInfo.targetElement : eventInfo.srcElement; + return getData(eventInfo, id, sto.name, prop); + }; + + var getData = function(eventInfo, id, name, prop) { + var repeaterId = $ax.getParentRepeaterFromScriptId($ax.repeater.getScriptIdFromElementId(id)); + var itemId = $ax.repeater.getItemIdFromElementId(id); + return $ax.repeater.getData(eventInfo, repeaterId, itemId, name, prop); + }; + + _stoHandlers.paren = function(sto, scope, eventInfo) { + return _evaluateSTO(sto.innerSTO, scope, eventInfo); + }; + + _stoHandlers.fCall = function(sto, scope, eventInfo) { + //TODO: [mas] handle required type + var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo); + if(sto.thisSTO.desiredType == 'string' && sto.thisSTO.computedType != 'string') thisObj = thisObj.toString(); + + var args = []; + for(var i = 0; i < sto.arguments.length; i++) { + args[i] = _evaluateSTO(sto.arguments[i], scope, eventInfo); + } + var fn = (funcs.hasOwnProperty(sto.func) && funcs[sto.func]) || thisObj[sto.func]; + return fn.apply(thisObj, args); + }; + + _stoHandlers.propCall = function(sto, scope, eventInfo) { + //TODO: [mas] handle required type + if((sto.prop == 'url' || sto.prop == 'img') && sto.thisSTO.sto == 'item') return _stoHandlers.item(sto.thisSTO, scope, eventInfo, sto.prop); + var thisObj = _evaluateSTO(sto.thisSTO, scope, eventInfo); + var prop = thisObj[sto.prop] instanceof Function ? thisObj[sto.prop]() : thisObj[sto.prop]; + return prop; + }; + + var _binOps = {}; + _binOps['+'] = function(left, right) { + if(left instanceof Date) return addDayToDate(left, right); + if(right instanceof Date) return addDayToDate(right, left); + + var num = Number(left) + Number(right); + return isNaN(num) ? (String(left) + String(right)) : num; + }; + _binOps['-'] = function(left, right) { + if(left instanceof Date) return addDayToDate(left, -right); + return left - right; + }; + _binOps['*'] = function(left, right) { return Number(left) * Number(right); }; + _binOps['/'] = function(left, right) { return Number(left) / Number(right); }; + _binOps['%'] = function(left, right) { return Number(left) % Number(right); }; + _binOps['=='] = function(left, right) { return _getBool(left) == _getBool(right); }; + _binOps['!='] = function(left, right) { return _getBool(left) != _getBool(right); }; + _binOps['<'] = function(left, right) { return Number(left) < Number(right); }; + _binOps['<='] = function(left, right) { return Number(left) <= Number(right); }; + _binOps['>'] = function(left, right) { return Number(left) > Number(right); }; + _binOps['>='] = function(left, right) { return Number(left) >= Number(right); }; + _binOps['&&'] = function(left, right) { return _getBool(left) && _getBool(right); }; + _binOps['||'] = function(left, right) { return _getBool(left) || _getBool(right); }; + + // TODO: Move this to generic place to be used. + var addDayToDate = function(date, days) { + var retVal = new Date(date.valueOf()); + retVal.setDate(date.getDate() + days); + return retVal; + }; + + var _unOps = {}; + _unOps['+'] = function(arg) { return +arg; }; + _unOps['-'] = function(arg) { return -arg; }; + _unOps['!'] = function(arg) { return !_getBool(arg); }; + + _stoHandlers.binOp = function(sto, scope, eventInfo) { + var left = _evaluateSTO(sto.leftSTO, scope, eventInfo); + var right = _evaluateSTO(sto.rightSTO, scope, eventInfo); + return _binOps[sto.op](left, right); + }; + + _stoHandlers.unOp = function(sto, scope, eventInfo) { + var input = _evaluateSTO(sto.inputSTO, scope, eventInfo); + return _unOps[sto.op](input); + }; + + var _getBool = function(val) { + var lowerVal = val.toLowerCase ? val.toLowerCase() : val; + return lowerVal == "false" ? false : lowerVal == "true" ? true : val; + }; + $ax.getBool = _getBool; + + var _evaluateSTO = function(sto, scope, eventInfo) { + if(sto.sto == 'error') return undefined; + return _tryEscapeRichText(castSto(_stoHandlers[sto.sto](sto, scope, eventInfo), sto), eventInfo); + }; + $ax.evaluateSTO = _evaluateSTO; + + var castSto = function(val, sto) { + var type = sto.computedType || sto.desiredType; + if(type == 'string') val = String(val); + else if(type == 'date' && !(val instanceof Date)) val = new Date(val); + else if(type == 'int' || type == 'float') val = Number(val); + else if(type == 'bool') val = Boolean(val); + + return val; + }; + + var _tryEscapeRichText = function(text, eventInfo) { + return eventInfo.htmlLiteral ? _escapeRichText(text) : text; + }; + + var _escapeRichText = function(text) { + if(typeof (text) != 'string') return text; + + return text.replace('<', '<'); + }; +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/style.js b/code/page/resources/scripts/axure/style.js new file mode 100644 index 0000000..d4591d8 --- /dev/null +++ b/code/page/resources/scripts/axure/style.js @@ -0,0 +1,1363 @@ +$axure.internal(function($ax) { + var _style = {}; + $ax.style = _style; + + var _disabledWidgets = {}; + var _selectedWidgets = {}; + + // A table to cache the outerHTML of the _rtf elements before the rollover state is applied. + var _originalTextCache = {}; + // A table to exclude the normal style from adaptive overrides + var _shapesWithSetRichText = {}; + + // just a listing of shape ids + var _adaptiveStyledWidgets = {}; + + var _setLinkStyle = function(id, styleName) { + var parentId = $ax.GetParentIdFromLink(id); + var style = _computeAllOverrides(id, parentId, styleName, $ax.adaptive.currentViewId); + + var textId = $ax.GetTextPanelId(parentId); + if(!_originalTextCache[textId]) { + $ax.style.CacheOriginalText(textId); + } + if($.isEmptyObject(style)) return; + + var textCache = _originalTextCache[textId].styleCache; + + _transformTextWithVerticalAlignment(textId, function() { + var cssProps = _getCssStyleProperties(style); + $('#' + id).find('*').addBack().each(function(index, element) { + element.setAttribute('style', textCache[element.id]); + _applyCssProps(element, cssProps); + }); + }); + }; + + var _resetLinkStyle = function(id) { + var textId = $ax.GetTextPanelId($ax.GetParentIdFromLink(id)); + var textCache = _originalTextCache[textId].styleCache; + + _transformTextWithVerticalAlignment(textId, function() { + $('#' + id).find('*').addBack().each(function(index, element) { + element.style.cssText = textCache[element.id]; + }); + }); + if($ax.event.mouseDownObjectId) { + $ax.style.SetWidgetMouseDown($ax.event.mouseDownObjectId, true); + } else if($ax.event.mouseOverObjectId) { + $ax.style.SetWidgetHover($ax.event.mouseOverObjectId, true); + } + }; + + $ax.style.SetLinkHover = function(id) { + _setLinkStyle(id, MOUSE_OVER); + }; + + $ax.style.SetLinkNotHover = function(id) { + _resetLinkStyle(id); + }; + + $ax.style.SetLinkMouseDown = function(id) { + _setLinkStyle(id, MOUSE_DOWN); + }; + + $ax.style.SetLinkNotMouseDown = function(id) { + _resetLinkStyle(id); + var style = _computeAllOverrides(id, $ax.event.mouseOverObjectId, MOUSE_OVER, $ax.adaptive.currentViewId); + + if(!$.isEmptyObject(style)) $ax.style.SetLinkHover(id); + //we dont do anything here because the widget not mouse down has taken over here + }; + + var _widgetHasState = function(id, state) { + if($ax.style.getElementImageOverride(id, state)) return true; + var diagramObject = $ax.getObjectFromElementId(id); + + //var adaptiveIdChain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId); + var adaptiveIdChain = $ax.style.getViewIdChain($ax.adaptive.currentViewId, id, diagramObject); + + for(var i = 0; i < adaptiveIdChain.length; i++) { + var viewId = adaptiveIdChain[i]; + var adaptiveStyle = diagramObject.adaptiveStyles[viewId]; + if(adaptiveStyle && adaptiveStyle.stateStyles && adaptiveStyle.stateStyles[state]) return true; + } + + if(diagramObject.style.stateStyles) { + var stateStyle = diagramObject.style.stateStyles[state]; + if(!stateStyle) return false; + return !$.isEmptyObject(stateStyle); + } + + return false; + }; + + // Returns what overrides the hover, or false if nothing. + var _hoverOverride = function(id) { + if($ax.style.IsWidgetDisabled(id)) return DISABLED; + if($ax.style.IsWidgetSelected(id)) return SELECTED; + var obj = $ax.getObjectFromElementId(id); + if(!obj.isContained) return false; + var path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(id)); + path[path.length - 1] = obj.parent.id; + var itemId = $ax.repeater.getItemIdFromElementId(id); + return _hoverOverride($ax.getElementIdFromPath(path, { itemNum: itemId })); + }; + + $ax.style.SetWidgetHover = function(id, value) { + var override = _hoverOverride(id); + if(override == DISABLED) return; + if(!_widgetHasState(id, MOUSE_OVER)) return; + + var valToSet = value || _isRolloverOverride(id); + var state = _generateMouseState(id, valToSet ? MOUSE_OVER : NORMAL, override == SELECTED); + _applyImageAndTextJson(id, state); + _updateElementIdImageStyle(id, state); + }; + + var _rolloverOverrides = []; + var _isRolloverOverride = function(id) { + return _rolloverOverrides.indexOf(id) != -1; + }; + + $ax.style.AddRolloverOverride = function(id) { + if(_isRolloverOverride(id)) return; + _rolloverOverrides[_rolloverOverrides.length] = id; + if($ax.event.mouseOverIds.indexOf(id) == -1) $ax.style.SetWidgetHover(id, true); + }; + + $ax.style.RemoveRolloverOverride = function(id) { + var index = _rolloverOverrides.indexOf(id); + if(index == -1) return; + $ax.splice(_rolloverOverrides, index, 1); + if($ax.event.mouseOverIds.indexOf(id) == -1) $ax.style.SetWidgetHover(id, false); + }; + + // function GetWidgetCurrentState(id) { + // if($ax.style.IsWidgetDisabled(id)) return "disabled"; + // if($ax.style.IsWidgetSelected(id)) return "selected"; + // if($ax.event.mouseOverObjectId == id) return "mouseOver"; + // if($ax.event.mouseDownObjectId == id) return "mouseDown"; + + // return "normal"; + // } + + $ax.style.ObjHasMouseDown = function(id) { + var obj = $obj(id); + if($ax.style.getElementImageOverride(id, 'mouseDown') || obj.style && obj.style.stateStyles && obj.style.stateStyles.mouseDown) return true; + + //var chain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId); + var chain = $ax.style.getViewIdChain($ax.adaptive.currentViewId, id, obj); + for(var i = 0; i < chain.length; i++) { + var style = obj.adaptiveStyles[chain[i]]; + if(style && style.stateStyles && style.stateStyles.mouseDown) return true; + } + return false; + }; + + $ax.style.SetWidgetMouseDown = function(id, value, checkMouseOver) { + if($ax.style.IsWidgetDisabled(id)) return; + if(!_widgetHasState(id, MOUSE_DOWN)) return; + + //if set to value is true, it's mousedown, if check mouseover is true, + //check if element is currently mouseover and has mouseover state before setting mouseover + if(value) var state = MOUSE_DOWN; + else if(!checkMouseOver || $ax.event.mouseOverIds.indexOf(id) !== -1 && _widgetHasState(id, MOUSE_OVER)) state = MOUSE_OVER; + else state = NORMAL; + + var mouseState = _generateMouseState(id, state, $ax.style.IsWidgetSelected(id)); + _applyImageAndTextJson(id, mouseState); + _updateElementIdImageStyle(id, mouseState); + }; + + var _generateMouseState = function(id, mouseState, selected) { + + var isSelectedFocused = function (state) { + if(!_widgetHasState(id, FOCUSED)) return state; + + var jObj = $('#' + id); + if(state == SELECTED) return (jObj.hasClass(FOCUSED)) ? SELECTED_FOCUSED : state; + else return (jObj.hasClass(FOCUSED) || jObj.hasClass(SELECTED_FOCUSED)) ? FOCUSED : state; + } + + if (selected) { + if (_style.getElementImageOverride(id, SELECTED)) return isSelectedFocused(SELECTED); + + var obj = $obj(id); + //var viewChain = $ax.adaptive.getAdaptiveIdChain($ax.adaptive.currentViewId); + var viewChain = $ax.style.getViewIdChain($ax.adaptive.currentViewId, id, obj); + viewChain[viewChain.length] = ''; + if($ax.IsDynamicPanel(obj.type) || $ax.IsLayer(obj.type)) return isSelectedFocused(SELECTED); + + var any = function(dict) { + for(var key in dict) return true; + return false; + }; + + for(var i = 0; i < viewChain.length; i++) { + var viewId = viewChain[i]; + // Need to check seperately for images. + var scriptId = $ax.repeater.getScriptIdFromElementId(id); + if(obj.adaptiveStyles && obj.adaptiveStyles[viewId] && any(obj.adaptiveStyles[viewId]) + || obj.images && (obj.images[scriptId + '~selected~' + viewId] || obj.images['selected~' + viewId])) return isSelectedFocused(SELECTED); + } + var selectedStyle = obj.style && obj.style.stateStyles && obj.style.stateStyles.selected; + if(selectedStyle && any(selectedStyle)) return isSelectedFocused(SELECTED); + } + + // Not using selected + return isSelectedFocused(mouseState); + }; + + $ax.style.SetWidgetFocused = function (id, value) { + if (_isWidgetDisabled(id)) return; + if (!_widgetHasState(id, FOCUSED)) return; + + if (value) var state = $ax.style.IsWidgetSelected(id) ? SELECTED_FOCUSED : FOCUSED; + else state = $ax.style.IsWidgetSelected(id) ? SELECTED : NORMAL; + + _applyImageAndTextJson(id, state); + _updateElementIdImageStyle(id, state); + } + + $ax.style.SetWidgetSelected = function(id, value, alwaysApply) { + if(_isWidgetDisabled(id)) return; + //NOTE: not firing select events if state didn't change + var raiseSelectedEvents = $ax.style.IsWidgetSelected(id) != value; + + if(value) { + var group = $('#' + id).attr('selectiongroup'); + if(group) { + $("[selectiongroup='" + group + "']").each(function() { + var otherId = this.id; + if(otherId == id) return; + if ($ax.visibility.isScriptIdLimbo($ax.repeater.getScriptIdFromElementId(otherId))) return; + + $ax.style.SetWidgetSelected(otherId, false, alwaysApply); + }); + } + } + var obj = $obj(id); + if(obj) { + var actionId = id; + if ($ax.public.fn.IsDynamicPanel(obj.type) || $ax.public.fn.IsLayer(obj.type)) { + if(!value) $jobj(id).removeClass('selected'); + var children = $axure('#' + id).getChildren()[0].children; + for(var i = 0; i < children.length; i++) { + var childId = children[i]; + // Special case for trees + var childObj = $jobj(childId); + if(childObj.hasClass('treeroot')) { + var treenodes = childObj.find('.treenode'); + for(var j = 0; j < treenodes.length; j++) { + $axure('#' + treenodes[j].id).selected(value); + } + } else $axure('#' + childId).selected(value); + } + } else { + var widgetHasSelectedState = _widgetHasState(id, SELECTED); + while(obj.isContained && !widgetHasSelectedState) obj = obj.parent; + var itemId = $ax.repeater.getItemIdFromElementId(id); + var path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(id)); + path[path.length - 1] = obj.id; + actionId = $ax.getElementIdFromPath(path, { itemNum: itemId }); + if(alwaysApply || widgetHasSelectedState) { + var state = _generateSelectedState(actionId, value); + _applyImageAndTextJson(actionId, state); + _updateElementIdImageStyle(actionId, state); + } + //added actionId and this hacky logic because we set style state on child, but interaction on parent + //then the id saved in _selectedWidgets would be depended on widgetHasSelectedState... more see case 1818143 + while(obj.isContained && !$ax.getObjectFromElementId(id).interactionMap) obj = obj.parent; + path = $ax.getPathFromScriptId($ax.repeater.getScriptIdFromElementId(id)); + path[path.length - 1] = obj.id; + actionId = $ax.getElementIdFromPath(path, { itemNum: itemId }); + } + } + + // ApplyImageAndTextJson(id, value ? 'selected' : 'normal'); + _selectedWidgets[id] = value; + if(raiseSelectedEvents) $ax.event.raiseSelectedEvents(actionId, value); + }; + + var _generateSelectedState = function(id, selected) { + var mouseState = $ax.event.mouseDownObjectId == id ? MOUSE_DOWN : $.inArray(id, $ax.event.mouseOverIds) != -1 ? MOUSE_OVER : NORMAL; + //var mouseState = $ax.event.mouseDownObjectId == id ? MOUSE_DOWN : $ax.event.mouseOverIds.indexOf(id) != -1 ? MOUSE_OVER : NORMAL; + return _generateMouseState(id, mouseState, selected); + }; + + $ax.style.IsWidgetSelected = function(id) { + return Boolean(_selectedWidgets[id]) || $('#'+id).hasClass('selected'); + }; + + $ax.style.SetWidgetEnabled = function(id, value) { + _disabledWidgets[id] = !value; + $('#' + id).find('a').css('cursor', value ? 'pointer' : 'default'); + + if(!_widgetHasState(id, DISABLED)) return; + if(!value) { + _applyImageAndTextJson(id, DISABLED); + _updateElementIdImageStyle(id, DISABLED); + } else $ax.style.SetWidgetSelected(id, $ax.style.IsWidgetSelected(id), true); + }; + + $ax.style.SetWidgetPlaceholder = function(id, active, text, password) { + var inputId = $ax.repeater.applySuffixToElementId(id, '_input'); + + // Right now this is the only style on the widget. If other styles (ex. Rollover), are allowed + // on TextBox/TextArea, or Placeholder is applied to more widgets, this may need to do more. + var obj = $jobj(inputId); + + var height = document.getElementById(inputId).style['height']; + var width = document.getElementById(inputId).style['width']; + obj.attr('style', ''); + //removing all styles, but now we can change the size, so we should add them back + //this is more like a quick hack + if (height) obj.css('height', height); + if (width) obj.css('width', width); + + if(!active) { + try { //ie8 and below error + if(password) document.getElementById(inputId).type = 'password'; + } catch(e) { } + } else { + var element = $('#' + inputId)[0]; + var style = _computeAllOverrides(id, undefined, HINT, $ax.adaptive.currentViewId); + var styleProperties = _getCssStyleProperties(style); + + //moved this out of GetCssStyleProperties for now because it was breaking un/rollovers with gradient fills + //if(style.fill) styleProperties.allProps.backgroundColor = _getColorFromFill(style.fill); + + _applyCssProps(element, styleProperties, true); + try { //ie8 and below error + if(password && text) document.getElementById(inputId).type = 'text'; + } catch(e) { } + } + obj.val(text); + }; + + var _isWidgetDisabled = $ax.style.IsWidgetDisabled = function(id) { + return Boolean(_disabledWidgets[id]); + }; + + var _elementIdsToImageOverrides = {}; + $ax.style.mapElementIdToImageOverrides = function (elementId, override) { + for(var key in override) _addImageOverride(elementId, key, override[key]); + }; + + var _addImageOverride = function (elementId, state, val) { + if (!_elementIdsToImageOverrides[elementId]) _elementIdsToImageOverrides[elementId] = {}; + _elementIdsToImageOverrides[elementId][state] = val; + } + + $ax.style.deleteElementIdToImageOverride = function(elementId) { + delete _elementIdsToImageOverrides[elementId]; + }; + + $ax.style.getElementImageOverride = function(elementId, state) { + var url = _elementIdsToImageOverrides[elementId] && _elementIdsToImageOverrides[elementId][state]; + return url; + }; + + $ax.style.elementHasAnyImageOverride = function(elementId) { + return Boolean(_elementIdsToImageOverrides[elementId]); + }; + + var NORMAL = 'normal'; + var MOUSE_OVER = 'mouseOver'; + var MOUSE_DOWN = 'mouseDown'; + var SELECTED = 'selected'; + var DISABLED = 'disabled'; + var HINT = 'hint'; + var FOCUSED = 'focused'; + var SELECTED_FOCUSED = 'selectedFocused'; + + var _generateState = _style.generateState = function(id) { + return $ax.placeholderManager.isActive(id) ? HINT : _style.IsWidgetDisabled(id) ? DISABLED : _generateSelectedState(id, _style.IsWidgetSelected(id)); + }; + + var _progressState = _style.progessState = function(state) { + if(state == NORMAL) return false; + if(state == MOUSE_DOWN) return MOUSE_OVER; + return NORMAL; + }; + + var _unprogressState = function(state, goal) { + state = state || NORMAL; + if(state == goal || state == SELECTED_FOCUSED) return undefined; + if(state == NORMAL && goal == MOUSE_DOWN) return MOUSE_OVER; + if(state == NORMAL && goal == SELECTED_FOCUSED) return SELECTED; + if(state == SELECTED && goal == SELECTED_FOCUSED) return FOCUSED; + return goal; + }; + + var _updateElementIdImageStyle = _style.updateElementIdImageStyle = function(elementId, state) { + if(!_style.elementHasAnyImageOverride(elementId)) return; + + if(!state) state = _generateState(elementId); + + var style = _computeFullStyle(elementId, state, $ax.adaptive.currentViewId); + + var query = $jobj($ax.repeater.applySuffixToElementId(elementId, '_img')); + style.size.width = query.width(); + style.size.height = query.height(); + var borderId = $ax.repeater.applySuffixToElementId(elementId, '_border'); + var borderQuery = $jobj(borderId); + if(!borderQuery.length) { + borderQuery = $('
      '); + borderQuery.attr('id', borderId); + query.after(borderQuery); + } + + borderQuery.attr('style', ''); + //borderQuery.css('position', 'absolute'); + query.attr('style', ''); + + var borderQueryCss = { 'position': 'absolute' }; + var queryCss = {} + + var borderWidth = Number(style.borderWidth); + var hasBorderWidth = borderWidth > 0; + if(hasBorderWidth) { + //borderQuery.css('border-style', 'solid'); + //borderQuery.css('border-width', borderWidth + 'px'); // If images start being able to turn off borders on specific sides, need to update this. + //borderQuery.css('width', style.size.width - borderWidth * 2); + //borderQuery.css('height', style.size.height - borderWidth * 2); + //borderQuery.css({ + // 'border-style': 'solid', + // 'border-width': borderWidth + 'px', + // 'width': style.size.width - borderWidth * 2, + // 'height': style.size.height - borderWidth * 2 + //}); + borderQueryCss['border-style'] = 'solid'; + borderQueryCss['border-width'] = borderWidth + 'px'; // If images start being able to turn off borders on specific sides, need to update this. + borderQueryCss['width'] = style.size.width - borderWidth * 2; + borderQueryCss['height'] = style.size.height - borderWidth * 2; + } + + var linePattern = style.linePattern; + if(hasBorderWidth && linePattern) borderQueryCss['border-style'] = linePattern; + + var borderFill = style.borderFill; + if(hasBorderWidth && borderFill) { + var color = borderFill.fillType == 'solid' ? borderFill.color : + borderFill.fillType == 'linearGradient' ? borderFill.colors[0].color : 0; + + var alpha = Math.floor(color / 256 / 256 / 256); + color -= alpha * 256 * 256 * 256; + alpha = alpha / 255; + + var red = Math.floor(color / 256 / 256); + color -= red * 256 * 256; + var green = Math.floor(color / 256); + var blue = color - green * 256; + + borderQueryCss['border-color'] = _rgbaToFunc(red, green, blue, alpha); + } + + var cornerRadiusTopLeft = style.cornerRadius; + if(cornerRadiusTopLeft) { + queryCss['border-radius'] = cornerRadiusTopLeft + 'px'; + borderQueryCss['border-radius'] = cornerRadiusTopLeft + 'px'; + } + + var outerShadow = style.outerShadow; + if(outerShadow && outerShadow.on) { + var arg = ''; + arg += outerShadow.offsetX + 'px' + ' ' + outerShadow.offsetY + 'px' + ' '; + var rgba = outerShadow.color; + arg += outerShadow.blurRadius + 'px' + ' 0px ' + _rgbaToFunc(rgba.r, rgba.g, rgba.b, rgba.a); + //query.css('-moz-box-shadow', arg); + //query.css('-wibkit-box-shadow', arg); + //query.css('box-shadow', arg); + //query.css('left', '0px'); + //query.css('top', '0px'); + //query.css({ + // '-moz-box-shadow': arg, + // '-webkit-box-shadow': arg, + // 'box-shadow': arg, + // 'left': '0px', + // 'top': '0px' + //}); + queryCss['-moz-box-shadow'] = arg; + queryCss['-wibkit-box-shadow'] = arg; + queryCss['box-shadow'] = arg; + queryCss['left'] = '0px'; + queryCss['top'] = '0px'; + } + + queryCss['width'] = style.size.width; + queryCss['height'] = style.size.height; + + borderQuery.css(borderQueryCss); + query.css(queryCss); + + //query.css({ width: style.size.width, height: style.size.height }); + }; + + var _rgbaToFunc = function(red, green, blue, alpha) { + return 'rgba(' + red + ',' + green + ',' + blue + ',' + alpha + ')'; + }; + + var _applyImageAndTextJson = function(id, event) { + var textId = $ax.GetTextPanelId(id); + if(textId) _resetTextJson(id, textId); + + // This should never be the case + //if(event != '') { + var imgQuery = $jobj($ax.GetImageIdFromShape(id)); + var e = imgQuery.data('events'); + if(e && e[event]) imgQuery.trigger(event); + + var imageUrl = $ax.adaptive.getImageForStateAndView(id, event); + if(imageUrl) _applyImage(id, imageUrl, event); + + var style = _computeAllOverrides(id, undefined, event, $ax.adaptive.currentViewId); + if(!$.isEmptyObject(style) && textId) _applyTextStyle(textId, style); + + _updateStateClasses(id, event); + _updateStateClasses($ax.repeater.applySuffixToElementId(id, '_div'), event); + _updateStateClasses($ax.repeater.applySuffixToElementId(id, '_input'), event); + }; + + var _updateStateClasses = function(id, event) { + var jobj = $jobj(id); + + //if(jobj[0] && jobj[0].hasAttribute('widgetwidth')) { + // for (var x = 0; x < jobj[0].children.length; x++) { + // var childId = jobj[0].children[x].id; + // if (childId.indexOf('p') < 0) continue; + + // _updateStateClasses(childId, event) ; + // } + //} else { + for (var i = 0; i < ALL_STATES.length; i++) jobj.removeClass(ALL_STATES[i]); + if (event == 'mouseDown') jobj.addClass('mouseOver'); + if(event != 'normal') jobj.addClass(event); + //} + } + + /* ------------------- + + here's the algorithm in a nutshell: + [DOWN] -- refers to navigation down the view inheritance heirarchy (default to most specific) + [UP] -- navigate up the heirarchy + + ComputeAllOverrides (object): + All view styles [DOWN] + If hyperlink + - DO ComputeStateStyle for parent object + - if (MouseOver || MouseDown) + - linkMouseOver Style + - if (MouseDown) + - linkMouseDown style + - ComputeStateStyleForViewChain (parent, STATE) + + if (MouseDown) DO ComputeStateStyleForViewChain for object, mouseOver + DO ComputeStateStyleForViewChain for object, style + + + ComputeStateStyleForViewChain (object, STATE) + FIRST STATE state style [UP] the chain OR default object STATE style + + ------------------- */ + + var FONT_PROPS = { + 'typeface': true, + 'fontName': true, + 'fontWeight': true, + 'fontStyle': true, + 'fontStretch': true, + 'fontSize': true, + 'underline': true, + 'foreGroundFill': true, + 'horizontalAlignment': true, + 'letterCase': true, + 'strikethrough': true + }; + + var _getViewIdChain = $ax.style.getViewIdChain = function(currentViewId, id, diagramObject) { + var viewIdChain; + if (diagramObject.owner.type != 'Axure:Master') { + viewIdChain = $ax.adaptive.getAdaptiveIdChain(currentViewId); + } else { + //set viewIdChain to the chain from the parent RDO + var parentRdoId = $ax('#' + id).getParents(true, ['rdo'])[0][0]; + var rdoState = $ax.style.generateState(parentRdoId); + var rdoStyle = $ax.style.computeFullStyle(parentRdoId, rdoState, currentViewId); + var viewOverride = rdoStyle.viewOverride; + viewIdChain = $ax.adaptive.getMasterAdaptiveIdChain(diagramObject.owner.packageId, viewOverride); + } + return viewIdChain; + } + + var _computeAllOverrides = $ax.style.computeAllOverrides = function(id, parentId, state, currentViewId) { + var computedStyle = {}; + if(parentId) computedStyle = _computeAllOverrides(parentId, null, state, currentViewId); + + var diagramObject = $ax.getObjectFromElementId(id); + + var viewIdChain = _getViewIdChain(currentViewId, id, diagramObject); + var excludeFont = _shapesWithSetRichText[id]; + for(var i = 0; i < viewIdChain.length; i++) { + var viewId = viewIdChain[i]; + var style = diagramObject.adaptiveStyles[viewId]; + if(style) { + // we want to exclude the normal font style for shapes where the rich text has been set with an interaction + // so we copy the style so we don't modify the original, then delete all the font props. + if(excludeFont) { + style = $ax.deepCopy(style); + for(var prop in FONT_PROPS) delete style[prop]; + } + + if(style) { + var customStyle = style.baseStyle && $ax.document.stylesheet.stylesById[style.baseStyle]; + //make sure not to extend the customStyle this can mutate it for future use + $.extend(computedStyle, customStyle); + } + $.extend(computedStyle, style); + } + } + + var currState = NORMAL; + while(currState) { + $.extend(computedStyle, _computeStateStyleForViewChain(diagramObject, currState, viewIdChain, true)); + currState = _unprogressState(currState, state); + } + + return _removeUnsupportedProperties(computedStyle, diagramObject); + }; + + var _computeStateStyleForViewChain = function(diagramObject, state, viewIdChain, excludeNormal) { + var styleObject = diagramObject; + while(styleObject.isContained) styleObject = styleObject.parent; + + var adaptiveStyles = styleObject.adaptiveStyles; + + for(var i = viewIdChain.length - 1; i >= 0; i--) { + var viewId = viewIdChain[i]; + var viewStyle = adaptiveStyles[viewId]; + var stateStyle = viewStyle && _getFullStateStyle(viewStyle, state, excludeNormal); + if (stateStyle) return $.extend({}, stateStyle); + else if (viewStyle && viewStyle.stateStyles) return {}; //stateStyles are overriden but states could be null + } + + // we dont want to actually include the object style because those are not overrides, hence the true for "excludeNormal" and not passing the val through + var stateStyleFromDefault = _getFullStateStyle(styleObject.style, state, true); + return $.extend({}, stateStyleFromDefault); + }; + + // returns the full effective style for an object in a state state and view + var _computeFullStyle = $ax.style.computeFullStyle = function(id, state, currentViewId) { + var obj = $obj(id); + var overrides = _computeAllOverrides(id, undefined, state, currentViewId); + // todo: account for image box + var objStyle = obj.style; + var customStyle = objStyle.baseStyle && $ax.document.stylesheet.stylesById[objStyle.baseStyle]; + var returnVal = $.extend({}, $ax.document.stylesheet.defaultStyle, customStyle, objStyle, overrides); + return _removeUnsupportedProperties(returnVal, obj); + }; + + var _removeUnsupportedProperties = function(style, object) { + // for now all we need to do is remove padding from checkboxes and radio buttons + if ($ax.public.fn.IsRadioButton(object.type) || $ax.public.fn.IsCheckBox(object.type)) { + style.paddingTop = 0; + style.paddingLeft = 0; + style.paddingRight = 0; + style.paddingBottom = 0; + } + if ($ax.public.fn.IsTextBox(object.type) || $ax.public.fn.IsTextArea(object.type) || $ax.public.fn.IsButton(object.type) + || $ax.public.fn.IsListBox(object.type) || $ax.public.fn.IsComboBox(object.type)) { + if (object.images && style.fill) delete style['fill']; + } + + return style; + }; + + var _getFullStateStyle = function(style, state, excludeNormal) { + //'normal' is needed because now DiagramObjects get their image from the Style and unapplying a rollover needs the image + var stateStyle = state == 'normal' && !excludeNormal ? style : style && style.stateStyles && style.stateStyles[state]; + if(stateStyle) { + var customStyle = stateStyle.baseStyle && $ax.document.stylesheet.stylesById[stateStyle.baseStyle]; + //make sure not to extend the customStyle this can mutate it for future use + return $.extend({}, customStyle, stateStyle); + } + return undefined; + }; + + // commented this out for now... we actually will probably need it for ie + var _applyOpacityFromStyle = $ax.style.applyOpacityFromStyle = function(id, style) { + return; + var opacity = style.opacity || ''; + $jobj(id).children().css('opacity', opacity); + }; + + var _initialize = function() { + //$ax.style.initializeObjectTextAlignment($ax('*')); + }; + $ax.style.initialize = _initialize; + + //var _initTextAlignment = function(elementId) { + // var textId = $ax.GetTextPanelId(elementId); + // if(textId) { + // _storeIdToAlignProps(textId); + // // now handle vertical alignment + // if(_getObjVisible(textId)) { + // //_setTextAlignment(textId, _idToAlignProps[textId], false); + // _setTextAlignment(textId); + // } + // } + //}; + + //$ax.style.initializeObjectTextAlignment = function(query) { + // query.filter(function(diagramObject) { + // return $ax.public.fn.IsVector(diagramObject.type) || $ax.public.fn.IsImageBox(diagramObject.type); + // }).each(function(diagramObject, elementId) { + // if($jobj(elementId).length == 0) return; + // _initTextAlignment(elementId); + // }); + //}; + + //$ax.style.initializeObjectTextAlignment = function (query) { + // var textIds = []; + // query.filter(function(diagramObject) { + // return $ax.public.fn.IsVector(diagramObject.type) || $ax.public.fn.IsImageBox(diagramObject.type); + // }).each(function(diagramObject, elementId) { + // if($jobj(elementId).length == 0) return; + // var textId = $ax.GetTextPanelId(elementId); + // if(textId) { + // _storeIdToAlignProps(textId); + // textIds.push(textId); + // } + // }); + + // $ax.style.setTextAlignment(textIds); + //}; + + //var _getPadding = $ax.style.getPadding = function (textId) { + // var shapeId = $ax.GetShapeIdFromText(textId); + // var shapeObj = $obj(shapeId); + // var state = _generateState(shapeId); + + // var style = _computeFullStyle(shapeId, state, $ax.adaptive.currentViewId); + // var vAlign = style.verticalAlignment || 'middle'; + + // var paddingLeft = Number(style.paddingLeft) || 0; + // paddingLeft += (Number(shapeObj && shapeObj.extraLeft) || 0); + // var paddingTop = style.paddingTop || 0; + // var paddingRight = style.paddingRight || 0; + // var paddingBottom = style.paddingBottom || 0; + // return { vAlign: vAlign, paddingLeft: paddingLeft, paddingTop: paddingTop, paddingRight: paddingRight, paddingBottom: paddingBottom }; + //} + + //var _storeIdToAlignProps = function(textId) { + // _idToAlignProps[textId] = _getPadding(textId); + //}; + + var ALL_STATES = ['mouseOver', 'mouseDown', 'selected', 'focused', 'selectedFocused', 'disabled']; + var _applyImage = $ax.style.applyImage = function (id, imgUrl, state) { + var object = $obj(id); + if (object.generateCompound) { + for (var i = 0; i < object.compoundChildren.length; i++) { + var componentId = object.compoundChildren[i]; + var childId = $ax.public.fn.getComponentId(id, componentId); + var childImgQuery = $jobj(childId + '_img'); + var childQuery = $jobj(childId); + childImgQuery.attr('src', imgUrl[componentId]); + for (var j = 0; j < ALL_STATES.length; j++) { + childImgQuery.removeClass(ALL_STATES[j]); + childQuery.removeClass(ALL_STATES[j]); + } + if (state != 'normal') { + childImgQuery.addClass(state); + childQuery.addClass(state); + } + } + } else { + var imgQuery = $jobj($ax.GetImageIdFromShape(id)); + var idQuery = $jobj(id); + //it is hard to tell if setting the image or the class first causing less flashing when adding shadows. + imgQuery.attr('src', imgUrl); + for (var i = 0; i < ALL_STATES.length; i++) { + idQuery.removeClass(ALL_STATES[i]); + imgQuery.removeClass(ALL_STATES[i]); + } + if (state != 'normal') { + idQuery.addClass(state); + imgQuery.addClass(state); + } + if (imgQuery.parents('a.basiclink').length > 0) imgQuery.css('border', 'none'); + } + + }; + + $ax.public.fn.getComponentId = function (id, componentId) { + var idParts = id.split('-'); + idParts[0] = idParts[0] + componentId; + return idParts.join('-'); + } + + var _resetTextJson = function(id, textid) { + // reset the opacity + $jobj(id).children().css('opacity', ''); + + var cacheObject = _originalTextCache[textid]; + if(cacheObject) { + _transformTextWithVerticalAlignment(textid, function() { + var styleCache = cacheObject.styleCache; + var textQuery = $('#' + textid); + textQuery.find('*').each(function(index, element) { + element.style.cssText = styleCache[element.id]; + }); + }); + } + }; + + // Preserves the alingment for the element textid after executing transformFn + + //var _getRtfElementHeight = function(rtfElement) { + // if(rtfElement.innerHTML == '') rtfElement.innerHTML = ' '; + + // // To handle render text as image + // //var images = $(rtfElement).children('img'); + // //if(images.length) return images.height(); + // return rtfElement.offsetHeight; + //}; + + // why microsoft decided to default to round to even is beyond me... + //var _roundToEven = function(number) { + // var numString = number.toString(); + // var parts = numString.split('.'); + // if(parts.length == 1) return number; + // if(parts[1].length == 1 && parts[1] == '5') { + // var wholePart = Number(parts[0]); + // return wholePart % 2 == 0 ? wholePart : wholePart + 1; + // } else return Math.round(number); + //}; + + //var _suspendTextAlignment = 0; + //var _suspendedTextIds = []; + //$ax.style.startSuspendTextAlignment = function() { + // _suspendTextAlignment++; + //} + //$ax.style.resumeSuspendTextAlignment = function () { + // _suspendTextAlignment--; + // if(_suspendTextAlignment == 0) $ax.style.setTextAlignment(_suspendedTextIds); + //} + + var _transformTextWithVerticalAlignment = $ax.style.transformTextWithVerticalAlignment = function(textId, transformFn) { + if(!_originalTextCache[textId]) { + $ax.style.CacheOriginalText(textId); + } + + var rtfElement = window.document.getElementById(textId); + if(!rtfElement) return; + + transformFn(); + + //_storeIdToAlignProps(textId); + + //if (_suspendTextAlignment) { + // _suspendedTextIds.push(textId); + // return; + //} + + //$ax.style.setTextAlignment([textId]); + }; + + // this is for vertical alignments set on hidden objects + //var _idToAlignProps = {}; + + //$ax.style.updateTextAlignmentForVisibility = function (textId) { + // var textObj = $jobj(textId); + // // must check if parent id exists. Doesn't exist for text objs in check boxes, and potentially elsewhere. + // var parentId = textObj.parent().attr('id'); + // if (parentId && $ax.visibility.isContainer(parentId)) return; + + // //var alignProps = _idToAlignProps[textId]; + // //if(!alignProps || !_getObjVisible(textId)) return; + // //if (!alignProps) return; + + // //_setTextAlignment(textId, alignProps); + // _setTextAlignment(textId); + //}; + + var _getObjVisible = _style.getObjVisible = function (id) { + var element = document.getElementById(id); + return element && (element.offsetWidth || element.offsetHeight); + }; + + //$ax.style.setTextAlignment = function (textIds) { + + // var getTextAlignDim = function(textId, alignProps) { + // var dim = {}; + // var vAlign = alignProps.vAlign; + // var paddingTop = Number(alignProps.paddingTop); + // var paddingBottom = Number(alignProps.paddingBottom); + // var paddingLeft = Number(alignProps.paddingLeft); + // var paddingRight = Number(alignProps.paddingRight); + + // var topParam = 0.0; + // var bottomParam = 1.0; + // var leftParam = 0.0; + // var rightParam = 1.0; + + // var textObj = $jobj(textId); + // var textObjParent = textObj.offsetParent(); + // var parentId = textObjParent.attr('id'); + // if(!parentId) { + // // Only case should be for radio/checkbox that get the label now because it must be absolute positioned for animate (offset parent ignored it before) + // textObjParent = textObjParent.parent(); + // parentId = textObjParent.attr('id'); + // } + + // parentId = $ax.visibility.getWidgetFromContainer(textObjParent.attr('id')); + // textObjParent = $jobj(parentId); + // var parentObj = $obj(parentId); + // if(parentObj['bottomTextPadding']) bottomParam = parentObj['bottomTextPadding']; + // if(parentObj['topTextPadding']) topParam = parentObj['topTextPadding']; + // if(parentObj['leftTextPadding']) leftParam = parentObj['leftTextPadding']; + // if(parentObj['rightTextPadding']) rightParam = parentObj['rightTextPadding']; + + // // smart shapes are mutually exclusive from compound vectors. + // var isConnector = parentObj.type == $ax.constants.CONNECTOR_TYPE; + // if(isConnector) return; + + // var axTextObjectParent = $ax('#' + textObjParent.attr('id')); + + + // var jDims = textObj.css(['width','left','top']); + // var oldWidth = $ax.getNumFromPx(jDims['width']); + // var oldLeft = $ax.getNumFromPx(jDims['left']); + // var oldTop = $ax.getNumFromPx(jDims['top']); + + // var newTop = 0; + // var newLeft = 0.0; + + // var size = axTextObjectParent.size(); + // var width = size.width; + // var height = size.height; + // //var width = axTextObjectParent.width(); + // //var height = axTextObjectParent.height(); + + // // If text rotated need to handle getting the correct width for text based on bounding rect of rotated parent. + // var boundingRotation = -$ax.move.getRotationDegreeFromElement(textObj[0]); + // var boundingParent = $axure.fn.getBoundingSizeForRotate(width, height, boundingRotation); + // var extraLeftPadding = (width - boundingParent.width) / 2; + // width = boundingParent.width; + // var relativeTop = 0.0; + // relativeTop = height * topParam; + // var containerHeight = height * bottomParam - relativeTop; + + // newLeft = paddingLeft + extraLeftPadding + width * leftParam; + + // var newWidth = width * (rightParam - leftParam) - paddingLeft - paddingRight; + + // var horizChange = newWidth != oldWidth || newLeft != oldLeft; + // if(horizChange) { + // dim.left = newLeft; + // dim.width = newWidth; + // //textObj.css('left', newLeft); + // //textObj.width(newWidth); + // } + + // var textHeight = _getRtfElementHeight(textObj[0]); + + // if(vAlign == "middle") + // newTop = _roundToEven(relativeTop + (containerHeight - textHeight + paddingTop - paddingBottom) / 2); + // else if(vAlign == "bottom") + // newTop = _roundToEven(relativeTop + containerHeight - textHeight - paddingBottom); + // else newTop = _roundToEven(paddingTop + relativeTop); + // var vertChange = oldTop != newTop; + // if (vertChange) dim.top = newTop; //textObj.css('top', newTop + 'px'); + + // return dim; + // }; + + // var applyTextAlignment = function(textId, dim) { + // var textObj = $jobj(textId); + // if(dim.left) { + // textObj.css('left', dim.left); + // textObj.width(dim.width); + // } + // if(dim.top) textObj.css('top', dim.top); + + // if((dim.top || dim.left)) _updateTransformOrigin(textId); + // }; + + // var idToDim = []; + // for (var i = 0; i < textIds.length; i++) { + // var textId = textIds[i]; + // var alignProps = _idToAlignProps[textId]; + // if (!alignProps || !_getObjVisible(textId)) continue; + + // idToDim.push({ id: textId, dim: getTextAlignDim(textId, alignProps) }); + // } + + // for (var i = 0; i < idToDim.length; i++) { + // var info = idToDim[i]; + // applyTextAlignment(info.id, info.dim); + // } + //}; + + //var _setTextAlignment = function(textId, alignProps, updateProps) { + // if(updateProps) _storeIdToAlignProps(textId); + // if(!alignProps) return; + + // var vAlign = alignProps.vAlign; + // var paddingTop = Number(alignProps.paddingTop); + // var paddingBottom = Number(alignProps.paddingBottom); + // var paddingLeft = Number(alignProps.paddingLeft); + // var paddingRight = Number(alignProps.paddingRight); + + // var topParam = 0.0; + // var bottomParam = 1.0; + // var leftParam = 0.0; + // var rightParam = 1.0; + + // var textObj = $jobj(textId); + // var textObjParent = textObj.offsetParent(); + // var parentId = textObjParent.attr('id'); + // var isConnector = false; + // if(parentId) { + // parentId = $ax.visibility.getWidgetFromContainer(textObjParent.attr('id')); + // textObjParent = $jobj(parentId); + // var parentObj = $obj(parentId); + // if(parentObj['bottomTextPadding']) bottomParam = parentObj['bottomTextPadding']; + // if(parentObj['topTextPadding']) topParam = parentObj['topTextPadding']; + // if(parentObj['leftTextPadding']) leftParam = parentObj['leftTextPadding']; + // if(parentObj['rightTextPadding']) rightParam = parentObj['rightTextPadding']; + + // // smart shapes are mutually exclusive from compound vectors. + // isConnector = parentObj.type == $ax.constants.CONNECTOR_TYPE; + // } + // if(isConnector) return; + + // var axTextObjectParent = $ax('#' + textObjParent.attr('id')); + + // var oldWidth = $ax.getNumFromPx(textObj.css('width')); + // var oldLeft = $ax.getNumFromPx(textObj.css('left')); + // var oldTop = $ax.getNumFromPx(textObj.css('top')); + + // var newTop = 0; + // var newLeft = 0.0; + + // var width = axTextObjectParent.width(); + // var height = axTextObjectParent.height(); + + // // If text rotated need to handle getting the correct width for text based on bounding rect of rotated parent. + // var boundingRotation = -$ax.move.getRotationDegreeFromElement(textObj[0]); + // var boundingParent = $axure.fn.getBoundingSizeForRotate(width, height, boundingRotation); + // var extraLeftPadding = (width - boundingParent.width) / 2; + // width = boundingParent.width; + // var relativeTop = 0.0; + // relativeTop = height * topParam; + // var containerHeight = height * bottomParam - relativeTop; + + + // newLeft = paddingLeft + extraLeftPadding + width * leftParam; + + // var newWidth = width * (rightParam - leftParam) - paddingLeft - paddingRight; + + // var horizChange = newWidth != oldWidth || newLeft != oldLeft; + // if(horizChange) { + // textObj.css('left', newLeft); + // textObj.width(newWidth); + // } + + // var textHeight = _getRtfElementHeight(textObj[0]); + + // if(vAlign == "middle") newTop = _roundToEven(relativeTop + (containerHeight - textHeight + paddingTop - paddingBottom) / 2); + // else if(vAlign == "bottom") newTop = _roundToEven(relativeTop + containerHeight - textHeight - paddingBottom); + // else newTop = _roundToEven(paddingTop + relativeTop); + // var vertChange = oldTop != newTop; + // if(vertChange) textObj.css('top', newTop + 'px'); + + // if((vertChange || horizChange)) _updateTransformOrigin(textId); + //}; + + //var _updateTransformOrigin = function (textId) { + // var textObj = $jobj(textId); + // var parentId = textObj.parent().attr('id'); + // if(!$obj(parentId).hasTransformOrigin) return; + + // //var transformOrigin = textObj.css('-webkit-transform-origin') || + // // textObj.css('-moz-transform-origin') || + // // textObj.css('-ms-transform-origin') || + // // textObj.css('transform-origin'); + // //if(transformOrigin) { + // var textObjParent = $ax('#' + textObj.parent().attr('id')); + // var newX = (textObjParent.width() / 2 - $ax.getNumFromPx(textObj.css('left'))); + // var newY = (textObjParent.height() / 2 - $ax.getNumFromPx(textObj.css('top'))); + // var newOrigin = newX + 'px ' + newY + 'px'; + // textObj.css('-webkit-transform-origin', newOrigin); + // textObj.css('-moz-transform-origin', newOrigin); + // textObj.css('-ms-transform-origin', newOrigin); + // textObj.css('transform-origin', newOrigin); + // //} + //}; + + $ax.style.reselectElements = function() { + for(var id in _selectedWidgets) { + // Only looking for the selected widgets that don't have their class set + if(!_selectedWidgets[id] || $jobj(id).hasClass('selected')) continue; + + $jobj(id).addClass('selected'); + _applyImageAndTextJson(id, $ax.style.generateState(id)); + } + + for(id in _disabledWidgets) { + // Only looking for the disabled widgets that don't have their class yet + if (!_disabledWidgets[id] || $jobj(id).hasClass('disabled')) continue; + + $jobj(id).addClass('disabled'); + _applyImageAndTextJson(id, $ax.style.generateState(id)); + } + } + + $ax.style.clearStateForRepeater = function(repeaterId) { + var children = $ax.getChildElementIdsForRepeater(repeaterId); + for(var i = 0; i < children.length; i++) { + var id = children[i]; + delete _selectedWidgets[id]; + delete _disabledWidgets[id]; + } + } + + _style.updateStateClass = function (repeaterId) { + var subElementIds = $ax.getChildElementIdsForRepeater(repeaterId); + for (var i = 0; i < subElementIds.length; i++) { + _applyImageAndTextJson(subElementIds[i], $ax.style.generateState(subElementIds[i])); + } + } + + $ax.style.clearAdaptiveStyles = function() { + for(var shapeId in _adaptiveStyledWidgets) { + var repeaterId = $ax.getParentRepeaterFromScriptId(shapeId); + if(repeaterId) continue; + var elementId = $ax.GetButtonShapeId(shapeId); + if(elementId) _applyImageAndTextJson(elementId, $ax.style.generateState(elementId)); + } + + _adaptiveStyledWidgets = {}; + }; + + $ax.style.setAdaptiveStyle = function(shapeId, style) { + _adaptiveStyledWidgets[$ax.repeater.getScriptIdFromElementId(shapeId)] = style; + + var textId = $ax.GetTextPanelId(shapeId); + if(textId) _applyTextStyle(textId, style); + + $ax.placeholderManager.refreshPlaceholder(shapeId); + + // removing this for now + // if(style.location) { + // $jobj(shapeId).css('top', style.location.x + "px") + // .css('left', style.location.y + "px"); + // } + }; + + //------------------------------------------------------------------------- + // _applyTextStyle + // + // Applies a rollover style to a text element. + // id : the id of the text object to set. + // styleProperties : an object mapping style properties to values. eg: + // { 'fontWeight' : 'bold', + // 'fontStyle' : 'italic' } + //------------------------------------------------------------------------- + var _applyTextStyle = function(id, style) { + _transformTextWithVerticalAlignment(id, function() { + var styleProperties = _getCssStyleProperties(style); + $('#' + id).find('*').each(function(index, element) { + _applyCssProps(element, styleProperties); + }); + }); + }; + + var _applyCssProps = function(element, styleProperties, applyAllStyle) { + if(applyAllStyle) { + var allProps = styleProperties.allProps; + for(var prop in allProps) element.style[prop] = allProps[prop]; + } else { + var nodeName = element.nodeName.toLowerCase(); + if(nodeName == 'p') { + var parProps = styleProperties.parProps; + for(prop in parProps) element.style[prop] = parProps[prop]; + } else if(nodeName != 'a') { + var runProps = styleProperties.runProps; + for(prop in runProps) element.style[prop] = runProps[prop]; + } + } + }; + + var _getCssShadow = function(shadow) { + return !shadow.on ? "none" + : shadow.offsetX + "px " + shadow.offsetY + "px " + shadow.blurRadius + "px " + _getCssColor(shadow.color); + }; + + var _getCssStyleProperties = function(style) { + var toApply = {}; + toApply.runProps = {}; + toApply.parProps = {}; + toApply.allProps = {}; + + if(style.fontName) toApply.allProps.fontFamily = toApply.runProps.fontFamily = style.fontName; + // we need to set font size on both runs and pars because otherwise it well mess up the measure and thereby vertical alignment + if(style.fontSize) toApply.allProps.fontSize = toApply.runProps.fontSize = toApply.parProps.fontSize = style.fontSize; + if(style.fontWeight !== undefined) toApply.allProps.fontWeight = toApply.runProps.fontWeight = style.fontWeight; + if(style.fontStyle !== undefined) toApply.allProps.fontStyle = toApply.runProps.fontStyle = style.fontStyle; + + var textDecoration = []; + if(style.underline !== undefined) textDecoration[0] = style.underline ? 'underline ' : 'none'; + if(style.strikethrough !== undefined) { + var index = textDecoration.length; + if(style.strikethrough) textDecoration[index] ='line-through'; + else if(index == 0) textDecoration[0] = 'none'; + } + if (textDecoration.length > 0) { + var decorationLineUp = ""; + for (var l = 0; l < textDecoration.length; l++) { + decorationLineUp = decorationLineUp + textDecoration[l]; + } + toApply.allProps.textDecoration = toApply.runProps.textDecoration = decorationLineUp; + } + if(style.foreGroundFill) { + toApply.allProps.color = toApply.runProps.color = _getColorFromFill(style.foreGroundFill); + //if(style.foreGroundFill.opacity) toApply.allProps.opacity = toApply.runProps.opacity = style.foreGroundFill.opacity; + } + if(style.horizontalAlignment) toApply.allProps.textAlign = toApply.parProps.textAlign = toApply.runProps.textAlign = style.horizontalAlignment; + if(style.lineSpacing) toApply.allProps.lineHeight = toApply.parProps.lineHeight = style.lineSpacing; + if(style.textShadow) toApply.allProps.textShadow = toApply.parProps.textShadow = _getCssShadow(style.textShadow); + if (style.letterCase) toApply.allProps.textTransform = toApply.parProps.textTransform = style.letterCase; + if (style.characterSpacing) toApply.allProps.letterSpacing = toApply.runProps.letterSpacing = style.characterSpacing; + + return toApply; + }; + + var _getColorFromFill = function(fill) { + //var fillString = '00000' + fill.color.toString(16); + //return '#' + fillString.substring(fillString.length - 6); + var val = fill.color; + var color = {}; + color.b = val % 256; + val = Math.floor(val / 256); + color.g = val % 256; + val = Math.floor(val / 256); + color.r = val % 256; + color.a = typeof (fill.opacity) == 'number' ? fill.opacity : 1; + return _getCssColor(color); + }; + + var _getCssColor = function(rgbaObj) { + return "rgba(" + rgbaObj.r + ", " + rgbaObj.g + ", " + rgbaObj.b + ", " + rgbaObj.a + ")"; + }; + + // //-------------------------------------------------------------------------- + // // ApplyStyleRecursive + // // + // // Applies a style recursively to all span and div tags including elementNode + // // and all of its children. + // // + // // element : the element to apply the style to + // // styleName : the name of the style property to set (eg. 'font-weight') + // // styleValue : the value of the style to set (eg. 'bold') + // //-------------------------------------------------------------------------- + // function ApplyStyleRecursive(element, styleName, styleValue) { + // var nodeName = element.nodeName.toLowerCase(); + + // if (nodeName == 'div' || nodeName == 'span' || nodeName == 'p') { + // element.style[styleName] = styleValue; + // } + + // for (var i = 0; i < element.childNodes.length; i++) { + // ApplyStyleRecursive(element.childNodes[i], styleName, styleValue); + // } + // } + + // //--------------------------------------------------------------------------- + // // ApplyTextProperty + // // + // // Applies a text property to rtfElement. + // // + // // rtfElement : the the root text element of the rtf object (this is the + // // element named _rtf + // // prop : the style property to set. + // // value : the style value to set. + // //--------------------------------------------------------------------------- + // function ApplyTextProperty(rtfElement, prop, value) { + // /* + // var oldHtml = rtfElement.innerHTML; + // if (prop == 'fontWeight') { + // rtfElement.innerHTML = oldHtml.replace(/< *b *\/?>/gi, ""); + // } else if (prop == 'fontStyle') { + // rtfElement.innerHTML = oldHtml.replace(/< *i *\/?>/gi, ""); + // } else if (prop == 'textDecoration') { + // rtfElement.innerHTML = oldHtml.replace(/< *u *\/?>/gi, ""); + // } + // */ + + // for (var i = 0; i < rtfElement.childNodes.length; i++) { + // ApplyStyleRecursive(rtfElement.childNodes[i], prop, value); + // } + // } + //} + + //--------------------------------------------------------------------------- + // GetAndCacheOriginalText + // + // Gets the html for the pre-rollover state and returns the Html representing + // the Rich text. + //--------------------------------------------------------------------------- + var CACHE_COUNTER = 0; + + $ax.style.CacheOriginalText = function(textId, hasRichTextBeenSet) { + var rtfQuery = $('#' + textId); + if(rtfQuery.length > 0) { + + var styleCache = {}; + rtfQuery.find('*').each(function(index, element) { + var elementId = element.id; + if(!elementId) element.id = elementId = 'cache' + CACHE_COUNTER++; + styleCache[elementId] = element.style.cssText; + }); + + _originalTextCache[textId] = { + styleCache: styleCache + }; + if(hasRichTextBeenSet) { + var shapeId = $ax.GetShapeIdFromText(textId); + _shapesWithSetRichText[shapeId] = true; + } + } + }; + + $ax.style.ClearCacheForRepeater = function(repeaterId) { + for(var elementId in _originalTextCache) { + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + if($ax.getParentRepeaterFromScriptId(scriptId) == repeaterId) delete _originalTextCache[elementId]; + } + }; + + + + $ax.style.prefetch = function() { + var scriptIds = $ax.getAllScriptIds(); + var image = new Image(); + for(var i = 0; i < scriptIds.length; i++) { + var obj = $obj(scriptIds[i]); + if (!$ax.public.fn.IsImageBox(obj.type)) continue; + var images = obj.images; + for (var key in images) image.src = images[key]; + + var imageOverrides = obj.imageOverrides; + for(var elementId in imageOverrides) { + var override = imageOverrides[elementId]; + for (var state in override) { + _addImageOverride(elementId, state, override[state]); + image.src = override[state]; + } + } + } + }; +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/tree.js b/code/page/resources/scripts/axure/tree.js new file mode 100644 index 0000000..7c5ca2d --- /dev/null +++ b/code/page/resources/scripts/axure/tree.js @@ -0,0 +1,189 @@ +// This is actually for BOTH trees and menus +$axure.internal(function($ax) { + var _tree = $ax.tree = {}; + var _menu = $ax.menu = {}; + + $ax.menu.InitializeSubmenu = function(subMenuId, cellId) { + var $submenudiv = $('#' + subMenuId); + + //mouseenter and leave for parent table cell + $('#' + cellId).mouseenter(function(e) { + //show current submenu +// var submenuElement = document.getElementById(subMenuId); +// if($ax.visibility.IsVisible(submenuElement) && submenuElement.style.display !== 'none') return; + $ax.visibility.SetIdVisible(subMenuId, true); + $ax.legacy.BringToFront(subMenuId); + //$submenudiv.find('.menu_item').each(function() { + // $ax.style.updateTextAlignmentForVisibility($ax.GetTextPanelId($(this).attr('id'))); + //}); + _fireEventForSubmenu(subMenuId, "onShow"); + + }).mouseleave(function (e) { + var offset = $submenudiv.offset(); + var subcontwidth = $submenudiv.width(); + var subcontheight = $submenudiv.height(); + //If mouse is not within the submenu (added 3 pixel margin to top and left calculations), then close the submenu... + if(e.pageX + 3 < offset.left || e.pageX > offset.left + subcontwidth || e.pageY + 3 < offset.top || e.pageY > offset.top + subcontheight) { + $submenudiv.find('.sub_menu').addBack().each(function () { +// if(!$ax.visibility.IsVisible(this)) return; + $ax.visibility.SetVisible(this, false); + _fireEventForSubmenu(subMenuId, "onHide"); + }); + $ax.style.SetWidgetHover(cellId, false); + } + }); + + $submenudiv.css('display', 'none'); + + //mouseleave for submenu + $submenudiv.mouseleave(function(e) { + //close this menu and all menus below it + $(this).find('.sub_menu').addBack().css({ 'visibility': 'hidden', 'display': 'none' }).each(function () { +// if(!$ax.visibility.IsVisible(this)) return; + _fireEventForSubmenu(this.id, "onHide"); + }); + $ax.style.SetWidgetHover(cellId, false); + }); + }; + + var _fireEventForSubmenu = function(targetId, eventName) { + var diagramObject = $ax.getObjectFromElementId(targetId); + var event = diagramObject.interactionMap && diagramObject.interactionMap[eventName]; + if(event) { + var eventInfo = $ax.getEventInfoFromEvent($ax.getjBrowserEvent(), false, targetId); + $ax.event.handleEvent(targetId, eventInfo, event, false, true); + } + } + + function IsNodeVisible(nodeId) { + var current = window.document.getElementById(nodeId); + var parent = current.parentNode; + + //move all the parent's children that are below the node and their annotations + while(!$(current).hasClass("treeroot")) { + if(!$ax.visibility.IsVisible(parent)) return false; + current = parent; + parent = parent.parentNode; + } + return true; + } + + $ax.tree.ExpandNode = function(nodeId, childContainerId, plusMinusId) { + var container = window.document.getElementById(childContainerId); + if(!container || $ax.visibility.IsVisible(container)) return; + $ax.visibility.SetVisible(container, true); + + if(plusMinusId != '') $ax.style.SetWidgetSelected(plusMinusId, true); + + var delta = _getExpandCollapseDelta(nodeId, childContainerId); + + var isVisible = IsNodeVisible(nodeId); + var current = window.document.getElementById(nodeId); + var parent = current.parentNode; + + //move all the parent's children that are below the node and their annotations + while(!$(current).hasClass("treeroot")) { + var after = false; + var i = 0; + for(i = 0; i < parent.childNodes.length; i++) { + var child = parent.childNodes[i]; + if(after && child.id && $(child).hasClass("treenode")) { + var elementId = child.id; + child.style.top = $ax.getNumFromPx($(child).css('top')) + delta + 'px'; + var ann = window.document.getElementById(elementId + "_ann"); + if (ann) ann.style.top = $ax.getNumFromPx($(ann).css('top')) + delta + 'px'; + } + if(child == current) after = true; + } + current = parent; + parent = parent.parentNode; + if(!isVisible && $ax.visibility.IsVisible(parent)) break; + } + }; + + $ax.tree.CollapseNode = function(nodeId, childContainerId, plusMinusId) { + var container = window.document.getElementById(childContainerId); + if(!container || !$ax.visibility.IsVisible(container)) return; + + if(plusMinusId != '') $ax.style.SetWidgetSelected(plusMinusId, false); + + var delta = _getExpandCollapseDelta(nodeId, childContainerId); + + //hide it after getting the delta, otherwise the delta can't be calculated (offsetParent is null) + $ax.visibility.SetVisible(container, false); + + var isVisible = IsNodeVisible(nodeId); + var current = window.document.getElementById(nodeId); + var parent = current.parentNode; + + //move all the parent's children that are below the node and their annotations + while(!$(current).hasClass("treeroot")) { + var after = false; + var i = 0; + for(i = 0; i < parent.childNodes.length; i++) { + var child = parent.childNodes[i]; + if(after && child.id && $(child).hasClass("treenode")) { + var elementId = child.id; + child.style.top = $ax.getNumFromPx($(child).css('top')) - delta + 'px'; + var ann = window.document.getElementById(elementId + "_ann"); + if (ann) ann.style.top = $ax.getNumFromPx($(ann).css('top')) - delta + 'px'; + } + if(child == current) after = true; + } + current = parent; + parent = current.parentNode; + if(!isVisible && $ax.visibility.IsVisible(parent)) break; + } + }; + + var _getExpandCollapseDelta = function(nodeId, childContainerId) { + return _getChildContainerHeightHelper(childContainerId); + }; + + var _getChildContainerHeightHelper = function(childContainerId) { + var height = 0; + $('#' + childContainerId).children().each(function() { + if($(this).hasClass("treenode")) { + height += $(this).height(); + var subContainer = window.document.getElementById(this.id + '_children'); + if(subContainer && $ax.visibility.IsVisible(subContainer)) { + height += _getChildContainerHeightHelper(subContainer.id); + } + } + }); + return height; + }; + + $ax.tree.InitializeTreeNode = function(nodeId, plusminusid, childContainerId, selectText) { + var childContainer = window.document.getElementById(childContainerId); + if(childContainer) { + //relying on the html generator to put this inline so we know to collapse by default + var isCollapsed = childContainer.style.visibility == "hidden"; + if(isCollapsed) $ax.visibility.SetVisible(childContainer, false); + + if(!isCollapsed && plusminusid != '') $ax.style.SetWidgetSelected(plusminusid, true); + } + + if(plusminusid != '') { + $jobj(plusminusid).click(function() { + var visibleSet = $ax.visibility.IsIdVisible(childContainerId); + + if(visibleSet) $ax.tree.CollapseNode(nodeId, childContainerId, plusminusid); + else $ax.tree.ExpandNode(nodeId, childContainerId, plusminusid); + $ax.tree.SelectTreeNode(nodeId, true); + + return false; + }).css('cursor', 'default'); + } + }; + + var _getButtonShapeId = function(id) { + var obj = $obj(id); + return $ax.public.fn.IsTreeNodeObject(obj.type) ? $ax.getElementIdFromPath([obj.buttonShapeId], { relativeTo: id }) : id; + }; + + $ax.tree.SelectTreeNode = function(id, selected) { + $ax.style.SetWidgetSelected(_getButtonShapeId(id), selected); + }; + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/utils.temp.js b/code/page/resources/scripts/axure/utils.temp.js new file mode 100644 index 0000000..43ba542 --- /dev/null +++ b/code/page/resources/scripts/axure/utils.temp.js @@ -0,0 +1,99 @@ +// ******* Deep Copy ******** // +$axure.internal(function($ax) { + // TODO: [ben] Ah, infinite loops cause major issues here. Tried saving objects we've already hit, but that didn't seem to work (at least at my first shot). + // TODO: [ben] To continue from above, added a filter to filter out problem keys. Will need a better way of sorting this out eventually. + var _deepCopy = function (original, trackCopies, filter) { + if(trackCopies) { + var index = _getCopyIndex(original); + if(index != -1) return _originalToCopy[index][1]; + } + var isArray = original instanceof Array; + var isObject = !(original instanceof Function) && !(original instanceof Date) && (original instanceof Object); + if(!isArray && !isObject) return original; + var copy = isArray ? [] : { }; + if(trackCopies) _originalToCopy.push([original, copy]); + isArray ? deepCopyArray(original, trackCopies, copy, filter) : deepCopyObject(original, trackCopies, copy, filter); + return copy; + }; + $ax.deepCopy = _deepCopy; + + // Hacky way to copy event info. Copying dragInfo causes major issues due to infinite loops + // Hashmap doesn't map objects well. It just toStrings them, making them all the same key. This has to be slow... + var _originalToCopy = []; + var _getCopyIndex = function(original) { + for(var i = 0; i < _originalToCopy.length; i++) if(original === _originalToCopy[i][0]) return i; + return -1; + }; + + $ax.eventCopy = function(eventInfo) { + var copy = _deepCopy(eventInfo, true, ['dragInfo', 'elementQuery', 'obj']); + // reset the map. TODO: May need to reset elsewhere too, but this is the only way it's used currently + _originalToCopy = []; + + return copy; + }; + + var deepCopyArray = function(original, trackCopies, copy, filter) { + for(var i = 0; i < original.length; i++) { + copy[i] = _deepCopy(original[i], trackCopies, filter); + } + }; + + var deepCopyObject = function(original, trackCopies, copy, filter) { + for(var key in original) { + if(!original.hasOwnProperty(key)) continue; // Continue if the prop was not put there like a dictionary, but just a native part of the object + + if(filter && filter.indexOf[key] != -1) copy[key] = original[key]; // If that key is filtered out, skip recursion on it. + else copy[key] = _deepCopy(original[key], trackCopies, filter); + } + }; + + // Our implementation of splice because it is broken in IE8... + $ax.splice = function(array, startIndex, count) { + var retval = []; + if(startIndex >= array.length || startIndex < 0 || count == 0) return retval; + if(!count || startIndex + count > array.length) count = array.length - startIndex; + for(var i = 0; i < count; i++) retval[i] = array[startIndex + i]; + for(i = startIndex + count; i < array.length; i++) array[i - count] = array[i]; + for(i = 0; i < count; i++) array.pop(); + return retval; + }; +}); + + + +// ******* Flow Shape Links ******** // +$axure.internal(function($ax) { + + $(window.document).ready(function() { + if (!$ax.document.configuration.linkFlowsToPages && !$ax.document.configuration.linkFlowsToPagesNewWindow) return; + + $ax(function (dObj) { return ($ax.public.fn.IsVector(dObj.type) || $ax.public.fn.IsSnapshot(dObj.type)) && dObj.referencePageUrl; }).each(function (dObj, elementId) { + + var elementIdQuery = $('#' + elementId); + + if($ax.document.configuration.linkFlowsToPages && !$ax.event.HasClick(dObj)) { + elementIdQuery.css("cursor", "pointer"); + elementIdQuery.click(function() { + $ax.navigate({ + url: dObj.referencePageUrl, + target: "current", + includeVariables: true + }); + }); + } + + if($ax.document.configuration.linkFlowsToPagesNewWindow) { + $('#' + elementId + "_ref").append("
      "); + $('#' + elementId + "PagePopup").click(function() { + $ax.navigate({ + url: dObj.referencePageUrl, + target: "new", + includeVariables: true + }); + }); + } + }); + }); + +}); diff --git a/code/page/resources/scripts/axure/variables.js b/code/page/resources/scripts/axure/variables.js new file mode 100644 index 0000000..19a26f8 --- /dev/null +++ b/code/page/resources/scripts/axure/variables.js @@ -0,0 +1,151 @@ +// ******* GLOBAL VARIABLE PROVIDER ******** // +$axure.internal(function($ax) { + var _globalVariableValues = {}; + + var _globalVariableProvider = {}; + $ax.globalVariableProvider = _globalVariableProvider; + + var setVariableValue = function(variable, value, suppressBroadcast) { + if(!(value instanceof Object)) value = value.toString(); + + variable = variable.toLowerCase(); + _globalVariableValues[variable] = value; + + if(suppressBroadcast !== true) { + var varData = { + globalVarName: variable, + globalVarValue: value.toString() + }; + + $axure.messageCenter.postMessage('setGlobalVar', varData); + } + + //Post global var values only if pageData is loaded (suppresses exception which occurs when page loads) + if($ax.pageData) { + _postGlobalVarVals(); + } + }; + _globalVariableProvider.setVariableValue = setVariableValue; + + var getVariableValue = function(variable, eventInfo, ignoreDefaultsForLinkUrl) { + variable = variable.toLowerCase(); + if(_globalVariableValues[variable] !== undefined) { + //If this is for the GetLinkUrl function and + //the current value of the global variable is the same as the default defined in the document, don't return it + if(ignoreDefaultsForLinkUrl == true && $ax.document.globalVariables[variable] == _globalVariableValues[variable]) { + return null; + } + + return _globalVariableValues[variable]; + } + if($ax.document.globalVariables[variable] !== undefined) return ignoreDefaultsForLinkUrl == true ? null : $ax.document.globalVariables[variable]; + switch(variable) { + case "pagename": return $ax.pageData.page.name; + + case "now": return eventInfo.now; + case "gendate": return $ax.pageData.generationDate; + + case "dragx": return $ax.drag.GetDragX(); + case "dragy": return $ax.drag.GetDragY(); + case "totaldragx": return $ax.drag.GetTotalDragX(); + case "totaldragy": return $ax.drag.GetTotalDragY(); + case "dragtime": return $ax.drag.GetDragTime(); + + case "math": return Math; + case "date": return Date; + + case "window": return eventInfo && eventInfo.window; + case "this": return eventInfo && eventInfo.thiswidget && $ax.getWidgetInfo(eventInfo.thiswidget.elementId); + case "item": return (eventInfo && eventInfo.item && eventInfo.item.valid && eventInfo.item) || getVariableValue('targetitem', eventInfo, ignoreDefaultsForLinkUrl); + case "targetitem": return eventInfo && eventInfo.targetElement && $ax.getItemInfo(eventInfo.targetElement); + case "repeater": return eventInfo && eventInfo.repeater; + case "target": return eventInfo && eventInfo.targetElement && $ax.getWidgetInfo(eventInfo.targetElement); + case "cursor": return eventInfo && eventInfo.cursor; + default: + var gen = variable.substr(0, 3) == "gen"; + var date = gen ? $ax.pageData.generationDate : new Date(); + var prop = gen ? variable.substr(3) : variable; + switch(prop) { + case "day": return date.getDate(); + case "month": return date.getMonth() + 1; + case "monthname": return $ax.getMonthName(date.getMonth()); + case "dayofweek": return $ax.getDayOfWeek(date.getDay()); + case "year": return date.getFullYear(); + case "time": return date.toLocaleTimeString(); + case "hours": return date.getHours(); + case "minutes": return date.getMinutes(); + case "seconds": return date.getSeconds(); + default: return ''; + } + } + }; + _globalVariableProvider.getVariableValue = getVariableValue; + + var load = function() { + var csum = false; + + var query = (window.location.href.split("#")[1] || ''); //hash.substring(1); Firefox decodes this so & in variables breaks + if(query.length > 0) { + var vars = query.split("&"); + for(var i = 0; i < vars.length; i++) { + var pair = vars[i].split("="); + var varName = pair[0]; + var varValue = pair[1]; + if(varName) { + if(varName == 'CSUM') { + csum = true; + } else setVariableValue(varName, decodeURIComponent(varValue), true); + } + } + + if(!csum && query.length > 250) { + window.alert('Axure Warning: The variable values were too long to pass to this page.\n\nIf you are using IE, using Chrome or Firefox will support more data.'); + } + } + }; + + var getLinkUrl = function(baseUrl) { + var toAdd = ''; + var definedVariables = _getDefinedVariables(); + for(var i = 0; i < definedVariables.length; i++) { + var key = definedVariables[i]; + var val = getVariableValue(key, undefined, true); + if(val != null) { + if(toAdd.length > 0) toAdd += '&'; + toAdd += key + '=' + encodeURIComponent(val); + } + } + return toAdd.length > 0 ? baseUrl + ($axure.shouldSendVarsToServer() ? '?' : '#') + toAdd + "&CSUM=1" : baseUrl; + }; + _globalVariableProvider.getLinkUrl = getLinkUrl; + + var _getDefinedVariables = function() { + return $ax.pageData.variables; + }; + _globalVariableProvider.getDefinedVariables = _getDefinedVariables; + + var _postGlobalVarVals = function() { + var retVal = {}; + var definedVariables = _getDefinedVariables(); + for(var i = 0; i < definedVariables.length; i++) { + var key = definedVariables[i]; + var val = getVariableValue(key); + if(val != null) { + retVal[key] = val; + } + } + + $ax.messageCenter.postMessage('globalVariableValues', retVal); + }; + + $ax.messageCenter.addMessageListener(function(message, data) { + if(message == 'getGlobalVariables') { + _postGlobalVarVals(); + } else if(message == 'resetGlobalVariables') { + _globalVariableValues = {}; + _postGlobalVarVals(); + } + }); + + load(); +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/viewer.js b/code/page/resources/scripts/axure/viewer.js new file mode 100644 index 0000000..10415e4 --- /dev/null +++ b/code/page/resources/scripts/axure/viewer.js @@ -0,0 +1,268 @@ +// ******* SITEMAP TOOLBAR VIEWER ACTIONS ******** // +$axure.internal(function ($ax) { + var userTriggeredEventNames = ['onClick', 'onDoubleClick', 'onMouseOver', 'onMouseMove', 'onMouseOut', 'onMouseDown', 'onMouseUp', + 'onKeyDown', 'onKeyUp', 'onFocus', 'onLostFocus', 'onTextChange', 'onSelectionChange', 'onSelectedChange', 'onSelect', 'onUnselect', + 'onSwipeLeft', 'onSwipeRight', 'onSwipeUp', 'onSwipeDown', 'onDragStart', 'onDrag', 'onDragDrop', 'onScroll', 'onContextMenu', 'onMouseHover', 'onLongClick']; + + //var _toggleSelectWidgetNoteForRepeater = function (repeaterId, scriptId, select) { + // var itemIds = $ax.getItemIdsForRepeater(repeaterId); + + // for(var i = 0; i < itemIds.length; i++) { + // var itemId = itemIds[i]; + // var elementId = $ax.repeater.createElementId(scriptId, itemId); + // if(select) $('#' + elementId).addClass('widgetNoteSelected'); + // else $('#' + elementId).removeClass('widgetNoteSelected'); + // } + //} + $ax.messageCenter.addMessageListener(function (message, data) { + //If annotation toggle message received from sitemap, toggle footnotes + if(message == 'toggleSelectWidgetNote') { + + if (!IOS) { + $('.widgetNoteSelected').removeClass('widgetNoteSelected'); + } + + if(!data.value) return; + + //if(lastSelectedWidgetNote == data.id) { + // lastSelectedWidgetNote = null; + // return; + //} + + $ax('*').each(function(obj, elementId) { + if (obj.id == data.id) { + if (!IOS) { + $('#' + elementId).addClass('widgetNoteSelected'); + } + + _scrollToSelectedNote($('#' + elementId), data.view); + } + }); + } + }); + + var _scrollToSelectedNote = function ($elmt, view) { + var isLandscape = IOS ? window.orientation != 0 && window.orientation != 180 : false; + var winWidth = !IOS ? $(window).width() : (isLandscape ? window.screen.height : window.screen.width) - view.panelWidthOffset; + var winHeight = !IOS ? $(window).height() : view.height; + var docLeft = $('html').last().scrollLeft(); + var docTop = $('html').last().scrollTop(); + var docRight = docLeft + winWidth; + var docBottom = docTop + winHeight; + + var scale = $('#base').css('transform');; + scale = (scale == "none") ? 1 : Number(scale.substring(scale.indexOf('(') + 1, scale.indexOf(','))); + + var bodyLeft = ($('body').css('left') !== undefined && $('body').css('left') !== "auto") ? Number($('body').css('left').replace('px','')) : 0; + var top = scale * Number($elmt.css('top').replace('px', '')); + var bottom = top + scale * $elmt.height(); + var left = scale * Number($elmt.css('left').replace('px', '')) + bodyLeft; + var right = left + scale * $elmt.width(); + + var doHorizontalMove = left < docLeft || right > docRight; + var doVerticalMove = top < docTop || bottom > docBottom; + var padding = scale * 50; + + var newScrollLeft = 0 + if (left < docLeft) { + newScrollLeft = left - padding; + } else if (right > docRight) { + newScrollLeft = right + padding - winWidth; + } + + var newScrollTop = 0 + if (top < docTop) { + newScrollTop = top - padding; + } else if (bottom > docBottom) { + newScrollTop = bottom + padding - winHeight; + } + + // Device Frame or Scale to width or Scale to fit (situations where there is no horizontal scroll) + if (view.h || view.scaleVal == 1 || view.scaleVal == 2) { + doHorizontalMove = false; + } + + // Has Device Frame or Scale to Width and widget with note is outside of viewable panel right bounds + if ((view.scaleVal == 1 || view.h) && (left > docRight)) { + doVerticalMove = false; + } + + // TODO: need to do something for dynamic panel with scroll + if (doHorizontalMove && doVerticalMove) { + $("html, body").animate({ scrollLeft: newScrollLeft, scrollTop: newScrollTop }, 300); + } else if (doHorizontalMove) { + $("html, body").animate({ scrollLeft: newScrollLeft }, 300); + } else if (doVerticalMove) { + $("html, body").animate({ scrollTop: newScrollTop }, 300); + } + } + + var highlightEnabled = false; + $ax.messageCenter.addMessageListener(function(message, data) { + if(message == 'highlightInteractive') { + highlightEnabled = data == true; + _applyHighlight($ax('*')); + } + }); + + var _applyHighlight = $ax.applyHighlight = function(query, ignoreUnset) { + if(ignoreUnset && !highlightEnabled) return; + + var pulsateClassName = 'legacyPulsateBorder'; + //Determine if the widget has a defined userTriggeredEventName specified in the array above + var _isInteractive = function(diagramObject) { + if(diagramObject && diagramObject.interactionMap) { + for(var index in userTriggeredEventNames) { + if(diagramObject.interactionMap[userTriggeredEventNames[index]]) return true; + } + } + return false; + }; + + //Traverse through parent layers (if any) of an element and see if any have a defined userTriggeredEventName + var _findMatchInParent = function(id) { + var parents = $ax('#' + id).getParents(true, ['layer'])[0]; + for(var i in parents) { + var parentId = parents[i]; + var parentObj = $ax.getObjectFromScriptId(parentId); + if(_isInteractive(parentObj)) return true; + } + return false; + }; + + //Find all widgets with a defined userTriggeredEventName specified in the array above + var $matchingElements = query.filter(function (obj, id) { + + //This prevents the top left corner of the page from highlighting with everything else + if($ax.public.fn.IsLayer(obj.type)) return false; + + if(_isInteractive(obj)) return true; + else if($ax.public.fn.IsVector(obj.type) && obj.referencePageUrl) return true; + + //Last check on the object's parent layer(s), if a layer has a defined userTriggeredEventName + //then we shall highlight each member of that layer TODO This is a design decision and is subject to change + return _findMatchInParent(id); + }).$(); + + var isHighlighted = $matchingElements.is('.' + pulsateClassName); + + //Toggle the pulsate class on the matched elements + if(highlightEnabled && !isHighlighted) { + $matchingElements.addClass(pulsateClassName); + } else if(!highlightEnabled && isHighlighted) { + $matchingElements.removeClass(pulsateClassName); + } + }; + + var getElementsFromPoint = function (x, y) { + var elementsFromPointFn = document.elementsFromPoint || document.msElementsFromPoint; + if (typeof elementsFromPointFn === "function") { + return elementsFromPointFn.bind(document)(x, y); + } + return []; + } + + $axure.getIdAndRectAtLoc = function (data) { + var element = document.elementFromPoint(data.x, data.y); + if (!element) return undefined; + + var jObj = _getElementIdFromTarget(element); + if (jObj.length > 0) { + var id = jObj.attr('id'); + var axObj = $ax('#' + id); + var rect = axObj.pageBoundingRect(); + return { 'id': id, 'rect': rect }; + } + return undefined; + } + + $axure.getListOfIdAndRectAtLoc = function (data) { + var domElements = getElementsFromPoint(data.x, data.y); + + if (!domElements || !domElements.length) return []; + + const elements = []; + + domElements.forEach(function (domElement) { + var jObj = _getElementIdFromTarget(domElement); + if (jObj.length > 0) { + var id = jObj.attr('id'); + var axObj = $ax('#' + id); + var rect = axObj.pageBoundingRect(); + if (elements.findIndex(function (x) { return x.id === id }) < 0) { + elements.push( { 'id': id, 'rect': rect } ); + } + } + }); + + return elements; + } + + $axure.getIdRectAndStyleAtLoc = function(data) { + var element = document.elementFromPoint(data.x, data.y); + if (!element) return undefined; + + var jObj = _getElementIdFromTarget(element); + if (jObj.length > 0) { + var id = jObj.attr('id'); + return $axure.getRectAndStyleById(id); + } + return undefined; + } + + $axure.getListOfIdRectAndStyleAtLoc = function(data) { + var domElements = getElementsFromPoint(data.x, data.y); + + if (!domElements || !domElements.length) return []; + + const elements = []; + + domElements.forEach(function (domElement) { + var jObj = _getElementIdFromTarget(domElement); + if (jObj.length > 0) { + var id = jObj.attr('id'); + if (elements.findIndex(function (x) { return x.id === id }) < 0) { + elements.push($axure.getRectAndStyleById(id)); + } + } + }); + + return elements; + } + + $axure.getRectAndStyleById = function (id) { + var axObj = $ax('#' + id); + var rect = axObj.pageBoundingRect(); + var style = $ax.style.computeFullStyle(id, $ax.style.generateState(id), $ax.adaptive.currentViewId); + style.text = axObj.text(); + return { 'id': id, 'rect': rect, 'style': style }; + } + + $axure.isIdVisible = function (id) { + return id ? $ax.visibility.IsIdVisible(id) : false; + } + + $axure.getParentElementById = function (elementId) { + if (!elementId) return undefined; + var parentId = $ax.getLayerParentFromElementId(elementId); + if (!parentId) { + return undefined; + } + return $axure.getRectAndStyleById(parentId); + } + + var _getElementIdFromTarget = function (target) { + var targetId = target.id; + var jTarget = $(target); + while((!targetId || targetId.indexOf('cache') > -1) && jTarget[0].tagName != 'HTML') { + jTarget = jTarget.parent(); + targetId = jTarget.attr('id'); + } + if(targetId && targetId != 'base') { + var sections = targetId.split('_'); + return $('#' + sections[0]); + } + return ''; + } + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axure/visibility.js b/code/page/resources/scripts/axure/visibility.js new file mode 100644 index 0000000..4c234bc --- /dev/null +++ b/code/page/resources/scripts/axure/visibility.js @@ -0,0 +1,1291 @@ +$axure.internal(function($ax) { + var document = window.document; + var _visibility = {}; + $ax.visibility = _visibility; + + var _defaultHidden = {}; + var _defaultLimbo = {}; + + // ****************** Visibility and State Functions ****************** // + + var _isIdVisible = $ax.visibility.IsIdVisible = function(id) { + return $ax.visibility.IsVisible(window.document.getElementById(id)); + }; + + $ax.visibility.IsVisible = function(element) { + //cannot use css('visibility') because that gets the effective visiblity + //e.g. won't be able to set visibility on panels inside hidden panels + return element.style.visibility != 'hidden'; + }; + + $ax.visibility.SetIdVisible = function(id, visible) { + $ax.visibility.SetVisible(window.document.getElementById(id), visible); + // Hide lightbox if necessary + if(!visible) { + $jobj($ax.repeater.applySuffixToElementId(id, '_lightbox')).remove(); + $ax.flyoutManager.unregisterPanel(id, true); + } + }; + + var _setAllVisible = function(query, visible) { + for(var i = 0; i < query.length; i++) { + _visibility.SetVisible(query[i], visible); + } + } + + $ax.visibility.SetVisible = function (element, visible) { + //not setting display to none to optimize measuring + if(visible) { + if($(element).hasClass(HIDDEN_CLASS)) $(element).removeClass(HIDDEN_CLASS); + if($(element).hasClass(UNPLACED_CLASS)) $(element).removeClass(UNPLACED_CLASS); + element.style.display = ''; + element.style.visibility = 'inherit'; + } else { + element.style.display = 'none'; + element.style.visibility = 'hidden'; + } + }; + + var _setWidgetVisibility = $ax.visibility.SetWidgetVisibility = function (elementId, options) { + var visible = $ax.visibility.IsIdVisible(elementId); + // If limboed, just fire the next action then leave. + if(visible == options.value || _limboIds[elementId]) { + if(!_limboIds[elementId]) options.onComplete && options.onComplete(); + $ax.action.fireAnimationFromQueue(elementId, $ax.action.queueTypes.fade); + return; + } + + options.containInner = true; + var query = $jobj(elementId); + var parentId = query.parent().attr('id'); + var axObj = $obj(elementId); + var preserveScroll = false; + var isPanel = $ax.public.fn.IsDynamicPanel(axObj.type); + var isLayer = $ax.public.fn.IsLayer(axObj.type); + if(!options.noContainer && (isPanel || isLayer)) { + //if dp has scrollbar, save its scroll position + if(isPanel && axObj.scrollbars != 'none') { + var shownState = $ax.dynamicPanelManager.getShownState(elementId); + preserveScroll = true; + //before hiding, try to save scroll location + if(!options.value && shownState) { + DPStateAndScroll[elementId] = { + shownId: shownState.attr('id'), + left: shownState.scrollLeft(), + top: shownState.scrollTop() + } + } + } + + _pushContainer(elementId, isPanel); + if(isPanel && !options.value) _tryResumeScrollForDP(elementId); + var complete = options.onComplete; + options.onComplete = function () { + if(complete) complete(); + _popContainer(elementId, isPanel); + //using containers stops mouseleave from firing on IE/Edge and FireFox + if(!options.value && $ax.event.mouseOverObjectId && (FIREFOX || $axure.browser.isEdge || IE)) { + var mouseOveredElement = $('#' + $ax.event.mouseOverObjectId); + if(mouseOveredElement && !mouseOveredElement.is(":visible")) { + var axObj = $obj($ax.event.mouseOverObjectId); + + if(($ax.public.fn.IsDynamicPanel(axObj.type) || $ax.public.fn.IsLayer(axObj.type)) && axObj.propagate) { + mouseOveredElement.trigger('mouseleave'); + } else mouseOveredElement.trigger('mouseleave.ixStyle'); + } + } + //after showing dp, restore the scoll position + if(isPanel && options.value) _tryResumeScrollForDP(elementId, true); + } + options.containerExists = true; + } + _setVisibility(parentId, elementId, options, preserveScroll); + + //set the visibility of the annotation box as well if it exists + var ann = document.getElementById(elementId + "_ann"); + if(ann) _visibility.SetVisible(ann, options.value); + + //set ref visibility for ref of flow shape, if that exists + var ref = document.getElementById(elementId + '_ref'); + if(ref) _visibility.SetVisible(ref, options.value); + }; + + var _setVisibility = function(parentId, childId, options, preserveScroll) { + var wrapped = $jobj(childId); + var completeTotal = 1; + var visible = $ax.visibility.IsIdVisible(childId); + + if(visible == options.value) { + options.onComplete && options.onComplete(); + $ax.action.fireAnimationFromQueue(childId, $ax.action.queueTypes.fade); + return; + } + + var child = $jobj(childId); + var size = options.size || (options.containerExists ? $(child.children()[0]) : child); + + var isIdFitToContent = $ax.dynamicPanelManager.isIdFitToContent(parentId); + //fade and resize won't work together when there is a container... but we still needs the container for fit to content DPs + var needContainer = options.easing && options.easing != 'none' && (options.easing != 'fade' || isIdFitToContent); + var cullPosition = options.cull ? options.cull.css('position') : ''; + var containerExists = options.containerExists; + + var isFullWidth = $ax.dynamicPanelManager.isPercentWidthPanel($obj(childId)); + + // If fixed fit to content panel, then we must set size on it. It will be size of 0 otherwise, because container in it is absolute position. + var needSetSize = false; + var sizeObj = {}; + if(needContainer) { + var sizeId = ''; + if($ax.dynamicPanelManager.isIdFitToContent(childId)) sizeId = childId; + else { + var panelId = $ax.repeater.removeSuffixFromElementId(childId); + if($ax.dynamicPanelManager.isIdFitToContent(panelId)) sizeId = panelId; + } + + if(sizeId) { + needSetSize = true; + + sizeObj = $jobj(sizeId); + var newSize = options.cull || sizeObj; + var newAxSize = $ax('#' + newSize.attr('id')); + sizeObj.width(newAxSize.width()); + sizeObj.height(newAxSize.height()); + } + } + + var wrappedOffset = { left: 0, top: 0 }; + var visibleWrapped = wrapped; + if(needContainer) { + var childObj = $obj(childId); + if (options.cull) { + var axCull = $ax('#' + options.cull.attr('id')); + var containerWidth = axCull.width(); + var containerHeight = axCull.height(); + } else { + if (childObj && ($ax.public.fn.IsLayer(childObj.type))) {// || childObj.generateCompound)) { + var boundingRectangle = $ax('#' + childId).offsetBoundingRect(); + //var boundingRectangle = $ax.public.fn.getWidgetBoundingRect(childId); + wrappedOffset.left = boundingRectangle.left; + wrappedOffset.top = boundingRectangle.top; + containerWidth = boundingRectangle.width; + containerHeight = boundingRectangle.height; + } else if (childObj && childObj.generateCompound) { + var image = $jobj(childId + '_img'); + containerWidth = $ax.getNumFromPx(image.css('width')); + containerHeight = $ax.getNumFromPx(image.css('height')); + wrappedOffset.left = $ax.getNumFromPx(image.css('left')); + wrappedOffset.top = $ax.getNumFromPx(image.css('top')); + } else { + containerWidth = $ax('#' + childId).width(); + containerHeight = $ax('#' + childId).height(); + } + } + + var containerId = $ax.visibility.applyWidgetContainer(childId); +// var container = _makeContainer(containerId, options.cull || boundingRectangle, isFullWidth, options.easing == 'flip', wrappedOffset, options.containerExists); + var container = _makeContainer(containerId, containerWidth, containerHeight, isFullWidth, options.easing == 'flip', wrappedOffset, options.containerExists); + + if(options.containInner) { + wrapped = _wrappedChildren(containerExists ? $(child.children()[0]) : child); + + // Filter for visibile wrapped children + visibleWrapped = []; + for (var i = 0; i < wrapped.length; i++) if($ax.visibility.IsVisible(wrapped[i])) visibleWrapped.push(wrapped[i]); + visibleWrapped = $(visibleWrapped); + + completeTotal = visibleWrapped.length; + if(!containerExists) container.prependTo(child); + + // Offset items if necessary + if(!containerExists && (wrappedOffset.left != 0 || wrappedOffset.top != 0)) { + for(var i = 0; i < wrapped.length; i++) { + var inner = $(wrapped[i]); + inner.css('left', $ax.getNumFromPx(inner.css('left')) - wrappedOffset.left); + inner.css('top', $ax.getNumFromPx(inner.css('top')) - wrappedOffset.top); + // Parent layer is now size 0, so have to have to use conatiner since it's the real size. + // Should we use container all the time? This may make things easier for fit panels too. + size = container; + } + } + } else if(!containerExists) container.insertBefore(child); + if(!containerExists) wrapped.appendTo(container); + + if (options.value && options.containInner) { + //has to set children first because flip to show needs children invisible + _setAllVisible(visibleWrapped, false); + //_updateChildAlignment(childId); + _setAllVisible(child, true); + } + } + + var completeCount = 0; + var onComplete = function () { + completeCount++; + if (needContainer && completeCount == completeTotal) { + if ($ax.public.fn.isCompoundVectorHtml(container.parent()[0])) { + wrappedOffset.left = $ax.getNumFromPx(container.css('left')); + wrappedOffset.top = $ax.getNumFromPx(container.css('top')); + } + + if (options.containInner && !containerExists) { + if (wrappedOffset.left != 0 || wrappedOffset.top != 0) { + for (i = 0; i < wrapped.length; i++) { + inner = $(wrapped[i]); + if (!inner.hasClass('text')) { + inner.css('left', $ax.getNumFromPx(inner.css('left')) + wrappedOffset.left); + inner.css('top', $ax.getNumFromPx(inner.css('top')) + wrappedOffset.top); + } + } + } + + wrapped.filter('.text').css({ 'left': '', 'top': '' }); + } + + if(options.containInner && !options.value) { + _setAllVisible(child, false); + _setAllVisible(visibleWrapped, true); + } + + if(containerExists) { + if(!options.settingChild) container.css('position', 'relative;'); + } else { + wrapped.insertBefore(container); + container.remove(); + } + + if(childObj && $ax.public.fn.IsDynamicPanel(childObj.type) && window.modifiedDynamicPanleParentOverflowProp) { + child.css('overflow', 'hidden'); + window.modifiedDynamicPanleParentOverflowProp = false; + } + } + + //if(options.value) _updateChildAlignment(childId); + + if(!needContainer || completeTotal == completeCount) { + if(options.cull) options.cull.css('position', cullPosition); + + if(needSetSize) { + sizeObj.css('width', 'auto'); + sizeObj.css('height', 'auto'); + } + + options.onComplete && options.onComplete(); + + if(options.fire) { + $ax.event.raiseSyntheticEvent(childId, options.value ? 'onShow' : 'onHide'); + $ax.action.fireAnimationFromQueue(childId, $ax.action.queueTypes.fade); + } + } + }; + + // Nothing actually being animated, all wrapped elements invisible + if(!visibleWrapped.length) { + if(!options.easing || options.easing == 'none') { + $ax.visibility.SetIdVisible(childId, options.value); + completeTotal = 1; + onComplete(); + } else { + window.setTimeout(function() { + completeCount = completeTotal - 1; + onComplete(); + },options.duration); + } + + return; + } + + if(!options.easing || options.easing == 'none') { + $ax.visibility.SetIdVisible(childId, options.value); + completeTotal = 1; + onComplete(); + } else if(options.easing == 'fade') { + if(options.value) { + if(preserveScroll) { + visibleWrapped.css('opacity', 0); + visibleWrapped.css('visibility', 'inherit'); + visibleWrapped.css('display', 'block'); + //was hoping we could just use fadein here, but need to set display before set scroll position + _tryResumeScrollForDP(childId); + visibleWrapped.animate({ opacity: 1 }, { + duration: options.duration, + easing: 'swing', + queue: false, + complete: function() { + $ax.visibility.SetIdVisible(childId, true); + visibleWrapped.css('opacity', ''); + onComplete(); + } + }); + } else { + // Can't use $ax.visibility.SetIdVisible, because we only want to set visible, we don't want to set display, fadeIn will handle that. + visibleWrapped.css('visibility', 'inherit'); + visibleWrapped.fadeIn({ + queue: false, + duration: options.duration, + complete: onComplete + }); + } + } else { + // Fading here is being strange... + visibleWrapped.animate({ opacity: 0 }, { duration: options.duration, easing: 'swing', queue: false, complete: function() { + $ax.visibility.SetIdVisible(childId, false); + visibleWrapped.css('opacity', ''); + + onComplete(); + }}); + } + } else if (options.easing == 'flip') { + //this container will hold + var trapScroll = _trapScrollLoc(childId); + var innerContainer = $('
      '); + innerContainer.attr('id', containerId + "_inner"); + innerContainer.data('flip', options.direction == 'left' || options.direction == 'right' ? 'y' : 'x'); + innerContainer.css({ + position: 'relative', + 'width': containerWidth, + 'height': containerHeight, + 'display': 'flex' + }); + + innerContainer.appendTo(container); + wrapped.appendTo(innerContainer); + + if(childObj && $ax.public.fn.IsDynamicPanel(childObj.type)) var containerDiv = child; + else containerDiv = parentId ? $jobj(parentId) : child.parent(); + + completeTotal = 1; + var flipdegree; + + var originForFlip = containerWidth / 2 + 'px ' + containerHeight / 2 + 'px'; + if (options.value) { + innerContainer.css({ + '-webkit-transform-origin': originForFlip, + '-ms-transform-origin': originForFlip, + 'transform-origin': originForFlip, + }); + + //options.value == true means in or show, note to get here, the element must be currently hidden to show, + // we need to first flip it +/- 90deg without animation (180 if we want to show the back of the flip) + switch(options.direction) { + case 'right': + case 'left': + _setRotateTransformation(innerContainer, _getRotateString(true, options.direction === 'right', options.showFlipBack)); + flipdegree = 'rotateY(0deg)'; + break; + case 'up': + case 'down': + _setRotateTransformation(innerContainer, _getRotateString(false, options.direction === 'up', options.showFlipBack)); + flipdegree = 'rotateX(0deg)'; + break; + } + + var onFlipShowComplete = function() { + var trapScroll = _trapScrollLoc(childId); + $ax.visibility.SetIdVisible(childId, true); + + wrapped.insertBefore(innerContainer); + innerContainer.remove(); + trapScroll(); + + onComplete(); + }; + + innerContainer.css({ + '-webkit-backface-visibility': 'hidden', + 'backface-visibility': 'hidden' + }); + + child.css({ + 'display': '', + 'visibility': 'inherit' + }); + + visibleWrapped.css({ + 'display': '', + 'visibility': 'inherit' + }); + + innerContainer.css({ + '-webkit-transition-duration': options.duration + 'ms', + 'transition-duration': options.duration + 'ms' + }); + + if(preserveScroll) _tryResumeScrollForDP(childId); + _setRotateTransformation(innerContainer, flipdegree, containerDiv, onFlipShowComplete, options.duration, true); + } else { //hide or out + innerContainer.css({ + '-webkit-transform-origin': originForFlip, + '-ms-transform-origin': originForFlip, + 'transform-origin': originForFlip, + }); + switch(options.direction) { + case 'right': + case 'left': + flipdegree = _getRotateString(true, options.direction !== 'right', options.showFlipBack); + break; + case 'up': + case 'down': + flipdegree = _getRotateString(false, options.direction !== 'up', options.showFlipBack); + break; + } + + var onFlipHideComplete = function() { + var trapScroll = _trapScrollLoc(childId); + wrapped.insertBefore(innerContainer); + $ax.visibility.SetIdVisible(childId, false); + + innerContainer.remove(); + trapScroll(); + + onComplete(); + }; + + innerContainer.css({ + '-webkit-backface-visibility': 'hidden', + 'backface-visibility': 'hidden', + '-webkit-transition-duration': options.duration + 'ms', + 'transition-duration': options.duration + 'ms' + }); + + if(preserveScroll) _tryResumeScrollForDP(childId); + _setRotateTransformation(innerContainer, flipdegree, containerDiv, onFlipHideComplete, options.duration, true); + } + + trapScroll(); + } else { + // Because the move is gonna fire on annotation and ref too, need to update complete total + completeTotal = $addAll(visibleWrapped, childId).length; + if(options.value) { + _slideStateIn(childId, childId, options, size, false, onComplete, visibleWrapped, preserveScroll); + } else { + var tops = []; + var lefts = []; + for(var i = 0; i < visibleWrapped.length; i++) { + var currWrapped = $(visibleWrapped[i]); + + tops.push(fixAuto(currWrapped, 'top')); + lefts.push(fixAuto(currWrapped, 'left')); + } + + var onOutComplete = function () { + //bring back SetIdVisible on childId for hiding lightbox + $ax.visibility.SetIdVisible(childId, false); + for(i = 0; i < visibleWrapped.length; i++) { + currWrapped = $(visibleWrapped[i]); + $ax.visibility.SetVisible(currWrapped[0], false); + currWrapped.css('top', tops[i]); + currWrapped.css('left', lefts[i]); + } + onComplete(); + }; + _slideStateOut(size, childId, options, onOutComplete, visibleWrapped); + } + } + + // If showing, go through all rich text objects inside you, and try to redo alignment of them + //if(options.value && !options.containInner) { + // _updateChildAlignment(childId); + //} + }; + + // IE/Safari are giving auto here instead of calculating to for us. May need to calculate this eventually, but for now we can assume auto === 0px for the edge case found + var fixAuto = function (jobj, prop) { + var val = jobj.css(prop); + return val == 'auto' ? '0px' : val; + }; + + var _getRotateString = function (y, neg, showFlipBack) { + // y means flip on y axis, or left/right, neg means flipping it left/down, and show back is for set panel state + // and will show the back of the widget (transparent) for the first half of a show, or second half of a hide. + return 'rotate' + (y ? 'Y' : 'X') + '(' + (neg ? '-' : '') + (showFlipBack ? 180 : IE ? 91 : 90) + 'deg)'; + } + + //var _updateChildAlignment = function(childId) { + // var descendants = $jobj(childId).find('.text'); + // for(var i = 0; i < descendants.length; i++) $ax.style.updateTextAlignmentForVisibility(descendants[i].id); + //}; + var _wrappedChildren = function (child) { + return child.children(); + //var children = child.children(); + //var valid = []; + //for(var i = 0; i < children.length; i++) if($ax.visibility.IsVisible(children[i])) valid.push(children[i]); + //return $(valid); + }; + + var requestAnimationFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || window.msRequestAnimationFrame || + function (callback) { + window.setTimeout(callback, 1000 / 60); + }; + + var _setRotateTransformation = function(elementsToSet, transformValue, elementParent, flipCompleteCallback, flipDurationMs, useAnimationFrame) { + if(flipCompleteCallback) { + //here we didn't use 'transitionend' event to fire callback + //when show/hide on one element, changing transition property will stop the event from firing + window.setTimeout(flipCompleteCallback, flipDurationMs); + } + + var trasformCss = { + '-webkit-transform': transformValue, + '-moz-transform': transformValue, + '-ms-transform': transformValue, + '-o-transform': transformValue, + 'transform': transformValue + }; + + if(useAnimationFrame) { + if(FIREFOX || CHROME) $('body').hide().show(0); //forces FF to render the animation + requestAnimationFrame(function() { + elementsToSet.css(trasformCss); + }); + } else elementsToSet.css(trasformCss); + + //when deal with dynamic panel, we need to set it's parent's overflow to visible to have the 3d effect + //NOTE: we need to set this back when both flips finishes in DP, to prevents one animation finished first and set this back + if(elementParent && elementParent.css('overflow') === 'hidden') { + elementParent.css('overflow', 'visible'); + window.modifiedDynamicPanleParentOverflowProp = true; + } + }; + + $ax.visibility.GetPanelState = function(id) { + var children = $ax.visibility.getRealChildren($jobj(id).children()); + for(var i = 0; i < children.length; i++) { + if(children[i].style && $ax.visibility.IsVisible(children[i])) return children[i].id; + } + return ''; + }; + + var containerCount = {}; + $ax.visibility.SetPanelState = function(id, stateId, easingOut, directionOut, durationOut, easingIn, directionIn, durationIn, showWhenSet) { + var show = !$ax.visibility.IsIdVisible(id) && showWhenSet; + if(show) $ax.visibility.SetIdVisible(id, true); + + // Exit here if already at desired state. + if($ax.visibility.IsIdVisible(stateId)) { + if(show) { + $ax.event.raiseSyntheticEvent(id, 'onShow'); + // If showing size changes and need to update parent panels + $ax.dynamicPanelManager.fitParentPanel(id); + } + + $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.setState); + return; + } + + var hasEasing = easingIn != 'none' || easingOut != 'none'; + if(hasEasing) _pushContainer(id, true); + + var state = $jobj(stateId); + var oldStateId = $ax.visibility.GetPanelState(id); + var oldState = $jobj(oldStateId); + + var isFixed = $jobj(id).css('position') == 'fixed'; + //pin to browser + if(isFixed) $ax.dynamicPanelManager.adjustFixed(id, oldState.width(), oldState.height(), state.width(), state.height()); + + _bringPanelStateToFront(id, stateId, oldStateId, easingIn == 'none' || durationIn == '0'); + + var fitToContent = $ax.dynamicPanelManager.isIdFitToContent(id); + var resized = false; + if(fitToContent) { + // Set resized + //var width = state.width(); + //var height = state.height(); + var newBoundingRect = $ax('#' + stateId).childrenBoundingRect(); + var width = newBoundingRect.right; + var height = newBoundingRect.bottom; + var oldBoundingRect = $ax('#' + id).size(); + var oldWidth = oldBoundingRect.right; + var oldHeight = oldBoundingRect.bottom; + resized = width != oldWidth || height != oldHeight; + //resized = width != oldState.width() || height != oldState.height(); + + $ax.visibility.setResizedSize(id, $obj(id).percentWidth ? oldWidth : width, height); + } + + //edge case for sliding + var movement = (directionOut == 'left' || directionOut == 'up' || state.children().length == 0) && oldState.children().length != 0 ? oldState : state; + var onCompleteCount = 0; + var onComplete = function () { + //move this call from _setVisibility() for animate out. + //Because this will make the order of dp divs consistence: the showing panel is always in front after both animation finished + //tested in the cases where one panel is out/show slower/faster/same time/instantly. + _bringPanelStateToFront(id, stateId, oldStateId, false); + + if (window.modifiedDynamicPanleParentOverflowProp) { + var parent = id ? $jobj(id) : child.parent(); + parent.css('overflow', 'hidden'); + window.modifiedDynamicPanleParentOverflowProp = false; + } + + $ax.dynamicPanelManager.fitParentPanel(id); + $ax.dynamicPanelManager.updatePanelPercentWidth(id); + $ax.dynamicPanelManager.updatePanelContentPercentWidth(id); + $ax.action.fireAnimationFromQueue(id, $ax.action.queueTypes.setState); + $ax.event.raiseSyntheticEvent(id, "onPanelStateChange"); + $ax.event.leavingState(oldStateId); + if (hasEasing) _popContainer(id, true); + + $ax.dynamicPanelManager.updateMobileScroll(id, stateId); + }; + // Must do state out first, so if we cull by new state, location is correct + _setVisibility(id, oldStateId, { + value: false, + easing: easingOut, + direction: directionOut, + duration: durationOut, + containerExists: true, + onComplete: function() { +// if(easingIn !== 'flip') _bringPanelStateToFront(id, stateId); + if (++onCompleteCount == 2) onComplete(); + }, + settingChild: true, + size: movement, + //cull for + cull: easingOut == 'none' || state.children().length == 0 ? oldState : state, + showFlipBack: true + }); + + _setVisibility(id, stateId, { + value: true, + easing: easingIn, + direction: directionIn, + duration: durationIn, + containerExists: true, + onComplete: function () { +// if (easingIn === 'flip') _bringPanelStateToFront(id, stateId); + if (++onCompleteCount == 2) onComplete(); + }, + settingChild: true, + //size for offset + size: movement, + showFlipBack: true + }); + + if(show) $ax.event.raiseSyntheticEvent(id, 'onShow'); + if(resized) $ax.event.raiseSyntheticEvent(id, 'onResize'); + }; + + var containedFixed = {}; + var _pushContainer = _visibility.pushContainer = function(id, panel) { + var count = containerCount[id]; + if(count) containerCount[id] = count + 1; + else { + var trapScroll = _trapScrollLoc(id); + var jobj = $jobj(id); + var children = jobj.children(); + var css = { + position: 'relative', + top: 0, + left: 0 + }; + + if(!panel) { + var boundingRect = $ax('#' + id).offsetBoundingRect(); + //var boundingRect = $axure.fn.getWidgetBoundingRect(id); + css.top = boundingRect.top; + css.left = boundingRect.left; + } + + var container = $('
      '); + container.attr('id', ''); // Placeholder id, so we won't try to recurse the container until it is ready + container.css(css); + //container.append(jobj.children()); + jobj.append(container); + containerCount[id] = 1; + + // Panel needs to wrap children + if(panel) { + for(var i = 0; i < children.length; i++) { + var child = $(children[i]); + var childContainer = $('
      '); + childContainer.attr('id', $ax.visibility.applyWidgetContainer(child.attr('id'))); + childContainer.css(css); + child.after(childContainer); + childContainer.append(child); + container.append(childContainer); + } + } else { + var focus = _getCurrFocus(); + if(focus) $ax.event.addSuppressedEvent($ax.repeater.removeSuffixFromElementId(focus), 'OnLostFocus'); + + // Layer needs to fix top left + var childIds = $ax('#' + id).getChildren()[0].children; + for(var i = 0; i < childIds.length; i++) { + var childId = childIds[i]; + var childObj = $jobj(childId); + var fixedInfo = $ax.dynamicPanelManager.getFixedInfo(childId); + if(fixedInfo.fixed) { + var axObj = $ax('#' + childId); + var viewportLocation = axObj.viewportLocation(); + var left = viewportLocation.left; + var top = viewportLocation.top; + //var left = axObj.left(); + //var top = axObj.top(); + containedFixed[childId] = { left: left, top: top, fixed: fixedInfo }; + childObj.css('left', left); + childObj.css('top', top); + childObj.css('margin-left', 0); + childObj.css('margin-top', 0); + childObj.css('right', 'auto'); + childObj.css('bottom', 'auto'); + childObj.css('position', 'absolute'); + } + var cssChange = { + left: '-=' + css.left, + top: '-=' + css.top + }; + if($ax.getTypeFromElementId(childId) == $ax.constants.LAYER_TYPE) { + _pushContainer(childId, false); + $ax.visibility.applyWidgetContainer(childId, true).css(cssChange); + } else { + //if ($ax.public.fn.isCompoundVectorHtml(jobj[0])) { + // var grandChildren = jobj[0].children; + // //while (grandChildren.length > 0 && grandChildren[0].id.indexOf('container') >= 0) grandChildren = grandChildren[0].children; + + // for (var j = 0; j < grandChildren.length; j++) { + // var grandChildId = grandChildren[j].id; + // if (grandChildId.indexOf(childId + 'p') >= 0 || grandChildId.indexOf('_container') >= 0) $jobj(grandChildId).css(cssChange); + // } + //} else + // Need to include ann and ref in move. + childObj = $addAll(childObj, childId); + childObj.css(cssChange); + } + + container.append(childObj); + } + _setCurrFocus(focus); + } + container.attr('id', $ax.visibility.applyWidgetContainer(id)); // Setting the correct final id for the container + trapScroll(); + } + }; + + var _popContainer = _visibility.popContainer = function (id, panel) { + var count = containerCount[id]; + if(!count) return; + count--; + containerCount[id] = count; + if(count != 0) return; + + var trapScroll = _trapScrollLoc(id); + + var jobj = $jobj(id); + var container = $ax.visibility.applyWidgetContainer(id, true); + + // If layer is at bottom or right of page, unwrapping could change scroll by temporarily reducting page size. + // To avoid this, we let container persist on page, with the size it is at this point, and don't remove container completely + // until the children are back to their proper locations. + var size = $ax('#' + id).size(); + container.css('width', size.width); + container.css('height', size.height); + var focus = _getCurrFocus(); + if(focus) $ax.event.addSuppressedEvent($ax.repeater.removeSuffixFromElementId(focus), 'OnLostFocus'); + jobj.append(container.children()); + _setCurrFocus(focus); + $('body').first().append(container); + + // Layer doesn't have children containers to clean up + if(panel) { + var children = jobj.children(); + for(var i = 0; i < children.length; i++) { + var childContainer = $(children[i]); + var child = $(childContainer.children()[0]); + childContainer.after(child); + childContainer.remove(); + } + } else { + var left = container.css('left'); + var top = container.css('top'); + var childIds = $ax('#' + id).getChildren()[0].children; + for (var i = 0; i < childIds.length; i++) { + var childId = childIds[i]; + var cssChange = { + left: '+=' + left, + top: '+=' + top + }; + if($ax.getTypeFromElementId(childId) == $ax.constants.LAYER_TYPE) { + $ax.visibility.applyWidgetContainer(childId, true).css(cssChange); + _popContainer(childId, false); + } else { + var childObj = $jobj(childId); + // if ($ax.public.fn.isCompoundVectorHtml(jobj[0])) { + // var grandChildren = jobj[0].children; + // //while (grandChildren.length > 0 && grandChildren[0].id.indexOf('container') >= 0) grandChildren = grandChildren[0].children; + // for (var j = 0; j < grandChildren.length; j++) { + // var grandChildId = grandChildren[j].id; + // if (grandChildId.indexOf(childId + 'p') >= 0 || grandChildId.indexOf('_container') >= 0) $jobj(grandChildId).css(cssChange); + // } + //} else + + var allObjs = $addAll(childObj, childId); // Just include other objects for initial css. Fixed panels need to be dealt with separately. + allObjs.css(cssChange); + + var fixedInfo = containedFixed[childId]; + if(fixedInfo) { + delete containedFixed[childId]; + + childObj.css('position', 'fixed'); + var deltaX = $ax.getNumFromPx(childObj.css('left')) - fixedInfo.left; + var deltaY = $ax.getNumFromPx(childObj.css('top')) - fixedInfo.top; + + fixedInfo = fixedInfo.fixed; + if(fixedInfo.horizontal == 'left') childObj.css('left', fixedInfo.x + deltaX); + else if(fixedInfo.horizontal == 'center') { + childObj.css('left', '50%'); + childObj.css('margin-left', fixedInfo.x + deltaX); + } else { + childObj.css('left', 'auto'); + childObj.css('right', fixedInfo.x - deltaX); + } + + if(fixedInfo.vertical == 'top') childObj.css('top', fixedInfo.y + deltaY); + else if(fixedInfo.vertical == 'middle') { + childObj.css('top', '50%'); + childObj.css('margin-top', fixedInfo.y + deltaY); + } else { + childObj.css('top', 'auto'); + childObj.css('bottom', fixedInfo.y - deltaY); + } + + $ax.dynamicPanelManager.updatePanelPercentWidth(childId); + $ax.dynamicPanelManager.updatePanelContentPercentWidth(childId); + + } + } + } + } + container.remove(); + trapScroll(); + }; + + var _trapScrollLoc = function(id) { + var locs = {}; + var states = $jobj(id).find('.panel_state'); + for(var i = 0; i < states.length; i++) { + var state = $(states[i]); + locs[state.attr('id')] = { x: state.scrollLeft(), y: state.scrollTop() }; + } + return function() { + for(var key in locs) { + var state = $jobj(key); + state.scrollLeft(locs[key].x); + state.scrollTop(locs[key].y); + } + }; + } + + var _getCurrFocus = function () { + // Only care about focused a tags and inputs + var id = window.lastFocusedClickable && window.lastFocusedClickable.id; + + if(!id) return id; + var jobj = $(window.lastFocusedClickable); + return jobj.is('a') || jobj.is('input') ? id : ''; + } + + var _setCurrFocus = function(id) { + if(id) { + // This is really just needed for IE, so if this causes issues on other browsers, try adding that check here + var trap = $ax.event.blockEvent($ax.repeater.removeSuffixFromElementId(id), 'OnFocus'); + window.setTimeout(function () { + $jobj(id).focus(); + trap(); + }, 0); + } + } + + //use this to save & restore DP's scroll position when show/hide + //key => dp's id (not state's id, because it seems we can change state while hiding) + //value => first state's id & scroll position + //we only need to store one scroll position for one DP, and remove the key after shown. + var DPStateAndScroll = {} + var _tryResumeScrollForDP = function (dpId, deleteId) { + var scrollObj = DPStateAndScroll[dpId]; + if(scrollObj) { + var shownState = document.getElementById(scrollObj.shownId); + if(scrollObj.left) shownState.scrollLeft = scrollObj.left; + if(scrollObj.top) shownState.scrollTop = scrollObj.top; + if(deleteId) delete DPStateAndScroll[dpId]; + } + }; +// var _makeContainer = function (containerId, rect, isFullWidth, isFlip, offset, containerExists) { + var _makeContainer = function (containerId, width, height, isFullWidth, isFlip, offset, containerExists) { + if(containerExists) var container = $jobj(containerId); + else { + container = $('
      '); + container.attr('id', containerId); + } + var css = { + position: 'absolute', + width: width, + height: height, + display: 'flex' + }; + + if(!containerExists) { + // If container exists, may be busy updating location. Will init and update it correctly. + css.top = offset.top; + css.left = offset.left; + } + + + if(isFlip) { + css.perspective = '800px'; + css.webkitPerspective = "800px"; + css.mozPerspective = "800px"; + //adding this to make Edge happy + css['transform-style'] = 'preserve-3d'; + } else css.overflow = 'hidden'; + + //perspective on container will give us 3d effect when flip + //if(!isFlip) css.overflow = 'hidden'; + + // Rect should be a jquery not axquery obj + //_getFixedCss(css, rect.$ ? rect.$() : rect, fixedInfo, isFullWidth); + + container.css(css); + return container; + }; + + var CONTAINER_SUFFIX = _visibility.CONTAINER_SUFFIX = '_container'; + var CONTAINER_INNER = CONTAINER_SUFFIX + '_inner'; + _visibility.getWidgetFromContainer = function(id) { + var containerIndex = id.indexOf(CONTAINER_SUFFIX); + if(containerIndex == -1) return id; + return id.substr(0, containerIndex) + id.substr(containerIndex + CONTAINER_SUFFIX.length); + }; + + // Apply container to widget id if necessary. + // returnJobj: True if you want the jquery object rather than id returned + // skipCheck: True if you want the query returned reguardless of container existing + // checkInner: True if inner container should be checked + _visibility.applyWidgetContainer = function (id, returnJobj, skipCheck, checkInner) { + // If container exists, just return (return query if requested) + if(id.indexOf(CONTAINER_SUFFIX) != -1) return returnJobj ? $jobj(id) : id; + + // Get desired id, and return it if query is not desired + var containerId = $ax.repeater.applySuffixToElementId(id, checkInner ? CONTAINER_INNER : CONTAINER_SUFFIX); + if(!returnJobj) return containerId; + + // If skipping check or container exists, just return innermost container requested + var container = $jobj(containerId); + if(skipCheck || container.length) return container; + // If inner container was not checked, then no more to check, return query for widget + if(!checkInner) return $jobj(id); + + // If inner container was checked, check for regular container still + container = $jobj($ax.repeater.applySuffixToElementId(id, CONTAINER_SUFFIX)); + return container.length ? container : $jobj(id); + }; + + _visibility.isContainer = function(id) { + return id.indexOf(CONTAINER_SUFFIX) != -1; + }; + + _visibility.getRealChildren = function(query) { + while(query.length && $(query[0]).attr('id').indexOf(CONTAINER_SUFFIX) != -1) query = query.children(); + return query; + }; + + //var _getFixedCss = function(css, rect, fixedInfo, isFullWidth) { + // // todo: **mas** make sure this is ok + // if(fixedInfo.fixed) { + // css.position = 'fixed'; + + // if(fixedInfo.horizontal == 'left') css.left = fixedInfo.x; + // else if(fixedInfo.horizontal == 'center') { + // css.left = isFullWidth ? '0px' : '50%'; + // css['margin-left'] = fixedInfo.x; + // } else if(fixedInfo.horizontal == 'right') { + // css.left = 'auto'; + // css.right = fixedInfo.x; + // } + + // if(fixedInfo.vertical == 'top') css.top = fixedInfo.y; + // else if(fixedInfo.vertical == 'middle') { + // css.top = '50%'; + // css['margin-top'] = fixedInfo.y; + // } else if(fixedInfo.vertical == 'bottom') { + // css.top = 'auto'; + // css.bottom = fixedInfo.y; + // } + // } else { + // css.left = Number(rect.css('left').replace('px', '')) || 0; + // css.top = Number(rect.css('top').replace('px', '')) || 0; + // } + //}; + + var _slideStateOut = function (container, stateId, options, onComplete, jobj) { + var directionOut = options.direction; + var axObject = $ax('#' + container.attr('id')); + var width = axObject.width(); + var height = axObject.height(); + + _blockSetMoveIds = true; + + if(directionOut == "right") { + $ax.move.MoveWidget(stateId, width, 0, options, false, onComplete, false, jobj, true); + } else if(directionOut == "left") { + $ax.move.MoveWidget(stateId, -width, 0, options, false, onComplete, false, jobj, true); + } else if(directionOut == "up") { + $ax.move.MoveWidget(stateId, 0, -height, options, false, onComplete, false, jobj, true); + } else if(directionOut == "down") { + $ax.move.MoveWidget(stateId, 0, height, options, false, onComplete, false, jobj, true); + } + + _blockSetMoveIds = false; + }; + + var _slideStateIn = function (id, stateId, options, container, makePanelVisible, onComplete, jobj, preserveScroll) { + var directionIn = options.direction; + var axObject = $ax('#' +container.attr('id')); + var width = axObject.width(); + var height = axObject.height(); + + if (makePanelVisible) $ax.visibility.SetIdVisible(id, true); + for (i = 0; i < jobj.length; i++) $ax.visibility.SetVisible(jobj[i], true); + + for(var i = 0; i < jobj.length; i++) { + var child = $(jobj[i]); + var oldTop = $ax.getNumFromPx(fixAuto(child, 'top')); + var oldLeft = $ax.getNumFromPx(fixAuto(child, 'left')); + if (directionIn == "right") { + child.css('left', oldLeft - width + 'px'); + } else if(directionIn == "left") { + child.css('left', oldLeft + width + 'px'); + } else if(directionIn == "up") { + child.css('top', oldTop + height + 'px'); + } else if(directionIn == "down") { + child.css('top', oldTop - height + 'px'); + } + } + + if(preserveScroll) _tryResumeScrollForDP(id); + + _blockSetMoveIds = true; + + if(directionIn == "right") { + $ax.move.MoveWidget(stateId, width, 0, options, false, onComplete, false, jobj, true); + } else if(directionIn == "left") { + $ax.move.MoveWidget(stateId, -width, 0, options, false, onComplete, false, jobj, true); + } else if(directionIn == "up") { + $ax.move.MoveWidget(stateId, 0, -height, options, false, onComplete, false, jobj, true); + } else if(directionIn == "down") { + $ax.move.MoveWidget(stateId, 0, height, options, false, onComplete, false, jobj, true); + } + + _blockSetMoveIds = false; + }; + + $ax.visibility.GetPanelStateId = function(dpId, index) { + var itemNum = $ax.repeater.getItemIdFromElementId(dpId); + var panelStateId = $ax.repeater.getScriptIdFromElementId(dpId) + '_state' + index; + return $ax.repeater.createElementId(panelStateId, itemNum); + }; + + $ax.visibility.GetPanelStateCount = function(id) { + return $ax.visibility.getRealChildren($jobj(id).children()).filter("[id*='_state']").length; + }; + + var _bringPanelStateToFront = function (dpId, stateId, oldStateId, oldInFront) { + var panel = $jobj(dpId); + var frontId = oldInFront ? oldStateId : stateId; + if(containerCount[dpId]) { + frontId = $ax.visibility.applyWidgetContainer(frontId); + panel = $ax.visibility.applyWidgetContainer(dpId, true, false, true); + } + $jobj(frontId).appendTo(panel); + //when bring a panel to front, it will be focused, and the previous front panel should fire blur event if it's lastFocusedClickableSelector + //ie(currently 11) and firefox(currently 34) doesn't fire blur event, this is the hack to fire it manually + if((IE || FIREFOX) && window.lastFocusedClickable && $ax.event.getFocusableWidgetOrChildId(window.lastFocusedControl) == window.lastFocusedClickable.id) { + // Only need to do this if the currently focused widget is in the panel state that is being hidden. + if($jobj(oldStateId).find('#' + window.lastFocusedClickable.id.split('_')[0]).length) $(window.lastFocusedClickable).triggerHandler('blur'); + } + }; + + var _limboIds = _visibility.limboIds = {}; + // limboId's is a dictionary of id->true, essentially a set. + var _addLimboAndHiddenIds = $ax.visibility.addLimboAndHiddenIds = function(newLimboIds, newHiddenIds, query, skipRepeater) { + var limboedByMaster = {}; + for(var key in newLimboIds) { + if (!$ax.public.fn.IsReferenceDiagramObject($ax.getObjectFromElementId(key).type)) continue; + var ids = $ax.model.idsInRdoToHideOrLimbo(key); + for(var i = 0; i < ids.length; i++) limboedByMaster[ids[i]] = true; + } + + var hiddenByMaster = {}; + for(key in newHiddenIds) { + if (!$ax.public.fn.IsReferenceDiagramObject($ax.getObjectFromElementId(key).type)) continue; + ids = $ax.model.idsInRdoToHideOrLimbo(key); + for(i = 0; i < ids.length; i++) hiddenByMaster[ids[i]] = true; + } + + // Extend with children of rdos + newLimboIds = $.extend(newLimboIds, limboedByMaster); + newHiddenIds = $.extend(newHiddenIds, hiddenByMaster); + + // something is only visible if it's not hidden and limboed + query.each(function(diagramObject, elementId) { + // Rdos already handled, contained widgets are limboed by the parent, and sub menus should be ignored + if(diagramObject.isContained || $ax.public.fn.IsReferenceDiagramObject(diagramObject.type) || $ax.public.fn.IsTableCell(diagramObject.type) || $jobj(elementId).hasClass('sub_menu')) return; + if(diagramObject.type == 'table' && $jobj(elementId).parent().hasClass('ax_menu')) return; + if(skipRepeater) { + // Any item in a repeater should return + if($ax.getParentRepeaterFromElementIdExcludeSelf(elementId)) return; + } + + var scriptId = $ax.repeater.getScriptIdFromElementId(elementId); + var shouldBeVisible = Boolean(!newLimboIds[scriptId] && !newHiddenIds[scriptId]); + var isVisible = Boolean(_isIdVisible(elementId)); + if(shouldBeVisible != isVisible) { + _setWidgetVisibility(elementId, { value: shouldBeVisible, noContainer: true }); + } + }); + + _limboIds = _visibility.limboIds = $.extend(_limboIds, newLimboIds); + + }; + + var _clearLimboAndHidden = $ax.visibility.clearLimboAndHidden = function(ids) { + _limboIds = _visibility.limboIds = {}; + }; + + $ax.visibility.clearLimboAndHiddenIds = function(ids) { + for(var i = 0; i < ids.length; i++) { + var scriptId = $ax.repeater.getScriptIdFromElementId(ids[i]); + delete _limboIds[scriptId]; + } + }; + + $ax.visibility.resetLimboAndHiddenToDefaults = function (query) { + if(!query) query = $ax('*'); + _clearLimboAndHidden(); + _addLimboAndHiddenIds(_defaultLimbo, _defaultHidden, query); + }; + + $ax.visibility.isScriptIdLimbo = function(scriptId) { + if(_limboIds[scriptId]) return true; + + var repeater = $ax.getParentRepeaterFromScriptId(scriptId); + if(!repeater) return false; + + var itemId = $ax.getItemIdsForRepeater(repeater)[0]; + return _limboIds[$ax.repeater.createElementId(scriptId, itemId)]; + } + + $ax.visibility.isElementIdLimboOrInLimboContainer = function (elementId) { + var parent = document.getElementById(elementId); + while(parent) { + var scriptId = $ax.repeater.getScriptIdFromElementId($(parent).attr('id')); + if(_limboIds[scriptId]) return true; + parent = parent.parentElement; + } + return false; + } + + var _blockSetMoveIds = false; + var _movedIds = _visibility.movedIds = {}; + var _resizedIds = _visibility.resizedIds = {}; + var _rotatedIds = _visibility.rotatedIds = {}; + + $ax.visibility.getMovedLocation = function(scriptId) { + return _movedIds[scriptId]; + + //var repeater = $ax.getParentRepeaterFromScriptId(scriptId); + //if (!repeater) return false; + + //var itemId = $ax.getItemIdsForRepeater(repeater)[0]; + //return _movedIds[$ax.repeater.createElementId(scriptId, itemId)]; + }; + + $ax.visibility.setMovedLocation = function (scriptId, left, top) { + if ($jobj(scriptId).css('position') == 'fixed') return; + _movedIds[scriptId] = { left: left, top: top }; + }; + + $ax.visibility.moveMovedLocation = function (scriptId, deltaLeft, deltaTop) { + if(_blockSetMoveIds) return false; + + var offsetLocation = $ax('#' + scriptId).offsetLocation(); + $ax.visibility.setMovedLocation(scriptId, offsetLocation.x + deltaLeft, offsetLocation.y + deltaTop); + + if($ax.getTypeFromElementId(scriptId) == $ax.constants.LAYER_TYPE) { + var childIds = $ax('#' + scriptId).getChildren()[0].children; + for (var i = 0; i < childIds.length; i++) { + $ax.visibility.moveMovedLocation(childIds[i], deltaLeft, deltaTop); + } + } + }; + + $ax.visibility.getResizedSize = function(scriptId) { + return _resizedIds[scriptId]; + + //var repeater = $ax.getParentRepeaterFromScriptId(scriptId); + //if (!repeater) return false; + + //var itemId = $ax.getItemIdsForRepeater(repeater)[0]; + //return _resizedIds[$ax.repeater.createElementId(scriptId, itemId)]; + }; + + $ax.visibility.setResizedSize = function(scriptId, width, height) { + _resizedIds[scriptId] = { width: width, height: height }; + }; + + $ax.visibility.getRotatedAngle = function (scriptId) { + return _rotatedIds[scriptId]; + }; + + $ax.visibility.setRotatedAngle = function (scriptId, rotation) { + _rotatedIds[scriptId] = rotation; + }; + + $ax.visibility.clearMovedAndResized = function () { + _movedIds = _visibility.movedIds = {}; + _resizedIds = _visibility.resizedIds = {}; + _rotatedIds = _visibility.rotatedIds = {}; + }; + + $ax.visibility.clearMovedAndResizedIds = function (elementIds) { + for (var i = 0; i < elementIds.length; i++) { + var id = elementIds[i]; + delete _movedIds[id]; + delete _resizedIds[id]; + delete _rotatedIds[id]; + } + }; + + $ax.visibility.initialize = function() { + // initialize initial visible states + $('.' + HIDDEN_CLASS).each(function (index, diagramObject) { + _defaultHidden[$ax.repeater.getScriptIdFromElementId(diagramObject.id)] = true; + }); + + $('.' + UNPLACED_CLASS).each(function (index, diagramObject) { + _defaultLimbo[$ax.repeater.getScriptIdFromElementId(diagramObject.id)] = true; + }); + + _addLimboAndHiddenIds(_defaultLimbo, _defaultHidden, $ax('*'), true); + }; + + _visibility.initRepeater = function(repeaterId) { + var html = $('
      '); + html.append($jobj(repeaterId + '_script').html()); + + html.find('.' + HIDDEN_CLASS).each(function (index, element) { + _defaultHidden[$ax.repeater.getScriptIdFromElementId(element.id)] = true; + }); + + html.find('.' + UNPLACED_CLASS).each(function (index, element) { + _defaultLimbo[$ax.repeater.getScriptIdFromElementId(element.id)] = true; + }); + } + + var HIDDEN_CLASS = _visibility.HIDDEN_CLASS = 'ax_default_hidden'; + var UNPLACED_CLASS = _visibility.UNPLACED_CLASS = 'ax_default_unplaced'; + +}); \ No newline at end of file diff --git a/code/page/resources/scripts/axutils.js b/code/page/resources/scripts/axutils.js new file mode 100644 index 0000000..0fc44cc --- /dev/null +++ b/code/page/resources/scripts/axutils.js @@ -0,0 +1,231 @@ +/* + * + * + * + * + */ + + (function() { + // define the root namespace object + if(!window.$axure) window.$axure = {}; + + $axure.utils = {}; + + // ------------------------------------------------------------------------ + // Makes an object bindable + // ------------------------------------------------------------------------ + $axure.utils.makeBindable = function(obj, events) { + if(obj.registeredBindings != null) return; + + // copy the events + obj.bindableEvents = events.slice(); + obj.registeredBindings = {}; + + obj.bind = function(eventName, fn) { + var binding = {}; + binding.eventName = eventName; + binding.action = fn; + + var bindingList = this.registeredBindings[eventName]; + if(bindingList == null) { + bindingList = []; + this.registeredBindings[eventName] = bindingList; + } + bindingList[bindingList.length] = binding; + }; + + obj.unbind = function(eventName) { + if(eventName.indexOf('.') >= 0) { + this.registeredBindings[eventName] = null; + } else { + var event = eventName.split('.')[0]; + for(var bindingKey in this.registeredBindings) { + if(bindingKey.split('.')[0] == event) { + this.registeredBindings[bindingKey] = null; + } + } + } + }; + + obj.triggerEvent = function(eventName, arg) { + for(var bindingKey in this.registeredBindings) { + if(bindingKey.split('.')[0] == eventName) { + var bindings = this.registeredBindings[bindingKey]; + for(var i = 0; i < bindings.length; i++) { + if(arg == null) { + bindings[i].action(); + } else { + bindings[i].action(arg); + } + } + } + } + }; + }; + + + $axure.utils.loadCSS = function(url) { + $('head').append(''); + }; + + $axure.utils.loadJS = function(url) { + $('head').append(''); + }; + + $axure.utils.curry = function(fn) { + var curriedArgs = Array.prototype.slice.call(arguments, [1]); + return function() { + fn.apply(this, curriedArgs.concat(Array.prototype.slice.call(arguments))); + }; + }; + + $axure.utils.succeeded = function(result) { + return result && result.success; + }; + + $axure.utils.createUniqueTag = function() { + return Math.random().toString().substring(2) + + Math.random().toString().substring(2) + + Math.random().toString().substring(2) + + Math.random().toString().substring(2); + }; + + $axure.utils.formatDate = function(date) { + var months = [ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + var hours = date.getHours(); + var amPm = (hours > 11 ? 'PM' : 'AM'); + hours = hours % 12; + if(hours == '0') hours = '12'; + var minutes = date.getMinutes() + ''; + if(minutes.length == 1) { + minutes = '0' + minutes; + } + return [ + months[date.getMonth()], ' ', date.getDate(), ' ', date.getFullYear(), ' ', + hours, ':', minutes, ' ', amPm].join(''); + + }; + + $axure.utils.quickObject = function() { + var returnVal = {}; + for(var i = 0; i < arguments.length; i += 2) { + returnVal[arguments[i]] = arguments[i + 1]; + } + return returnVal; + }; + + var matrixBase = { + mul: function(val) { + if(val.x !== undefined) { + return $axure.utils.Vector2D( + this.m11 * val.x + this.m12 * val.y + this.tx, + this.m21 * val.x + this.m22 * val.y + this.ty); + } else if(val.m11) { + return $axure.utils.Matrix2D( + this.m11 * val.m11 + this.m12 * val.m21, + this.m11 * val.m12 + this.m12 * val.m22, + this.m21 * val.m11 + this.m22 * val.m21, + this.m21 * val.m12 + this.m22 * val.m22, + val.tx + this.tx * val.m11 + this.ty * val.m21, + val.ty + this.tx * val.m12 + this.ty * val.m22 + ); + } else if(Number(val)) { + var num = Number(val); + return $axure.utils.Matrix2D(this.m11 * num, this.m12 * num, + this.m21 * num, this.m22 * num, + this.tx * num, this.ty * num); + } else return undefined; + }, + rotate: function(angle) { + var angleRad = angle * Math.PI / 180; + var c = Math.cos(angleRad); + var s = Math.sin(angleRad); + + return this.mul($axure.utils.Matrix2D(c, -s, s, c)); + }, + translate: function(tx, ty) { + return this.mul($axure.utils.Matrix2D(1, 0, 0, 1, tx, ty)); + } + }; + + $axure.utils.Matrix2D = function(m11, m12, m21, m22, tx, ty) { + return $.extend({ + m11: m11 || 0, + m12: m12 || 0, + m21: m21 || 0, + m22: m22 || 0, + tx: tx || 0, + ty: ty || 0 + }, matrixBase); + }; + + $axure.utils.Vector2D = function(x, y) { + return { x: x || 0, y: y || 0 }; + }; + + $axure.utils.Matrix2D.identity = function() { + return $axure.utils.Matrix2D(1, 0, 0, 1, 0, 0); + }; + + })(); + + // TODO: [mas] simplify this + if(window.$axure && window.$axure.internal) { + $axure.internal(function($ax) { $ax.utils = $axure.utils; }); + } + + // Its too much of a pain to escape everything and use regular expresions, just replace manually + (function () { + var original = String.prototype.replace; + // TODO: maybe use flags or object instead to pass options in + String.prototype.replace = function (search, newVal, replaceFirst, ignoreCase) { + // Use original is some cases + if (search instanceof RegExp) return original.apply(this, arguments); + + search = String(search); + var searchCompare = ignoreCase ? this.toLowerCase() : this; + if (ignoreCase) search = search.toLowerCase(); + + var searchLength = search.length; + var thisLength = this.length; + + var index = 0; + var retVal = ''; + while (index != -1) { + var nextIndex = searchCompare.indexOf(search, index); + if (nextIndex != -1) { + retVal += this.substring(index, nextIndex) + newVal; + index = nextIndex + searchLength; + if (index >= thisLength) index = -1; + } else { + retVal += this.substring(index); + index = -1; + } + if (replaceFirst) break; + } + + return retVal; + }; + + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (elt /*, from*/) { + var len = this.length >>> 0; + + var from = trunc(Number(arguments[1]) || 0); + if(from < 0) from += len; + + for(; from < len; from++) { + if(from in this && this[from] === elt) return from; + } + return -1; + }; + } + + var trunc = function(num) { + return num < 0 ? Math.ceil(num) : Math.floor(num); + }; + + + })(); diff --git a/code/page/resources/scripts/jquery-1.7.1.min.js b/code/page/resources/scripts/jquery-1.7.1.min.js new file mode 100644 index 0000000..198b3ff --- /dev/null +++ b/code/page/resources/scripts/jquery-1.7.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.1 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
      a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
      "+""+"
      ",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
      t
      ",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
      ",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; +f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() +{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/code/page/resources/scripts/jquery-3.2.1.min.js b/code/page/resources/scripts/jquery-3.2.1.min.js new file mode 100644 index 0000000..1f824ba --- /dev/null +++ b/code/page/resources/scripts/jquery-3.2.1.min.js @@ -0,0 +1,14 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"
      ","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + + +
      +
      +
      + +
      + CLOSE +
      + +
      +
      +
        +
        + +
        +
        +   +
        +
        +
        + + +
        +
         
        +
        +   +
        +
        +
        +
        + +
        +
        +
          +
          +
          +
          + Local Preview +
          +
          +
          + +
          + + +
          +
            +
          • + +
          • +
          +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          +
          + +
          +
          + +
          +
          +
          + +
          +
          +
          + +
          + +
          + +
          +
          +
          +
          +
          +
          +
          + +
          + + + + + + + + + + + + diff --git a/code/page/start_c_1.html b/code/page/start_c_1.html new file mode 100644 index 0000000..82de5fd --- /dev/null +++ b/code/page/start_c_1.html @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/code/page/start_with_pages.html b/code/page/start_with_pages.html new file mode 100644 index 0000000..5db78d6 --- /dev/null +++ b/code/page/start_with_pages.html @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/code/page/供应商信息.html b/code/page/供应商信息.html new file mode 100644 index 0000000..92f99a0 --- /dev/null +++ b/code/page/供应商信息.html @@ -0,0 +1,623 @@ + + + + 供应商信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          + + +
          +
          +
          +

          药品库存管理

          +
          +
          + + +
          +
          +
          +

          入库信息

          +
          +
          + + +
          +
          +
          +

          出库信息

          +
          +
          + + +
          +
          +
          +

          药品保质期检查

          +
          +
          + + +
          +
          +
          +

          药品明细查询

          +
          +
          + + +
          +
          +
          +

          供应商信息

          +
          +
          + + +
          +
          +
          +

          药品信息

          +
          +
          + + +
          +
          +
          +

          账单信息

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

          供应商信息列表

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

          序列

          +
          +
          + + +
          + +
          +

          供应商名称

          +
          +
          + + +
          + +
          +

          描述

          +
          +
          + + +
          + +
          +

          创建时间

          +
          +
          + + +
          + +
          +

          操作

          +
          +
          + + +
          + +
          +

          1

          +
          +
          + + +
          + +
          +

          白云山

          +
          +
          + + +
          + +
          +

          广东著名制造厂

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑   删除

          +
          +
          + + +
          + +
          +

          2

          +
          +
          + + +
          + +
          +

          云南白药

          +
          +
          + + +
          + +
          +

          著名中成药

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          3

          +
          +
          + + +
          + +
          +

          西南制药

          +
          +
          + + +
          + +
          +

          重庆制药厂

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          4

          +
          +
          + + +
          + +
          +

          北京协和

          +
          +
          + + +
          + +
          +

          测试

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          5

          +
          +
          + + +
          + +
          +

          金甲王药物研究

          +
          +
          + + +
          + +
          +

          成都制药

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          6

          +
          +
          + + +
          + +
          +

          向阳制造厂

          +
          +
          + + +
          + +
          +

          北京制药

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          7

          +
          +
          + + +
          + +
          +

          华新制药厂

          +
          +
          + + +
          + +
          +

          石家庄

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          8

          +
          +
          + + +
          + +
          +

          三九医药

          +
          +
          + + +
          + +
          +

          三九医药股份有限公司

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          编辑  删除

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

          提交

          +
          +
          + + +
          +
          + +
          + + +
          +
          +
          + + + diff --git a/code/page/入库信息.html b/code/page/入库信息.html new file mode 100644 index 0000000..e1a6807 --- /dev/null +++ b/code/page/入库信息.html @@ -0,0 +1,551 @@ + + + + 入库信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          + + +
          +
          +
          +

          药品库存管理

          +
          +
          + + +
          +
          +
          +

          入库信息

          +
          +
          + + +
          +
          +
          +

          出库信息

          +
          +
          + + +
          +
          +
          +

          药品保质期检查

          +
          +
          + + +
          +
          +
          +

          药品明细查询

          +
          +
          + + +
          +
          +
          +

          供应商信息

          +
          +
          + + +
          +
          +
          +

          药品信息

          +
          +
          + + +
          +
          +
          +

          账单信息

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

          入库信息列表

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

          提交

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

          序号

          +
          +
          + + +
          + +
          +

          药品名称

          +
          +
          + + +
          + +
          +

          数量

          +
          +
          + + +
          + +
          +

          操作人

          +
          +
          + + +
          + +
          +

          操作时间

          +
          +
          + + +
          + +
          +

          操作

          +
          +
          + + +
          + +
          +

          1

          +
          +
          + + +
          + +
          +

          云南白药

          +
          +
          + + +
          + +
          +

          800

          +
          +
          + + +
          + +
          +

          小红

          +
          +
          + + +
          + +
          +

          2022-09-22

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          2

          +
          +
          + + +
          + +
          +

          布诺芬

          +
          +
          + + +
          + +
          +

          123

          +
          +
          + + +
          + +
          +

          小灰

          +
          +
          + + +
          + +
          +

          2021-09-08

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          3

          +
          +
          + + +
          + +
          +

          999感冒灵颗粒

          +
          +
          + + +
          + +
          +

          234

          +
          +
          + + +
          + +
          +

          小美

          +
          +
          + + +
          + +
          +

          2028-06-04

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          4

          +
          +
          + + +
          + +
          +

          皮炎平

          +
          +
          + + +
          + +
          +

          256

          +
          +
          + + +
          + +
          +

          小喜

          +
          +
          + + +
          + +
          +

          2020-11-12

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          5

          +
          +
          + + +
          + +
          +

          西瓜霜

          +
          +
          + + +
          + +
          +

          300

          +
          +
          + + +
          + +
          +

          小懒

          +
          +
          + + +
          + +
          +

          2021-08-04

          +
          +
          + + +
          + +
          +

          编辑 删除

          +
          +
          +
          +
          + + + diff --git a/code/page/出库信息.html b/code/page/出库信息.html new file mode 100644 index 0000000..2177a37 --- /dev/null +++ b/code/page/出库信息.html @@ -0,0 +1,551 @@ + + + + 出库信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          + + +
          +
          +
          +

          药品库存管理

          +
          +
          + + +
          +
          +
          +

          入库信息

          +
          +
          + + +
          +
          +
          +

          出库信息

          +
          +
          + + +
          +
          +
          +

          药品保质期检查

          +
          +
          + + +
          +
          +
          +

          药品明细查询

          +
          +
          + + +
          +
          +
          +

          供应商信息

          +
          +
          + + +
          +
          +
          +

          药品信息

          +
          +
          + + +
          +
          +
          +

          账单信息

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

          出库信息列表

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

          提交

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

          序号

          +
          +
          + + +
          + +
          +

          药品名称

          +
          +
          + + +
          + +
          +

          数量

          +
          +
          + + +
          + +
          +

          操作人

          +
          +
          + + +
          + +
          +

          操作时间

          +
          +
          + + +
          + +
          +

          操作

          +
          +
          + + +
          + +
          +

          1

          +
          +
          + + +
          + +
          +

          云南白药

          +
          +
          + + +
          + +
          +

          800

          +
          +
          + + +
          + +
          +

          小红

          +
          +
          + + +
          + +
          +

          2022-09-22

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          2

          +
          +
          + + +
          + +
          +

          布诺芬

          +
          +
          + + +
          + +
          +

          123

          +
          +
          + + +
          + +
          +

          小灰

          +
          +
          + + +
          + +
          +

          2021-09-08

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          3

          +
          +
          + + +
          + +
          +

          999感冒灵颗粒

          +
          +
          + + +
          + +
          +

          234

          +
          +
          + + +
          + +
          +

          小美

          +
          +
          + + +
          + +
          +

          2028-06-04

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          4

          +
          +
          + + +
          + +
          +

          皮炎平

          +
          +
          + + +
          + +
          +

          256

          +
          +
          + + +
          + +
          +

          小喜

          +
          +
          + + +
          + +
          +

          2020-11-12

          +
          +
          + + +
          + +
          +

          编辑  删除

          +
          +
          + + +
          + +
          +

          5

          +
          +
          + + +
          + +
          +

          西瓜霜

          +
          +
          + + +
          + +
          +

          300

          +
          +
          + + +
          + +
          +

          小懒

          +
          +
          + + +
          + +
          +

          2021-08-04

          +
          +
          + + +
          + +
          +

          编辑 删除

          +
          +
          +
          +
          + + + diff --git a/code/page/药品保质期检查.html b/code/page/药品保质期检查.html new file mode 100644 index 0000000..76b2cd9 --- /dev/null +++ b/code/page/药品保质期检查.html @@ -0,0 +1,551 @@ + + + + 药品保质期检查 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          + + +
          +
          +
          +

          药品库存管理

          +
          +
          + + +
          +
          +
          +

          入库信息

          +
          +
          + + +
          +
          +
          +

          出库信息

          +
          +
          + + +
          +
          +
          +

          药品保质期检查

          +
          +
          + + +
          +
          +
          +

          药品明细查询

          +
          +
          + + +
          +
          +
          +

          供应商信息

          +
          +
          + + +
          +
          +
          +

          药品信息

          +
          +
          + + +
          +
          +
          +

          账单信息

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

          药品保质期检查列表

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

          提交

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

          序号

          +
          +
          + + +
          + +
          +

          药品名称

          +
          +
          + + +
          + +
          +

          保质期

          +
          +
          + + +
          + +
          +

          生产日期

          +
          +
          + + +
          + +
          +

          当前时间

          +
          +
          + + +
          + +
          +

          是否过期

          +
          +
          + + +
          + +
          +

          1

          +
          +
          + + +
          + +
          +

          999感冒颗粒

          +
          +
          + + +
          + +
          +

          24

          +
          +
          + + +
          + +
          +

          2019-05-31

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          过期17个月

          +
          +
          + + +
          + +
          +

          2

          +
          +
          + + +
          + +
          +

          百宝丹

          +
          +
          + + +
          + +
          +

          60

          +
          +
          + + +
          + +
          +

          2019-06-30

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          未过期

          +
          +
          + + +
          + +
          +

          3

          +
          +
          + + +
          + +
          +

          异丁苯丙酸

          +
          +
          + + +
          + +
          +

          24

          +
          +
          + + +
          + +
          +

          2020-06-01

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          过期5个月

          +
          +
          + + +
          + +
          +

          4

          +
          +
          + + +
          + +
          +

          氧氟沙星

          +
          +
          + + +
          + +
          +

          60

          +
          +
          + + +
          + +
          +

          2021-09-23

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          未过期

          +
          +
          + + +
          + +
          +

          5

          +
          +
          + + +
          + +
          +

          滴眼液

          +
          +
          + + +
          + +
          +

          48

          +
          +
          + + +
          + +
          +

          2021-07-13

          +
          +
          + + +
          + +
          +

          2022-10-13

          +
          +
          + + +
          + +
          +

          未过期

          +
          +
          +
          +
          + + + diff --git a/code/page/药品信息.html b/code/page/药品信息.html new file mode 100644 index 0000000..c50067b --- /dev/null +++ b/code/page/药品信息.html @@ -0,0 +1,1063 @@ + + + + 药品信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          + + +
          +
          +
          +

          药品库存管理

          +
          +
          + + +
          +
          +
          +

          入库信息

          +
          +
          + + +
          +
          +
          +

          出库信息

          +
          +
          + + +
          +
          +
          +

          药品保质期检查

          +
          +
          + + +
          +
          +
          +

          药品明细查询

          +
          +
          + + +
          +
          +
          +

          供应商信息

          +
          +
          + + +
          +
          +
          +

          药品信息

          +
          +
          + + +
          +
          +
          +

          账单信息

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

          药品信息列表

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

          提交

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

          序号

          +
          +
          + + +
          + +
          +

          药品名称

          +
          +
          + + +
          + +
          +

          处方药

          +
          +
          + + +
          + +
          +

          供应商

          +
          +
          + + +
          + +
          +

          保质期

          +
          +
          + + +
          + +
          +

          编码

          +
          +
          + + +
          + +
          +

          价格

          +
          +
          + + +
          + +
          +

          库存

          +
          +
          + + +
          + +
          +

          生产日期

          +
          +
          + + +
          + +
          +

          操作

          +
          +
          + + +
          + +
          +

          1

          +
          +
          + + +
          + +
          +

          999感冒颗粒

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          白云山

          +
          +
          + + +
          + +
          +

          24

          +
          +
          + + +
          + +
          +

          0001

          +
          +
          + + +
          + +
          +

          16.8

          +
          +
          + + +
          + +
          +

          500

          +
          +
          + + +
          + +
          +

          2019-10-11

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          2

          +
          +
          + + +
          + +
          +

          云南牙膏

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          云南白药

          +
          +
          + + +
          + +
          +

          60

          +
          +
          + + +
          + +
          +

          0002

          +
          +
          + + +
          + +
          +

          25.8

          +
          +
          + + +
          + +
          +

          1000

          +
          +
          + + +
          + +
          +

          2009-9-8

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          3

          +
          +
          + + +
          + +
          +

          氧氟沙星

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          三九医药

          +
          +
          + + +
          + +
          +

          21

          +
          +
          + + +
          + +
          +

          0003

          +
          +
          + + +
          + +
          +

          39.7

          +
          +
          + + +
          + +
          +

          3

          +
          +
          + + +
          + +
          +

          2008-10-23

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          4

          +
          +
          + + +
          + +
          +

          红霉素软膏

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          西南制药

          +
          +
          + + +
          + +
          +

          50

          +
          +
          + + +
          + +
          +

          0004

          +
          +
          + + +
          + +
          +

          23.5

          +
          +
          + + +
          + +
          +

          60

          +
          +
          + + +
          + +
          +

          2004-12-22

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          5

          +
          +
          + + +
          + +
          +

          布洛芬缓释胶囊

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          白云山

          +
          +
          + + +
          + +
          +

          34

          +
          +
          + + +
          + +
          +

          0005

          +
          +
          + + +
          + +
          +

          18.5

          +
          +
          + + +
          + +
          +

          48

          +
          +
          + + +
          + +
          +

          2024-5-29

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          6

          +
          +
          + + +
          + +
          +

          藿香正气水

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          西南制药

          +
          +
          + + +
          + +
          +

          12

          +
          +
          + + +
          + +
          +

          0006

          +
          +
          + + +
          + +
          +

          3.86

          +
          +
          + + +
          + +
          +

          89

          +
          +
          + + +
          + +
          +

          2022-7-8

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          7

          +
          +
          + + +
          + +
          +

          阿奇霉素

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          北京协和

          +
          +
          + + +
          + +
          +

          15

          +
          +
          + + +
          + +
          +

          0007

          +
          +
          + + +
          + +
          +

          16.35

          +
          +
          + + +
          + +
          +

          67

          +
          +
          + + +
          + +
          +

          2034-5-6

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          8

          +
          +
          + + +
          + +
          +

          桂林西瓜霜

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          北京协和

          +
          +
          + + +
          + +
          +

          40

          +
          +
          + + +
          + +
          +

          0008

          +
          +
          + + +
          + +
          +

          4.6

          +
          +
          + + +
          + +
          +

          200

          +
          +
          + + +
          + +
          +

          2021-8-9

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          + + +
          + +
          +

          9

          +
          +
          + + +
          + +
          +

          风油精

          +
          +
          + + +
          + +
          +

          false

          +
          +
          + + +
          + +
          +

          白云山

          +
          +
          + + +
          + +
          +

          400

          +
          +
          + + +
          + +
          +

          0009

          +
          +
          + + +
          + +
          +

          2.0

          +
          +
          + + +
          + +
          +

          599

          +
          +
          + + +
          + +
          +

          2020-11-13

          +
          +
          + + +
          + +
          +

          编译  删除

          +
          +
          +
          +
          + + + diff --git a/code/page/账单信息.html b/code/page/账单信息.html new file mode 100644 index 0000000..85a838f --- /dev/null +++ b/code/page/账单信息.html @@ -0,0 +1,503 @@ + + + + 账单信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          +
          +
          +
          +
          + + +
          +
          + +
          + + +
          +
          +
          +

          药品库存管理

          +
          +
          + + +
          +
          +
          +

          入库信息

          +
          +
          + + +
          +
          +
          +

          出库信息

          +
          +
          + + +
          +
          +
          +

          药品保质期检查

          +
          +
          + + +
          +
          +
          +

          药品明细查询

          +
          +
          + + +
          +
          +
          +

          供应商信息

          +
          +
          + + +
          +
          +
          +

          药品信息

          +
          +
          + + +
          +
          +
          +

          账单信息

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

          账单信息列表

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

          提交

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

          账单号

          +
          +
          + + +
          + +
          +

          药品名称

          +
          +
          + + +
          + +
          +

          数量

          +
          +
          + + +
          + +
          +

          金额

          +
          +
          + + +
          + +
          +

          成交时间

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