17195 lines
517 KiB
XML
17195 lines
517 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
<svg version="1.2" viewBox="0 0 28002 15752" preserveAspectRatio="xMidYMid" fill-rule="evenodd" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:presentation="http://sun.com/xmlns/staroffice/presentation" xmlns:smil="http://www.w3.org/2001/SMIL20/" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xml:space="preserve">
|
|
<defs class="ClipPathGroup">
|
|
<clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
|
|
<rect x="0" y="0" width="28002" height="15752"/>
|
|
</clipPath>
|
|
<clipPath id="presentation_clip_path_shrink" clipPathUnits="userSpaceOnUse">
|
|
<rect x="28" y="15" width="27946" height="15721"/>
|
|
</clipPath>
|
|
</defs>
|
|
<defs>
|
|
<g id="ooo:meta_slides" ooo:number-of-slides="1" ooo:start-slide-number="0">
|
|
<g id="ooo:meta_dummy_slide" ooo:slide="dummy-slide" ooo:master="dummy-master-page" ooo:background-visibility="hidden" ooo:master-objects-visibility="hidden" ooo:has-transition="false"/>
|
|
<g id="ooo:meta_slide_0" ooo:slide="id1" ooo:master="id2" ooo:display-name="Slide 1" ooo:date-time-visibility="hidden" ooo:footer-visibility="hidden" ooo:has-transition="true"/>
|
|
</g>
|
|
</defs>
|
|
<defs id="presentation-animations"/>
|
|
<defs>
|
|
<font id="EmbeddedFont_1" horiz-adv-x="2048">
|
|
<font-face font-family="Liberation Sans embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1852" descent="423"/>
|
|
<missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z "/>
|
|
<glyph unicode="x" horiz-adv-x="976" d="M 801,0 L 510,444 217,0 23,0 408,556 41,1082 240,1082 510,661 778,1082 979,1082 612,558 1002,0 801,0 Z "/>
|
|
<glyph unicode="t" horiz-adv-x="523" d="M 554,8 C 495,-8 434,-16 372,-16 228,-16 156,66 156,229 L 156,951 31,951 31,1082 163,1082 216,1324 336,1324 336,1082 536,1082 536,951 336,951 336,268 C 336,216 345,180 362,159 379,138 408,127 450,127 474,127 509,132 554,141 L 554,8 Z "/>
|
|
<glyph unicode="r" horiz-adv-x="511" d="M 142,0 L 142,830 C 142,906 140,990 136,1082 L 306,1082 C 311,959 314,886 314,861 L 318,861 C 347,954 380,1017 417,1051 454,1085 507,1102 575,1102 599,1102 623,1099 648,1092 L 648,927 C 624,934 592,937 552,937 477,937 420,905 381,841 342,776 322,684 322,564 L 322,0 142,0 Z "/>
|
|
<glyph unicode="o" horiz-adv-x="964" d="M 1053,542 C 1053,353 1011,212 928,119 845,26 724,-20 565,-20 407,-20 288,28 207,125 126,221 86,360 86,542 86,915 248,1102 571,1102 736,1102 858,1057 936,966 1014,875 1053,733 1053,542 Z M 864,542 C 864,691 842,800 798,868 753,935 679,969 574,969 469,969 393,935 346,866 299,797 275,689 275,542 275,399 298,292 345,221 391,149 464,113 563,113 671,113 748,148 795,217 841,286 864,395 864,542 Z "/>
|
|
<glyph unicode="m" horiz-adv-x="1429" d="M 768,0 L 768,686 C 768,791 754,863 725,903 696,943 645,963 570,963 493,963 433,934 388,875 343,816 321,734 321,627 L 321,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 356,974 400,1027 450,1057 500,1087 561,1102 633,1102 715,1102 780,1086 828,1053 875,1020 908,968 927,897 L 930,897 C 967,970 1013,1022 1066,1054 1119,1086 1183,1102 1258,1102 1367,1102 1447,1072 1497,1013 1546,954 1571,856 1571,721 L 1571,0 1393,0 1393,686 C 1393,791 1379,863 1350,903 1321,943 1270,963 1195,963 1116,963 1055,934 1012,876 968,817 946,734 946,627 L 946,0 768,0 Z "/>
|
|
<glyph unicode="l" horiz-adv-x="181" d="M 138,0 L 138,1484 318,1484 318,0 138,0 Z "/>
|
|
<glyph unicode="k" horiz-adv-x="886" d="M 816,0 L 450,494 318,385 318,0 138,0 138,1484 318,1484 318,557 793,1082 1004,1082 565,617 1027,0 816,0 Z "/>
|
|
<glyph unicode="i" horiz-adv-x="181" d="M 137,1312 L 137,1484 317,1484 317,1312 137,1312 Z M 137,0 L 137,1082 317,1082 317,0 137,0 Z "/>
|
|
<glyph unicode="h" horiz-adv-x="861" d="M 317,897 C 356,968 402,1020 457,1053 511,1086 580,1102 663,1102 780,1102 867,1073 923,1015 978,956 1006,858 1006,721 L 1006,0 825,0 825,686 C 825,762 818,819 804,856 790,893 767,920 735,937 703,954 659,963 602,963 517,963 450,934 399,875 348,816 322,737 322,638 L 322,0 142,0 142,1484 322,1484 322,1098 C 322,1057 321,1015 319,972 316,929 315,904 314,897 L 317,897 Z "/>
|
|
<glyph unicode="f" horiz-adv-x="543" d="M 361,951 L 361,0 181,0 181,951 29,951 29,1082 181,1082 181,1204 C 181,1303 203,1374 246,1417 289,1460 356,1482 445,1482 495,1482 537,1478 572,1470 L 572,1333 C 542,1338 515,1341 492,1341 446,1341 413,1329 392,1306 371,1283 361,1240 361,1179 L 361,1082 572,1082 572,951 361,951 Z "/>
|
|
<glyph unicode="e" horiz-adv-x="958" d="M 276,503 C 276,379 302,283 353,216 404,149 479,115 578,115 656,115 719,131 766,162 813,193 844,233 861,281 L 1019,236 C 954,65 807,-20 578,-20 418,-20 296,28 213,123 129,218 87,360 87,548 87,727 129,864 213,959 296,1054 416,1102 571,1102 889,1102 1048,910 1048,527 L 1048,503 276,503 Z M 862,641 C 852,755 823,838 775,891 727,943 658,969 568,969 481,969 412,940 361,882 310,823 282,743 278,641 L 862,641 Z "/>
|
|
<glyph unicode="d" horiz-adv-x="918" d="M 821,174 C 788,105 744,55 689,25 634,-5 565,-20 484,-20 347,-20 247,26 183,118 118,210 86,349 86,536 86,913 219,1102 484,1102 566,1102 634,1087 689,1057 744,1027 788,979 821,914 L 823,914 821,1035 821,1484 1001,1484 1001,223 C 1001,110 1003,36 1007,0 L 835,0 C 833,11 831,35 829,74 826,113 825,146 825,174 L 821,174 Z M 275,542 C 275,391 295,282 335,217 375,152 440,119 530,119 632,119 706,154 752,225 798,296 821,405 821,554 821,697 798,802 752,869 706,936 633,969 532,969 441,969 376,936 336,869 295,802 275,693 275,542 Z "/>
|
|
<glyph unicode="c" horiz-adv-x="880" d="M 275,546 C 275,402 298,295 343,226 388,157 457,122 548,122 612,122 666,139 709,174 752,209 778,262 788,334 L 970,322 C 956,218 912,135 837,73 762,11 668,-20 553,-20 402,-20 286,28 207,124 127,219 87,359 87,542 87,724 127,863 207,959 287,1054 402,1102 551,1102 662,1102 754,1073 827,1016 900,959 945,880 964,779 L 779,765 C 770,825 746,873 708,908 670,943 616,961 546,961 451,961 382,929 339,866 296,803 275,696 275,546 Z "/>
|
|
<glyph unicode="a" horiz-adv-x="1049" d="M 414,-20 C 305,-20 224,9 169,66 114,123 87,202 87,302 87,414 124,500 198,560 271,620 390,652 554,656 L 797,660 797,719 C 797,807 778,870 741,908 704,946 645,965 565,965 484,965 426,951 389,924 352,897 330,853 323,793 L 135,810 C 166,1005 310,1102 569,1102 705,1102 807,1071 876,1009 945,946 979,856 979,738 L 979,272 C 979,219 986,179 1000,152 1014,125 1041,111 1080,111 1097,111 1117,113 1139,118 L 1139,6 C 1094,-5 1047,-10 1000,-10 933,-10 885,8 855,43 824,78 807,132 803,207 L 797,207 C 751,124 698,66 637,32 576,-3 501,-20 414,-20 Z M 455,115 C 521,115 580,130 631,160 682,190 723,231 753,284 782,336 797,390 797,445 L 797,534 600,530 C 515,529 451,520 408,504 364,488 330,463 307,430 284,397 272,353 272,299 272,240 288,195 320,163 351,131 396,115 455,115 Z "/>
|
|
<glyph unicode="C" horiz-adv-x="1292" d="M 792,1274 C 636,1274 515,1224 428,1124 341,1023 298,886 298,711 298,538 343,400 434,295 524,190 646,137 800,137 997,137 1146,235 1245,430 L 1401,352 C 1343,231 1262,138 1157,75 1052,12 930,-20 791,-20 649,-20 526,10 423,69 319,128 240,212 186,322 131,431 104,561 104,711 104,936 165,1112 286,1239 407,1366 575,1430 790,1430 940,1430 1065,1401 1166,1342 1267,1283 1341,1196 1388,1081 L 1207,1021 C 1174,1103 1122,1166 1050,1209 977,1252 891,1274 792,1274 Z "/>
|
|
<glyph unicode=" " horiz-adv-x="566"/>
|
|
</font>
|
|
</defs>
|
|
<defs>
|
|
<font id="EmbeddedFont_2" horiz-adv-x="2048">
|
|
<font-face font-family="Liberation Serif embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1826" descent="450"/>
|
|
<missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z "/>
|
|
<glyph unicode="t" horiz-adv-x="537" d="M 334,-20 C 270,-20 222,-1 191,37 159,75 143,128 143,197 L 143,856 20,856 20,901 145,940 246,1153 309,1153 309,940 524,940 524,856 309,856 309,215 C 309,172 319,139 339,117 358,95 384,84 416,84 455,84 502,89 557,100 L 557,35 C 534,19 500,6 456,-5 412,-15 371,-20 334,-20 Z "/>
|
|
<glyph unicode="m" horiz-adv-x="1512" d="M 326,864 C 376,893 429,917 485,936 541,955 590,965 633,965 679,965 722,956 761,939 800,922 829,894 848,856 899,885 960,910 1029,932 1098,954 1155,965 1200,965 1360,965 1440,873 1440,688 L 1440,70 1561,45 1561,0 1134,0 1134,45 1274,70 1274,670 C 1274,785 1221,842 1114,842 1097,842 1077,841 1054,838 1031,835 1008,832 985,829 962,826 940,822 919,818 898,813 880,810 866,807 877,771 883,731 883,688 L 883,70 1024,45 1024,0 578,0 578,45 717,70 717,670 C 717,725 703,768 675,798 646,827 604,842 547,842 488,842 415,832 328,813 L 328,70 469,45 469,0 43,0 43,45 162,70 162,870 43,895 43,940 318,940 326,864 Z "/>
|
|
<glyph unicode="i" horiz-adv-x="487" d="M 379,1247 C 379,1218 368,1192 347,1171 326,1150 300,1139 270,1139 241,1139 215,1150 194,1171 173,1192 162,1218 162,1247 162,1277 173,1303 194,1324 215,1345 241,1356 270,1356 300,1356 326,1345 347,1324 368,1303 379,1277 379,1247 Z M 369,70 L 530,45 530,0 43,0 43,45 203,70 203,870 70,895 70,940 369,940 369,70 Z "/>
|
|
<glyph unicode="e" horiz-adv-x="756" d="M 260,473 L 260,455 C 260,363 270,292 291,241 311,190 342,151 385,124 427,97 482,84 551,84 587,84 630,87 679,93 728,99 769,106 801,113 L 801,57 C 769,36 726,18 671,3 616,-12 559,-20 502,-20 356,-20 249,19 182,98 114,177 80,303 80,477 80,641 114,763 183,844 252,925 350,965 477,965 718,965 838,828 838,555 L 838,473 260,473 Z M 477,885 C 408,885 355,857 318,801 281,745 262,662 262,553 L 664,553 C 664,672 649,758 618,809 587,860 540,885 477,885 Z "/>
|
|
<glyph unicode="d" horiz-adv-x="922" d="M 723,70 C 648,10 560,-20 459,-20 202,-20 74,140 74,461 74,626 110,751 183,837 256,922 363,965 504,965 576,965 649,957 723,942 719,964 717,1019 717,1108 L 717,1352 559,1376 559,1421 883,1421 883,70 999,45 999,0 735,0 723,70 Z M 254,461 C 254,334 275,240 318,178 361,115 426,84 514,84 589,84 657,97 717,123 L 717,866 C 658,877 590,883 514,883 341,883 254,742 254,461 Z "/>
|
|
<glyph unicode="a" horiz-adv-x="807" d="M 465,961 C 568,961 643,940 692,898 740,856 764,792 764,705 L 764,70 881,45 881,0 623,0 604,94 C 528,18 431,-20 313,-20 152,-20 72,73 72,260 72,323 84,375 109,416 133,457 172,488 225,510 278,531 356,543 457,545 L 598,549 598,696 C 598,761 586,808 563,839 539,870 502,885 453,885 386,885 325,869 270,838 L 236,721 180,721 180,926 C 288,949 383,961 465,961 Z M 598,479 L 467,475 C 378,472 317,454 286,423 254,392 238,339 238,266 238,149 286,90 381,90 426,90 466,95 499,106 532,116 565,129 598,145 L 598,479 Z "/>
|
|
<glyph unicode=">" horiz-adv-x="950" d="M 104,186 L 104,289 913,680 104,1071 104,1174 1057,705 1057,655 104,186 Z "/>
|
|
<glyph unicode="<" horiz-adv-x="950" d="M 102,655 L 102,705 1055,1174 1055,1071 246,680 1055,289 1055,186 102,655 Z "/>
|
|
<glyph unicode="/" horiz-adv-x="568" d="M 100,-20 L 0,-20 471,1350 569,1350 100,-20 Z "/>
|
|
</font>
|
|
</defs>
|
|
<defs>
|
|
<font id="EmbeddedFont_3" horiz-adv-x="2048">
|
|
<font-face font-family="Times New Roman embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1826" descent="450"/>
|
|
<missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z "/>
|
|
<glyph unicode="w" horiz-adv-x="1442" d="M 13,916 L 397,916 397,879 C 362,876 339,870 328,860 317,850 311,836 311,817 311,796 317,771 328,742 L 524,215 721,644 669,780 C 653,820 632,848 606,863 591,872 564,877 524,877 L 524,916 960,916 960,877 C 912,877 878,869 858,854 845,843 838,826 838,803 838,790 841,776 846,762 L 1054,235 1247,742 C 1260,778 1267,807 1267,828 1267,841 1261,852 1248,863 1235,873 1209,878 1171,878 L 1171,916 1460,916 1460,879 C 1402,870 1359,831 1332,761 L 1026,-28 985,-28 756,557 489,-28 452,-28 158,742 C 139,791 120,824 101,841 82,858 53,870 13,879 L 13,916 Z "/>
|
|
<glyph unicode="v" horiz-adv-x="985" d="M 17,916 L 448,916 448,879 420,879 C 394,879 374,873 361,860 347,847 340,830 340,809 340,786 347,758 361,726 L 574,220 788,745 C 803,782 811,811 811,830 811,839 808,847 803,853 796,863 786,870 775,874 764,877 741,879 706,879 L 706,916 1005,916 1005,879 C 970,876 946,869 933,858 910,838 889,805 870,758 L 545,-28 504,-28 177,745 C 162,781 148,807 135,823 122,838 105,851 84,862 73,868 50,874 17,879 L 17,916 Z "/>
|
|
<glyph unicode="u" horiz-adv-x="1016" d="M 867,916 L 867,361 C 867,255 870,190 875,167 880,143 888,126 899,117 910,108 922,103 937,103 958,103 981,109 1007,120 L 1021,85 747,-28 702,-28 702,166 C 623,81 563,27 522,5 481,-17 437,-28 391,-28 340,-28 295,-13 258,16 220,46 194,84 179,131 164,177 157,243 157,329 L 157,737 C 157,780 152,810 143,827 134,844 120,857 102,866 83,875 50,879 2,879 L 2,916 323,916 323,303 C 323,218 338,162 368,135 397,108 433,95 475,95 504,95 536,104 573,122 609,140 652,174 702,225 L 702,745 C 702,797 693,832 674,850 655,869 615,878 555,878 L 555,916 867,916 Z "/>
|
|
<glyph unicode="t" horiz-adv-x="552" d="M 330,1217 L 330,916 544,916 544,846 330,846 330,252 C 330,193 339,153 356,132 373,111 394,101 421,101 443,101 464,108 485,122 506,135 522,155 533,182 L 572,182 C 549,117 516,68 473,35 430,2 386,-15 341,-15 310,-15 280,-6 251,11 222,28 200,52 186,84 172,115 165,164 165,230 L 165,846 20,846 20,879 C 57,894 94,919 133,954 171,989 205,1030 235,1078 250,1103 272,1150 299,1217 L 330,1217 Z "/>
|
|
<glyph unicode="s" horiz-adv-x="624" d="M 656,943 L 656,631 623,631 C 598,729 565,796 526,831 486,866 435,884 374,884 327,884 290,872 261,847 232,822 218,795 218,765 218,728 229,696 250,669 271,642 313,613 376,582 L 522,511 C 657,445 725,358 725,250 725,167 694,100 631,49 568,-2 497,-28 419,-28 363,-28 299,-18 227,2 205,9 187,12 173,12 158,12 146,3 137,-14 L 104,-14 104,313 137,313 C 156,220 191,149 244,102 297,55 356,31 421,31 467,31 505,45 534,72 563,99 577,131 577,169 577,215 561,254 529,285 496,316 432,356 335,404 238,452 175,495 145,534 115,572 100,620 100,678 100,753 126,816 178,867 229,918 296,943 378,943 414,943 458,935 509,920 543,910 566,905 577,905 588,905 596,907 602,912 608,917 615,927 623,943 L 656,943 Z "/>
|
|
<glyph unicode="r" horiz-adv-x="681" d="M 332,943 L 332,737 C 409,874 487,943 568,943 605,943 635,932 659,910 683,887 695,861 695,832 695,806 686,784 669,766 652,748 631,739 607,739 584,739 558,751 529,774 500,797 478,808 464,808 452,808 439,801 425,788 395,761 364,716 332,653 L 332,214 C 332,163 338,125 351,99 360,81 375,66 397,54 419,42 451,36 492,36 L 492,0 23,0 23,36 C 70,36 104,43 127,58 144,69 155,86 162,109 165,120 167,153 167,206 L 167,561 C 167,668 165,731 161,752 156,772 148,787 137,796 125,805 110,810 93,810 72,810 49,805 23,795 L 13,831 290,943 332,943 Z "/>
|
|
<glyph unicode="o" horiz-adv-x="882" d="M 512,943 C 651,943 762,890 846,785 917,695 953,592 953,475 953,393 933,310 894,226 855,142 801,79 732,36 663,-7 586,-28 501,-28 363,-28 253,27 172,137 103,230 69,334 69,449 69,533 90,617 132,700 173,783 228,844 296,884 364,923 436,943 512,943 Z M 481,878 C 446,878 410,868 375,847 339,826 310,789 288,736 266,683 255,616 255,533 255,400 282,285 335,188 388,91 457,43 544,43 609,43 662,70 704,123 746,176 767,268 767,398 767,561 732,689 662,782 615,846 554,878 481,878 Z "/>
|
|
<glyph unicode="n" horiz-adv-x="1000" d="M 331,749 C 438,878 541,943 638,943 688,943 731,931 767,906 803,881 832,839 853,782 868,742 875,681 875,598 L 875,207 C 875,149 880,110 889,89 896,72 908,59 925,50 941,41 971,36 1015,36 L 1015,0 562,0 562,36 581,36 C 624,36 654,43 671,56 688,69 699,88 706,113 709,123 710,154 710,207 L 710,582 C 710,665 699,726 678,764 656,801 619,820 568,820 489,820 410,777 331,690 L 331,207 C 331,145 335,107 342,92 351,73 364,59 381,50 397,41 430,36 480,36 L 480,0 27,0 27,36 47,36 C 94,36 125,48 142,72 158,95 166,140 166,207 L 166,547 C 166,657 164,724 159,748 154,772 146,788 136,797 125,806 111,810 94,810 75,810 53,805 27,795 L 12,831 288,943 331,943 331,749 Z "/>
|
|
<glyph unicode="m" horiz-adv-x="1561" d="M 336,748 C 403,815 442,853 454,863 484,888 516,908 551,922 586,936 620,943 654,943 711,943 761,926 802,893 843,860 871,811 885,748 954,828 1012,881 1059,906 1106,931 1155,943 1205,943 1254,943 1297,931 1335,906 1372,881 1402,840 1424,783 1439,744 1446,684 1446,601 L 1446,207 C 1446,150 1450,110 1459,89 1466,74 1478,62 1496,52 1514,41 1543,36 1584,36 L 1584,0 1132,0 1132,36 1151,36 C 1190,36 1221,44 1243,59 1258,70 1269,87 1276,110 1279,121 1280,154 1280,207 L 1280,601 C 1280,676 1271,728 1253,759 1227,802 1185,823 1128,823 1093,823 1057,814 1022,797 986,779 943,746 892,698 L 890,687 892,644 892,207 C 892,144 896,105 903,90 910,75 923,62 942,52 961,41 994,36 1041,36 L 1041,0 578,0 578,36 C 629,36 664,42 683,54 702,66 715,84 722,108 725,119 727,152 727,207 L 727,601 C 727,676 716,729 694,762 665,805 624,826 571,826 535,826 499,816 464,797 409,768 366,735 336,698 L 336,207 C 336,147 340,108 349,90 357,72 369,59 386,50 402,41 435,36 485,36 L 485,0 32,0 32,36 C 74,36 103,41 120,50 137,59 149,73 158,93 167,112 171,150 171,207 L 171,557 C 171,658 168,723 162,752 157,774 150,789 140,798 130,806 116,810 99,810 80,810 58,805 32,795 L 17,831 293,943 336,943 336,748 Z "/>
|
|
<glyph unicode="l" horiz-adv-x="466" d="M 379,1422 L 379,207 C 379,150 383,112 392,93 400,74 413,60 430,51 447,41 480,36 527,36 L 527,0 78,0 78,36 C 120,36 149,40 164,49 179,58 191,72 200,92 209,112 213,150 213,207 L 213,1039 C 213,1142 211,1206 206,1230 201,1253 194,1269 184,1278 173,1287 160,1291 144,1291 127,1291 105,1286 78,1275 L 61,1310 334,1422 379,1422 Z "/>
|
|
<glyph unicode="k" horiz-adv-x="1016" d="M 335,1422 L 335,510 568,724 C 617,769 646,798 654,810 659,818 662,826 662,834 662,847 657,859 646,868 635,878 616,883 591,883 L 591,916 989,916 989,883 C 934,883 889,875 853,860 816,845 776,817 733,778 L 498,560 733,263 C 798,181 842,129 865,107 897,76 925,55 949,46 966,39 995,36 1036,36 L 1036,0 591,0 591,36 C 616,36 634,40 643,47 652,54 656,63 656,76 656,91 643,116 616,150 L 335,510 335,205 C 335,146 339,107 348,88 356,69 368,56 383,48 398,40 432,36 483,36 L 483,0 17,0 17,36 C 64,36 99,42 122,53 136,60 147,72 154,87 164,109 169,147 169,201 L 169,1035 C 169,1141 167,1206 162,1230 157,1253 150,1270 139,1279 128,1288 114,1292 97,1292 83,1292 62,1286 34,1275 L 17,1310 289,1422 335,1422 Z "/>
|
|
<glyph unicode="i" horiz-adv-x="459" d="M 297,1422 C 325,1422 349,1412 369,1393 388,1373 398,1349 398,1321 398,1293 388,1269 369,1249 349,1229 325,1219 297,1219 269,1219 245,1229 225,1249 205,1269 195,1293 195,1321 195,1349 205,1373 225,1393 244,1412 268,1422 297,1422 Z M 380,943 L 380,207 C 380,150 384,112 393,93 401,74 413,59 430,50 446,41 476,36 519,36 L 519,0 74,0 74,36 C 119,36 149,40 164,49 179,58 192,72 201,92 210,112 214,150 214,207 L 214,560 C 214,659 211,724 205,753 200,774 193,789 183,798 173,806 159,810 142,810 123,810 101,805 74,795 L 60,831 336,943 380,943 Z "/>
|
|
<glyph unicode="g" horiz-adv-x="923" d="M 309,334 C 253,361 210,400 180,449 150,498 135,552 135,611 135,702 169,780 238,845 306,910 393,943 500,943 587,943 663,922 727,879 L 921,879 C 950,879 966,878 971,877 976,875 979,872 981,868 985,862 987,851 987,836 987,819 985,807 982,800 980,797 977,794 972,792 967,790 950,789 921,789 L 802,789 C 839,741 858,680 858,605 858,520 825,447 760,386 695,325 607,295 497,295 452,295 405,302 358,315 329,290 309,268 299,249 288,230 283,213 283,200 283,189 289,178 300,167 311,156 332,149 364,144 383,141 429,139 504,137 641,134 730,129 771,123 833,114 883,91 920,54 957,17 975,-29 975,-84 975,-159 940,-230 869,-296 765,-393 629,-442 462,-442 333,-442 225,-413 136,-355 86,-322 61,-287 61,-251 61,-235 65,-219 72,-203 83,-178 107,-144 142,-100 147,-94 181,-58 244,8 209,29 185,47 171,64 156,80 149,98 149,119 149,142 159,170 178,201 197,232 240,277 309,334 Z M 483,895 C 434,895 392,875 359,836 326,797 309,736 309,655 309,550 332,468 377,410 412,366 456,344 509,344 560,344 601,363 634,401 667,439 683,499 683,580 683,686 660,769 614,829 580,873 536,895 483,895 Z M 299,0 C 268,-34 244,-66 228,-95 212,-124 204,-151 204,-176 204,-208 223,-236 262,-260 329,-301 425,-322 551,-322 671,-322 760,-301 817,-259 874,-216 902,-171 902,-123 902,-88 885,-64 851,-49 816,-34 748,-26 645,-23 495,-19 380,-11 299,0 Z "/>
|
|
<glyph unicode="f" horiz-adv-x="809" d="M 422,844 L 422,242 C 422,157 431,103 450,80 475,51 508,36 549,36 L 632,36 632,0 85,0 85,36 126,36 C 153,36 177,43 199,56 221,69 236,87 245,110 253,133 257,177 257,242 L 257,844 79,844 79,916 257,916 257,976 C 257,1067 272,1145 301,1208 330,1271 375,1323 436,1362 496,1401 564,1420 639,1420 709,1420 773,1397 832,1352 871,1322 890,1288 890,1251 890,1231 881,1212 864,1195 847,1177 828,1168 808,1168 793,1168 777,1174 760,1185 743,1196 722,1219 697,1256 672,1292 650,1316 629,1329 608,1342 585,1348 560,1348 529,1348 503,1340 482,1324 461,1307 445,1282 436,1248 427,1213 422,1125 422,982 L 422,916 658,916 658,844 422,844 Z "/>
|
|
<glyph unicode="e" horiz-adv-x="773" d="M 218,571 C 217,435 250,328 317,251 384,174 462,135 552,135 612,135 664,152 709,185 753,218 790,274 820,354 L 851,334 C 837,243 796,160 729,85 662,10 577,-28 476,-28 366,-28 272,15 194,101 115,186 76,301 76,446 76,603 116,725 197,813 277,900 378,944 499,944 602,944 686,910 752,843 818,775 851,684 851,571 L 218,571 Z M 218,629 L 642,629 C 639,688 632,729 621,753 604,790 580,820 547,841 514,862 479,873 443,873 388,873 338,852 295,809 251,766 225,706 218,629 Z "/>
|
|
<glyph unicode="d" horiz-adv-x="958" d="M 711,103 C 666,56 623,23 580,3 537,-18 491,-28 442,-28 342,-28 255,14 180,98 105,181 68,289 68,420 68,551 109,672 192,781 275,890 381,944 511,944 592,944 658,918 711,867 L 711,1036 C 711,1141 709,1205 704,1229 699,1253 691,1269 680,1278 669,1287 656,1291 640,1291 623,1291 600,1286 571,1275 L 558,1310 831,1422 876,1422 876,363 C 876,256 879,190 884,167 889,143 897,126 908,117 919,108 931,103 946,103 964,103 988,109 1018,120 L 1029,85 757,-28 711,-28 711,103 Z M 711,173 L 711,645 C 707,690 695,732 675,769 655,806 629,835 596,854 563,873 530,882 499,882 440,882 388,856 342,803 281,734 251,632 251,499 251,364 280,261 339,190 398,118 463,82 535,82 596,82 654,112 711,173 Z "/>
|
|
<glyph unicode="c" horiz-adv-x="770" d="M 842,348 C 817,227 769,135 697,70 625,5 545,-28 458,-28 354,-28 263,16 186,103 109,190 70,308 70,457 70,601 113,718 199,808 284,898 387,943 507,943 597,943 671,919 729,872 787,824 816,774 816,723 816,698 808,677 792,662 775,646 752,638 723,638 684,638 654,651 634,676 623,690 615,717 612,756 608,795 594,825 571,846 548,866 515,876 474,876 407,876 354,851 313,802 259,737 232,650 232,543 232,434 259,337 313,254 366,170 439,128 530,128 595,128 654,150 706,195 743,226 778,281 813,362 L 842,348 Z "/>
|
|
<glyph unicode="b" horiz-adv-x="955" d="M 315,758 C 404,881 499,943 602,943 696,943 778,903 848,823 918,742 953,632 953,493 953,330 899,199 791,100 698,15 595,-28 481,-28 428,-28 374,-18 319,1 264,20 207,49 150,88 L 150,1037 C 150,1141 148,1205 143,1229 138,1253 130,1269 119,1278 108,1287 95,1291 79,1291 60,1291 37,1286 9,1275 L -5,1310 270,1422 315,1422 315,758 Z M 315,694 L 315,146 C 349,113 384,88 421,71 457,54 494,45 532,45 593,45 649,78 702,145 754,212 780,309 780,436 780,553 754,644 702,707 649,770 590,801 523,801 488,801 452,792 417,774 390,761 356,734 315,694 Z "/>
|
|
<glyph unicode="a" horiz-adv-x="830" d="M 583,132 C 489,59 430,17 406,6 370,-11 332,-19 291,-19 228,-19 176,3 135,46 94,89 73,146 73,217 73,262 83,300 103,333 130,378 178,421 246,461 313,501 426,550 583,607 L 583,643 C 583,734 569,797 540,831 511,865 468,882 413,882 371,882 338,871 313,848 288,825 275,799 275,770 L 277,712 C 277,681 269,658 254,641 238,624 217,616 192,616 167,616 147,625 132,642 116,659 108,683 108,713 108,770 137,823 196,871 255,919 337,943 443,943 524,943 591,929 643,902 682,881 711,849 730,805 742,776 748,718 748,629 L 748,318 C 748,231 750,177 753,158 756,138 762,125 770,118 777,111 786,108 796,108 807,108 816,110 824,115 838,124 865,148 905,188 L 905,132 C 830,32 759,-18 691,-18 658,-18 632,-7 613,16 594,39 584,77 583,132 Z M 583,197 L 583,546 C 482,506 417,478 388,461 335,432 298,401 275,369 252,337 241,302 241,264 241,216 255,176 284,145 313,113 346,97 383,97 434,97 500,130 583,197 Z "/>
|
|
<glyph unicode="V" horiz-adv-x="1431" d="M 1454,1356 L 1454,1319 C 1406,1310 1370,1295 1345,1273 1310,1240 1278,1190 1251,1123 L 778,-31 741,-31 233,1138 C 207,1198 189,1235 178,1248 161,1269 141,1285 117,1297 92,1308 59,1316 18,1319 L 18,1356 572,1356 572,1319 C 509,1313 469,1302 450,1287 431,1272 422,1252 422,1228 422,1195 437,1143 468,1072 L 813,277 1133,1062 C 1164,1139 1180,1193 1180,1223 1180,1242 1170,1261 1151,1279 1132,1296 1099,1309 1053,1316 1050,1317 1044,1318 1036,1319 L 1036,1356 1454,1356 Z "/>
|
|
<glyph unicode="R" horiz-adv-x="1344" d="M 1384,0 L 1022,0 563,633 C 529,633 501,633 480,633 471,633 462,633 452,633 442,633 432,633 421,634 L 421,240 C 421,155 430,102 449,81 474,52 512,37 563,37 L 616,37 616,0 35,0 35,37 86,37 C 143,37 184,56 209,93 223,114 230,163 230,240 L 230,1116 C 230,1201 221,1254 202,1275 176,1304 137,1319 86,1319 L 35,1319 35,1356 529,1356 C 673,1356 779,1346 848,1325 916,1304 974,1265 1022,1209 1069,1152 1093,1085 1093,1007 1093,924 1066,851 1012,790 957,729 873,685 759,660 L 1039,271 C 1103,182 1158,122 1204,93 1250,64 1310,45 1384,37 L 1384,0 Z M 421,696 C 434,696 445,696 454,696 463,696 471,696 477,696 606,696 704,724 770,780 835,836 868,907 868,994 868,1079 842,1148 789,1201 736,1254 665,1280 578,1280 539,1280 487,1274 421,1261 L 421,696 Z "/>
|
|
<glyph unicode="I" horiz-adv-x="580" d="M 632,37 L 632,0 51,0 51,37 99,37 C 155,37 196,53 221,86 237,107 245,159 245,240 L 245,1116 C 245,1185 241,1230 232,1252 225,1269 212,1283 191,1295 162,1311 131,1319 99,1319 L 51,1319 51,1356 632,1356 632,1319 583,1319 C 528,1319 487,1303 462,1270 445,1249 437,1197 437,1116 L 437,240 C 437,171 441,126 450,104 457,87 471,73 492,61 521,45 551,37 583,37 L 632,37 Z "/>
|
|
<glyph unicode="F" horiz-adv-x="1019" d="M 419,1282 L 419,749 666,749 C 723,749 764,762 791,787 817,812 834,861 843,935 L 880,935 880,476 843,476 C 842,529 836,567 823,592 810,617 792,635 769,648 746,660 711,666 666,666 L 419,666 419,240 C 419,171 423,126 432,104 439,87 453,73 474,61 503,45 534,37 566,37 L 615,37 615,0 33,0 33,37 81,37 C 137,37 178,53 203,86 219,107 227,159 227,240 L 227,1116 C 227,1185 223,1230 214,1252 207,1269 194,1283 173,1295 144,1311 114,1319 81,1319 L 33,1319 33,1356 1042,1356 1055,1058 1020,1058 C 1003,1121 983,1168 960,1198 937,1227 908,1249 875,1262 841,1275 789,1282 718,1282 L 419,1282 Z "/>
|
|
<glyph unicode="D" horiz-adv-x="1361" d="M 35,0 L 35,37 86,37 C 143,37 184,55 208,92 223,114 230,163 230,240 L 230,1116 C 230,1201 221,1254 202,1275 176,1304 137,1319 86,1319 L 35,1319 35,1356 587,1356 C 790,1356 944,1333 1050,1287 1155,1241 1240,1164 1305,1057 1369,950 1401,826 1401,685 1401,496 1344,339 1229,212 1100,71 904,0 641,0 L 35,0 Z M 422,98 C 507,79 578,70 635,70 790,70 918,124 1020,233 1122,342 1173,489 1173,675 1173,862 1122,1010 1020,1118 918,1226 787,1280 627,1280 567,1280 499,1270 422,1251 L 422,98 Z "/>
|
|
<glyph unicode="B" horiz-adv-x="1216" d="M 946,692 C 1040,672 1110,640 1157,596 1222,535 1254,460 1254,371 1254,304 1233,239 1190,178 1147,116 1089,71 1015,43 940,14 827,0 674,0 L 34,0 34,37 85,37 C 142,37 182,55 207,91 222,114 230,164 230,240 L 230,1116 C 230,1200 220,1253 201,1275 175,1304 136,1319 85,1319 L 34,1319 34,1356 620,1356 C 729,1356 817,1348 883,1332 983,1308 1059,1266 1112,1205 1165,1144 1191,1073 1191,994 1191,926 1170,865 1129,812 1088,758 1027,718 946,692 Z M 422,746 C 447,741 475,738 507,736 538,733 573,732 611,732 708,732 782,743 831,764 880,785 917,817 943,860 969,903 982,951 982,1002 982,1081 950,1149 885,1205 820,1261 726,1289 602,1289 535,1289 475,1282 422,1267 L 422,746 Z M 422,98 C 499,80 576,71 651,71 772,71 864,98 927,153 990,207 1022,274 1022,354 1022,407 1008,457 979,506 950,555 904,593 839,621 774,649 694,663 599,663 558,663 522,662 493,661 464,660 440,657 422,654 L 422,98 Z "/>
|
|
<glyph unicode="A" horiz-adv-x="1435" d="M 937,454 L 412,454 320,240 C 297,187 286,148 286,122 286,101 296,83 316,68 335,52 378,42 443,37 L 443,0 16,0 16,37 C 73,47 109,60 126,76 160,108 198,173 239,271 L 716,1387 751,1387 1223,259 C 1261,168 1296,110 1327,83 1358,56 1401,40 1456,37 L 1456,0 921,0 921,37 C 975,40 1012,49 1031,64 1050,79 1059,98 1059,120 1059,149 1046,196 1019,259 L 937,454 Z M 909,528 L 679,1076 443,528 909,528 Z "/>
|
|
<glyph unicode=">" horiz-adv-x="1073" d="M 1113,653 L 37,187 37,273 964,675 37,1081 37,1172 1113,702 1113,653 Z "/>
|
|
<glyph unicode="<" horiz-adv-x="1073" d="M 37,706 L 1113,1172 1113,1085 187,683 1113,277 1113,187 37,657 37,706 Z "/>
|
|
<glyph unicode="-" horiz-adv-x="516" d="M 83,535 L 600,535 600,384 83,384 83,535 Z "/>
|
|
<glyph unicode=")" horiz-adv-x="551" d="M 46,1380 L 46,1422 C 147,1372 232,1313 299,1245 394,1148 468,1034 520,903 572,772 598,635 598,493 598,286 547,98 446,-73 344,-243 211,-365 46,-438 L 46,-401 C 128,-355 196,-293 249,-215 302,-136 341,-36 367,85 392,206 405,332 405,463 405,605 394,735 372,852 355,944 335,1018 310,1073 285,1128 251,1182 210,1233 169,1284 114,1333 46,1380 Z "/>
|
|
<glyph unicode="(" horiz-adv-x="551" d="M 636,-401 L 636,-438 C 535,-387 451,-328 384,-260 288,-163 214,-49 162,82 110,213 84,350 84,491 84,698 135,886 237,1057 339,1227 472,1349 636,1422 L 636,1380 C 554,1335 487,1273 434,1194 381,1115 342,1016 316,895 290,774 277,648 277,517 277,374 288,245 310,128 327,36 348,-38 373,-94 398,-149 431,-203 473,-254 514,-305 569,-354 636,-401 Z "/>
|
|
<glyph unicode=" " horiz-adv-x="509"/>
|
|
</font>
|
|
</defs>
|
|
<defs class="TextShapeIndex">
|
|
<g ooo:slide="id1" ooo:id-list="id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41 id42 id43 id44 id45 id46 id47 id48 id49 id50 id51 id52 id53 id54 id55 id56 id57 id58 id59 id60 id61 id62 id63"/>
|
|
</defs>
|
|
<defs class="EmbeddedBulletChars">
|
|
<g id="bullet-char-template-57356" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-57354" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-10146" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-10132" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-10007" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-10004" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-9679" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-8226" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-8211" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/>
|
|
</g>
|
|
<g id="bullet-char-template-61548" transform="scale(0.00048828125,-0.00048828125)">
|
|
<path d="M 173,740 C 173,903 231,1043 346,1159 462,1274 601,1332 765,1332 928,1332 1067,1274 1183,1159 1299,1043 1357,903 1357,740 1357,577 1299,437 1183,322 1067,206 928,148 765,148 601,148 462,206 346,322 231,437 173,577 173,740 Z"/>
|
|
</g>
|
|
</defs>
|
|
<defs>
|
|
<g id="dummy-master-page" ooo:name="dummy-master-page" class="Master_Slide">
|
|
<g id="bg-dummy-master-page" class="Background" visibility="hidden"/>
|
|
<g id="bo-dummy-master-page" class="BackgroundObjects" visibility="hidden"/>
|
|
</g>
|
|
<g id="id2" ooo:name="Default" class="Master_Slide">
|
|
<g id="bg-id2" class="Background"/>
|
|
<g id="bo-id2" class="BackgroundObjects">
|
|
<g visibility="hidden" ooo:text-adjust="left" class="Footer">
|
|
<g id="id3">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="9576" y="14348" width="8873" height="1083"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="13142" y="14842"><tspan class="PlaceholderText Footer" font-family="Times New Roman, serif" font-size="494px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="1741" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"><footer></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g visibility="hidden" ooo:text-adjust="left" class="PageNumber">
|
|
<g id="id4">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="20076" y="14348" width="6521" height="1083"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="24525" y="14842"><tspan class="PlaceholderText PageNumber" font-family="Times New Roman, serif" font-size="494px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2072" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"><number></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g visibility="hidden" ooo:text-adjust="left" class="DateTime">
|
|
<g id="id5">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="1400" y="14348" width="6521" height="1083"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="1400" y="14841"><tspan class="PlaceholderText DateTime" font-family="Liberation Serif, serif" font-size="493px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2381" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"><date/time></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
</defs>
|
|
<g class="DummySlide">
|
|
<g>
|
|
<g id="dummy-slide" class="Slide" clip-path="url(#presentation_clip_path)">
|
|
<g ooo:name="dummy-page" class="Page"/>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
<g class="SlideGroup">
|
|
<g visibility="hidden">
|
|
<g id="container-id1">
|
|
<g id="id1" class="Slide" clip-path="url(#presentation_clip_path)">
|
|
<g ooo:name="page1" class="Page">
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id6">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4139" y="2838" width="6045" height="5310"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 7161,8146 L 4140,8146 4140,2839 10182,2839 10182,8146 7161,8146 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id7">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4269" y="3204" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 4270,3205 L 4905,3206 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id8">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4270" y="3404" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 4271,3405 L 4906,3406 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id9">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4270" y="3004" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 4271,3005 L 4906,3006 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id10">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="5338" y="2969" width="3810" height="635"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 7243,3602 L 5339,3602 5339,2970 9146,2970 9146,3602 7243,3602 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id11">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="5339" y="2969" width="3808" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="5589" y="3447"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2478" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Search Account#</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id12">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4239" y="4103" width="5855" height="3710"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 7166,7811 L 4240,7811 4240,4104 10092,4104 10092,7811 7166,7811 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id13">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4642" y="4028" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="4892" y="4506"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2530" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre"><<AccountList>></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id14">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4742" y="4974" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="4992" y="5452"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3654" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Number | Address | Phone</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id15">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4470" y="2434" width="637" height="772"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 5105,2435 L 4595,3054 "/>
|
|
<path fill="rgb(178,178,178)" stroke="none" d="M 4470,3205 L 4523,2976 4685,3110 4470,3205 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id16">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4139" y="708" width="4748" height="2790"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="4389" y="1256"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3384" fill="rgb(0,0,0)" stroke="none" style="white-space: pre">View (toggle menu)</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="4389" y="1764"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3656" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> In account view</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="4389" y="2272"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3891" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> for reservations view</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="4389" y="2780"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3186" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> on an Account</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id17">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10639" y="2838" width="6045" height="5310"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 13661,8146 L 10640,8146 10640,2839 16682,2839 16682,8146 13661,8146 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id18">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10769" y="3204" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 10770,3205 L 11405,3206 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id19">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10770" y="3404" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 10771,3405 L 11406,3406 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id20">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10770" y="3004" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 10771,3005 L 11406,3006 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id21">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="12238" y="2969" width="3810" height="635"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 14143,3602 L 12239,3602 12239,2970 16046,2970 16046,3602 14143,3602 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id22">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="12239" y="2969" width="3808" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="12489" y="3447"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2166" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Account#Label</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id23">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10855" y="4103" width="5615" height="3710"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 13662,7811 L 10856,7811 10856,4104 16468,4104 16468,7811 13662,7811 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id24">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="11142" y="4028" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="11392" y="4506"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2530" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre"><<AccountList>></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id25">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="11242" y="4974" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="11492" y="5452"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3654" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Number | Address | Phone</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id26">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17039" y="2838" width="6045" height="5310"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 20061,8146 L 17040,8146 17040,2839 23082,2839 23082,8146 20061,8146 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id27">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17169" y="3204" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 17170,3205 L 17805,3206 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id28">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17170" y="3404" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 17171,3405 L 17806,3406 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id29">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17170" y="3004" width="638" height="4"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 17171,3005 L 17806,3006 "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id30">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="18638" y="2969" width="3810" height="635"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 20543,3602 L 18639,3602 18639,2970 22446,2970 22446,3602 20543,3602 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id31">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="18639" y="2969" width="3808" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="18889" y="3447"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2166" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Account#Label</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id32">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17274" y="4103" width="5615" height="3710"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 20081,7811 L 17275,7811 17275,4104 22887,4104 22887,7811 20081,7811 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id33">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17542" y="4028" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="17792" y="4506"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2530" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre"><<AccountList>></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id34">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17642" y="4974" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="17892" y="5452"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3654" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Number | Address | Phone</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id35">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17439" y="2538" width="6045" height="5310"/>
|
|
<g>
|
|
<defs>
|
|
<pattern id="pattern1" x="17440" y="2539" width="6043" height="5308" patternUnits="userSpaceOnUse">
|
|
<g transform="translate(-17440,-2539)">
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="2619" x2="23482" y2="2619"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="2725" x2="23482" y2="2725"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="2831" x2="23482" y2="2831"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="2937" x2="23482" y2="2937"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3043" x2="23482" y2="3043"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3149" x2="23482" y2="3149"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3255" x2="23482" y2="3255"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3361" x2="23482" y2="3361"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3467" x2="23482" y2="3467"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3573" x2="23482" y2="3573"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3679" x2="23482" y2="3679"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3785" x2="23482" y2="3785"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3891" x2="23482" y2="3891"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="3997" x2="23482" y2="3997"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4103" x2="23482" y2="4103"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4209" x2="23482" y2="4209"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4315" x2="23482" y2="4315"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4421" x2="23482" y2="4421"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4527" x2="23482" y2="4527"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4633" x2="23482" y2="4633"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4739" x2="23482" y2="4739"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4845" x2="23482" y2="4845"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="4951" x2="23482" y2="4951"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5057" x2="23482" y2="5057"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5163" x2="23482" y2="5163"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5269" x2="23482" y2="5269"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5375" x2="23482" y2="5375"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5481" x2="23482" y2="5481"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5587" x2="23482" y2="5587"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5693" x2="23482" y2="5693"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5799" x2="23482" y2="5799"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="5905" x2="23482" y2="5905"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6011" x2="23482" y2="6011"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6117" x2="23482" y2="6117"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6223" x2="23482" y2="6223"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6329" x2="23482" y2="6329"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6435" x2="23482" y2="6435"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6541" x2="23482" y2="6541"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6647" x2="23482" y2="6647"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6753" x2="23482" y2="6753"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6859" x2="23482" y2="6859"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="6965" x2="23482" y2="6965"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7071" x2="23482" y2="7071"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7177" x2="23482" y2="7177"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7283" x2="23482" y2="7283"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7389" x2="23482" y2="7389"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7495" x2="23482" y2="7495"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7601" x2="23482" y2="7601"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7707" x2="23482" y2="7707"/>
|
|
<line fill="rgb(102,102,102)" stroke="rgb(102,102,102)" x1="17440" y1="7813" x2="23482" y2="7813"/>
|
|
</g>
|
|
</pattern>
|
|
</defs>
|
|
<path style="fill:url(#pattern1)" d="M 20461,7846 L 17440,7846 17440,2539 23482,2539 23482,7846 20461,7846 Z "/>
|
|
</g>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 20461,7846 L 17440,7846 17440,2539 23482,2539 23482,7846 20461,7846 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id36">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="17370" y="2369" width="637" height="772"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 18005,2370 L 17495,2989 "/>
|
|
<path fill="rgb(178,178,178)" stroke="none" d="M 17370,3140 L 17423,2911 17585,3045 17370,3140 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id37">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="16839" y="344" width="4748" height="2129"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="17089" y="892"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3595" fill="rgb(0,0,0)" stroke="none" style="white-space: pre">View (toggled menu)</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="17089" y="1400"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2610" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> Reservations</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="17089" y="1908"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2846" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> For Account</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="17089" y="2416"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2234" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> In view</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id38">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="13230" y="3610" width="212" height="5107"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" stroke-width="51" stroke-linejoin="round" d="M 13335,8690 L 13336,3806 "/>
|
|
<path fill="rgb(178,178,178)" stroke="none" d="M 13336,3610 L 13441,3820 13231,3820 13336,3610 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id39">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4039" y="9238" width="6045" height="5310"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 7061,14546 L 4040,14546 4040,9239 10082,9239 10082,14546 7061,14546 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id40">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4238" y="9369" width="3810" height="635"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 6143,10002 L 4239,10002 4239,9370 8046,9370 8046,10002 6143,10002 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id41">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4239" y="9369" width="3808" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="4489" y="9847"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2166" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Account#Label</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id42">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4255" y="10503" width="5615" height="3710"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 7062,14211 L 4256,14211 4256,10504 9868,10504 9868,14211 7062,14211 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id43">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4542" y="10428" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="4792" y="10906"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3017" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre"><<ReservationList>></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id44">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="4642" y="11374" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="4892" y="11852"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3908" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Number | Address | Address</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id45">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="11430" y="7515" width="3173" height="2129"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="11680" y="8063"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="800" fill="rgb(0,0,0)" stroke="none" style="white-space: pre">Row</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="11680" y="8571"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="1352" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> onclick</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="11680" y="9079"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2504" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> Data-Bind</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id46">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="3149" y="5464" width="2567" height="713"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" stroke-width="51" stroke-linejoin="round" d="M 3175,6150 L 5525,5563 "/>
|
|
<path fill="rgb(178,178,178)" stroke="none" d="M 5715,5515 L 5537,5668 5486,5464 5715,5515 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id47">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="1529" y="5315" width="2538" height="1268"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="1779" y="5863"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="800" fill="rgb(0,0,0)" stroke="none" style="white-space: pre">Row</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="1779" y="6371"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="1352" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> onclick</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id48">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="3170" y="11758" width="3814" height="716"/>
|
|
<path fill="rgb(178,178,178)" stroke="none" d="M 3187,12472 L 3178,12447 3170,12422 6641,11844 6608,11758 6983,11813 6692,11980 6659,11893 3187,12472 3187,12472 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id49">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="1530" y="11615" width="2538" height="1268"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="1780" y="12163"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="800" fill="rgb(0,0,0)" stroke="none" style="white-space: pre">Row</tspan></tspan></tspan><tspan class="TextParagraph"><tspan class="TextPosition" x="1780" y="12671"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="1352" fill="rgb(0,0,0)" stroke="none" style="white-space: pre"> onclick</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id50">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="8789" y="9339" width="1268" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="9039" y="9817"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="605" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Add</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.LineShape">
|
|
<g id="id51">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="9437" y="9770" width="2567" height="212"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" stroke-width="51" stroke-linejoin="round" d="M 9463,9875 L 11807,9876 "/>
|
|
<path fill="rgb(178,178,178)" stroke="none" d="M 12003,9876 L 11793,9981 11793,9771 12003,9876 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id52">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10639" y="9238" width="6045" height="5310"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 13661,14546 L 10640,14546 10640,9239 16682,9239 16682,14546 13661,14546 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id53">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10838" y="9369" width="3810" height="635"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 12743,10002 L 10839,10002 10839,9370 14646,9370 14646,10002 12743,10002 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id54">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10839" y="9369" width="3808" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="11089" y="9847"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2166" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Account#Label</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id55">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10855" y="10503" width="5615" height="3710"/>
|
|
<path fill="none" stroke="rgb(178,178,178)" d="M 13662,14211 L 10856,14211 10856,10504 16468,10504 16468,14211 13662,14211 Z "/>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id56">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="11142" y="10428" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="11392" y="10906"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="3310" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre"><<CabinReservation>></tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id57">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10948" y="11262" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="11198" y="11740"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2684" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre"> Address: Physical </tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id58">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="14489" y="9339" width="2018" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="14739" y="9817"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="976" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Cancel</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id59">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="10948" y="12053" width="5440" height="644"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="11198" y="12531"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2606" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre"> Address: Mailing </tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id60">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="15690" y="9339" width="1293" height="638"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="15940" y="9817"><tspan font-family="Times New Roman, serif" font-size="353px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="683" fill-opacity="0.611764705882353" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">Save</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id61">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="5079" y="11659" width="5805" height="1039"/>
|
|
<path fill="rgb(178,178,178)" stroke="none" d="M 5107,12697 L 5093,12661 5080,12625 10362,11783 10313,11659 10883,11738 10440,11981 10391,11855 5107,12697 5107,12697 Z "/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="7665" y="12348"><tspan font-family="Times New Roman, serif" font-size="423px" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="635" fill="rgb(0,0,0)" stroke="none" style="white-space: pre">edit</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id62">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="20954" y="2028" width="4138" height="645"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="21204" y="2506"><tspan font-family="Arial, sans-serif" font-size="353px" font-style="italic" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2539" fill-opacity="0.968627450980392" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">reservation view</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
<g class="com.sun.star.drawing.CustomShape">
|
|
<g id="id63">
|
|
<rect class="BoundingBox" stroke="none" fill="none" x="3654" y="8729" width="4138" height="645"/>
|
|
<text class="SVGTextShape"><tspan class="TextParagraph"><tspan class="TextPosition" x="3904" y="9207"><tspan font-family="Arial, sans-serif" font-size="353px" font-style="italic" font-weight="400" lengthAdjust="spacingAndGlyphs" textLength="2539" fill-opacity="0.968627450980392" fill="rgb(204,204,204)" stroke="none" style="white-space: pre">reservation view</tspan></tspan></tspan></text>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
</g>
|
|
<script type="text/ecmascript"><![CDATA[
|
|
|
|
|
|
(function(window, document, exportName, undefined) {
|
|
'use strict';
|
|
|
|
var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];
|
|
var TEST_ELEMENT = document.createElement('div');
|
|
|
|
var TYPE_FUNCTION = 'function';
|
|
|
|
var round = Math.round;
|
|
var abs = Math.abs;
|
|
var now = Date.now;
|
|
|
|
if (!Math.trunc) {
|
|
Math.trunc = function (v) {
|
|
return v < 0 ? Math.ceil(v) : Math.floor(v);
|
|
};
|
|
}
|
|
|
|
function setTimeoutContext(fn, timeout, context) {
|
|
return setTimeout(bindFn(fn, context), timeout);
|
|
}
|
|
|
|
function invokeArrayArg(arg, fn, context) {
|
|
if (Array.isArray(arg)) {
|
|
each(arg, context[fn], context);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function each(obj, iterator, context) {
|
|
var i;
|
|
|
|
if (!obj) {
|
|
return;
|
|
}
|
|
|
|
if (obj.forEach) {
|
|
obj.forEach(iterator, context);
|
|
} else if (obj.length !== undefined) {
|
|
i = 0;
|
|
while (i < obj.length) {
|
|
iterator.call(context, obj[i], i, obj);
|
|
i++;
|
|
}
|
|
} else {
|
|
for (i in obj) {
|
|
obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);
|
|
}
|
|
}
|
|
}
|
|
|
|
function deprecate(method, name, message) {
|
|
var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\n' + message + ' AT \n';
|
|
return function() {
|
|
var e = new Error('get-stack-trace');
|
|
var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '')
|
|
.replace(/^\s+at\s+/gm, '')
|
|
.replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';
|
|
|
|
var log = window.console && (window.console.warn || window.console.log);
|
|
if (log) {
|
|
log.call(window.console, deprecationMessage, stack);
|
|
}
|
|
return method.apply(this, arguments);
|
|
};
|
|
}
|
|
|
|
var assign;
|
|
if (typeof Object.assign !== 'function') {
|
|
assign = function assign(target) {
|
|
if (target === undefined || target === null) {
|
|
throw new TypeError('Cannot convert undefined or null to object');
|
|
}
|
|
|
|
var output = Object(target);
|
|
for (var index = 1; index < arguments.length; index++) {
|
|
var source = arguments[index];
|
|
if (source !== undefined && source !== null) {
|
|
for (var nextKey in source) {
|
|
if (source.hasOwnProperty(nextKey)) {
|
|
output[nextKey] = source[nextKey];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return output;
|
|
};
|
|
} else {
|
|
assign = Object.assign;
|
|
}
|
|
|
|
var extend = deprecate(function extend(dest, src, merge) {
|
|
var keys = Object.keys(src);
|
|
var i = 0;
|
|
while (i < keys.length) {
|
|
if (!merge || (merge && dest[keys[i]] === undefined)) {
|
|
dest[keys[i]] = src[keys[i]];
|
|
}
|
|
i++;
|
|
}
|
|
return dest;
|
|
}, 'extend', 'Use `assign`.');
|
|
|
|
var merge = deprecate(function merge(dest, src) {
|
|
return extend(dest, src, true);
|
|
}, 'merge', 'Use `assign`.');
|
|
|
|
function inherit(child, base, properties) {
|
|
var baseP = base.prototype,
|
|
childP;
|
|
|
|
childP = child.prototype = Object.create(baseP);
|
|
childP.constructor = child;
|
|
childP._super = baseP;
|
|
|
|
if (properties) {
|
|
assign(childP, properties);
|
|
}
|
|
}
|
|
|
|
function bindFn(fn, context) {
|
|
return function boundFn() {
|
|
return fn.apply(context, arguments);
|
|
};
|
|
}
|
|
|
|
function boolOrFn(val, args) {
|
|
if (typeof val == TYPE_FUNCTION) {
|
|
return val.apply(args ? args[0] || undefined : undefined, args);
|
|
}
|
|
return val;
|
|
}
|
|
|
|
function ifUndefined(val1, val2) {
|
|
return (val1 === undefined) ? val2 : val1;
|
|
}
|
|
|
|
function addEventListeners(target, types, handler) {
|
|
each(splitStr(types), function(type) {
|
|
target.addEventListener(type, handler, false);
|
|
});
|
|
}
|
|
|
|
function removeEventListeners(target, types, handler) {
|
|
each(splitStr(types), function(type) {
|
|
target.removeEventListener(type, handler, false);
|
|
});
|
|
}
|
|
|
|
function hasParent(node, parent) {
|
|
while (node) {
|
|
if (node == parent) {
|
|
return true;
|
|
}
|
|
node = node.parentNode;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function inStr(str, find) {
|
|
return str.indexOf(find) > -1;
|
|
}
|
|
|
|
function splitStr(str) {
|
|
return str.trim().split(/\s+/g);
|
|
}
|
|
|
|
function inArray(src, find, findByKey) {
|
|
if (src.indexOf && !findByKey) {
|
|
return src.indexOf(find);
|
|
} else {
|
|
var i = 0;
|
|
while (i < src.length) {
|
|
if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {
|
|
return i;
|
|
}
|
|
i++;
|
|
}
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
function toArray(obj) {
|
|
return Array.prototype.slice.call(obj, 0);
|
|
}
|
|
|
|
function uniqueArray(src, key, sort) {
|
|
var results = [];
|
|
var values = [];
|
|
var i = 0;
|
|
|
|
while (i < src.length) {
|
|
var val = key ? src[i][key] : src[i];
|
|
if (inArray(values, val) < 0) {
|
|
results.push(src[i]);
|
|
}
|
|
values[i] = val;
|
|
i++;
|
|
}
|
|
|
|
if (sort) {
|
|
if (!key) {
|
|
results = results.sort();
|
|
} else {
|
|
results = results.sort(function sortUniqueArray(a, b) {
|
|
return a[key] > b[key];
|
|
});
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
function prefixed(obj, property) {
|
|
if (obj === undefined) {
|
|
return undefined;
|
|
}
|
|
|
|
var prefix, prop;
|
|
var camelProp = property[0].toUpperCase() + property.slice(1);
|
|
|
|
var i = 0;
|
|
while (i < VENDOR_PREFIXES.length) {
|
|
prefix = VENDOR_PREFIXES[i];
|
|
prop = (prefix) ? prefix + camelProp : property;
|
|
|
|
if (prop in obj) {
|
|
return prop;
|
|
}
|
|
i++;
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
var _uniqueId = 1;
|
|
function uniqueId() {
|
|
return _uniqueId++;
|
|
}
|
|
|
|
function getWindowForElement(element) {
|
|
var doc = element.ownerDocument || element;
|
|
return (doc.defaultView || doc.parentWindow || window);
|
|
}
|
|
|
|
var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;
|
|
|
|
var SUPPORT_TOUCH = ('ontouchstart' in window);
|
|
var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;
|
|
var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);
|
|
|
|
var INPUT_TYPE_TOUCH = 'touch';
|
|
var INPUT_TYPE_PEN = 'pen';
|
|
var INPUT_TYPE_MOUSE = 'mouse';
|
|
var INPUT_TYPE_KINECT = 'kinect';
|
|
|
|
var COMPUTE_INTERVAL = 25;
|
|
|
|
var INPUT_START = 1;
|
|
var INPUT_MOVE = 2;
|
|
var INPUT_END = 4;
|
|
var INPUT_CANCEL = 8;
|
|
|
|
var DIRECTION_NONE = 1;
|
|
var DIRECTION_LEFT = 2;
|
|
var DIRECTION_RIGHT = 4;
|
|
var DIRECTION_UP = 8;
|
|
var DIRECTION_DOWN = 16;
|
|
|
|
var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;
|
|
var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;
|
|
var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;
|
|
|
|
var PROPS_XY = ['x', 'y'];
|
|
var PROPS_CLIENT_XY = ['clientX', 'clientY'];
|
|
|
|
function Input(manager, callback) {
|
|
var self = this;
|
|
this.manager = manager;
|
|
this.callback = callback;
|
|
this.element = manager.element;
|
|
this.target = manager.options.inputTarget;
|
|
|
|
this.domHandler = function(ev) {
|
|
if (boolOrFn(manager.options.enable, [manager])) {
|
|
self.handler(ev);
|
|
}
|
|
};
|
|
|
|
this.init();
|
|
|
|
}
|
|
|
|
Input.prototype = {
|
|
handler: function() { },
|
|
|
|
init: function() {
|
|
this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);
|
|
this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);
|
|
this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
|
|
},
|
|
|
|
destroy: function() {
|
|
this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);
|
|
this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);
|
|
this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
|
|
}
|
|
};
|
|
|
|
function createInputInstance(manager) {
|
|
var Type;
|
|
var inputClass = manager.options.inputClass;
|
|
|
|
if (inputClass) {
|
|
Type = inputClass;
|
|
} else if (!SUPPORT_TOUCH && SUPPORT_POINTER_EVENTS) {
|
|
Type = PointerEventInput;
|
|
} else if (SUPPORT_ONLY_TOUCH) {
|
|
Type = TouchInput;
|
|
} else if (!SUPPORT_TOUCH) {
|
|
Type = MouseInput;
|
|
} else {
|
|
Type = TouchMouseInput;
|
|
}
|
|
return new (Type)(manager, inputHandler);
|
|
}
|
|
|
|
function inputHandler(manager, eventType, input) {
|
|
var pointersLen = input.pointers.length;
|
|
var changedPointersLen = input.changedPointers.length;
|
|
var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));
|
|
var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));
|
|
|
|
input.isFirst = !!isFirst;
|
|
input.isFinal = !!isFinal;
|
|
|
|
if (isFirst) {
|
|
manager.session = {};
|
|
}
|
|
|
|
input.eventType = eventType;
|
|
|
|
computeInputData(manager, input);
|
|
|
|
manager.emit('hammer.input', input);
|
|
|
|
manager.recognize(input);
|
|
manager.session.prevInput = input;
|
|
}
|
|
|
|
function computeInputData(manager, input) {
|
|
var session = manager.session;
|
|
var pointers = input.pointers;
|
|
var pointersLength = pointers.length;
|
|
|
|
if (!session.firstInput) {
|
|
session.firstInput = simpleCloneInputData(input);
|
|
}
|
|
|
|
if (pointersLength > 1 && !session.firstMultiple) {
|
|
session.firstMultiple = simpleCloneInputData(input);
|
|
} else if (pointersLength === 1) {
|
|
session.firstMultiple = false;
|
|
}
|
|
|
|
var firstInput = session.firstInput;
|
|
var firstMultiple = session.firstMultiple;
|
|
var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;
|
|
|
|
var center = input.center = getCenter(pointers);
|
|
input.timeStamp = now();
|
|
input.deltaTime = input.timeStamp - firstInput.timeStamp;
|
|
|
|
input.angle = getAngle(offsetCenter, center);
|
|
input.distance = getDistance(offsetCenter, center);
|
|
|
|
computeDeltaXY(session, input);
|
|
input.offsetDirection = getDirection(input.deltaX, input.deltaY);
|
|
|
|
var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);
|
|
input.overallVelocityX = overallVelocity.x;
|
|
input.overallVelocityY = overallVelocity.y;
|
|
input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;
|
|
|
|
input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;
|
|
input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;
|
|
|
|
input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >
|
|
session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);
|
|
|
|
computeIntervalInputData(session, input);
|
|
|
|
var target = manager.element;
|
|
if (hasParent(input.srcEvent.target, target)) {
|
|
target = input.srcEvent.target;
|
|
}
|
|
input.target = target;
|
|
}
|
|
|
|
function computeDeltaXY(session, input) {
|
|
var center = input.center;
|
|
var offset = session.offsetDelta || {};
|
|
var prevDelta = session.prevDelta || {};
|
|
var prevInput = session.prevInput || {};
|
|
|
|
if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {
|
|
prevDelta = session.prevDelta = {
|
|
x: prevInput.deltaX || 0,
|
|
y: prevInput.deltaY || 0
|
|
};
|
|
|
|
offset = session.offsetDelta = {
|
|
x: center.x,
|
|
y: center.y
|
|
};
|
|
}
|
|
|
|
input.deltaX = prevDelta.x + (center.x - offset.x);
|
|
input.deltaY = prevDelta.y + (center.y - offset.y);
|
|
}
|
|
|
|
function computeIntervalInputData(session, input) {
|
|
var last = session.lastInterval || input,
|
|
deltaTime = input.timeStamp - last.timeStamp,
|
|
velocity, velocityX, velocityY, direction;
|
|
|
|
if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {
|
|
var deltaX = input.deltaX - last.deltaX;
|
|
var deltaY = input.deltaY - last.deltaY;
|
|
|
|
var v = getVelocity(deltaTime, deltaX, deltaY);
|
|
velocityX = v.x;
|
|
velocityY = v.y;
|
|
velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;
|
|
direction = getDirection(deltaX, deltaY);
|
|
|
|
session.lastInterval = input;
|
|
} else {
|
|
velocity = last.velocity;
|
|
velocityX = last.velocityX;
|
|
velocityY = last.velocityY;
|
|
direction = last.direction;
|
|
}
|
|
|
|
input.velocity = velocity;
|
|
input.velocityX = velocityX;
|
|
input.velocityY = velocityY;
|
|
input.direction = direction;
|
|
}
|
|
|
|
function simpleCloneInputData(input) {
|
|
var pointers = [];
|
|
var i = 0;
|
|
while (i < input.pointers.length) {
|
|
pointers[i] = {
|
|
clientX: round(input.pointers[i].clientX),
|
|
clientY: round(input.pointers[i].clientY)
|
|
};
|
|
i++;
|
|
}
|
|
|
|
return {
|
|
timeStamp: now(),
|
|
pointers: pointers,
|
|
center: getCenter(pointers),
|
|
deltaX: input.deltaX,
|
|
deltaY: input.deltaY
|
|
};
|
|
}
|
|
|
|
function getCenter(pointers) {
|
|
var pointersLength = pointers.length;
|
|
|
|
if (pointersLength === 1) {
|
|
return {
|
|
x: round(pointers[0].clientX),
|
|
y: round(pointers[0].clientY)
|
|
};
|
|
}
|
|
|
|
var x = 0, y = 0, i = 0;
|
|
while (i < pointersLength) {
|
|
x += pointers[i].clientX;
|
|
y += pointers[i].clientY;
|
|
i++;
|
|
}
|
|
|
|
return {
|
|
x: round(x / pointersLength),
|
|
y: round(y / pointersLength)
|
|
};
|
|
}
|
|
|
|
function getVelocity(deltaTime, x, y) {
|
|
return {
|
|
x: x / deltaTime || 0,
|
|
y: y / deltaTime || 0
|
|
};
|
|
}
|
|
|
|
function getDirection(x, y) {
|
|
if (x === y) {
|
|
return DIRECTION_NONE;
|
|
}
|
|
|
|
if (abs(x) >= abs(y)) {
|
|
return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
|
|
}
|
|
return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;
|
|
}
|
|
|
|
function getDistance(p1, p2, props) {
|
|
if (!props) {
|
|
props = PROPS_XY;
|
|
}
|
|
var x = p2[props[0]] - p1[props[0]],
|
|
y = p2[props[1]] - p1[props[1]];
|
|
|
|
return Math.hypot(x, y);
|
|
}
|
|
|
|
function getAngle(p1, p2, props) {
|
|
if (!props) {
|
|
props = PROPS_XY;
|
|
}
|
|
var x = p2[props[0]] - p1[props[0]],
|
|
y = p2[props[1]] - p1[props[1]];
|
|
return Math.atan2(y, x) * 180 / Math.PI;
|
|
}
|
|
|
|
function getRotation(start, end) {
|
|
return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);
|
|
}
|
|
|
|
function getScale(start, end) {
|
|
return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);
|
|
}
|
|
|
|
var MOUSE_INPUT_MAP = {
|
|
mousedown: INPUT_START,
|
|
mousemove: INPUT_MOVE,
|
|
mouseup: INPUT_END
|
|
};
|
|
|
|
var MOUSE_ELEMENT_EVENTS = 'mousedown';
|
|
var MOUSE_WINDOW_EVENTS = 'mousemove mouseup';
|
|
|
|
function MouseInput() {
|
|
this.evEl = MOUSE_ELEMENT_EVENTS;
|
|
this.evWin = MOUSE_WINDOW_EVENTS;
|
|
|
|
this.pressed = false; // mousedown state
|
|
|
|
Input.apply(this, arguments);
|
|
}
|
|
|
|
inherit(MouseInput, Input, {
|
|
handler: function MEhandler(ev) {
|
|
var eventType = MOUSE_INPUT_MAP[ev.type];
|
|
|
|
if (eventType & INPUT_START && ev.button === 0) {
|
|
this.pressed = true;
|
|
}
|
|
|
|
if (eventType & INPUT_MOVE && ev.which !== 1) {
|
|
eventType = INPUT_END;
|
|
}
|
|
|
|
if (!this.pressed) {
|
|
return;
|
|
}
|
|
|
|
if (eventType & INPUT_END) {
|
|
this.pressed = false;
|
|
}
|
|
|
|
this.callback(this.manager, eventType, {
|
|
pointers: [ev],
|
|
changedPointers: [ev],
|
|
pointerType: INPUT_TYPE_MOUSE,
|
|
srcEvent: ev
|
|
});
|
|
}
|
|
});
|
|
|
|
var POINTER_INPUT_MAP = {
|
|
pointerdown: INPUT_START,
|
|
pointermove: INPUT_MOVE,
|
|
pointerup: INPUT_END,
|
|
pointercancel: INPUT_CANCEL,
|
|
pointerout: INPUT_CANCEL
|
|
};
|
|
|
|
var IE10_POINTER_TYPE_ENUM = {
|
|
2: INPUT_TYPE_TOUCH,
|
|
3: INPUT_TYPE_PEN,
|
|
4: INPUT_TYPE_MOUSE,
|
|
5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816
|
|
};
|
|
|
|
var POINTER_ELEMENT_EVENTS = 'pointerdown';
|
|
var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';
|
|
|
|
if (window.MSPointerEvent && !window.PointerEvent) {
|
|
POINTER_ELEMENT_EVENTS = 'MSPointerDown';
|
|
POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';
|
|
}
|
|
|
|
function PointerEventInput() {
|
|
this.evEl = POINTER_ELEMENT_EVENTS;
|
|
this.evWin = POINTER_WINDOW_EVENTS;
|
|
|
|
Input.apply(this, arguments);
|
|
|
|
this.store = (this.manager.session.pointerEvents = []);
|
|
}
|
|
|
|
inherit(PointerEventInput, Input, {
|
|
handler: function PEhandler(ev) {
|
|
var store = this.store;
|
|
var removePointer = false;
|
|
|
|
var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');
|
|
var eventType = POINTER_INPUT_MAP[eventTypeNormalized];
|
|
var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;
|
|
|
|
var isTouch = (pointerType == INPUT_TYPE_TOUCH);
|
|
|
|
var storeIndex = inArray(store, ev.pointerId, 'pointerId');
|
|
|
|
if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {
|
|
if (storeIndex < 0) {
|
|
store.push(ev);
|
|
storeIndex = store.length - 1;
|
|
}
|
|
} else if (eventType & (INPUT_END | INPUT_CANCEL)) {
|
|
removePointer = true;
|
|
}
|
|
|
|
if (storeIndex < 0) {
|
|
return;
|
|
}
|
|
|
|
store[storeIndex] = ev;
|
|
|
|
this.callback(this.manager, eventType, {
|
|
pointers: store,
|
|
changedPointers: [ev],
|
|
pointerType: pointerType,
|
|
srcEvent: ev
|
|
});
|
|
|
|
if (removePointer) {
|
|
store.splice(storeIndex, 1);
|
|
}
|
|
}
|
|
});
|
|
|
|
var SINGLE_TOUCH_INPUT_MAP = {
|
|
touchstart: INPUT_START,
|
|
touchmove: INPUT_MOVE,
|
|
touchend: INPUT_END,
|
|
touchcancel: INPUT_CANCEL
|
|
};
|
|
|
|
var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';
|
|
var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';
|
|
|
|
function SingleTouchInput() {
|
|
this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;
|
|
this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;
|
|
this.started = false;
|
|
|
|
Input.apply(this, arguments);
|
|
}
|
|
|
|
inherit(SingleTouchInput, Input, {
|
|
handler: function TEhandler(ev) {
|
|
var type = SINGLE_TOUCH_INPUT_MAP[ev.type];
|
|
|
|
if (type === INPUT_START) {
|
|
this.started = true;
|
|
}
|
|
|
|
if (!this.started) {
|
|
return;
|
|
}
|
|
|
|
var touches = normalizeSingleTouches.call(this, ev, type);
|
|
|
|
if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {
|
|
this.started = false;
|
|
}
|
|
|
|
this.callback(this.manager, type, {
|
|
pointers: touches[0],
|
|
changedPointers: touches[1],
|
|
pointerType: INPUT_TYPE_TOUCH,
|
|
srcEvent: ev
|
|
});
|
|
}
|
|
});
|
|
|
|
function normalizeSingleTouches(ev, type) {
|
|
var all = toArray(ev.touches);
|
|
var changed = toArray(ev.changedTouches);
|
|
|
|
if (type & (INPUT_END | INPUT_CANCEL)) {
|
|
all = uniqueArray(all.concat(changed), 'identifier', true);
|
|
}
|
|
|
|
return [all, changed];
|
|
}
|
|
|
|
var TOUCH_INPUT_MAP = {
|
|
touchstart: INPUT_START,
|
|
touchmove: INPUT_MOVE,
|
|
touchend: INPUT_END,
|
|
touchcancel: INPUT_CANCEL
|
|
};
|
|
|
|
var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';
|
|
|
|
function TouchInput() {
|
|
this.evTarget = TOUCH_TARGET_EVENTS;
|
|
this.targetIds = {};
|
|
|
|
Input.apply(this, arguments);
|
|
}
|
|
|
|
inherit(TouchInput, Input, {
|
|
handler: function MTEhandler(ev) {
|
|
var type = TOUCH_INPUT_MAP[ev.type];
|
|
var touches = getTouches.call(this, ev, type);
|
|
if (!touches) {
|
|
return;
|
|
}
|
|
|
|
this.callback(this.manager, type, {
|
|
pointers: touches[0],
|
|
changedPointers: touches[1],
|
|
pointerType: INPUT_TYPE_TOUCH,
|
|
srcEvent: ev
|
|
});
|
|
}
|
|
});
|
|
|
|
function getTouches(ev, type) {
|
|
var allTouches = toArray(ev.touches);
|
|
var targetIds = this.targetIds;
|
|
|
|
if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {
|
|
targetIds[allTouches[0].identifier] = true;
|
|
return [allTouches, allTouches];
|
|
}
|
|
|
|
var i,
|
|
targetTouches,
|
|
changedTouches = toArray(ev.changedTouches),
|
|
changedTargetTouches = [],
|
|
target = this.target;
|
|
|
|
targetTouches = allTouches.filter(function(touch) {
|
|
return hasParent(touch.target, target);
|
|
});
|
|
|
|
if (type === INPUT_START) {
|
|
i = 0;
|
|
while (i < targetTouches.length) {
|
|
targetIds[targetTouches[i].identifier] = true;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
i = 0;
|
|
while (i < changedTouches.length) {
|
|
if (targetIds[changedTouches[i].identifier]) {
|
|
changedTargetTouches.push(changedTouches[i]);
|
|
}
|
|
|
|
if (type & (INPUT_END | INPUT_CANCEL)) {
|
|
delete targetIds[changedTouches[i].identifier];
|
|
}
|
|
i++;
|
|
}
|
|
|
|
if (!changedTargetTouches.length) {
|
|
return;
|
|
}
|
|
|
|
return [
|
|
uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),
|
|
changedTargetTouches
|
|
];
|
|
}
|
|
|
|
|
|
var DEDUP_TIMEOUT = 2500;
|
|
var DEDUP_DISTANCE = 25;
|
|
|
|
function TouchMouseInput() {
|
|
Input.apply(this, arguments);
|
|
|
|
var handler = bindFn(this.handler, this);
|
|
this.touch = new TouchInput(this.manager, handler);
|
|
this.mouse = new MouseInput(this.manager, handler);
|
|
|
|
this.primaryTouch = null;
|
|
this.lastTouches = [];
|
|
}
|
|
|
|
inherit(TouchMouseInput, Input, {
|
|
handler: function TMEhandler(manager, inputEvent, inputData) {
|
|
var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),
|
|
isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);
|
|
|
|
if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {
|
|
return;
|
|
}
|
|
|
|
if (isTouch) {
|
|
recordTouches.call(this, inputEvent, inputData);
|
|
} else if (isMouse && isSyntheticEvent.call(this, inputData)) {
|
|
return;
|
|
}
|
|
|
|
this.callback(manager, inputEvent, inputData);
|
|
},
|
|
|
|
destroy: function destroy() {
|
|
this.touch.destroy();
|
|
this.mouse.destroy();
|
|
}
|
|
});
|
|
|
|
function recordTouches(eventType, eventData) {
|
|
if (eventType & INPUT_START) {
|
|
this.primaryTouch = eventData.changedPointers[0].identifier;
|
|
setLastTouch.call(this, eventData);
|
|
} else if (eventType & (INPUT_END | INPUT_CANCEL)) {
|
|
setLastTouch.call(this, eventData);
|
|
}
|
|
}
|
|
|
|
function setLastTouch(eventData) {
|
|
var touch = eventData.changedPointers[0];
|
|
|
|
if (touch.identifier === this.primaryTouch) {
|
|
var lastTouch = {x: touch.clientX, y: touch.clientY};
|
|
this.lastTouches.push(lastTouch);
|
|
var lts = this.lastTouches;
|
|
var removeLastTouch = function() {
|
|
var i = lts.indexOf(lastTouch);
|
|
if (i > -1) {
|
|
lts.splice(i, 1);
|
|
}
|
|
};
|
|
setTimeout(removeLastTouch, DEDUP_TIMEOUT);
|
|
}
|
|
}
|
|
|
|
function isSyntheticEvent(eventData) {
|
|
var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;
|
|
for (var i = 0; i < this.lastTouches.length; i++) {
|
|
var t = this.lastTouches[i];
|
|
var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);
|
|
if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');
|
|
var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;
|
|
|
|
var TOUCH_ACTION_COMPUTE = 'compute';
|
|
var TOUCH_ACTION_AUTO = 'auto';
|
|
var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented
|
|
var TOUCH_ACTION_NONE = 'none';
|
|
var TOUCH_ACTION_PAN_X = 'pan-x';
|
|
var TOUCH_ACTION_PAN_Y = 'pan-y';
|
|
var TOUCH_ACTION_MAP = getTouchActionProps();
|
|
|
|
function TouchAction(manager, value) {
|
|
this.manager = manager;
|
|
this.set(value);
|
|
}
|
|
|
|
TouchAction.prototype = {
|
|
set: function(value) {
|
|
if (value == TOUCH_ACTION_COMPUTE) {
|
|
value = this.compute();
|
|
}
|
|
|
|
if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {
|
|
this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;
|
|
}
|
|
this.actions = value.toLowerCase().trim();
|
|
},
|
|
|
|
update: function() {
|
|
this.set(this.manager.options.touchAction);
|
|
},
|
|
|
|
compute: function() {
|
|
var actions = [];
|
|
each(this.manager.recognizers, function(recognizer) {
|
|
if (boolOrFn(recognizer.options.enable, [recognizer])) {
|
|
actions = actions.concat(recognizer.getTouchAction());
|
|
}
|
|
});
|
|
return cleanTouchActions(actions.join(' '));
|
|
},
|
|
|
|
preventDefaults: function(input) {
|
|
var srcEvent = input.srcEvent;
|
|
var direction = input.offsetDirection;
|
|
|
|
if (this.manager.session.prevented) {
|
|
srcEvent.preventDefault();
|
|
return;
|
|
}
|
|
|
|
var actions = this.actions;
|
|
var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];
|
|
var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];
|
|
var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];
|
|
|
|
if (hasNone) {
|
|
|
|
var isTapPointer = input.pointers.length === 1;
|
|
var isTapMovement = input.distance < 2;
|
|
var isTapTouchTime = input.deltaTime < 250;
|
|
|
|
if (isTapPointer && isTapMovement && isTapTouchTime) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (hasPanX && hasPanY) {
|
|
return;
|
|
}
|
|
|
|
if (hasNone ||
|
|
(hasPanY && direction & DIRECTION_HORIZONTAL) ||
|
|
(hasPanX && direction & DIRECTION_VERTICAL)) {
|
|
return this.preventSrc(srcEvent);
|
|
}
|
|
},
|
|
|
|
preventSrc: function(srcEvent) {
|
|
this.manager.session.prevented = true;
|
|
srcEvent.preventDefault();
|
|
}
|
|
};
|
|
|
|
function cleanTouchActions(actions) {
|
|
if (inStr(actions, TOUCH_ACTION_NONE)) {
|
|
return TOUCH_ACTION_NONE;
|
|
}
|
|
|
|
var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);
|
|
var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);
|
|
|
|
if (hasPanX && hasPanY) {
|
|
return TOUCH_ACTION_NONE;
|
|
}
|
|
|
|
if (hasPanX || hasPanY) {
|
|
return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;
|
|
}
|
|
|
|
if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {
|
|
return TOUCH_ACTION_MANIPULATION;
|
|
}
|
|
|
|
return TOUCH_ACTION_AUTO;
|
|
}
|
|
|
|
function getTouchActionProps() {
|
|
if (!NATIVE_TOUCH_ACTION) {
|
|
return false;
|
|
}
|
|
var touchMap = {};
|
|
var cssSupports = window.CSS && window.CSS.supports;
|
|
['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {
|
|
|
|
touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;
|
|
});
|
|
return touchMap;
|
|
}
|
|
|
|
var STATE_POSSIBLE = 1;
|
|
var STATE_BEGAN = 2;
|
|
var STATE_CHANGED = 4;
|
|
var STATE_ENDED = 8;
|
|
var STATE_RECOGNIZED = STATE_ENDED;
|
|
var STATE_CANCELLED = 16;
|
|
var STATE_FAILED = 32;
|
|
|
|
function Recognizer(options) {
|
|
this.options = assign({}, this.defaults, options || {});
|
|
|
|
this.id = uniqueId();
|
|
|
|
this.manager = null;
|
|
|
|
this.options.enable = ifUndefined(this.options.enable, true);
|
|
|
|
this.state = STATE_POSSIBLE;
|
|
|
|
this.simultaneous = {};
|
|
this.requireFail = [];
|
|
}
|
|
|
|
Recognizer.prototype = {
|
|
defaults: {},
|
|
|
|
set: function(options) {
|
|
assign(this.options, options);
|
|
|
|
this.manager && this.manager.touchAction.update();
|
|
return this;
|
|
},
|
|
|
|
recognizeWith: function(otherRecognizer) {
|
|
if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {
|
|
return this;
|
|
}
|
|
|
|
var simultaneous = this.simultaneous;
|
|
otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
|
|
if (!simultaneous[otherRecognizer.id]) {
|
|
simultaneous[otherRecognizer.id] = otherRecognizer;
|
|
otherRecognizer.recognizeWith(this);
|
|
}
|
|
return this;
|
|
},
|
|
|
|
dropRecognizeWith: function(otherRecognizer) {
|
|
if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {
|
|
return this;
|
|
}
|
|
|
|
otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
|
|
delete this.simultaneous[otherRecognizer.id];
|
|
return this;
|
|
},
|
|
|
|
requireFailure: function(otherRecognizer) {
|
|
if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {
|
|
return this;
|
|
}
|
|
|
|
var requireFail = this.requireFail;
|
|
otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
|
|
if (inArray(requireFail, otherRecognizer) === -1) {
|
|
requireFail.push(otherRecognizer);
|
|
otherRecognizer.requireFailure(this);
|
|
}
|
|
return this;
|
|
},
|
|
|
|
dropRequireFailure: function(otherRecognizer) {
|
|
if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {
|
|
return this;
|
|
}
|
|
|
|
otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
|
|
var index = inArray(this.requireFail, otherRecognizer);
|
|
if (index > -1) {
|
|
this.requireFail.splice(index, 1);
|
|
}
|
|
return this;
|
|
},
|
|
|
|
hasRequireFailures: function() {
|
|
return this.requireFail.length > 0;
|
|
},
|
|
|
|
canRecognizeWith: function(otherRecognizer) {
|
|
return !!this.simultaneous[otherRecognizer.id];
|
|
},
|
|
|
|
emit: function(input) {
|
|
var self = this;
|
|
var state = this.state;
|
|
|
|
function emit(event) {
|
|
self.manager.emit(event, input);
|
|
}
|
|
|
|
if (state < STATE_ENDED) {
|
|
emit(self.options.event + stateStr(state));
|
|
}
|
|
|
|
emit(self.options.event); // simple 'eventName' events
|
|
|
|
if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)
|
|
emit(input.additionalEvent);
|
|
}
|
|
|
|
if (state >= STATE_ENDED) {
|
|
emit(self.options.event + stateStr(state));
|
|
}
|
|
},
|
|
|
|
tryEmit: function(input) {
|
|
if (this.canEmit()) {
|
|
return this.emit(input);
|
|
}
|
|
this.state = STATE_FAILED;
|
|
},
|
|
|
|
canEmit: function() {
|
|
var i = 0;
|
|
while (i < this.requireFail.length) {
|
|
if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {
|
|
return false;
|
|
}
|
|
i++;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
recognize: function(inputData) {
|
|
var inputDataClone = assign({}, inputData);
|
|
|
|
if (!boolOrFn(this.options.enable, [this, inputDataClone])) {
|
|
this.reset();
|
|
this.state = STATE_FAILED;
|
|
return;
|
|
}
|
|
|
|
if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {
|
|
this.state = STATE_POSSIBLE;
|
|
}
|
|
|
|
this.state = this.process(inputDataClone);
|
|
|
|
if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {
|
|
this.tryEmit(inputDataClone);
|
|
}
|
|
},
|
|
|
|
process: function(inputData) { }, // jshint ignore:line
|
|
|
|
getTouchAction: function() { },
|
|
|
|
reset: function() { }
|
|
};
|
|
|
|
function stateStr(state) {
|
|
if (state & STATE_CANCELLED) {
|
|
return 'cancel';
|
|
} else if (state & STATE_ENDED) {
|
|
return 'end';
|
|
} else if (state & STATE_CHANGED) {
|
|
return 'move';
|
|
} else if (state & STATE_BEGAN) {
|
|
return 'start';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function directionStr(direction) {
|
|
if (direction == DIRECTION_DOWN) {
|
|
return 'down';
|
|
} else if (direction == DIRECTION_UP) {
|
|
return 'up';
|
|
} else if (direction == DIRECTION_LEFT) {
|
|
return 'left';
|
|
} else if (direction == DIRECTION_RIGHT) {
|
|
return 'right';
|
|
}
|
|
return '';
|
|
}
|
|
|
|
function getRecognizerByNameIfManager(otherRecognizer, recognizer) {
|
|
var manager = recognizer.manager;
|
|
if (manager) {
|
|
return manager.get(otherRecognizer);
|
|
}
|
|
return otherRecognizer;
|
|
}
|
|
|
|
function AttrRecognizer() {
|
|
Recognizer.apply(this, arguments);
|
|
}
|
|
|
|
inherit(AttrRecognizer, Recognizer, {
|
|
defaults: {
|
|
pointers: 1
|
|
},
|
|
|
|
attrTest: function(input) {
|
|
var optionPointers = this.options.pointers;
|
|
return optionPointers === 0 || input.pointers.length === optionPointers;
|
|
},
|
|
|
|
process: function(input) {
|
|
var state = this.state;
|
|
var eventType = input.eventType;
|
|
|
|
var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);
|
|
var isValid = this.attrTest(input);
|
|
|
|
if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {
|
|
return state | STATE_CANCELLED;
|
|
} else if (isRecognized || isValid) {
|
|
if (eventType & INPUT_END) {
|
|
return state | STATE_ENDED;
|
|
} else if (!(state & STATE_BEGAN)) {
|
|
return STATE_BEGAN;
|
|
}
|
|
return state | STATE_CHANGED;
|
|
}
|
|
return STATE_FAILED;
|
|
}
|
|
});
|
|
|
|
function PanRecognizer() {
|
|
AttrRecognizer.apply(this, arguments);
|
|
|
|
this.pX = null;
|
|
this.pY = null;
|
|
}
|
|
|
|
inherit(PanRecognizer, AttrRecognizer, {
|
|
defaults: {
|
|
event: 'pan',
|
|
threshold: 10,
|
|
pointers: 1,
|
|
direction: DIRECTION_ALL
|
|
},
|
|
|
|
getTouchAction: function() {
|
|
var direction = this.options.direction;
|
|
var actions = [];
|
|
if (direction & DIRECTION_HORIZONTAL) {
|
|
actions.push(TOUCH_ACTION_PAN_Y);
|
|
}
|
|
if (direction & DIRECTION_VERTICAL) {
|
|
actions.push(TOUCH_ACTION_PAN_X);
|
|
}
|
|
return actions;
|
|
},
|
|
|
|
directionTest: function(input) {
|
|
var options = this.options;
|
|
var hasMoved = true;
|
|
var distance = input.distance;
|
|
var direction = input.direction;
|
|
var x = input.deltaX;
|
|
var y = input.deltaY;
|
|
|
|
if (!(direction & options.direction)) {
|
|
if (options.direction & DIRECTION_HORIZONTAL) {
|
|
direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;
|
|
hasMoved = x != this.pX;
|
|
distance = Math.abs(input.deltaX);
|
|
} else {
|
|
direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;
|
|
hasMoved = y != this.pY;
|
|
distance = Math.abs(input.deltaY);
|
|
}
|
|
}
|
|
input.direction = direction;
|
|
return hasMoved && distance > options.threshold && direction & options.direction;
|
|
},
|
|
|
|
attrTest: function(input) {
|
|
return AttrRecognizer.prototype.attrTest.call(this, input) &&
|
|
(this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));
|
|
},
|
|
|
|
emit: function(input) {
|
|
|
|
this.pX = input.deltaX;
|
|
this.pY = input.deltaY;
|
|
|
|
var direction = directionStr(input.direction);
|
|
|
|
if (direction) {
|
|
input.additionalEvent = this.options.event + direction;
|
|
}
|
|
this._super.emit.call(this, input);
|
|
}
|
|
});
|
|
|
|
function PinchRecognizer() {
|
|
AttrRecognizer.apply(this, arguments);
|
|
}
|
|
|
|
inherit(PinchRecognizer, AttrRecognizer, {
|
|
defaults: {
|
|
event: 'pinch',
|
|
threshold: 0,
|
|
pointers: 2
|
|
},
|
|
|
|
getTouchAction: function() {
|
|
return [TOUCH_ACTION_NONE];
|
|
},
|
|
|
|
attrTest: function(input) {
|
|
return this._super.attrTest.call(this, input) &&
|
|
(Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);
|
|
},
|
|
|
|
emit: function(input) {
|
|
if (input.scale !== 1) {
|
|
var inOut = input.scale < 1 ? 'in' : 'out';
|
|
input.additionalEvent = this.options.event + inOut;
|
|
}
|
|
this._super.emit.call(this, input);
|
|
}
|
|
});
|
|
|
|
function PressRecognizer() {
|
|
Recognizer.apply(this, arguments);
|
|
|
|
this._timer = null;
|
|
this._input = null;
|
|
}
|
|
|
|
inherit(PressRecognizer, Recognizer, {
|
|
defaults: {
|
|
event: 'press',
|
|
pointers: 1,
|
|
time: 251, // minimal time of the pointer to be pressed
|
|
threshold: 9 // a minimal movement is ok, but keep it low
|
|
},
|
|
|
|
getTouchAction: function() {
|
|
return [TOUCH_ACTION_AUTO];
|
|
},
|
|
|
|
process: function(input) {
|
|
var options = this.options;
|
|
var validPointers = input.pointers.length === options.pointers;
|
|
var validMovement = input.distance < options.threshold;
|
|
var validTime = input.deltaTime > options.time;
|
|
|
|
this._input = input;
|
|
|
|
if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {
|
|
this.reset();
|
|
} else if (input.eventType & INPUT_START) {
|
|
this.reset();
|
|
this._timer = setTimeoutContext(function() {
|
|
this.state = STATE_RECOGNIZED;
|
|
this.tryEmit();
|
|
}, options.time, this);
|
|
} else if (input.eventType & INPUT_END) {
|
|
return STATE_RECOGNIZED;
|
|
}
|
|
return STATE_FAILED;
|
|
},
|
|
|
|
reset: function() {
|
|
clearTimeout(this._timer);
|
|
},
|
|
|
|
emit: function(input) {
|
|
if (this.state !== STATE_RECOGNIZED) {
|
|
return;
|
|
}
|
|
|
|
if (input && (input.eventType & INPUT_END)) {
|
|
this.manager.emit(this.options.event + 'up', input);
|
|
} else {
|
|
this._input.timeStamp = now();
|
|
this.manager.emit(this.options.event, this._input);
|
|
}
|
|
}
|
|
});
|
|
|
|
function RotateRecognizer() {
|
|
AttrRecognizer.apply(this, arguments);
|
|
}
|
|
|
|
inherit(RotateRecognizer, AttrRecognizer, {
|
|
defaults: {
|
|
event: 'rotate',
|
|
threshold: 0,
|
|
pointers: 2
|
|
},
|
|
|
|
getTouchAction: function() {
|
|
return [TOUCH_ACTION_NONE];
|
|
},
|
|
|
|
attrTest: function(input) {
|
|
return this._super.attrTest.call(this, input) &&
|
|
(Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);
|
|
}
|
|
});
|
|
|
|
function SwipeRecognizer() {
|
|
AttrRecognizer.apply(this, arguments);
|
|
}
|
|
|
|
inherit(SwipeRecognizer, AttrRecognizer, {
|
|
defaults: {
|
|
event: 'swipe',
|
|
threshold: 10,
|
|
velocity: 0.3,
|
|
direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,
|
|
pointers: 1
|
|
},
|
|
|
|
getTouchAction: function() {
|
|
return PanRecognizer.prototype.getTouchAction.call(this);
|
|
},
|
|
|
|
attrTest: function(input) {
|
|
var direction = this.options.direction;
|
|
var velocity;
|
|
|
|
if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {
|
|
velocity = input.overallVelocity;
|
|
} else if (direction & DIRECTION_HORIZONTAL) {
|
|
velocity = input.overallVelocityX;
|
|
} else if (direction & DIRECTION_VERTICAL) {
|
|
velocity = input.overallVelocityY;
|
|
}
|
|
|
|
return this._super.attrTest.call(this, input) &&
|
|
direction & input.offsetDirection &&
|
|
input.distance > this.options.threshold &&
|
|
input.maxPointers == this.options.pointers &&
|
|
abs(velocity) > this.options.velocity && input.eventType & INPUT_END;
|
|
},
|
|
|
|
emit: function(input) {
|
|
var direction = directionStr(input.offsetDirection);
|
|
if (direction) {
|
|
this.manager.emit(this.options.event + direction, input);
|
|
}
|
|
|
|
this.manager.emit(this.options.event, input);
|
|
}
|
|
});
|
|
|
|
function TapRecognizer() {
|
|
Recognizer.apply(this, arguments);
|
|
|
|
this.pTime = false;
|
|
this.pCenter = false;
|
|
|
|
this._timer = null;
|
|
this._input = null;
|
|
this.count = 0;
|
|
}
|
|
|
|
inherit(TapRecognizer, Recognizer, {
|
|
defaults: {
|
|
event: 'tap',
|
|
pointers: 1,
|
|
taps: 1,
|
|
interval: 300, // max time between the multi-tap taps
|
|
time: 250, // max time of the pointer to be down (like finger on the screen)
|
|
threshold: 9, // a minimal movement is ok, but keep it low
|
|
posThreshold: 10 // a multi-tap can be a bit off the initial position
|
|
},
|
|
|
|
getTouchAction: function() {
|
|
return [TOUCH_ACTION_MANIPULATION];
|
|
},
|
|
|
|
process: function(input) {
|
|
var options = this.options;
|
|
|
|
var validPointers = input.pointers.length === options.pointers;
|
|
var validMovement = input.distance < options.threshold;
|
|
var validTouchTime = input.deltaTime < options.time;
|
|
|
|
this.reset();
|
|
|
|
if ((input.eventType & INPUT_START) && (this.count === 0)) {
|
|
return this.failTimeout();
|
|
}
|
|
|
|
if (validMovement && validTouchTime && validPointers) {
|
|
if (input.eventType != INPUT_END) {
|
|
return this.failTimeout();
|
|
}
|
|
|
|
var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;
|
|
var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;
|
|
|
|
this.pTime = input.timeStamp;
|
|
this.pCenter = input.center;
|
|
|
|
if (!validMultiTap || !validInterval) {
|
|
this.count = 1;
|
|
} else {
|
|
this.count += 1;
|
|
}
|
|
|
|
this._input = input;
|
|
|
|
var tapCount = this.count % options.taps;
|
|
if (tapCount === 0) {
|
|
if (!this.hasRequireFailures()) {
|
|
return STATE_RECOGNIZED;
|
|
} else {
|
|
this._timer = setTimeoutContext(function() {
|
|
this.state = STATE_RECOGNIZED;
|
|
this.tryEmit();
|
|
}, options.interval, this);
|
|
return STATE_BEGAN;
|
|
}
|
|
}
|
|
}
|
|
return STATE_FAILED;
|
|
},
|
|
|
|
failTimeout: function() {
|
|
this._timer = setTimeoutContext(function() {
|
|
this.state = STATE_FAILED;
|
|
}, this.options.interval, this);
|
|
return STATE_FAILED;
|
|
},
|
|
|
|
reset: function() {
|
|
clearTimeout(this._timer);
|
|
},
|
|
|
|
emit: function() {
|
|
if (this.state == STATE_RECOGNIZED) {
|
|
this._input.tapCount = this.count;
|
|
this.manager.emit(this.options.event, this._input);
|
|
}
|
|
}
|
|
});
|
|
|
|
function Hammer(element, options) {
|
|
options = options || {};
|
|
options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);
|
|
return new Manager(element, options);
|
|
}
|
|
|
|
Hammer.VERSION = '2.0.7';
|
|
|
|
Hammer.defaults = {
|
|
domEvents: false,
|
|
|
|
touchAction: TOUCH_ACTION_COMPUTE,
|
|
|
|
enable: true,
|
|
|
|
inputTarget: null,
|
|
|
|
inputClass: null,
|
|
|
|
preset: [
|
|
[RotateRecognizer, {enable: false}],
|
|
[PinchRecognizer, {enable: false}, ['rotate']],
|
|
[SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],
|
|
[PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],
|
|
[TapRecognizer],
|
|
[TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],
|
|
[PressRecognizer]
|
|
],
|
|
|
|
cssProps: {
|
|
userSelect: 'none',
|
|
|
|
touchSelect: 'none',
|
|
|
|
touchCallout: 'none',
|
|
|
|
contentZooming: 'none',
|
|
|
|
userDrag: 'none',
|
|
|
|
tapHighlightColor: 'rgba(0,0,0,0)'
|
|
}
|
|
};
|
|
|
|
var STOP = 1;
|
|
var FORCED_STOP = 2;
|
|
|
|
function Manager(element, options) {
|
|
this.options = assign({}, Hammer.defaults, options || {});
|
|
|
|
this.options.inputTarget = this.options.inputTarget || element;
|
|
|
|
this.handlers = {};
|
|
this.session = {};
|
|
this.recognizers = [];
|
|
this.oldCssProps = {};
|
|
|
|
this.element = element;
|
|
this.input = createInputInstance(this);
|
|
this.touchAction = new TouchAction(this, this.options.touchAction);
|
|
|
|
toggleCssProps(this, true);
|
|
|
|
each(this.options.recognizers, function(item) {
|
|
var recognizer = this.add(new (item[0])(item[1]));
|
|
item[2] && recognizer.recognizeWith(item[2]);
|
|
item[3] && recognizer.requireFailure(item[3]);
|
|
}, this);
|
|
}
|
|
|
|
Manager.prototype = {
|
|
set: function(options) {
|
|
assign(this.options, options);
|
|
|
|
if (options.touchAction) {
|
|
this.touchAction.update();
|
|
}
|
|
if (options.inputTarget) {
|
|
this.input.destroy();
|
|
this.input.target = options.inputTarget;
|
|
this.input.init();
|
|
}
|
|
return this;
|
|
},
|
|
|
|
stop: function(force) {
|
|
this.session.stopped = force ? FORCED_STOP : STOP;
|
|
},
|
|
|
|
recognize: function(inputData) {
|
|
var session = this.session;
|
|
if (session.stopped) {
|
|
return;
|
|
}
|
|
|
|
this.touchAction.preventDefaults(inputData);
|
|
|
|
var recognizer;
|
|
var recognizers = this.recognizers;
|
|
|
|
var curRecognizer = session.curRecognizer;
|
|
|
|
if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {
|
|
curRecognizer = session.curRecognizer = null;
|
|
}
|
|
|
|
var i = 0;
|
|
while (i < recognizers.length) {
|
|
recognizer = recognizers[i];
|
|
|
|
if (session.stopped !== FORCED_STOP && ( // 1
|
|
!curRecognizer || recognizer == curRecognizer || // 2
|
|
recognizer.canRecognizeWith(curRecognizer))) { // 3
|
|
recognizer.recognize(inputData);
|
|
} else {
|
|
recognizer.reset();
|
|
}
|
|
|
|
if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {
|
|
curRecognizer = session.curRecognizer = recognizer;
|
|
}
|
|
i++;
|
|
}
|
|
},
|
|
|
|
get: function(recognizer) {
|
|
if (recognizer instanceof Recognizer) {
|
|
return recognizer;
|
|
}
|
|
|
|
var recognizers = this.recognizers;
|
|
for (var i = 0; i < recognizers.length; i++) {
|
|
if (recognizers[i].options.event == recognizer) {
|
|
return recognizers[i];
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
|
|
add: function(recognizer) {
|
|
if (invokeArrayArg(recognizer, 'add', this)) {
|
|
return this;
|
|
}
|
|
|
|
var existing = this.get(recognizer.options.event);
|
|
if (existing) {
|
|
this.remove(existing);
|
|
}
|
|
|
|
this.recognizers.push(recognizer);
|
|
recognizer.manager = this;
|
|
|
|
this.touchAction.update();
|
|
return recognizer;
|
|
},
|
|
|
|
remove: function(recognizer) {
|
|
if (invokeArrayArg(recognizer, 'remove', this)) {
|
|
return this;
|
|
}
|
|
|
|
recognizer = this.get(recognizer);
|
|
|
|
if (recognizer) {
|
|
var recognizers = this.recognizers;
|
|
var index = inArray(recognizers, recognizer);
|
|
|
|
if (index !== -1) {
|
|
recognizers.splice(index, 1);
|
|
this.touchAction.update();
|
|
}
|
|
}
|
|
|
|
return this;
|
|
},
|
|
|
|
on: function(events, handler) {
|
|
if (events === undefined) {
|
|
return;
|
|
}
|
|
if (handler === undefined) {
|
|
return;
|
|
}
|
|
|
|
var handlers = this.handlers;
|
|
each(splitStr(events), function(event) {
|
|
handlers[event] = handlers[event] || [];
|
|
handlers[event].push(handler);
|
|
});
|
|
return this;
|
|
},
|
|
|
|
off: function(events, handler) {
|
|
if (events === undefined) {
|
|
return;
|
|
}
|
|
|
|
var handlers = this.handlers;
|
|
each(splitStr(events), function(event) {
|
|
if (!handler) {
|
|
delete handlers[event];
|
|
} else {
|
|
handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);
|
|
}
|
|
});
|
|
return this;
|
|
},
|
|
|
|
emit: function(event, data) {
|
|
if (this.options.domEvents) {
|
|
triggerDomEvent(event, data);
|
|
}
|
|
|
|
var handlers = this.handlers[event] && this.handlers[event].slice();
|
|
if (!handlers || !handlers.length) {
|
|
return;
|
|
}
|
|
|
|
data.type = event;
|
|
data.preventDefault = function() {
|
|
data.srcEvent.preventDefault();
|
|
};
|
|
|
|
var i = 0;
|
|
while (i < handlers.length) {
|
|
handlers[i](data);
|
|
i++;
|
|
}
|
|
},
|
|
|
|
destroy: function() {
|
|
this.element && toggleCssProps(this, false);
|
|
|
|
this.handlers = {};
|
|
this.session = {};
|
|
this.input.destroy();
|
|
this.element = null;
|
|
}
|
|
};
|
|
|
|
function toggleCssProps(manager, add) {
|
|
var element = manager.element;
|
|
if (!element.style) {
|
|
return;
|
|
}
|
|
var prop;
|
|
each(manager.options.cssProps, function(value, name) {
|
|
prop = prefixed(element.style, name);
|
|
if (add) {
|
|
manager.oldCssProps[prop] = element.style[prop];
|
|
element.style[prop] = value;
|
|
} else {
|
|
element.style[prop] = manager.oldCssProps[prop] || '';
|
|
}
|
|
});
|
|
if (!add) {
|
|
manager.oldCssProps = {};
|
|
}
|
|
}
|
|
|
|
function triggerDomEvent(event, data) {
|
|
var gestureEvent = document.createEvent('Event');
|
|
gestureEvent.initEvent(event, true, true);
|
|
gestureEvent.gesture = data;
|
|
data.target.dispatchEvent(gestureEvent);
|
|
}
|
|
|
|
assign(Hammer, {
|
|
INPUT_START: INPUT_START,
|
|
INPUT_MOVE: INPUT_MOVE,
|
|
INPUT_END: INPUT_END,
|
|
INPUT_CANCEL: INPUT_CANCEL,
|
|
|
|
STATE_POSSIBLE: STATE_POSSIBLE,
|
|
STATE_BEGAN: STATE_BEGAN,
|
|
STATE_CHANGED: STATE_CHANGED,
|
|
STATE_ENDED: STATE_ENDED,
|
|
STATE_RECOGNIZED: STATE_RECOGNIZED,
|
|
STATE_CANCELLED: STATE_CANCELLED,
|
|
STATE_FAILED: STATE_FAILED,
|
|
|
|
DIRECTION_NONE: DIRECTION_NONE,
|
|
DIRECTION_LEFT: DIRECTION_LEFT,
|
|
DIRECTION_RIGHT: DIRECTION_RIGHT,
|
|
DIRECTION_UP: DIRECTION_UP,
|
|
DIRECTION_DOWN: DIRECTION_DOWN,
|
|
DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,
|
|
DIRECTION_VERTICAL: DIRECTION_VERTICAL,
|
|
DIRECTION_ALL: DIRECTION_ALL,
|
|
|
|
Manager: Manager,
|
|
Input: Input,
|
|
TouchAction: TouchAction,
|
|
|
|
TouchInput: TouchInput,
|
|
MouseInput: MouseInput,
|
|
PointerEventInput: PointerEventInput,
|
|
TouchMouseInput: TouchMouseInput,
|
|
SingleTouchInput: SingleTouchInput,
|
|
|
|
Recognizer: Recognizer,
|
|
AttrRecognizer: AttrRecognizer,
|
|
Tap: TapRecognizer,
|
|
Pan: PanRecognizer,
|
|
Swipe: SwipeRecognizer,
|
|
Pinch: PinchRecognizer,
|
|
Rotate: RotateRecognizer,
|
|
Press: PressRecognizer,
|
|
|
|
on: addEventListeners,
|
|
off: removeEventListeners,
|
|
each: each,
|
|
merge: merge,
|
|
extend: extend,
|
|
assign: assign,
|
|
inherit: inherit,
|
|
bindFn: bindFn,
|
|
prefixed: prefixed
|
|
});
|
|
|
|
var freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line
|
|
freeGlobal.Hammer = Hammer;
|
|
|
|
if (typeof define === 'function' && define.amd) {
|
|
define(function() {
|
|
return Hammer;
|
|
});
|
|
} else if (typeof module != 'undefined' && module.exports) {
|
|
module.exports = Hammer;
|
|
} else {
|
|
window[exportName] = Hammer;
|
|
}
|
|
|
|
})(window, document, 'Hammer');
|
|
|
|
/*****
|
|
* @licstart
|
|
*
|
|
* The following is the license notice for the part of JavaScript code of this
|
|
* page included between the '@jessyinkstart' and the '@jessyinkend' notes.
|
|
*/
|
|
|
|
/***** ******************************************************************
|
|
*
|
|
* Copyright 2008-2013 Hannes Hochreiner
|
|
*
|
|
* The JavaScript code included between the start note '@jessyinkstart'
|
|
* and the end note '@jessyinkend' is subject to the terms of the Mozilla
|
|
* Public License, v. 2.0. If a copy of the MPL was not distributed with
|
|
* this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* Alternatively, you can redistribute and/or that part of this file
|
|
* under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see http://www.gnu.org/licenses/.
|
|
*/
|
|
|
|
/*****
|
|
* You can find the complete source code of the JessyInk project at:
|
|
* @source http://code.google.com/p/jessyink/
|
|
*/
|
|
|
|
/*****
|
|
* @licend
|
|
*
|
|
* The above is the license notice for the part of JavaScript code of this
|
|
* page included between the '@jessyinkstart' and the '@jessyinkend' notes.
|
|
*/
|
|
|
|
|
|
/*****
|
|
* @jessyinkstart
|
|
*
|
|
* The following code is a derivative work of some parts of the JessyInk
|
|
* project.
|
|
* @source http://code.google.com/p/jessyink/
|
|
*/
|
|
|
|
function getElementsByProperty( node, name )
|
|
{
|
|
var elements = [];
|
|
|
|
if( node.getAttribute( name ) )
|
|
elements.push( node );
|
|
|
|
for( var counter = 0; counter < node.childNodes.length; ++counter )
|
|
{
|
|
if( node.childNodes[counter].nodeType == 1 )
|
|
{
|
|
var subElements = getElementsByProperty( node.childNodes[counter], name );
|
|
elements = elements.concat( subElements );
|
|
}
|
|
}
|
|
return elements;
|
|
}
|
|
|
|
var rootNodeInitialBackgroundColor = undefined;
|
|
|
|
function changeRootNodeBackgroundTo(color) {
|
|
if (rootNodeInitialBackgroundColor === undefined)
|
|
rootNodeInitialBackgroundColor = ROOT_NODE.style.backgroundColor;
|
|
|
|
if (color === 'initial')
|
|
ROOT_NODE.style.backgroundColor = rootNodeInitialBackgroundColor;
|
|
else
|
|
ROOT_NODE.style.backgroundColor = color;
|
|
}
|
|
|
|
var isContentHidden = false;
|
|
var contentInitialVisibilityValues = null;
|
|
|
|
function getInitialVisibilityValues() {
|
|
var list = ROOT_NODE.querySelectorAll('g');
|
|
contentInitialVisibilityValues = [];
|
|
for (var i = 0; i < list.length; i++) {
|
|
var temp = {};
|
|
temp.object = list[i];
|
|
temp.visibility = list[i].style.visibility;
|
|
contentInitialVisibilityValues.push(temp);
|
|
}
|
|
}
|
|
|
|
function hideShowContent(color) {
|
|
if (contentInitialVisibilityValues === null)
|
|
getInitialVisibilityValues();
|
|
|
|
if (isContentHidden) {
|
|
for (var i = 0; i < contentInitialVisibilityValues.length; i++)
|
|
contentInitialVisibilityValues[i].object.style.visibility = contentInitialVisibilityValues[i].visibility;
|
|
|
|
changeRootNodeBackgroundTo('initial');
|
|
isContentHidden = false;
|
|
}
|
|
else {
|
|
for (var i = 0; i < contentInitialVisibilityValues.length; i++)
|
|
contentInitialVisibilityValues[i].object.style.visibility = 'hidden';
|
|
|
|
changeRootNodeBackgroundTo(color);
|
|
isContentHidden = true;
|
|
}
|
|
}
|
|
|
|
function onKeyDown( aEvt )
|
|
{
|
|
if ( !aEvt )
|
|
aEvt = window.event;
|
|
|
|
var code = aEvt.keyCode || aEvt.charCode || aEvt.code;
|
|
|
|
|
|
if (code == 0 && aEvt.key != undefined) {
|
|
switch (aEvt.key) {
|
|
case 'UIKeyInputLeftArrow':
|
|
code = LEFT_KEY;
|
|
break;
|
|
case 'UIKeyInputUpArrow':
|
|
code = UP_KEY;
|
|
break;
|
|
case 'UIKeyInputRightArrow':
|
|
code = RIGHT_KEY;
|
|
break;
|
|
case 'UIKeyInputDownArrow':
|
|
code = DOWN_KEY;
|
|
break;
|
|
}
|
|
|
|
}
|
|
else if (code === P_KEY) {
|
|
aEvt.preventDefault();
|
|
if (ROOT_NODE.style.cursor === 'pointer')
|
|
ROOT_NODE.style.cursor = 'default';
|
|
else
|
|
ROOT_NODE.style.cursor = 'pointer';
|
|
}
|
|
else if (code === W_KEY) {
|
|
hideShowContent('white');
|
|
}
|
|
else if (code === B_KEY) {
|
|
hideShowContent('black');
|
|
}
|
|
|
|
|
|
if( !processingEffect && keyCodeDictionary[currentMode] && keyCodeDictionary[currentMode][code] )
|
|
{
|
|
return keyCodeDictionary[currentMode][code]();
|
|
}
|
|
else
|
|
{
|
|
document.onkeypress = onKeyPress;
|
|
return null;
|
|
}
|
|
}
|
|
document.onkeydown = onKeyDown;
|
|
|
|
function onKeyPress( aEvt )
|
|
{
|
|
document.onkeypress = null;
|
|
|
|
if ( !aEvt )
|
|
aEvt = window.event;
|
|
|
|
var str = String.fromCharCode( aEvt.keyCode || aEvt.charCode );
|
|
|
|
if ( !processingEffect && charCodeDictionary[currentMode] && charCodeDictionary[currentMode][str] )
|
|
return charCodeDictionary[currentMode][str]();
|
|
|
|
return null;
|
|
}
|
|
|
|
function getDefaultKeyCodeDictionary()
|
|
{
|
|
var keyCodeDict = {};
|
|
|
|
keyCodeDict[SLIDE_MODE] = {};
|
|
keyCodeDict[INDEX_MODE] = {};
|
|
|
|
keyCodeDict[SLIDE_MODE][LEFT_KEY]
|
|
= function() { return aSlideShow.rewindEffect(); };
|
|
keyCodeDict[SLIDE_MODE][RIGHT_KEY]
|
|
= function() { return dispatchEffects(1); };
|
|
keyCodeDict[SLIDE_MODE][UP_KEY]
|
|
= function() { return aSlideShow.rewindEffect(); };
|
|
keyCodeDict[SLIDE_MODE][DOWN_KEY]
|
|
= function() { return skipEffects(1); };
|
|
keyCodeDict[SLIDE_MODE][PAGE_UP_KEY]
|
|
= function() { return aSlideShow.rewindAllEffects(); };
|
|
keyCodeDict[SLIDE_MODE][PAGE_DOWN_KEY]
|
|
= function() { return skipAllEffects(); };
|
|
keyCodeDict[SLIDE_MODE][HOME_KEY]
|
|
= function() { return aSlideShow.displaySlide( 0, true ); };
|
|
keyCodeDict[SLIDE_MODE][END_KEY]
|
|
= function() { return aSlideShow.displaySlide( theMetaDoc.nNumberOfSlides - 1, true ); };
|
|
keyCodeDict[SLIDE_MODE][SPACE_KEY]
|
|
= function() { return dispatchEffects(1); };
|
|
keyCodeDict[SLIDE_MODE][ESCAPE_KEY]
|
|
= function() { return aSlideShow.exitSlideShowInApp(); };
|
|
keyCodeDict[SLIDE_MODE][Q_KEY]
|
|
= function() { return aSlideShow.exitSlideShowInApp(); };
|
|
|
|
keyCodeDict[INDEX_MODE][LEFT_KEY]
|
|
= function() { return indexSetPageSlide( theSlideIndexPage.selectedSlideIndex - 1 ); };
|
|
keyCodeDict[INDEX_MODE][RIGHT_KEY]
|
|
= function() { return indexSetPageSlide( theSlideIndexPage.selectedSlideIndex + 1 ); };
|
|
keyCodeDict[INDEX_MODE][UP_KEY]
|
|
= function() { return indexSetPageSlide( theSlideIndexPage.selectedSlideIndex - theSlideIndexPage.indexColumns ); };
|
|
keyCodeDict[INDEX_MODE][DOWN_KEY]
|
|
= function() { return indexSetPageSlide( theSlideIndexPage.selectedSlideIndex + theSlideIndexPage.indexColumns ); };
|
|
keyCodeDict[INDEX_MODE][PAGE_UP_KEY]
|
|
= function() { return indexSetPageSlide( theSlideIndexPage.selectedSlideIndex - theSlideIndexPage.getTotalThumbnails() ); };
|
|
keyCodeDict[INDEX_MODE][PAGE_DOWN_KEY]
|
|
= function() { return indexSetPageSlide( theSlideIndexPage.selectedSlideIndex + theSlideIndexPage.getTotalThumbnails() ); };
|
|
keyCodeDict[INDEX_MODE][HOME_KEY]
|
|
= function() { return indexSetPageSlide( 0 ); };
|
|
keyCodeDict[INDEX_MODE][END_KEY]
|
|
= function() { return indexSetPageSlide( theMetaDoc.nNumberOfSlides - 1 ); };
|
|
keyCodeDict[INDEX_MODE][ENTER_KEY]
|
|
= function() { return toggleSlideIndex(); };
|
|
keyCodeDict[INDEX_MODE][SPACE_KEY]
|
|
= function() { return toggleSlideIndex(); };
|
|
keyCodeDict[INDEX_MODE][ESCAPE_KEY]
|
|
= function() { return abandonIndexMode(); };
|
|
|
|
return keyCodeDict;
|
|
}
|
|
|
|
function getDefaultCharCodeDictionary()
|
|
{
|
|
var charCodeDict = {};
|
|
|
|
charCodeDict[SLIDE_MODE] = {};
|
|
charCodeDict[INDEX_MODE] = {};
|
|
|
|
charCodeDict[SLIDE_MODE]['i']
|
|
= function () { return toggleSlideIndex(); };
|
|
|
|
charCodeDict[INDEX_MODE]['i']
|
|
= function () { return toggleSlideIndex(); };
|
|
charCodeDict[INDEX_MODE]['-']
|
|
= function () { return theSlideIndexPage.decreaseNumberOfColumns(); };
|
|
charCodeDict[INDEX_MODE]['=']
|
|
= function () { return theSlideIndexPage.increaseNumberOfColumns(); };
|
|
charCodeDict[INDEX_MODE]['+']
|
|
= function () { return theSlideIndexPage.increaseNumberOfColumns(); };
|
|
charCodeDict[INDEX_MODE]['0']
|
|
= function () { return theSlideIndexPage.resetNumberOfColumns(); };
|
|
|
|
return charCodeDict;
|
|
}
|
|
|
|
|
|
function slideOnMouseUp( aEvt )
|
|
{
|
|
if (!aEvt)
|
|
aEvt = window.event;
|
|
|
|
var nOffset = 0;
|
|
|
|
if( aEvt.button == 0 )
|
|
nOffset = 1;
|
|
else if( aEvt.button == 2 )
|
|
nOffset = -1;
|
|
|
|
if( 0 != nOffset )
|
|
dispatchEffects( nOffset );
|
|
return true; // the click has been handled
|
|
}
|
|
|
|
document.handleClick = slideOnMouseUp;
|
|
|
|
|
|
function slideOnMouseWheel(aEvt)
|
|
{
|
|
var delta = 0;
|
|
|
|
if (!aEvt)
|
|
aEvt = window.event;
|
|
|
|
if (aEvt.wheelDelta)
|
|
{ // IE Opera
|
|
delta = aEvt.wheelDelta/120;
|
|
}
|
|
else if (aEvt.detail)
|
|
{ // MOZ
|
|
delta = -aEvt.detail/3;
|
|
}
|
|
|
|
if (delta > 0)
|
|
skipEffects(-1);
|
|
else if (delta < 0)
|
|
skipEffects(1);
|
|
|
|
if (aEvt.preventDefault)
|
|
aEvt.preventDefault();
|
|
|
|
aEvt.returnValue = false;
|
|
}
|
|
|
|
if( window.addEventListener )
|
|
{
|
|
window.addEventListener( 'DOMMouseScroll', function( aEvt ) { return mouseHandlerDispatch( aEvt, MOUSE_WHEEL ); }, false );
|
|
}
|
|
|
|
window.onmousewheel
|
|
= function( aEvt ) { return mouseHandlerDispatch( aEvt, MOUSE_WHEEL ); };
|
|
|
|
function mouseHandlerDispatch( aEvt, anAction )
|
|
{
|
|
if( !aEvt )
|
|
aEvt = window.event;
|
|
|
|
var retVal = true;
|
|
|
|
if ( mouseHandlerDictionary[currentMode] && mouseHandlerDictionary[currentMode][anAction] )
|
|
{
|
|
var subRetVal = mouseHandlerDictionary[currentMode][anAction]( aEvt );
|
|
|
|
if( subRetVal != null && subRetVal != undefined )
|
|
retVal = subRetVal;
|
|
}
|
|
|
|
if( aEvt.preventDefault && !retVal )
|
|
aEvt.preventDefault();
|
|
|
|
aEvt.returnValue = retVal;
|
|
|
|
return retVal;
|
|
}
|
|
|
|
document.onmouseup = function( aEvt ) { return mouseHandlerDispatch( aEvt, MOUSE_UP ); };
|
|
|
|
|
|
function mouseClickHelper( aEvt )
|
|
{
|
|
if( !Detect.isMozilla )
|
|
{
|
|
var aWindowObject = document.defaultView;
|
|
if( aWindowObject )
|
|
{
|
|
var aTextSelection = aWindowObject.getSelection();
|
|
var sSelectedText = aTextSelection.toString();
|
|
if( sSelectedText )
|
|
{
|
|
DBGLOG( 'text selection: ' + sSelectedText );
|
|
if( sLastSelectedText !== sSelectedText )
|
|
{
|
|
bTextHasBeenSelected = true;
|
|
sLastSelectedText = sSelectedText;
|
|
}
|
|
else
|
|
{
|
|
bTextHasBeenSelected = false;
|
|
}
|
|
return null;
|
|
}
|
|
else if( bTextHasBeenSelected )
|
|
{
|
|
bTextHasBeenSelected = false;
|
|
sLastSelectedText = '';
|
|
return null;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
log( 'error: HyperlinkElement.handleClick: invalid window object.' );
|
|
}
|
|
}
|
|
|
|
var aSlideAnimationsHandler = theMetaDoc.aMetaSlideSet[nCurSlide].aSlideAnimationsHandler;
|
|
if( aSlideAnimationsHandler )
|
|
{
|
|
var aCurrentEventMultiplexer = aSlideAnimationsHandler.aEventMultiplexer;
|
|
if( aCurrentEventMultiplexer )
|
|
{
|
|
if( aCurrentEventMultiplexer.hasRegisteredMouseClickHandlers() )
|
|
{
|
|
return aCurrentEventMultiplexer.notifyMouseClick( aEvt );
|
|
}
|
|
}
|
|
}
|
|
return slideOnMouseUp( aEvt );
|
|
}
|
|
|
|
|
|
function getDefaultMouseHandlerDictionary()
|
|
{
|
|
var mouseHandlerDict = {};
|
|
|
|
mouseHandlerDict[SLIDE_MODE] = {};
|
|
mouseHandlerDict[INDEX_MODE] = {};
|
|
|
|
mouseHandlerDict[SLIDE_MODE][MOUSE_UP]
|
|
= mouseClickHelper;
|
|
|
|
mouseHandlerDict[SLIDE_MODE][MOUSE_WHEEL]
|
|
= function( aEvt ) { return slideOnMouseWheel( aEvt ); };
|
|
|
|
mouseHandlerDict[INDEX_MODE][MOUSE_UP]
|
|
= function( ) { return toggleSlideIndex(); };
|
|
|
|
return mouseHandlerDict;
|
|
}
|
|
|
|
function indexSetPageSlide( nIndex )
|
|
{
|
|
var aMetaSlideSet = theMetaDoc.aMetaSlideSet;
|
|
nIndex = getSafeIndex( nIndex, 0, aMetaSlideSet.length - 1 );
|
|
|
|
var nSelectedThumbnailIndex = nIndex % theSlideIndexPage.getTotalThumbnails();
|
|
var offset = nIndex - nSelectedThumbnailIndex;
|
|
|
|
if( offset < 0 )
|
|
offset = 0;
|
|
|
|
if( offset != INDEX_OFFSET )
|
|
{
|
|
INDEX_OFFSET = offset;
|
|
displayIndex( INDEX_OFFSET );
|
|
}
|
|
|
|
theSlideIndexPage.setSelection( nSelectedThumbnailIndex );
|
|
}
|
|
|
|
|
|
/*****
|
|
* @jessyinkend
|
|
*
|
|
* The above code is a derivative work of some parts of the JessyInk project.
|
|
* @source http://code.google.com/p/jessyink/
|
|
*/
|
|
|
|
|
|
/*****
|
|
* @licstart
|
|
*
|
|
* The following is the license notice for the part of JavaScript code of this
|
|
* page included between the '@dojostart' and the '@dojoend' notes.
|
|
*/
|
|
|
|
/***** **********************************************************************
|
|
*
|
|
* The 'New' BSD License:
|
|
* **********************
|
|
* Copyright (c) 2005-2012, The Dojo Foundation
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright notice,
|
|
* this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
* * Neither the name of the Dojo Foundation nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
****************************************************************************/
|
|
|
|
|
|
/*****
|
|
* @licend
|
|
*
|
|
* The above is the license notice for the part of JavaScript code of this
|
|
* page included between the '@dojostart' and the '@dojoend' notes.
|
|
*/
|
|
|
|
|
|
/*****
|
|
* @dojostart
|
|
*
|
|
* The following code is a derivative work of some part of the dojox.gfx library.
|
|
* @source http://svn.dojotoolkit.org/src/dojox/trunk/_base/sniff.js
|
|
*/
|
|
|
|
function has( name )
|
|
{
|
|
return has.cache[name];
|
|
}
|
|
|
|
has.cache = {};
|
|
|
|
has.add = function( name, test )
|
|
{
|
|
has.cache[name] = test;
|
|
};
|
|
|
|
function configureDetectionTools()
|
|
{
|
|
if( !navigator )
|
|
{
|
|
log( 'error: configureDetectionTools: configuration failed' );
|
|
return null;
|
|
}
|
|
|
|
var n = navigator,
|
|
dua = n.userAgent,
|
|
dav = n.appVersion,
|
|
tv = parseFloat(dav);
|
|
|
|
has.add('air', dua.indexOf('AdobeAIR') >= 0);
|
|
has.add('khtml', dav.indexOf('Konqueror') >= 0 ? tv : undefined);
|
|
has.add('webkit', parseFloat(dua.split('WebKit/')[1]) || undefined);
|
|
has.add('chrome', parseFloat(dua.split('Chrome/')[1]) || undefined);
|
|
has.add('safari', dav.indexOf('Safari')>=0 && !has('chrome') ? parseFloat(dav.split('Version/')[1]) : undefined);
|
|
has.add('mac', dav.indexOf('Macintosh') >= 0);
|
|
has.add('quirks', document.compatMode == 'BackCompat');
|
|
has.add('ios', /iPhone|iPod|iPad/.test(dua));
|
|
has.add('android', parseFloat(dua.split('Android ')[1]) || undefined);
|
|
|
|
if(!has('webkit')){
|
|
if(dua.indexOf('Opera') >= 0){
|
|
has.add('opera', tv >= 9.8 ? parseFloat(dua.split('Version/')[1]) || tv : tv);
|
|
}
|
|
|
|
if(dua.indexOf('Gecko') >= 0 && !has('khtml') && !has('webkit')){
|
|
has.add('mozilla', tv);
|
|
}
|
|
if(has('mozilla')){
|
|
has.add('ff', parseFloat(dua.split('Firefox/')[1] || dua.split('Minefield/')[1]) || undefined);
|
|
}
|
|
|
|
if(document.all && !has('opera')){
|
|
var isIE = parseFloat(dav.split('MSIE ')[1]) || undefined;
|
|
|
|
var mode = document.documentMode;
|
|
if(mode && mode != 5 && Math.floor(isIE) != mode){
|
|
isIE = mode;
|
|
}
|
|
|
|
has.add('ie', isIE);
|
|
}
|
|
|
|
has.add('wii', typeof opera != 'undefined' && opera.wiiremote);
|
|
}
|
|
|
|
var detect =
|
|
{
|
|
isFF: has('ff'),
|
|
|
|
isIE: has('ie'),
|
|
|
|
isKhtml: has('khtml'),
|
|
|
|
isWebKit: has('webkit'),
|
|
|
|
isMozilla: has('mozilla'),
|
|
isMoz: has('mozilla'),
|
|
|
|
isOpera: has('opera'),
|
|
|
|
isSafari: has('safari'),
|
|
|
|
isChrome: has('chrome'),
|
|
|
|
isMac: has('mac'),
|
|
|
|
isIos: has('ios'),
|
|
|
|
isAndroid: has('android'),
|
|
|
|
isWii: has('wii'),
|
|
|
|
isQuirks: has('quirks'),
|
|
|
|
isAir: has('air')
|
|
};
|
|
return detect;
|
|
}
|
|
|
|
/*****
|
|
* @dojoend
|
|
*
|
|
* The above code is a derivative work of some part of the dojox.gfx library.
|
|
* @source http://svn.dojotoolkit.org/src/dojox/trunk/_base/sniff.js
|
|
*/
|
|
|
|
/*****
|
|
* @licstart
|
|
*
|
|
* The following is the license notice for the part of JavaScript code of this
|
|
* file included between the '@svgpathstart' and the '@svgpathend' notes.
|
|
*/
|
|
|
|
/***** **********************************************************************
|
|
*
|
|
* Copyright 2015 The Chromium Authors. All rights reserved.
|
|
*
|
|
* The Chromium Authors can be found at
|
|
* http://src.chromium.org/svn/trunk/src/AUTHORS
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following disclaimer
|
|
* in the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* * Neither the name of Google Inc. nor the names of its
|
|
* contributors may be used to endorse or promote products derived from
|
|
* this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/*****
|
|
* @licend
|
|
*
|
|
* The above is the license notice for the part of JavaScript code of this
|
|
* file included between the '@svgpathstart' and the '@svgpathend' notes.
|
|
*/
|
|
|
|
|
|
/*****
|
|
* @svgpathstart
|
|
*
|
|
* The following code is a derivative work of some part of the SVGPathSeg API.
|
|
*
|
|
* This API is a drop-in replacement for the SVGPathSeg and SVGPathSegList APIs that were removed from
|
|
* SVG2 (https://lists.w3.org/Archives/Public/www-svg/2015Jun/0044.html), including the latest spec
|
|
* changes which were implemented in Firefox 43 and Chrome 46.
|
|
*
|
|
* @source https://github.com/progers/pathseg
|
|
*/
|
|
|
|
(function() { 'use strict';
|
|
if (!('SVGPathSeg' in window)) {
|
|
window.SVGPathSeg = function(type, typeAsLetter, owningPathSegList) {
|
|
this.pathSegType = type;
|
|
this.pathSegTypeAsLetter = typeAsLetter;
|
|
this._owningPathSegList = owningPathSegList;
|
|
}
|
|
|
|
window.SVGPathSeg.prototype.classname = 'SVGPathSeg';
|
|
|
|
window.SVGPathSeg.PATHSEG_UNKNOWN = 0;
|
|
window.SVGPathSeg.PATHSEG_CLOSEPATH = 1;
|
|
window.SVGPathSeg.PATHSEG_MOVETO_ABS = 2;
|
|
window.SVGPathSeg.PATHSEG_MOVETO_REL = 3;
|
|
window.SVGPathSeg.PATHSEG_LINETO_ABS = 4;
|
|
window.SVGPathSeg.PATHSEG_LINETO_REL = 5;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
|
|
window.SVGPathSeg.PATHSEG_ARC_ABS = 10;
|
|
window.SVGPathSeg.PATHSEG_ARC_REL = 11;
|
|
window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
|
|
window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
|
|
window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
|
|
window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
|
|
window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
|
|
|
|
window.SVGPathSeg.prototype._segmentChanged = function() {
|
|
if (this._owningPathSegList)
|
|
this._owningPathSegList.segmentChanged(this);
|
|
}
|
|
|
|
window.SVGPathSegClosePath = function(owningPathSegList) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CLOSEPATH, 'z', owningPathSegList);
|
|
}
|
|
window.SVGPathSegClosePath.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegClosePath.prototype.toString = function() { return '[object SVGPathSegClosePath]'; }
|
|
window.SVGPathSegClosePath.prototype._asPathString = function() { return this.pathSegTypeAsLetter; }
|
|
window.SVGPathSegClosePath.prototype.clone = function() { return new window.SVGPathSegClosePath(undefined); }
|
|
|
|
window.SVGPathSegMovetoAbs = function(owningPathSegList, x, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_MOVETO_ABS, 'M', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegMovetoAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegMovetoAbs.prototype.toString = function() { return '[object SVGPathSegMovetoAbs]'; }
|
|
window.SVGPathSegMovetoAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegMovetoAbs.prototype.clone = function() { return new window.SVGPathSegMovetoAbs(undefined, this._x, this._y); }
|
|
Object.defineProperty(window.SVGPathSegMovetoAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegMovetoAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegMovetoRel = function(owningPathSegList, x, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_MOVETO_REL, 'm', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegMovetoRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegMovetoRel.prototype.toString = function() { return '[object SVGPathSegMovetoRel]'; }
|
|
window.SVGPathSegMovetoRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegMovetoRel.prototype.clone = function() { return new window.SVGPathSegMovetoRel(undefined, this._x, this._y); }
|
|
Object.defineProperty(window.SVGPathSegMovetoRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegMovetoRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegLinetoAbs = function(owningPathSegList, x, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_ABS, 'L', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegLinetoAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegLinetoAbs.prototype.toString = function() { return '[object SVGPathSegLinetoAbs]'; }
|
|
window.SVGPathSegLinetoAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegLinetoAbs.prototype.clone = function() { return new window.SVGPathSegLinetoAbs(undefined, this._x, this._y); }
|
|
Object.defineProperty(window.SVGPathSegLinetoAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegLinetoAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegLinetoRel = function(owningPathSegList, x, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_REL, 'l', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegLinetoRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegLinetoRel.prototype.toString = function() { return '[object SVGPathSegLinetoRel]'; }
|
|
window.SVGPathSegLinetoRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegLinetoRel.prototype.clone = function() { return new window.SVGPathSegLinetoRel(undefined, this._x, this._y); }
|
|
Object.defineProperty(window.SVGPathSegLinetoRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegLinetoRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoCubicAbs = function(owningPathSegList, x, y, x1, y1, x2, y2) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS, 'C', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._x1 = x1;
|
|
this._y1 = y1;
|
|
this._x2 = x2;
|
|
this._y2 = y2;
|
|
}
|
|
window.SVGPathSegCurvetoCubicAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoCubicAbs.prototype.toString = function() { return '[object SVGPathSegCurvetoCubicAbs]'; }
|
|
window.SVGPathSegCurvetoCubicAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoCubicAbs.prototype.clone = function() { return new window.SVGPathSegCurvetoCubicAbs(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, 'x1', { get: function() { return this._x1; }, set: function(x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, 'y1', { get: function() { return this._y1; }, set: function(y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, 'x2', { get: function() { return this._x2; }, set: function(x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicAbs.prototype, 'y2', { get: function() { return this._y2; }, set: function(y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoCubicRel = function(owningPathSegList, x, y, x1, y1, x2, y2) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL, 'c', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._x1 = x1;
|
|
this._y1 = y1;
|
|
this._x2 = x2;
|
|
this._y2 = y2;
|
|
}
|
|
window.SVGPathSegCurvetoCubicRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoCubicRel.prototype.toString = function() { return '[object SVGPathSegCurvetoCubicRel]'; }
|
|
window.SVGPathSegCurvetoCubicRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoCubicRel.prototype.clone = function() { return new window.SVGPathSegCurvetoCubicRel(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, 'x1', { get: function() { return this._x1; }, set: function(x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, 'y1', { get: function() { return this._y1; }, set: function(y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, 'x2', { get: function() { return this._x2; }, set: function(x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicRel.prototype, 'y2', { get: function() { return this._y2; }, set: function(y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoQuadraticAbs = function(owningPathSegList, x, y, x1, y1) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS, 'Q', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._x1 = x1;
|
|
this._y1 = y1;
|
|
}
|
|
window.SVGPathSegCurvetoQuadraticAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoQuadraticAbs.prototype.toString = function() { return '[object SVGPathSegCurvetoQuadraticAbs]'; }
|
|
window.SVGPathSegCurvetoQuadraticAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoQuadraticAbs.prototype.clone = function() { return new window.SVGPathSegCurvetoQuadraticAbs(undefined, this._x, this._y, this._x1, this._y1); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, 'x1', { get: function() { return this._x1; }, set: function(x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticAbs.prototype, 'y1', { get: function() { return this._y1; }, set: function(y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoQuadraticRel = function(owningPathSegList, x, y, x1, y1) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL, 'q', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._x1 = x1;
|
|
this._y1 = y1;
|
|
}
|
|
window.SVGPathSegCurvetoQuadraticRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoQuadraticRel.prototype.toString = function() { return '[object SVGPathSegCurvetoQuadraticRel]'; }
|
|
window.SVGPathSegCurvetoQuadraticRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoQuadraticRel.prototype.clone = function() { return new window.SVGPathSegCurvetoQuadraticRel(undefined, this._x, this._y, this._x1, this._y1); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, 'x1', { get: function() { return this._x1; }, set: function(x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticRel.prototype, 'y1', { get: function() { return this._y1; }, set: function(y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegArcAbs = function(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_ARC_ABS, 'A', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._r1 = r1;
|
|
this._r2 = r2;
|
|
this._angle = angle;
|
|
this._largeArcFlag = largeArcFlag;
|
|
this._sweepFlag = sweepFlag;
|
|
}
|
|
window.SVGPathSegArcAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegArcAbs.prototype.toString = function() { return '[object SVGPathSegArcAbs]'; }
|
|
window.SVGPathSegArcAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._r1 + ' ' + this._r2 + ' ' + this._angle + ' ' + (this._largeArcFlag ? '1' : '0') + ' ' + (this._sweepFlag ? '1' : '0') + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegArcAbs.prototype.clone = function() { return new window.SVGPathSegArcAbs(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag); }
|
|
Object.defineProperty(window.SVGPathSegArcAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcAbs.prototype, 'r1', { get: function() { return this._r1; }, set: function(r1) { this._r1 = r1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcAbs.prototype, 'r2', { get: function() { return this._r2; }, set: function(r2) { this._r2 = r2; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcAbs.prototype, 'angle', { get: function() { return this._angle; }, set: function(angle) { this._angle = angle; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcAbs.prototype, 'largeArcFlag', { get: function() { return this._largeArcFlag; }, set: function(largeArcFlag) { this._largeArcFlag = largeArcFlag; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcAbs.prototype, 'sweepFlag', { get: function() { return this._sweepFlag; }, set: function(sweepFlag) { this._sweepFlag = sweepFlag; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegArcRel = function(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_ARC_REL, 'a', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._r1 = r1;
|
|
this._r2 = r2;
|
|
this._angle = angle;
|
|
this._largeArcFlag = largeArcFlag;
|
|
this._sweepFlag = sweepFlag;
|
|
}
|
|
window.SVGPathSegArcRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegArcRel.prototype.toString = function() { return '[object SVGPathSegArcRel]'; }
|
|
window.SVGPathSegArcRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._r1 + ' ' + this._r2 + ' ' + this._angle + ' ' + (this._largeArcFlag ? '1' : '0') + ' ' + (this._sweepFlag ? '1' : '0') + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegArcRel.prototype.clone = function() { return new window.SVGPathSegArcRel(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag); }
|
|
Object.defineProperty(window.SVGPathSegArcRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcRel.prototype, 'r1', { get: function() { return this._r1; }, set: function(r1) { this._r1 = r1; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcRel.prototype, 'r2', { get: function() { return this._r2; }, set: function(r2) { this._r2 = r2; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcRel.prototype, 'angle', { get: function() { return this._angle; }, set: function(angle) { this._angle = angle; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcRel.prototype, 'largeArcFlag', { get: function() { return this._largeArcFlag; }, set: function(largeArcFlag) { this._largeArcFlag = largeArcFlag; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegArcRel.prototype, 'sweepFlag', { get: function() { return this._sweepFlag; }, set: function(sweepFlag) { this._sweepFlag = sweepFlag; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegLinetoHorizontalAbs = function(owningPathSegList, x) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS, 'H', owningPathSegList);
|
|
this._x = x;
|
|
}
|
|
window.SVGPathSegLinetoHorizontalAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegLinetoHorizontalAbs.prototype.toString = function() { return '[object SVGPathSegLinetoHorizontalAbs]'; }
|
|
window.SVGPathSegLinetoHorizontalAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x; }
|
|
window.SVGPathSegLinetoHorizontalAbs.prototype.clone = function() { return new window.SVGPathSegLinetoHorizontalAbs(undefined, this._x); }
|
|
Object.defineProperty(window.SVGPathSegLinetoHorizontalAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegLinetoHorizontalRel = function(owningPathSegList, x) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL, 'h', owningPathSegList);
|
|
this._x = x;
|
|
}
|
|
window.SVGPathSegLinetoHorizontalRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegLinetoHorizontalRel.prototype.toString = function() { return '[object SVGPathSegLinetoHorizontalRel]'; }
|
|
window.SVGPathSegLinetoHorizontalRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x; }
|
|
window.SVGPathSegLinetoHorizontalRel.prototype.clone = function() { return new window.SVGPathSegLinetoHorizontalRel(undefined, this._x); }
|
|
Object.defineProperty(window.SVGPathSegLinetoHorizontalRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegLinetoVerticalAbs = function(owningPathSegList, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS, 'V', owningPathSegList);
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegLinetoVerticalAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegLinetoVerticalAbs.prototype.toString = function() { return '[object SVGPathSegLinetoVerticalAbs]'; }
|
|
window.SVGPathSegLinetoVerticalAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._y; }
|
|
window.SVGPathSegLinetoVerticalAbs.prototype.clone = function() { return new window.SVGPathSegLinetoVerticalAbs(undefined, this._y); }
|
|
Object.defineProperty(window.SVGPathSegLinetoVerticalAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegLinetoVerticalRel = function(owningPathSegList, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL, 'v', owningPathSegList);
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegLinetoVerticalRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegLinetoVerticalRel.prototype.toString = function() { return '[object SVGPathSegLinetoVerticalRel]'; }
|
|
window.SVGPathSegLinetoVerticalRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._y; }
|
|
window.SVGPathSegLinetoVerticalRel.prototype.clone = function() { return new window.SVGPathSegLinetoVerticalRel(undefined, this._y); }
|
|
Object.defineProperty(window.SVGPathSegLinetoVerticalRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoCubicSmoothAbs = function(owningPathSegList, x, y, x2, y2) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS, 'S', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._x2 = x2;
|
|
this._y2 = y2;
|
|
}
|
|
window.SVGPathSegCurvetoCubicSmoothAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoCubicSmoothAbs.prototype.toString = function() { return '[object SVGPathSegCurvetoCubicSmoothAbs]'; }
|
|
window.SVGPathSegCurvetoCubicSmoothAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoCubicSmoothAbs.prototype.clone = function() { return new window.SVGPathSegCurvetoCubicSmoothAbs(undefined, this._x, this._y, this._x2, this._y2); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, 'x2', { get: function() { return this._x2; }, set: function(x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothAbs.prototype, 'y2', { get: function() { return this._y2; }, set: function(y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoCubicSmoothRel = function(owningPathSegList, x, y, x2, y2) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL, 's', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
this._x2 = x2;
|
|
this._y2 = y2;
|
|
}
|
|
window.SVGPathSegCurvetoCubicSmoothRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoCubicSmoothRel.prototype.toString = function() { return '[object SVGPathSegCurvetoCubicSmoothRel]'; }
|
|
window.SVGPathSegCurvetoCubicSmoothRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoCubicSmoothRel.prototype.clone = function() { return new window.SVGPathSegCurvetoCubicSmoothRel(undefined, this._x, this._y, this._x2, this._y2); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, 'x2', { get: function() { return this._x2; }, set: function(x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoCubicSmoothRel.prototype, 'y2', { get: function() { return this._y2; }, set: function(y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoQuadraticSmoothAbs = function(owningPathSegList, x, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS, 'T', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype.toString = function() { return '[object SVGPathSegCurvetoQuadraticSmoothAbs]'; }
|
|
window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype.clone = function() { return new window.SVGPathSegCurvetoQuadraticSmoothAbs(undefined, this._x, this._y); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothAbs.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathSegCurvetoQuadraticSmoothRel = function(owningPathSegList, x, y) {
|
|
window.SVGPathSeg.call(this, window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL, 't', owningPathSegList);
|
|
this._x = x;
|
|
this._y = y;
|
|
}
|
|
window.SVGPathSegCurvetoQuadraticSmoothRel.prototype = Object.create(window.SVGPathSeg.prototype);
|
|
window.SVGPathSegCurvetoQuadraticSmoothRel.prototype.toString = function() { return '[object SVGPathSegCurvetoQuadraticSmoothRel]'; }
|
|
window.SVGPathSegCurvetoQuadraticSmoothRel.prototype._asPathString = function() { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }
|
|
window.SVGPathSegCurvetoQuadraticSmoothRel.prototype.clone = function() { return new window.SVGPathSegCurvetoQuadraticSmoothRel(undefined, this._x, this._y); }
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothRel.prototype, 'x', { get: function() { return this._x; }, set: function(x) { this._x = x; this._segmentChanged(); }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathSegCurvetoQuadraticSmoothRel.prototype, 'y', { get: function() { return this._y; }, set: function(y) { this._y = y; this._segmentChanged(); }, enumerable: true });
|
|
|
|
window.SVGPathElement.prototype.createSVGPathSegClosePath = function() { return new window.SVGPathSegClosePath(undefined); }
|
|
window.SVGPathElement.prototype.createSVGPathSegMovetoAbs = function(x, y) { return new window.SVGPathSegMovetoAbs(undefined, x, y); }
|
|
window.SVGPathElement.prototype.createSVGPathSegMovetoRel = function(x, y) { return new window.SVGPathSegMovetoRel(undefined, x, y); }
|
|
window.SVGPathElement.prototype.createSVGPathSegLinetoAbs = function(x, y) { return new window.SVGPathSegLinetoAbs(undefined, x, y); }
|
|
window.SVGPathElement.prototype.createSVGPathSegLinetoRel = function(x, y) { return new window.SVGPathSegLinetoRel(undefined, x, y); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function(x, y, x1, y1, x2, y2) { return new window.SVGPathSegCurvetoCubicAbs(undefined, x, y, x1, y1, x2, y2); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel = function(x, y, x1, y1, x2, y2) { return new window.SVGPathSegCurvetoCubicRel(undefined, x, y, x1, y1, x2, y2); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs = function(x, y, x1, y1) { return new window.SVGPathSegCurvetoQuadraticAbs(undefined, x, y, x1, y1); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel = function(x, y, x1, y1) { return new window.SVGPathSegCurvetoQuadraticRel(undefined, x, y, x1, y1); }
|
|
window.SVGPathElement.prototype.createSVGPathSegArcAbs = function(x, y, r1, r2, angle, largeArcFlag, sweepFlag) { return new window.SVGPathSegArcAbs(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag); }
|
|
window.SVGPathElement.prototype.createSVGPathSegArcRel = function(x, y, r1, r2, angle, largeArcFlag, sweepFlag) { return new window.SVGPathSegArcRel(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag); }
|
|
window.SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs = function(x) { return new window.SVGPathSegLinetoHorizontalAbs(undefined, x); }
|
|
window.SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel = function(x) { return new window.SVGPathSegLinetoHorizontalRel(undefined, x); }
|
|
window.SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs = function(y) { return new window.SVGPathSegLinetoVerticalAbs(undefined, y); }
|
|
window.SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel = function(y) { return new window.SVGPathSegLinetoVerticalRel(undefined, y); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs = function(x, y, x2, y2) { return new window.SVGPathSegCurvetoCubicSmoothAbs(undefined, x, y, x2, y2); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel = function(x, y, x2, y2) { return new window.SVGPathSegCurvetoCubicSmoothRel(undefined, x, y, x2, y2); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs = function(x, y) { return new window.SVGPathSegCurvetoQuadraticSmoothAbs(undefined, x, y); }
|
|
window.SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel = function(x, y) { return new window.SVGPathSegCurvetoQuadraticSmoothRel(undefined, x, y); }
|
|
|
|
if (!('getPathSegAtLength' in window.SVGPathElement.prototype)) {
|
|
window.SVGPathElement.prototype.getPathSegAtLength = function(distance) {
|
|
if (distance === undefined || !isFinite(distance))
|
|
throw 'Invalid arguments.';
|
|
|
|
var measurementElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
measurementElement.setAttribute('d', this.getAttribute('d'));
|
|
var lastPathSegment = measurementElement.pathSegList.numberOfItems - 1;
|
|
|
|
if (lastPathSegment <= 0)
|
|
return 0;
|
|
|
|
do {
|
|
measurementElement.pathSegList.removeItem(lastPathSegment);
|
|
if (distance > measurementElement.getTotalLength())
|
|
break;
|
|
lastPathSegment--;
|
|
} while (lastPathSegment > 0);
|
|
return lastPathSegment;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!('SVGPathSegList' in window) || !('appendItem' in window.SVGPathSegList.prototype)) {
|
|
window.SVGPathSegList = function(pathElement) {
|
|
this._pathElement = pathElement;
|
|
this._list = this._parsePath(this._pathElement.getAttribute('d'));
|
|
|
|
this._mutationObserverConfig = { 'attributes': true, 'attributeFilter': ['d'] };
|
|
this._pathElementMutationObserver = new MutationObserver(this._updateListFromPathMutations.bind(this));
|
|
this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.classname = 'SVGPathSegList';
|
|
|
|
Object.defineProperty(window.SVGPathSegList.prototype, 'numberOfItems', {
|
|
get: function() {
|
|
this._checkPathSynchronizedToList();
|
|
return this._list.length;
|
|
},
|
|
enumerable: true
|
|
});
|
|
|
|
Object.defineProperty(window.SVGPathSegList.prototype, 'length', {
|
|
get: function() {
|
|
this._checkPathSynchronizedToList();
|
|
return this._list.length;
|
|
},
|
|
enumerable: true
|
|
});
|
|
|
|
Object.defineProperty(window.SVGPathElement.prototype, 'pathSegList', {
|
|
get: function() {
|
|
if (!this._pathSegList)
|
|
this._pathSegList = new window.SVGPathSegList(this);
|
|
return this._pathSegList;
|
|
},
|
|
enumerable: true
|
|
});
|
|
Object.defineProperty(window.SVGPathElement.prototype, 'normalizedPathSegList', { get: function() { return this.pathSegList; }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathElement.prototype, 'animatedPathSegList', { get: function() { return this.pathSegList; }, enumerable: true });
|
|
Object.defineProperty(window.SVGPathElement.prototype, 'animatedNormalizedPathSegList', { get: function() { return this.pathSegList; }, enumerable: true });
|
|
|
|
window.SVGPathSegList.prototype._checkPathSynchronizedToList = function() {
|
|
this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords());
|
|
}
|
|
|
|
window.SVGPathSegList.prototype._updateListFromPathMutations = function(mutationRecords) {
|
|
if (!this._pathElement)
|
|
return;
|
|
var hasPathMutations = false;
|
|
mutationRecords.forEach(function(record) {
|
|
if (record.attributeName == 'd')
|
|
hasPathMutations = true;
|
|
});
|
|
if (hasPathMutations)
|
|
this._list = this._parsePath(this._pathElement.getAttribute('d'));
|
|
}
|
|
|
|
window.SVGPathSegList.prototype._writeListToPath = function() {
|
|
this._pathElementMutationObserver.disconnect();
|
|
this._pathElement.setAttribute('d', window.SVGPathSegList._pathSegArrayAsString(this._list));
|
|
this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.segmentChanged = function(pathSeg) {
|
|
this._writeListToPath();
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.clear = function() {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
this._list.forEach(function(pathSeg) {
|
|
pathSeg._owningPathSegList = null;
|
|
});
|
|
this._list = [];
|
|
this._writeListToPath();
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.initialize = function(newItem) {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
this._list = [newItem];
|
|
newItem._owningPathSegList = this;
|
|
this._writeListToPath();
|
|
return newItem;
|
|
}
|
|
|
|
window.SVGPathSegList.prototype._checkValidIndex = function(index) {
|
|
if (isNaN(index) || index < 0 || index >= this.numberOfItems)
|
|
throw 'INDEX_SIZE_ERR';
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.getItem = function(index) {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
this._checkValidIndex(index);
|
|
return this._list[index];
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.insertItemBefore = function(newItem, index) {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
if (index > this.numberOfItems)
|
|
index = this.numberOfItems;
|
|
if (newItem._owningPathSegList) {
|
|
newItem = newItem.clone();
|
|
}
|
|
this._list.splice(index, 0, newItem);
|
|
newItem._owningPathSegList = this;
|
|
this._writeListToPath();
|
|
return newItem;
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.replaceItem = function(newItem, index) {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
if (newItem._owningPathSegList) {
|
|
newItem = newItem.clone();
|
|
}
|
|
this._checkValidIndex(index);
|
|
this._list[index] = newItem;
|
|
newItem._owningPathSegList = this;
|
|
this._writeListToPath();
|
|
return newItem;
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.removeItem = function(index) {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
this._checkValidIndex(index);
|
|
var item = this._list[index];
|
|
this._list.splice(index, 1);
|
|
this._writeListToPath();
|
|
return item;
|
|
}
|
|
|
|
window.SVGPathSegList.prototype.appendItem = function(newItem) {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
if (newItem._owningPathSegList) {
|
|
newItem = newItem.clone();
|
|
}
|
|
this._list.push(newItem);
|
|
newItem._owningPathSegList = this;
|
|
this._writeListToPath();
|
|
return newItem;
|
|
};
|
|
|
|
window.SVGPathSegList.prototype.matrixTransform = function(aSVGMatrix) {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
var nLength = this._list.length;
|
|
for( var i = 0; i < nLength; ++i )
|
|
{
|
|
var nX;
|
|
var aPathSeg = this._list[i];
|
|
switch( aPathSeg.pathSegTypeAsLetter )
|
|
{
|
|
case 'C':
|
|
nX = aPathSeg._x2;
|
|
aPathSeg._x2 = aSVGMatrix.a * nX + aSVGMatrix.c * aPathSeg._y2 + aSVGMatrix.e;
|
|
aPathSeg._y2 = aSVGMatrix.b * nX + aSVGMatrix.d * aPathSeg._y2 + aSVGMatrix.f;
|
|
case 'Q':
|
|
nX = aPathSeg._x1;
|
|
aPathSeg._x1 = aSVGMatrix.a * nX + aSVGMatrix.c * aPathSeg._y1 + aSVGMatrix.e;
|
|
aPathSeg._y1 = aSVGMatrix.b * nX + aSVGMatrix.d * aPathSeg._y1 + aSVGMatrix.f;
|
|
case 'M':
|
|
case 'L':
|
|
nX = aPathSeg._x;
|
|
aPathSeg._x = aSVGMatrix.a * nX + aSVGMatrix.c * aPathSeg._y + aSVGMatrix.e;
|
|
aPathSeg._y = aSVGMatrix.b * nX + aSVGMatrix.d * aPathSeg._y + aSVGMatrix.f;
|
|
break;
|
|
default:
|
|
log( 'SVGPathSeg.matrixTransform: unexpected path segment type: '
|
|
+ aPathSeg.pathSegTypeAsLetter );
|
|
}
|
|
}
|
|
|
|
this._writeListToPath();
|
|
};
|
|
|
|
window.SVGPathSegList.prototype.changeOrientation = function() {
|
|
this._checkPathSynchronizedToList();
|
|
|
|
var aPathSegList = this._list;
|
|
var nLength = aPathSegList.length;
|
|
if( nLength == 0 ) return;
|
|
|
|
var nCurrentX = 0;
|
|
var nCurrentY = 0;
|
|
|
|
var aPathSeg = aPathSegList[0];
|
|
if( aPathSeg.pathSegTypeAsLetter == 'M' )
|
|
{
|
|
nCurrentX = aPathSeg.x;
|
|
nCurrentY = aPathSeg.y;
|
|
aPathSegList.shift();
|
|
--nLength;
|
|
}
|
|
|
|
var i;
|
|
for( i = 0; i < nLength; ++i )
|
|
{
|
|
aPathSeg = aPathSegList[i];
|
|
switch( aPathSeg.pathSegTypeAsLetter )
|
|
{
|
|
case 'C':
|
|
var nX = aPathSeg._x1;
|
|
aPathSeg._x1 = aPathSeg._x2;
|
|
aPathSeg._x2 = nX;
|
|
var nY = aPathSeg._y1;
|
|
aPathSeg._y1 = aPathSeg._y2;
|
|
aPathSeg._y2 = nY;
|
|
case 'M':
|
|
case 'L':
|
|
case 'Q':
|
|
var aPoint = { x: aPathSeg._x, y: aPathSeg._y };
|
|
aPathSeg._x = nCurrentX;
|
|
aPathSeg._y = nCurrentY;
|
|
nCurrentX = aPoint.x;
|
|
nCurrentY = aPoint.y;
|
|
break;
|
|
default:
|
|
log( 'SVGPathSegList.changeOrientation: unexpected path segment type: '
|
|
+ aPathSeg.pathSegTypeAsLetter );
|
|
}
|
|
|
|
}
|
|
|
|
aPathSegList.reverse();
|
|
|
|
var aMovePathSeg = new window.SVGPathSegMovetoAbs( this, nCurrentX, nCurrentY );
|
|
aPathSegList.unshift( aMovePathSeg );
|
|
|
|
this._writeListToPath();
|
|
};
|
|
|
|
window.SVGPathSegList._pathSegArrayAsString = function(pathSegArray) {
|
|
var string = '';
|
|
var first = true;
|
|
pathSegArray.forEach(function(pathSeg) {
|
|
if (first) {
|
|
first = false;
|
|
string += pathSeg._asPathString();
|
|
} else {
|
|
string += ' ' + pathSeg._asPathString();
|
|
}
|
|
});
|
|
return string;
|
|
}
|
|
|
|
window.SVGPathSegList.prototype._parsePath = function(string) {
|
|
if (!string || string.length == 0)
|
|
return [];
|
|
|
|
var owningPathSegList = this;
|
|
|
|
var Builder = function() {
|
|
this.pathSegList = [];
|
|
}
|
|
|
|
Builder.prototype.appendSegment = function(pathSeg) {
|
|
this.pathSegList.push(pathSeg);
|
|
}
|
|
|
|
var Source = function(string) {
|
|
this._string = string;
|
|
this._currentIndex = 0;
|
|
this._endIndex = this._string.length;
|
|
this._previousCommand = window.SVGPathSeg.PATHSEG_UNKNOWN;
|
|
|
|
this._skipOptionalSpaces();
|
|
}
|
|
|
|
Source.prototype._isCurrentSpace = function() {
|
|
var character = this._string[this._currentIndex];
|
|
return character <= ' ' && (character == ' ' || character == '\n' || character == '\t' || character == '\r' || character == '\f');
|
|
}
|
|
|
|
Source.prototype._skipOptionalSpaces = function() {
|
|
while (this._currentIndex < this._endIndex && this._isCurrentSpace())
|
|
this._currentIndex++;
|
|
return this._currentIndex < this._endIndex;
|
|
}
|
|
|
|
Source.prototype._skipOptionalSpacesOrDelimiter = function() {
|
|
if (this._currentIndex < this._endIndex && !this._isCurrentSpace() && this._string.charAt(this._currentIndex) != ',')
|
|
return false;
|
|
if (this._skipOptionalSpaces()) {
|
|
if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == ',') {
|
|
this._currentIndex++;
|
|
this._skipOptionalSpaces();
|
|
}
|
|
}
|
|
return this._currentIndex < this._endIndex;
|
|
}
|
|
|
|
Source.prototype.hasMoreData = function() {
|
|
return this._currentIndex < this._endIndex;
|
|
}
|
|
|
|
Source.prototype.peekSegmentType = function() {
|
|
var lookahead = this._string[this._currentIndex];
|
|
return this._pathSegTypeFromChar(lookahead);
|
|
}
|
|
|
|
Source.prototype._pathSegTypeFromChar = function(lookahead) {
|
|
switch (lookahead) {
|
|
case 'Z':
|
|
case 'z':
|
|
return window.SVGPathSeg.PATHSEG_CLOSEPATH;
|
|
case 'M':
|
|
return window.SVGPathSeg.PATHSEG_MOVETO_ABS;
|
|
case 'm':
|
|
return window.SVGPathSeg.PATHSEG_MOVETO_REL;
|
|
case 'L':
|
|
return window.SVGPathSeg.PATHSEG_LINETO_ABS;
|
|
case 'l':
|
|
return window.SVGPathSeg.PATHSEG_LINETO_REL;
|
|
case 'C':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS;
|
|
case 'c':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL;
|
|
case 'Q':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS;
|
|
case 'q':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL;
|
|
case 'A':
|
|
return window.SVGPathSeg.PATHSEG_ARC_ABS;
|
|
case 'a':
|
|
return window.SVGPathSeg.PATHSEG_ARC_REL;
|
|
case 'H':
|
|
return window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS;
|
|
case 'h':
|
|
return window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL;
|
|
case 'V':
|
|
return window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS;
|
|
case 'v':
|
|
return window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL;
|
|
case 'S':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS;
|
|
case 's':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL;
|
|
case 'T':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS;
|
|
case 't':
|
|
return window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL;
|
|
default:
|
|
return window.SVGPathSeg.PATHSEG_UNKNOWN;
|
|
}
|
|
}
|
|
|
|
Source.prototype._nextCommandHelper = function(lookahead, previousCommand) {
|
|
if ((lookahead == '+' || lookahead == '-' || lookahead == '.' || (lookahead >= '0' && lookahead <= '9')) && previousCommand != window.SVGPathSeg.PATHSEG_CLOSEPATH) {
|
|
if (previousCommand == window.SVGPathSeg.PATHSEG_MOVETO_ABS)
|
|
return window.SVGPathSeg.PATHSEG_LINETO_ABS;
|
|
if (previousCommand == window.SVGPathSeg.PATHSEG_MOVETO_REL)
|
|
return window.SVGPathSeg.PATHSEG_LINETO_REL;
|
|
return previousCommand;
|
|
}
|
|
return window.SVGPathSeg.PATHSEG_UNKNOWN;
|
|
}
|
|
|
|
Source.prototype.initialCommandIsMoveTo = function() {
|
|
if (!this.hasMoreData())
|
|
return true;
|
|
var command = this.peekSegmentType();
|
|
return command == window.SVGPathSeg.PATHSEG_MOVETO_ABS || command == window.SVGPathSeg.PATHSEG_MOVETO_REL;
|
|
}
|
|
|
|
Source.prototype._parseNumber = function() {
|
|
var exponent = 0;
|
|
var integer = 0;
|
|
var frac = 1;
|
|
var decimal = 0;
|
|
var sign = 1;
|
|
var expsign = 1;
|
|
|
|
var startIndex = this._currentIndex;
|
|
|
|
this._skipOptionalSpaces();
|
|
|
|
if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '+')
|
|
this._currentIndex++;
|
|
else if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '-') {
|
|
this._currentIndex++;
|
|
sign = -1;
|
|
}
|
|
|
|
if (this._currentIndex == this._endIndex || ((this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') && this._string.charAt(this._currentIndex) != '.'))
|
|
return undefined;
|
|
|
|
var startIntPartIndex = this._currentIndex;
|
|
while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9')
|
|
this._currentIndex++; // Advance to first non-digit.
|
|
|
|
if (this._currentIndex != startIntPartIndex) {
|
|
var scanIntPartIndex = this._currentIndex - 1;
|
|
var multiplier = 1;
|
|
while (scanIntPartIndex >= startIntPartIndex) {
|
|
integer += multiplier * (this._string.charAt(scanIntPartIndex--) - '0');
|
|
multiplier *= 10;
|
|
}
|
|
}
|
|
|
|
if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) == '.') {
|
|
this._currentIndex++;
|
|
|
|
if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9')
|
|
return undefined;
|
|
while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') {
|
|
frac *= 10;
|
|
decimal += (this._string.charAt(this._currentIndex) - '0') / frac;
|
|
this._currentIndex += 1;
|
|
}
|
|
}
|
|
|
|
if (this._currentIndex != startIndex && this._currentIndex + 1 < this._endIndex && (this._string.charAt(this._currentIndex) == 'e' || this._string.charAt(this._currentIndex) == 'E') && (this._string.charAt(this._currentIndex + 1) != 'x' && this._string.charAt(this._currentIndex + 1) != 'm')) {
|
|
this._currentIndex++;
|
|
|
|
if (this._string.charAt(this._currentIndex) == '+') {
|
|
this._currentIndex++;
|
|
} else if (this._string.charAt(this._currentIndex) == '-') {
|
|
this._currentIndex++;
|
|
expsign = -1;
|
|
}
|
|
|
|
if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9')
|
|
return undefined;
|
|
|
|
while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') {
|
|
exponent *= 10;
|
|
exponent += (this._string.charAt(this._currentIndex) - '0');
|
|
this._currentIndex++;
|
|
}
|
|
}
|
|
|
|
var number = integer + decimal;
|
|
number *= sign;
|
|
|
|
if (exponent)
|
|
number *= Math.pow(10, expsign * exponent);
|
|
|
|
if (startIndex == this._currentIndex)
|
|
return undefined;
|
|
|
|
this._skipOptionalSpacesOrDelimiter();
|
|
|
|
return number;
|
|
}
|
|
|
|
Source.prototype._parseArcFlag = function() {
|
|
if (this._currentIndex >= this._endIndex)
|
|
return undefined;
|
|
var flag = false;
|
|
var flagChar = this._string.charAt(this._currentIndex++);
|
|
if (flagChar == '0')
|
|
flag = false;
|
|
else if (flagChar == '1')
|
|
flag = true;
|
|
else
|
|
return undefined;
|
|
|
|
this._skipOptionalSpacesOrDelimiter();
|
|
return flag;
|
|
}
|
|
|
|
Source.prototype.parseSegment = function() {
|
|
var lookahead = this._string[this._currentIndex];
|
|
var command = this._pathSegTypeFromChar(lookahead);
|
|
if (command == window.SVGPathSeg.PATHSEG_UNKNOWN) {
|
|
if (this._previousCommand == window.SVGPathSeg.PATHSEG_UNKNOWN)
|
|
return null;
|
|
command = this._nextCommandHelper(lookahead, this._previousCommand);
|
|
if (command == window.SVGPathSeg.PATHSEG_UNKNOWN)
|
|
return null;
|
|
} else {
|
|
this._currentIndex++;
|
|
}
|
|
|
|
this._previousCommand = command;
|
|
|
|
switch (command) {
|
|
case window.SVGPathSeg.PATHSEG_MOVETO_REL:
|
|
return new window.SVGPathSegMovetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_MOVETO_ABS:
|
|
return new window.SVGPathSegMovetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_LINETO_REL:
|
|
return new window.SVGPathSegLinetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_LINETO_ABS:
|
|
return new window.SVGPathSegLinetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:
|
|
return new window.SVGPathSegLinetoHorizontalRel(owningPathSegList, this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:
|
|
return new window.SVGPathSegLinetoHorizontalAbs(owningPathSegList, this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:
|
|
return new window.SVGPathSegLinetoVerticalRel(owningPathSegList, this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:
|
|
return new window.SVGPathSegLinetoVerticalAbs(owningPathSegList, this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_CLOSEPATH:
|
|
this._skipOptionalSpaces();
|
|
return new window.SVGPathSegClosePath(owningPathSegList);
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL:
|
|
var points = {x1: this._parseNumber(), y1: this._parseNumber(), x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegCurvetoCubicRel(owningPathSegList, points.x, points.y, points.x1, points.y1, points.x2, points.y2);
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS:
|
|
var points = {x1: this._parseNumber(), y1: this._parseNumber(), x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegCurvetoCubicAbs(owningPathSegList, points.x, points.y, points.x1, points.y1, points.x2, points.y2);
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL:
|
|
var points = {x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegCurvetoCubicSmoothRel(owningPathSegList, points.x, points.y, points.x2, points.y2);
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:
|
|
var points = {x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegCurvetoCubicSmoothAbs(owningPathSegList, points.x, points.y, points.x2, points.y2);
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL:
|
|
var points = {x1: this._parseNumber(), y1: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegCurvetoQuadraticRel(owningPathSegList, points.x, points.y, points.x1, points.y1);
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS:
|
|
var points = {x1: this._parseNumber(), y1: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegCurvetoQuadraticAbs(owningPathSegList, points.x, points.y, points.x1, points.y1);
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:
|
|
return new window.SVGPathSegCurvetoQuadraticSmoothRel(owningPathSegList, this._parseNumber(), this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:
|
|
return new window.SVGPathSegCurvetoQuadraticSmoothAbs(owningPathSegList, this._parseNumber(), this._parseNumber());
|
|
case window.SVGPathSeg.PATHSEG_ARC_REL:
|
|
var points = {x1: this._parseNumber(), y1: this._parseNumber(), arcAngle: this._parseNumber(), arcLarge: this._parseArcFlag(), arcSweep: this._parseArcFlag(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegArcRel(owningPathSegList, points.x, points.y, points.x1, points.y1, points.arcAngle, points.arcLarge, points.arcSweep);
|
|
case window.SVGPathSeg.PATHSEG_ARC_ABS:
|
|
var points = {x1: this._parseNumber(), y1: this._parseNumber(), arcAngle: this._parseNumber(), arcLarge: this._parseArcFlag(), arcSweep: this._parseArcFlag(), x: this._parseNumber(), y: this._parseNumber()};
|
|
return new window.SVGPathSegArcAbs(owningPathSegList, points.x, points.y, points.x1, points.y1, points.arcAngle, points.arcLarge, points.arcSweep);
|
|
default:
|
|
throw 'Unknown path seg type.'
|
|
}
|
|
}
|
|
|
|
var builder = new Builder();
|
|
var source = new Source(string);
|
|
|
|
if (!source.initialCommandIsMoveTo())
|
|
return [];
|
|
while (source.hasMoreData()) {
|
|
var pathSeg = source.parseSegment();
|
|
if (!pathSeg)
|
|
return [];
|
|
builder.appendSegment(pathSeg);
|
|
}
|
|
|
|
return builder.pathSegList;
|
|
}
|
|
}
|
|
}());
|
|
|
|
/*****
|
|
* @svgpathend
|
|
*
|
|
* The above code is a derivative work of some part of the SVGPathSeg API.
|
|
*
|
|
* This API is a drop-in replacement for the SVGPathSeg and SVGPathSegList APIs that were removed from
|
|
* SVG2 (https://lists.w3.org/Archives/Public/www-svg/2015Jun/0044.html), including the latest spec
|
|
* changes which were implemented in Firefox 43 and Chrome 46.
|
|
*
|
|
* @source https://github.com/progers/pathseg
|
|
*/
|
|
|
|
|
|
/*****
|
|
* @licstart
|
|
*
|
|
* The following is the license notice for the part of JavaScript code of
|
|
* this page included between the '@libreofficestart' and the '@libreofficeend'
|
|
* notes.
|
|
*/
|
|
|
|
/***** ******************************************************************
|
|
*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the 'License'); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*
|
|
************************************************************************/
|
|
|
|
/*****
|
|
* @licend
|
|
*
|
|
* The above is the license notice for the part of JavaScript code of
|
|
* this page included between the '@libreofficestart' and the '@libreofficeend'
|
|
* notes.
|
|
*/
|
|
|
|
|
|
/*****
|
|
* @libreofficestart
|
|
*
|
|
* Several parts of the following code are the result of the porting,
|
|
* started on August 2011, of the C++ code included in the source
|
|
* files placed under the folder '/slideshow/source' and
|
|
* sub-folders. This got later rebased onto the AL2-licensed versions
|
|
* of those files in early 2013.
|
|
* @source https://cgit.freedesktop.org/libreoffice/core/tree/slideshow/source
|
|
*
|
|
*/
|
|
|
|
|
|
window.onload = init;
|
|
|
|
|
|
var aOOOElemMetaSlides = 'ooo:meta_slides';
|
|
var aOOOElemMetaSlide = 'ooo:meta_slide';
|
|
var aOOOElemTextField = 'ooo:text_field';
|
|
var aPresentationClipPathId = 'presentation_clip_path';
|
|
var aPresentationClipPathShrinkId = 'presentation_clip_path_shrink';
|
|
|
|
var aOOOAttrNumberOfSlides = 'number-of-slides';
|
|
var aOOOAttrStartSlideNumber= 'start-slide-number';
|
|
var aOOOAttrNumberingType = 'page-numbering-type';
|
|
var aOOOAttrListItemNumberingType= 'numbering-type';
|
|
var aOOOAttrUsePositionedChars = 'use-positioned-chars';
|
|
|
|
var aOOOAttrSlide = 'slide';
|
|
var aOOOAttrMaster = 'master';
|
|
var aOOOAttrDisplayName = 'display-name';
|
|
var aOOOAttrSlideDuration = 'slide-duration';
|
|
var aOOOAttrHasTransition = 'has-transition';
|
|
var aOOOAttrHasCustomBackground = 'has-custom-background';
|
|
var aOOOAttrBackgroundVisibility = 'background-visibility';
|
|
var aOOOAttrMasterObjectsVisibility = 'master-objects-visibility';
|
|
var aOOOAttrPageNumberVisibility = 'page-number-visibility';
|
|
var aOOOAttrDateTimeVisibility = 'date-time-visibility';
|
|
var aOOOAttrFooterVisibility = 'footer-visibility';
|
|
var aOOOAttrHeaderVisibility = 'header-visibility';
|
|
var aOOOAttrDateTimeField = 'date-time-field';
|
|
var aOOOAttrFooterField = 'footer-field';
|
|
var aOOOAttrHeaderField = 'header-field';
|
|
|
|
var aOOOAttrDateTimeFormat = 'date-time-format';
|
|
|
|
var aOOOAttrTextAdjust = 'text-adjust';
|
|
|
|
var aClipPathGroupClassName = 'ClipPathGroup';
|
|
var aPageClassName = 'Page';
|
|
var aSlideNumberClassName = 'PageNumber';
|
|
var aDateTimeClassName = 'DateTime';
|
|
var aFooterClassName = 'Footer';
|
|
var aHeaderClassName = 'Header';
|
|
var aDateClassName = 'Date';
|
|
var aTimeClassName = 'Time';
|
|
var aSlideNameClassName='PageName';
|
|
|
|
var NSS = {};
|
|
NSS['svg']='http://www.w3.org/2000/svg';
|
|
NSS['rdf']='http://www.w3.org/1999/02/22-rdf-syntax-ns#';
|
|
NSS['xlink']='http://www.w3.org/1999/xlink';
|
|
NSS['xml']='http://www.w3.org/XML/1998/namespace';
|
|
NSS['ooo'] = 'http://xml.openoffice.org/svg/export';
|
|
NSS['presentation'] = 'http://sun.com/xmlns/staroffice/presentation';
|
|
NSS['smil'] = 'http://www.w3.org/2001/SMIL20/';
|
|
NSS['anim'] = 'urn:oasis:names:tc:opendocument:xmlns:animation:1.0';
|
|
|
|
var SLIDE_MODE = 1;
|
|
var INDEX_MODE = 2;
|
|
|
|
var MOUSE_UP = 1;
|
|
var MOUSE_DOWN = 2; // eslint-disable-line no-unused-vars
|
|
var MOUSE_MOVE = 3; // eslint-disable-line no-unused-vars
|
|
var MOUSE_WHEEL = 4;
|
|
|
|
var LEFT_KEY = 37; // cursor left keycode
|
|
var UP_KEY = 38; // cursor up keycode
|
|
var RIGHT_KEY = 39; // cursor right keycode
|
|
var DOWN_KEY = 40; // cursor down keycode
|
|
var PAGE_UP_KEY = 33; // page up keycode
|
|
var PAGE_DOWN_KEY = 34; // page down keycode
|
|
var HOME_KEY = 36; // home keycode
|
|
var END_KEY = 35; // end keycode
|
|
var ENTER_KEY = 13;
|
|
var SPACE_KEY = 32;
|
|
var ESCAPE_KEY = 27;
|
|
var B_KEY = 66;
|
|
var P_KEY = 80;
|
|
var Q_KEY = 81;
|
|
var W_KEY = 87;
|
|
|
|
var HIDDEN = 0;
|
|
var VISIBLE = 1;
|
|
var INHERIT = 2;
|
|
var aVisibilityAttributeValue = [ 'hidden', 'visible', 'inherit' ]; // eslint-disable-line no-unused-vars
|
|
var aVisibilityValue = { 'hidden' : HIDDEN, 'visible' : VISIBLE, 'inherit' : INHERIT };
|
|
|
|
var ROOT_NODE = document.getElementsByTagNameNS( NSS['svg'], 'svg' )[0];
|
|
var WIDTH = 0;
|
|
var HEIGHT = 0;
|
|
var INDEX_COLUMNS_DEFAULT = 3;
|
|
var INDEX_OFFSET = 0;
|
|
|
|
var Detect = configureDetectionTools();
|
|
var theMetaDoc;
|
|
var theSlideIndexPage;
|
|
var currentMode = SLIDE_MODE;
|
|
var processingEffect = false;
|
|
var nCurSlide = undefined;
|
|
var bTextHasBeenSelected = false;
|
|
var sLastSelectedText = '';
|
|
|
|
|
|
var charCodeDictionary = getDefaultCharCodeDictionary();
|
|
var keyCodeDictionary = getDefaultKeyCodeDictionary();
|
|
|
|
var mouseHandlerDictionary = getDefaultMouseHandlerDictionary();
|
|
|
|
|
|
function object( aObject )
|
|
{
|
|
var F = function() {};
|
|
F.prototype = aObject;
|
|
return new F();
|
|
}
|
|
|
|
|
|
function extend( aSubType, aSuperType )
|
|
{
|
|
if (!aSuperType || !aSubType)
|
|
{
|
|
alert('extend failed, verify dependencies');
|
|
}
|
|
var OP = Object.prototype;
|
|
var sp = aSuperType.prototype;
|
|
var rp = object( sp );
|
|
aSubType.prototype = rp;
|
|
|
|
rp.constructor = aSubType;
|
|
aSubType.superclass = sp;
|
|
|
|
if (aSuperType != Object && sp.constructor == OP.constructor)
|
|
{
|
|
sp.constructor = aSuperType;
|
|
}
|
|
|
|
return aSubType;
|
|
}
|
|
|
|
|
|
function instantiate( TemplateClass, BaseType )
|
|
{
|
|
if( !TemplateClass.instanceSet )
|
|
TemplateClass.instanceSet = [];
|
|
|
|
var nSize = TemplateClass.instanceSet.length;
|
|
|
|
for( var i = 0; i < nSize; ++i )
|
|
{
|
|
if( TemplateClass.instanceSet[i].base === BaseType )
|
|
return TemplateClass.instanceSet[i].instance;
|
|
}
|
|
|
|
TemplateClass.instanceSet[ nSize ] = {};
|
|
TemplateClass.instanceSet[ nSize ].base = BaseType;
|
|
TemplateClass.instanceSet[ nSize ].instance = TemplateClass( BaseType );
|
|
|
|
return TemplateClass.instanceSet[ nSize ].instance;
|
|
}
|
|
|
|
|
|
function Rectangle( aSVGRectElem )
|
|
{
|
|
var x = parseInt( aSVGRectElem.getAttribute( 'x' ) );
|
|
var y = parseInt( aSVGRectElem.getAttribute( 'y' ) );
|
|
var width = parseInt( aSVGRectElem.getAttribute( 'width' ) );
|
|
var height = parseInt( aSVGRectElem.getAttribute( 'height' ) );
|
|
|
|
this.left = x;
|
|
this.right = x + width;
|
|
this.top = y;
|
|
this.bottom = y + height;
|
|
}
|
|
|
|
function getKeyByValue(aObj, value) {
|
|
for(var key in aObj) {
|
|
if(aObj[key] == value)
|
|
return key;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function log( message )
|
|
{
|
|
if( typeof console == 'object' )
|
|
{
|
|
console.log( message );
|
|
}
|
|
else if( typeof opera == 'object' )
|
|
{
|
|
opera.postError( message );
|
|
}
|
|
else if( typeof java == 'object' && typeof java.lang == 'object' )
|
|
{
|
|
java.lang.System.out.println( message );
|
|
}
|
|
}
|
|
|
|
function getNSAttribute( sNSPrefix, aElem, sAttrName )
|
|
{
|
|
if( !aElem ) return null;
|
|
if( 'getAttributeNS' in aElem )
|
|
{
|
|
return aElem.getAttributeNS( NSS[sNSPrefix], sAttrName );
|
|
}
|
|
else
|
|
{
|
|
return aElem.getAttribute( sNSPrefix + ':' + sAttrName );
|
|
}
|
|
}
|
|
|
|
function getOOOAttribute( aElem, sAttrName )
|
|
{
|
|
return getNSAttribute( 'ooo', aElem, sAttrName );
|
|
}
|
|
|
|
function setNSAttribute( sNSPrefix, aElem, sAttrName, aValue )
|
|
{
|
|
if( !aElem ) return false;
|
|
if( 'setAttributeNS' in aElem )
|
|
{
|
|
aElem.setAttributeNS( NSS[sNSPrefix], sAttrName, aValue );
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
aElem.setAttribute(sNSPrefix + ':' + sAttrName, aValue );
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function getElementsByClassName( aElem, sClassName )
|
|
{
|
|
|
|
var aElementSet = [];
|
|
if( 'getElementsByClassName' in aElem )
|
|
{
|
|
aElementSet = aElem.getElementsByClassName( sClassName );
|
|
}
|
|
else
|
|
{
|
|
var aElementSetByClassProperty = getElementsByProperty( aElem, 'class' );
|
|
for( var i = 0; i < aElementSetByClassProperty.length; ++i )
|
|
{
|
|
var sAttrClassName = aElementSetByClassProperty[i].getAttribute( 'class' );
|
|
if( sAttrClassName == sClassName )
|
|
{
|
|
aElementSet.push( aElementSetByClassProperty[i] );
|
|
}
|
|
}
|
|
}
|
|
return aElementSet;
|
|
}
|
|
|
|
function getElementByClassName( aElem, sClassName /*, sTagName */)
|
|
{
|
|
var aElementSet = getElementsByClassName( aElem, sClassName );
|
|
if ( aElementSet.length == 1 )
|
|
return aElementSet[0];
|
|
else
|
|
return null;
|
|
}
|
|
|
|
function getClassAttribute( aElem )
|
|
{
|
|
if( aElem )
|
|
return aElem.getAttribute( 'class' );
|
|
return '';
|
|
}
|
|
|
|
function createElementGroup( aParentElement, aElementList, nFrom, nCount, sGroupClass, sGroupId )
|
|
{
|
|
var nTo = nFrom + nCount;
|
|
if( nCount < 1 || aElementList.length < nTo )
|
|
{
|
|
log( 'createElementGroup: not enough elements available.' );
|
|
return;
|
|
}
|
|
var firstElement = aElementList[nFrom];
|
|
if( !firstElement )
|
|
{
|
|
log( 'createElementGroup: element not found.' );
|
|
return;
|
|
}
|
|
var aGroupElement = document.createElementNS( NSS['svg'], 'g' );
|
|
if( sGroupId )
|
|
aGroupElement.setAttribute( 'id', sGroupId );
|
|
if( sGroupClass )
|
|
aGroupElement.setAttribute( 'class', sGroupClass );
|
|
aParentElement.insertBefore( aGroupElement, firstElement );
|
|
var i = nFrom;
|
|
for( ; i < nTo; ++i )
|
|
{
|
|
aParentElement.removeChild( aElementList[i] );
|
|
aGroupElement.appendChild( aElementList[i] );
|
|
}
|
|
}
|
|
|
|
function initVisibilityProperty( aElement )
|
|
{
|
|
var nVisibility = VISIBLE;
|
|
var sVisibility = aElement.getAttribute( 'visibility' );
|
|
if( sVisibility ) nVisibility = aVisibilityValue[ sVisibility ];
|
|
return nVisibility;
|
|
}
|
|
|
|
function getSafeIndex( nIndex, nMin, nMax )
|
|
{
|
|
if( nIndex < nMin )
|
|
return nMin;
|
|
else if( nIndex > nMax )
|
|
return nMax;
|
|
else
|
|
return nIndex;
|
|
}
|
|
|
|
function getUrlParameter(name)
|
|
{
|
|
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
|
|
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
|
var results = regex.exec(window.location.search);
|
|
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
|
|
}
|
|
|
|
function getRandomInt( nMax )
|
|
{
|
|
return Math.floor( Math.random() * nMax );
|
|
}
|
|
|
|
|
|
function DebugPrinter()
|
|
{
|
|
this.bEnabled = false;
|
|
}
|
|
|
|
|
|
DebugPrinter.prototype.on = function()
|
|
{
|
|
this.bEnabled = true;
|
|
};
|
|
|
|
DebugPrinter.prototype.off = function()
|
|
{
|
|
this.bEnabled = false;
|
|
};
|
|
|
|
DebugPrinter.prototype.isEnabled = function()
|
|
{
|
|
return this.bEnabled;
|
|
};
|
|
|
|
DebugPrinter.prototype.print = function( sMessage, nTime )
|
|
{
|
|
if( this.isEnabled() )
|
|
{
|
|
var sInfo = 'DBG: ' + sMessage;
|
|
if( nTime )
|
|
sInfo += ' (at: ' + String( nTime / 1000 ) + 's)';
|
|
log( sInfo );
|
|
}
|
|
};
|
|
|
|
|
|
var aGenericDebugPrinter = new DebugPrinter();
|
|
aGenericDebugPrinter.off();
|
|
var DBGLOG = bind2( DebugPrinter.prototype.print, aGenericDebugPrinter );
|
|
|
|
var NAVDBG = new DebugPrinter();
|
|
NAVDBG.off();
|
|
|
|
var ANIMDBG = new DebugPrinter();
|
|
ANIMDBG.off();
|
|
|
|
var aRegisterEventDebugPrinter = new DebugPrinter();
|
|
aRegisterEventDebugPrinter.off();
|
|
|
|
var aTimerEventQueueDebugPrinter = new DebugPrinter();
|
|
aTimerEventQueueDebugPrinter.off();
|
|
|
|
var aEventMultiplexerDebugPrinter = new DebugPrinter();
|
|
aEventMultiplexerDebugPrinter.off();
|
|
|
|
var aNextEffectEventArrayDebugPrinter = new DebugPrinter();
|
|
aNextEffectEventArrayDebugPrinter.off();
|
|
|
|
var aActivityQueueDebugPrinter = new DebugPrinter();
|
|
aActivityQueueDebugPrinter.off();
|
|
|
|
var aAnimatedElementDebugPrinter = new DebugPrinter();
|
|
aAnimatedElementDebugPrinter.off();
|
|
|
|
|
|
function MetaDocument()
|
|
{
|
|
var aMetaDocElem = document.getElementById( aOOOElemMetaSlides );
|
|
assert( aMetaDocElem, 'MetaDocument: the svg element with id:' + aOOOElemMetaSlides + 'is not valid.');
|
|
|
|
this.nNumberOfSlides = parseInt( aMetaDocElem.getAttributeNS( NSS['ooo'], aOOOAttrNumberOfSlides ) );
|
|
assert( typeof this.nNumberOfSlides == 'number' && this.nNumberOfSlides > 0,
|
|
'MetaDocument: number of slides is zero or undefined.' );
|
|
this.nStartSlideNumber = parseInt( aMetaDocElem.getAttributeNS( NSS['ooo'], aOOOAttrStartSlideNumber ) ) || 0;
|
|
var aParmStartSlideNumber = getUrlParameter('StartSlideNumber');
|
|
if (aParmStartSlideNumber !== '')
|
|
{
|
|
this.nStartSlideNumber = parseInt(aParmStartSlideNumber);
|
|
}
|
|
this.sPageNumberingType = aMetaDocElem.getAttributeNS( NSS['ooo'], aOOOAttrNumberingType ) || 'arabic';
|
|
this.bIsUsePositionedChars = ( aMetaDocElem.getAttributeNS( NSS['ooo'], aOOOAttrUsePositionedChars ) === 'true' );
|
|
|
|
this.aClipPathGroup = getElementByClassName( ROOT_NODE, aClipPathGroupClassName );
|
|
assert( this.aClipPathGroup, 'MetaDocument: the clip path group element is not valid.');
|
|
|
|
this.aPresentationClipPath = document.getElementById( aPresentationClipPathId );
|
|
assert( this.aPresentationClipPath,
|
|
'MetaDocument: the presentation clip path element element is not valid.');
|
|
|
|
this.aMetaSlideSet = [];
|
|
this.aMasterPageSet = {};
|
|
this.aTextFieldHandlerSet = {};
|
|
this.aTextFieldContentProviderSet = [];
|
|
this.aSlideNumberProvider = new SlideNumberProvider( this.nStartSlideNumber + 1, this.sPageNumberingType );
|
|
this.aCurrentDateProvider = new CurrentDateTimeProvider( null, '<date>' );
|
|
this.aCurrentTimeProvider = new CurrentDateTimeProvider( null, '<time>' );
|
|
|
|
this.bIsAnimated = false;
|
|
this.aSlideAnimationsMap = {};
|
|
this.initSlideAnimationsMap();
|
|
|
|
this.theMetaDummySlide = new MetaSlide( 'ooo:meta_dummy_slide', this );
|
|
|
|
for( var i = 0; i < this.nNumberOfSlides; ++i )
|
|
{
|
|
var sMetaSlideId = aOOOElemMetaSlide + '_' + i;
|
|
this.aMetaSlideSet.push( new MetaSlide( sMetaSlideId, this ) );
|
|
}
|
|
assert( this.aMetaSlideSet.length == this.nNumberOfSlides,
|
|
'MetaDocument: aMetaSlideSet.length != nNumberOfSlides.' );
|
|
}
|
|
|
|
MetaDocument.prototype =
|
|
{
|
|
|
|
getCurrentSlide : function()
|
|
{
|
|
return this.aMetaSlideSet[nCurSlide];
|
|
},
|
|
|
|
setCurrentSlide : function( nSlideIndex )
|
|
{
|
|
if( nSlideIndex >= 0 && nSlideIndex < this.nNumberOfSlides )
|
|
{
|
|
if( nCurSlide !== undefined )
|
|
this.aMetaSlideSet[nCurSlide].hide();
|
|
this.aMetaSlideSet[nSlideIndex].show();
|
|
nCurSlide = nSlideIndex;
|
|
}
|
|
else
|
|
{
|
|
log('MetaDocument.setCurrentSlide: slide index out of range: ' + nSlideIndex );
|
|
}
|
|
},
|
|
|
|
|
|
initSlideAnimationsMap : function()
|
|
{
|
|
var aAnimationsSection = document.getElementById( 'presentation-animations' );
|
|
if( aAnimationsSection )
|
|
{
|
|
var aAnimationsDefSet = aAnimationsSection.getElementsByTagName( 'defs' );
|
|
|
|
this.bIsAnimated = ( typeof aAnimationsDefSet.length =='number' &&
|
|
aAnimationsDefSet.length > 0 );
|
|
|
|
for( var i = 0; i < aAnimationsDefSet.length; ++i )
|
|
{
|
|
var sSlideId = aAnimationsDefSet[i].getAttributeNS( NSS['ooo'], aOOOAttrSlide );
|
|
var aChildSet = getElementChildren( aAnimationsDefSet[i] );
|
|
if( sSlideId && ( aChildSet.length === 1 ) )
|
|
{
|
|
this.aSlideAnimationsMap[ sSlideId ] = aChildSet[0];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}; // end MetaDocument prototype
|
|
|
|
function MetaSlide( sMetaSlideId, aMetaDoc )
|
|
{
|
|
this.theDocument = document;
|
|
this.id = sMetaSlideId;
|
|
this.theMetaDoc = aMetaDoc;
|
|
|
|
this.element = this.theDocument.getElementById( this.id );
|
|
assert( this.element,
|
|
'MetaSlide: meta_slide element <' + this.id + '> not found.' );
|
|
|
|
this.slideId = this.element.getAttributeNS( NSS['ooo'], aOOOAttrSlide );
|
|
this.slideElement = this.theDocument.getElementById( this.slideId );
|
|
assert( this.slideElement,
|
|
'MetaSlide: slide element <' + this.slideId + '> not found.' );
|
|
|
|
if( this.slideId !== 'dummy_slide' )
|
|
this.nSlideNumber = parseInt( this.slideId.substr(2) );
|
|
else
|
|
this.nSlideNumber= -1;
|
|
|
|
this.slideName = this.element.getAttributeNS( NSS['ooo'], aOOOAttrDisplayName );
|
|
|
|
this.aContainerElement = this.slideElement.parentNode;
|
|
this.slideContainerId = this.aContainerElement.getAttribute( 'id' );
|
|
this.aVisibilityStatusElement = this.aContainerElement.parentNode;
|
|
|
|
this.pageElement = getElementByClassName( this.slideElement, aPageClassName );
|
|
assert( this.pageElement,
|
|
'MetaSlide: page element <' + this.slideId + '> not found.' );
|
|
|
|
this.backgroundElement = getElementByClassName( this.pageElement, 'Background' );
|
|
if( this.backgroundElement )
|
|
{
|
|
this.backgroundId = this.backgroundElement.getAttribute( 'id' );
|
|
}
|
|
|
|
this.initPlaceholderElements();
|
|
|
|
this.masterPage = this.initMasterPage();
|
|
|
|
this.bHasCustomBackground = this.initHasCustomBackground();
|
|
|
|
this.nAreMasterObjectsVisible = this.initVisibilityProperty( aOOOAttrMasterObjectsVisibility, VISIBLE );
|
|
this.nIsBackgroundVisible = this.initVisibilityProperty( aOOOAttrBackgroundVisibility, VISIBLE );
|
|
this.nIsPageNumberVisible = this.initVisibilityProperty( aOOOAttrPageNumberVisibility, HIDDEN );
|
|
this.nIsDateTimeVisible = this.initVisibilityProperty( aOOOAttrDateTimeVisibility, VISIBLE );
|
|
this.nIsFooterVisible = this.initVisibilityProperty( aOOOAttrFooterVisibility, VISIBLE );
|
|
this.nIsHeaderVisible = this.initVisibilityProperty( aOOOAttrHeaderVisibility, VISIBLE );
|
|
|
|
this.bIsDateTimeVariable = undefined;
|
|
|
|
this.aTextFieldContentProviderSet = {};
|
|
this.aTextFieldContentProviderSet[aSlideNumberClassName] = this.initSlideNumberFieldContentProvider();
|
|
this.aTextFieldContentProviderSet[aDateTimeClassName] = this.initDateTimeFieldContentProvider( aOOOAttrDateTimeField );
|
|
this.aTextFieldContentProviderSet[aFooterClassName] = this.initFixedTextFieldContentProvider( aOOOAttrFooterField );
|
|
this.aTextFieldContentProviderSet[aHeaderClassName] = this.initFixedTextFieldContentProvider( aOOOAttrHeaderField );
|
|
this.aTextFieldContentProviderSet[aDateClassName] = this.theMetaDoc.aCurrentDateProvider;
|
|
this.aTextFieldContentProviderSet[aTimeClassName] = this.theMetaDoc.aCurrentTimeProvider;
|
|
this.aTextFieldContentProviderSet[aSlideNameClassName] = new FixedTextProvider( this.slideName );
|
|
|
|
this.fDuration = this.initSlideDuration();
|
|
|
|
this.aTransitionHandler = null;
|
|
this.bHasTransition = this.initHasTransition() || true;
|
|
if( this.bHasTransition )
|
|
{
|
|
this.aTransitionHandler = new SlideTransition( this.getSlideAnimationsRoot(), this.slideId );
|
|
}
|
|
|
|
this.aSlideAnimationsHandler = new SlideAnimations( aSlideShow.getContext() );
|
|
this.aSlideAnimationsHandler.importAnimations( this.getSlideAnimationsRoot() );
|
|
this.aSlideAnimationsHandler.parseElements();
|
|
|
|
if( false && this.aSlideAnimationsHandler.aRootNode )
|
|
log( this.aSlideAnimationsHandler.aRootNode.info( true ) );
|
|
|
|
this.aTextShapeSet = this.collectTextShapes();
|
|
|
|
this.aHyperlinkSet = this.initHyperlinks();
|
|
|
|
}
|
|
|
|
MetaSlide.prototype =
|
|
{
|
|
|
|
show : function()
|
|
{
|
|
this.updateMasterPageView();
|
|
this.aVisibilityStatusElement.setAttribute( 'visibility', 'inherit' );
|
|
},
|
|
|
|
hide : function()
|
|
{
|
|
this.aVisibilityStatusElement.setAttribute( 'visibility', 'hidden' );
|
|
},
|
|
|
|
updateMasterPageView : function()
|
|
{
|
|
if( !this.aMasterPageView )
|
|
{
|
|
this.aMasterPageView = new MasterPageView( this );
|
|
this.aMasterPageView.attachToSlide();
|
|
}
|
|
this.aMasterPageView.update();
|
|
},
|
|
|
|
|
|
initPlaceholderElements : function()
|
|
{
|
|
var aPlaceholderList = getElementsByClassName(this.pageElement , 'PlaceholderText' );
|
|
var i = 0;
|
|
for( ; i < aPlaceholderList.length; ++i )
|
|
{
|
|
var aPlaceholderElem = aPlaceholderList[i];
|
|
var sClass = aPlaceholderElem.getAttribute('class');
|
|
var sFieldType = sClass.split(' ')[1];
|
|
if( sFieldType === aDateClassName)
|
|
aPlaceholderElem.textContent = new Date().toLocaleDateString();
|
|
else if( sFieldType === aTimeClassName )
|
|
aPlaceholderElem.textContent = new Date().toLocaleTimeString();
|
|
}
|
|
},
|
|
|
|
initMasterPage : function()
|
|
{
|
|
var sMasterPageId = this.element.getAttributeNS( NSS['ooo'], aOOOAttrMaster );
|
|
|
|
if( !this.theMetaDoc.aMasterPageSet.hasOwnProperty( sMasterPageId ) )
|
|
{
|
|
this.theMetaDoc.aMasterPageSet[ sMasterPageId ] = new MasterPage( sMasterPageId, this );
|
|
|
|
this.theMetaDoc.aTextFieldHandlerSet[ sMasterPageId ] = {};
|
|
}
|
|
return this.theMetaDoc.aMasterPageSet[ sMasterPageId ];
|
|
},
|
|
|
|
initSlideDuration : function()
|
|
{
|
|
var sSlideDuration = this.element.getAttributeNS( NSS['ooo'], aOOOAttrSlideDuration );
|
|
if( sSlideDuration && sSlideDuration.length > 0 )
|
|
return parseFloat( sSlideDuration );
|
|
else
|
|
return -1;
|
|
},
|
|
|
|
initHasTransition : function()
|
|
{
|
|
var sHasTransition = this.element.getAttributeNS( NSS['ooo'], aOOOAttrHasTransition );
|
|
return ( sHasTransition === 'true' );
|
|
},
|
|
|
|
initHasCustomBackground : function()
|
|
{
|
|
var sHasCustomBackground = this.element.getAttributeNS( NSS['ooo'], aOOOAttrHasCustomBackground );
|
|
return ( sHasCustomBackground === 'true' );
|
|
},
|
|
|
|
initVisibilityProperty : function( aVisibilityAttribute, nDefaultValue )
|
|
{
|
|
var nVisibility = nDefaultValue;
|
|
var sVisibility = getOOOAttribute( this.element, aVisibilityAttribute );
|
|
if( sVisibility )
|
|
nVisibility = aVisibilityValue[ sVisibility ];
|
|
return nVisibility;
|
|
},
|
|
|
|
initSlideNumberFieldContentProvider : function()
|
|
{
|
|
return this.theMetaDoc.aSlideNumberProvider;
|
|
},
|
|
|
|
initDateTimeFieldContentProvider : function( aOOOAttrDateTimeField )
|
|
{
|
|
var sTextFieldId = getOOOAttribute( this.element, aOOOAttrDateTimeField );
|
|
if( !sTextFieldId ) return null;
|
|
|
|
var nLength = aOOOElemTextField.length + 1;
|
|
var nIndex = parseInt(sTextFieldId.substring( nLength ) );
|
|
if( typeof nIndex != 'number') return null;
|
|
|
|
if( !this.theMetaDoc.aTextFieldContentProviderSet[ nIndex ] )
|
|
{
|
|
var aTextField;
|
|
var aTextFieldElem = document.getElementById( sTextFieldId );
|
|
var sClassName = getClassAttribute( aTextFieldElem );
|
|
if( sClassName == 'FixedDateTimeField' )
|
|
{
|
|
aTextField = new FixedTextByElementProvider( aTextFieldElem );
|
|
this.bIsDateTimeVariable = false;
|
|
}
|
|
else if( sClassName == 'VariableDateTimeField' )
|
|
{
|
|
aTextField = new CurrentDateTimeProvider( aTextFieldElem );
|
|
this.bIsDateTimeVariable = true;
|
|
}
|
|
else
|
|
{
|
|
aTextField = null;
|
|
}
|
|
this.theMetaDoc.aTextFieldContentProviderSet[ nIndex ] = aTextField;
|
|
}
|
|
return this.theMetaDoc.aTextFieldContentProviderSet[ nIndex ];
|
|
},
|
|
|
|
initFixedTextFieldContentProvider : function( aOOOAttribute )
|
|
{
|
|
var sTextFieldId = getOOOAttribute( this.element, aOOOAttribute );
|
|
if( !sTextFieldId ) return null;
|
|
|
|
var nLength = aOOOElemTextField.length + 1;
|
|
var nIndex = parseInt( sTextFieldId.substring( nLength ) );
|
|
if( typeof nIndex != 'number') return null;
|
|
|
|
if( !this.theMetaDoc.aTextFieldContentProviderSet[ nIndex ] )
|
|
{
|
|
var aTextFieldElem = document.getElementById( sTextFieldId );
|
|
this.theMetaDoc.aTextFieldContentProviderSet[ nIndex ]
|
|
= new FixedTextByElementProvider( aTextFieldElem );
|
|
}
|
|
return this.theMetaDoc.aTextFieldContentProviderSet[ nIndex ];
|
|
},
|
|
|
|
collectTextShapes : function()
|
|
{
|
|
var aTextShapeSet = [];
|
|
var aTextShapeIndexElem = getElementByClassName( document, 'TextShapeIndex' );
|
|
if( aTextShapeIndexElem )
|
|
{
|
|
var aIndexEntryList = getElementChildren( aTextShapeIndexElem );
|
|
var i;
|
|
for( i = 0; i < aIndexEntryList.length; ++i )
|
|
{
|
|
var sSlideId = getOOOAttribute( aIndexEntryList[i], 'slide' );
|
|
if( sSlideId === this.slideId )
|
|
{
|
|
var sTextShapeIds = getOOOAttribute( aIndexEntryList[i], 'id-list' );
|
|
if( sTextShapeIds )
|
|
{
|
|
var aTextShapeIdSet = sTextShapeIds.split( ' ' );
|
|
var j;
|
|
for( j = 0; j < aTextShapeIdSet.length; ++j )
|
|
{
|
|
var aTextShapeElem = document.getElementById( aTextShapeIdSet[j] );
|
|
if( aTextShapeElem )
|
|
{
|
|
aTextShapeSet.push( aTextShapeElem );
|
|
}
|
|
else
|
|
{
|
|
log( 'warning: MetaSlide.collectTextShapes: text shape with id <' + aTextShapeIdSet[j] + '> is not valid.' );
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return aTextShapeSet;
|
|
},
|
|
|
|
initHyperlinks : function()
|
|
{
|
|
var aHyperlinkSet = {};
|
|
var i;
|
|
for( i = 0; i < this.aTextShapeSet.length; ++i )
|
|
{
|
|
if( this.aTextShapeSet[i] )
|
|
{
|
|
var aHyperlinkIdList = getElementByClassName( this.aTextShapeSet[i], 'HyperlinkIdList' );
|
|
if( aHyperlinkIdList )
|
|
{
|
|
var sHyperlinkIds = aHyperlinkIdList.textContent;
|
|
if( sHyperlinkIds )
|
|
{
|
|
var aHyperlinkIdSet = sHyperlinkIds.trim().split( ' ' );
|
|
var j;
|
|
for( j = 0; j < aHyperlinkIdSet.length; ++j )
|
|
{
|
|
var sId = aHyperlinkIdSet[j];
|
|
aHyperlinkSet[ sId ] = new HyperlinkElement( sId, this.aSlideAnimationsHandler.aEventMultiplexer );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return aHyperlinkSet;
|
|
},
|
|
|
|
getSlideAnimationsRoot : function()
|
|
{
|
|
return this.theMetaDoc.aSlideAnimationsMap[ this.slideId ];
|
|
}
|
|
|
|
}; // end MetaSlide prototype
|
|
|
|
function removeRedundantParagraphFromTextFieldShape( aObject )
|
|
{
|
|
var aTextElem = getElementByClassName( aObject, 'SVGTextShape' );
|
|
if( aTextElem )
|
|
{
|
|
var aPlaceholderElement = getElementsByClassName(aTextElem, 'PlaceholderText');
|
|
if( aPlaceholderElement )
|
|
{
|
|
var aTextParagraphSet = getElementsByClassName(aTextElem, 'TextParagraph');
|
|
if( aTextParagraphSet.length > 1 )
|
|
{
|
|
var i = aTextParagraphSet.length;
|
|
while( i > 1 )
|
|
{
|
|
aTextElem.removeChild(aTextParagraphSet[i - 1]);
|
|
--i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function getTextFieldType ( elem ) {
|
|
var sFieldType = null;
|
|
var sClass = elem.getAttribute('class');
|
|
if( sClass === 'TextShape' )
|
|
{
|
|
var aPlaceholderElement = getElementByClassName(elem, 'PlaceholderText');
|
|
if( aPlaceholderElement )
|
|
{
|
|
var sClassAttr = aPlaceholderElement.getAttribute('class');
|
|
var classes = sClassAttr.split(' ');
|
|
sFieldType = classes[1];
|
|
}
|
|
}
|
|
return sFieldType;
|
|
}
|
|
|
|
function isTextFieldByClassName ( sClassName )
|
|
{
|
|
return sClassName.indexOf( aDateTimeClassName ) == 0 || sClassName.indexOf( aFooterClassName ) == 0
|
|
|| sClassName.indexOf( aHeaderClassName ) == 0 || sClassName.indexOf( aSlideNumberClassName ) == 0
|
|
|| sClassName.indexOf( aDateClassName ) == 0 || sClassName.indexOf( aTimeClassName ) == 0
|
|
|| sClassName.indexOf( aSlideNameClassName ) == 0;
|
|
}
|
|
|
|
function MasterPage( sMasterPageId, aMetaSlide )
|
|
{
|
|
this.id = sMasterPageId;
|
|
this.metaSlide = aMetaSlide;
|
|
|
|
this.element = document.getElementById( this.id );
|
|
assert( this.element,
|
|
'MasterPage: master page element <' + this.id + '> not found.' );
|
|
|
|
this.background = getElementByClassName( this.element, 'Background' );
|
|
if( this.background )
|
|
{
|
|
this.backgroundId = this.background.getAttribute( 'id' );
|
|
this.backgroundVisibility = initVisibilityProperty( this.background );
|
|
}
|
|
else
|
|
{
|
|
this.backgroundId = '';
|
|
log( 'MasterPage: the background element is not valid.' );
|
|
}
|
|
|
|
this.backgroundObjects = getElementByClassName( this.element, 'BackgroundObjects' );
|
|
this.aBackgroundObjectSubGroupIdList = [];
|
|
if( this.backgroundObjects )
|
|
{
|
|
this.backgroundObjectsId = this.backgroundObjects.getAttribute( 'id' );
|
|
this.backgroundObjectsVisibility = initVisibilityProperty( this.backgroundObjects );
|
|
|
|
if( this.backgroundObjectsVisibility != HIDDEN )
|
|
{
|
|
var aBackgroundObjectList = getElementChildren( this.backgroundObjects );
|
|
var nFrom = 0;
|
|
var nCount = 0;
|
|
var nSubGroupId = 1;
|
|
var sClass;
|
|
var sId = '';
|
|
var i = 0;
|
|
for( ; i < aBackgroundObjectList.length; ++i )
|
|
{
|
|
var aObject = aBackgroundObjectList[i];
|
|
removeRedundantParagraphFromTextFieldShape( aObject );
|
|
sClass = null;
|
|
var sFieldType = getTextFieldType( aObject );
|
|
if( sFieldType && aObject.firstElementChild )
|
|
{
|
|
var sObjId = aObject.firstElementChild.getAttribute( 'id' );
|
|
if( sObjId )
|
|
{
|
|
sClass = sFieldType + '.' + sObjId;
|
|
aObject.setAttribute('class', sClass);
|
|
}
|
|
}
|
|
if( !sClass )
|
|
{
|
|
sClass = aBackgroundObjectList[i].getAttribute('class');
|
|
if( sClass === aDateTimeClassName || sClass === aFooterClassName
|
|
|| sClass === aHeaderClassName || sClass === aSlideNumberClassName)
|
|
{
|
|
sClass += '.Default';
|
|
aObject.setAttribute('class', sClass);
|
|
}
|
|
}
|
|
if( !sClass || !isTextFieldByClassName( sClass ) )
|
|
{
|
|
if( nCount === 0 )
|
|
{
|
|
nFrom = i;
|
|
sId = this.backgroundObjectsId + '.' + nSubGroupId;
|
|
++nSubGroupId;
|
|
this.aBackgroundObjectSubGroupIdList.push( sId );
|
|
}
|
|
++nCount;
|
|
}
|
|
else
|
|
{
|
|
this.aBackgroundObjectSubGroupIdList.push( sClass );
|
|
if( nCount !== 0 )
|
|
{
|
|
createElementGroup( this.backgroundObjects, aBackgroundObjectList, nFrom, nCount, 'BackgroundObjectSubgroup', sId );
|
|
nCount = 0;
|
|
}
|
|
}
|
|
}
|
|
if( nCount !== 0 )
|
|
{
|
|
createElementGroup( this.backgroundObjects, aBackgroundObjectList, nFrom, nCount, 'BackgroundObjectSubgroup', sId );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.backgroundObjectsId = '';
|
|
log( 'MasterPage: the background objects element is not valid.' );
|
|
}
|
|
|
|
this.aPlaceholderShapeSet = {};
|
|
this.initPlaceholderShapes();
|
|
}
|
|
|
|
MasterPage.prototype =
|
|
{
|
|
|
|
initPlaceholderShapes : function()
|
|
{
|
|
var sClassName;
|
|
var i = 0;
|
|
for( ; i < this.aBackgroundObjectSubGroupIdList.length; ++i )
|
|
{
|
|
sClassName = this.aBackgroundObjectSubGroupIdList[i];
|
|
if( isTextFieldByClassName( sClassName ) )
|
|
this.aPlaceholderShapeSet[ sClassName ] = new PlaceholderShape( this, sClassName );
|
|
}
|
|
}
|
|
|
|
}; // end MasterPage prototype
|
|
|
|
function PlaceholderShape( aMasterPage, sClassName )
|
|
{
|
|
this.masterPage = aMasterPage;
|
|
this.className = sClassName;
|
|
|
|
this.element = null;
|
|
this.textElement = null;
|
|
this.init();
|
|
}
|
|
|
|
PlaceholderShape.prototype.isValid = function()
|
|
{
|
|
return ( this.element && this.textElement );
|
|
};
|
|
|
|
|
|
PlaceholderShape.prototype.init = function()
|
|
{
|
|
var aTextFieldElement = getElementByClassName( this.masterPage.backgroundObjects, this.className );
|
|
if( aTextFieldElement )
|
|
{
|
|
var aTextElem = getElementByClassName( aTextFieldElement, 'SVGTextShape' );
|
|
if( aTextElem )
|
|
{
|
|
var aPlaceholderElement = getElementByClassName(aTextElem, 'PlaceholderText');
|
|
if( aPlaceholderElement )
|
|
{
|
|
var aSVGRectElem = getElementByClassName( aTextFieldElement, 'BoundingBox' );
|
|
if( aSVGRectElem )
|
|
{
|
|
var aRect = new Rectangle( aSVGRectElem );
|
|
var sTextAdjust = getOOOAttribute( aTextFieldElement, aOOOAttrTextAdjust );
|
|
var nMargin = 250; // 1000th mm
|
|
var sTextAnchor, sX;
|
|
if( sTextAdjust == 'left' )
|
|
{
|
|
sTextAnchor = 'start';
|
|
sX = String( Math.trunc( aRect.left + nMargin ) );
|
|
}
|
|
else if( sTextAdjust == 'right' )
|
|
{
|
|
sTextAnchor = 'end';
|
|
sX = String( Math.trunc( aRect.right - nMargin ) );
|
|
}
|
|
else if( sTextAdjust == 'center' )
|
|
{
|
|
sTextAnchor = 'middle';
|
|
var nMiddle = ( aRect.left + aRect.right ) / 2;
|
|
sX = String( parseInt( String( nMiddle ) ) );
|
|
}
|
|
if( sTextAnchor )
|
|
{
|
|
aTextElem.setAttribute( 'text-anchor', sTextAnchor );
|
|
if( sX )
|
|
aTextElem.setAttribute( 'x', sX );
|
|
|
|
var aTSpanElements = getElementsByClassName( aTextElem, 'TextPosition' );
|
|
if( aTSpanElements )
|
|
{
|
|
var i = 0;
|
|
for( ; i < aTSpanElements.length; ++i )
|
|
{
|
|
var aTSpanElem = aTSpanElements[i];
|
|
aTSpanElem.removeAttribute( 'x' );
|
|
if( i !== 0 )
|
|
aTSpanElem.removeAttribute( 'y' );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( this.masterPage.metaSlide.theMetaDoc.bIsUsePositionedChars )
|
|
{
|
|
var aTextLineGroupElem = aPlaceholderElement.parentNode.parentNode;
|
|
if( aTextLineGroupElem )
|
|
{
|
|
var sFontFamilyAttr = aTextLineGroupElem.getAttribute( 'font-family' );
|
|
if( sFontFamilyAttr )
|
|
{
|
|
var aChildSet = getElementChildren( aTextLineGroupElem );
|
|
if( aChildSet.length > 1 )
|
|
var i = 1;
|
|
for( ; i < aChildSet.length; ++i )
|
|
{
|
|
aTextLineGroupElem.removeChild( aChildSet[i] );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.textElement = aPlaceholderElement;
|
|
}
|
|
}
|
|
this.element = aTextFieldElement;
|
|
}
|
|
};
|
|
|
|
function MasterPageView( aMetaSlide )
|
|
{
|
|
this.aMetaSlide = aMetaSlide;
|
|
this.aSlideElement = aMetaSlide.slideElement;
|
|
this.aPageElement = aMetaSlide.pageElement;
|
|
this.aMasterPage = aMetaSlide.masterPage;
|
|
this.aMPVElement = this.createElement();
|
|
this.bIsAttached = false;
|
|
}
|
|
|
|
|
|
MasterPageView.prototype.attachToSlide = function()
|
|
{
|
|
if( !this.bIsAttached )
|
|
{
|
|
var aInsertedElement = this.aSlideElement.insertBefore( this.aMPVElement, this.aPageElement );
|
|
assert( aInsertedElement === this.aMPVElement,
|
|
'MasterPageView.attachToSlide: aInsertedElement != this.aMPVElement' );
|
|
|
|
this.bIsAttached = true;
|
|
}
|
|
};
|
|
|
|
MasterPageView.prototype.detachFromSlide = function()
|
|
{
|
|
if( this.bIsAttached )
|
|
{
|
|
this.aSlideElement.removeChild( this.aMPVElement );
|
|
this.bIsAttached = false;
|
|
}
|
|
};
|
|
|
|
MasterPageView.prototype.update = function()
|
|
{
|
|
if( this.aDateTimeFieldHandler && this.aMetaSlide.bIsDateTimeVariable )
|
|
this.aDateTimeFieldHandler.update();
|
|
};
|
|
|
|
|
|
MasterPageView.prototype.createElement = function()
|
|
{
|
|
var theDocument = document;
|
|
var aMasterPageViewElement = theDocument.createElementNS( NSS['svg'], 'g' );
|
|
assert( aMasterPageViewElement,
|
|
'MasterPageView.createElement: failed to create a master page view element.' );
|
|
aMasterPageViewElement.setAttribute( 'class', 'MasterPageView' );
|
|
|
|
var aWhiteRect = theDocument.createElementNS( NSS['svg'], 'rect' );
|
|
var nWidthExt = WIDTH / 1000;
|
|
var nHeightExt = HEIGHT / 1000;
|
|
aWhiteRect.setAttribute( 'x', String( -nWidthExt / 2 ) );
|
|
aWhiteRect.setAttribute( 'y', String( -nHeightExt / 2 ) );
|
|
aWhiteRect.setAttribute( 'width', String( WIDTH + nWidthExt ) );
|
|
aWhiteRect.setAttribute( 'height', String( HEIGHT + nHeightExt ) );
|
|
aWhiteRect.setAttribute( 'fill', '#FFFFFF' );
|
|
aMasterPageViewElement.appendChild( aWhiteRect );
|
|
|
|
if( this.aMetaSlide.nIsBackgroundVisible )
|
|
{
|
|
var nBackgroundId = this.aMetaSlide.bHasCustomBackground ? this.aMetaSlide.backgroundId : this.aMasterPage.backgroundId;
|
|
this.aBackgroundElement = theDocument.createElementNS( NSS['svg'], 'use' );
|
|
this.aBackgroundElement.setAttribute( 'class', 'Background' );
|
|
setNSAttribute( 'xlink', this.aBackgroundElement,
|
|
'href', '#' + nBackgroundId );
|
|
|
|
aMasterPageViewElement.appendChild( this.aBackgroundElement );
|
|
}
|
|
|
|
if( this.aMetaSlide.nAreMasterObjectsVisible )
|
|
{
|
|
this.aBackgroundObjectsElement = theDocument.createElementNS( NSS['svg'], 'g' );
|
|
this.aBackgroundObjectsElement.setAttribute( 'class', 'BackgroundObjects' );
|
|
|
|
var aBackgroundObjectSubGroupIdList = this.aMasterPage.aBackgroundObjectSubGroupIdList;
|
|
this.aBackgroundSubGroupElementSet = [];
|
|
var aPlaceholderShapeSet = this.aMasterPage.aPlaceholderShapeSet;
|
|
var aTextFieldContentProviderSet = this.aMetaSlide.aTextFieldContentProviderSet;
|
|
var aDefsElement = this.aMetaSlide.element.parentNode;
|
|
var aTextFieldHandlerSet = this.aMetaSlide.theMetaDoc.aTextFieldHandlerSet;
|
|
var sMasterSlideId = this.aMasterPage.id;
|
|
|
|
var i = 0;
|
|
var sId;
|
|
for( ; i < aBackgroundObjectSubGroupIdList.length; ++i )
|
|
{
|
|
sId = aBackgroundObjectSubGroupIdList[i];
|
|
if( sId.indexOf( aSlideNumberClassName ) == 0 )
|
|
{
|
|
var nIsPageNumberVisible = sId === (aSlideNumberClassName + '.Default') ? this.aMetaSlide.nIsPageNumberVisible : true;
|
|
if( aPlaceholderShapeSet[sId] &&
|
|
aPlaceholderShapeSet[sId].isValid() &&
|
|
nIsPageNumberVisible &&
|
|
aTextFieldContentProviderSet[aSlideNumberClassName] )
|
|
{
|
|
var aSlideNumberFieldHandler =
|
|
new SlideNumberFieldHandler( aPlaceholderShapeSet[sId],
|
|
aTextFieldContentProviderSet[aSlideNumberClassName] );
|
|
aSlideNumberFieldHandler.update( this.aMetaSlide.nSlideNumber );
|
|
aSlideNumberFieldHandler.appendTo( this.aBackgroundObjectsElement );
|
|
if ( sId === aSlideNumberClassName + '.Default' )
|
|
this.aSlideNumberFieldHandler = aSlideNumberFieldHandler;
|
|
}
|
|
}
|
|
else if( sId === aDateTimeClassName + '.Default' )
|
|
{
|
|
if( this.aMetaSlide.nIsDateTimeVisible )
|
|
{
|
|
this.aDateTimeFieldHandler =
|
|
this.initTextFieldHandler( sId, aPlaceholderShapeSet,
|
|
aTextFieldContentProviderSet, aDefsElement,
|
|
aTextFieldHandlerSet, sMasterSlideId );
|
|
}
|
|
}
|
|
else if( sId === aFooterClassName + '.Default' )
|
|
{
|
|
if( this.aMetaSlide.nIsFooterVisible )
|
|
{
|
|
this.aFooterFieldHandler =
|
|
this.initTextFieldHandler( sId, aPlaceholderShapeSet,
|
|
aTextFieldContentProviderSet, aDefsElement,
|
|
aTextFieldHandlerSet, sMasterSlideId );
|
|
}
|
|
}
|
|
else if( sId === aHeaderClassName + '.Default' )
|
|
{
|
|
if( this.aMetaSlide.nIsHeaderVisible )
|
|
{
|
|
this.aHeaderFieldHandler =
|
|
this.initTextFieldHandler( sId, aPlaceholderShapeSet,
|
|
aTextFieldContentProviderSet, aDefsElement,
|
|
aTextFieldHandlerSet, sMasterSlideId );
|
|
}
|
|
}
|
|
else if( sId.indexOf( aDateTimeClassName ) == 0
|
|
|| sId.indexOf( aFooterClassName ) == 0
|
|
|| sId.indexOf( aHeaderClassName ) == 0
|
|
|| sId.indexOf( aDateClassName ) == 0
|
|
|| sId.indexOf( aTimeClassName ) == 0
|
|
|| sId.indexOf( aSlideNameClassName ) == 0 )
|
|
{
|
|
this.initTextFieldHandler( sId, aPlaceholderShapeSet,
|
|
aTextFieldContentProviderSet, aDefsElement,
|
|
aTextFieldHandlerSet, sMasterSlideId );
|
|
}
|
|
else
|
|
{
|
|
var aBackgroundSubGroupElement = theDocument.createElementNS( NSS['svg'], 'use' );
|
|
aBackgroundSubGroupElement.setAttribute( 'class', 'BackgroundObjectSubGroup' );
|
|
setNSAttribute( 'xlink', aBackgroundSubGroupElement,
|
|
'href', '#' + sId );
|
|
this.aBackgroundSubGroupElementSet.push( aBackgroundSubGroupElement );
|
|
this.aBackgroundObjectsElement.appendChild( aBackgroundSubGroupElement );
|
|
}
|
|
|
|
}
|
|
aMasterPageViewElement.appendChild( this.aBackgroundObjectsElement );
|
|
}
|
|
|
|
return aMasterPageViewElement;
|
|
};
|
|
|
|
MasterPageView.prototype.initTextFieldHandler =
|
|
function( sId, aPlaceholderShapeSet, aTextFieldContentProviderSet,
|
|
aDefsElement, aTextFieldHandlerSet, sMasterSlideId )
|
|
{
|
|
var sRefId = null;
|
|
var aTextFieldHandler = null;
|
|
var sClassName = sId.split('.')[0];
|
|
var aPlaceholderShape = aPlaceholderShapeSet[sId];
|
|
var aTextFieldContentProvider = aTextFieldContentProviderSet[sClassName];
|
|
if( aPlaceholderShape && aPlaceholderShape.isValid()
|
|
&& aTextFieldContentProvider )
|
|
{
|
|
var sTextFiedHandlerKey = aTextFieldContentProvider.sId + '.' + sId;
|
|
if ( !aTextFieldHandlerSet[ sMasterSlideId ][ sTextFiedHandlerKey ] )
|
|
{
|
|
aTextFieldHandlerSet[ sMasterSlideId ][ sTextFiedHandlerKey ] =
|
|
new TextFieldHandler( aPlaceholderShape,
|
|
aTextFieldContentProvider );
|
|
aTextFieldHandler = aTextFieldHandlerSet[ sMasterSlideId ][ sTextFiedHandlerKey ];
|
|
aTextFieldHandler.update();
|
|
aTextFieldHandler.appendTo( aDefsElement );
|
|
}
|
|
else
|
|
{
|
|
aTextFieldHandler = aTextFieldHandlerSet[ sMasterSlideId ][ sTextFiedHandlerKey ];
|
|
}
|
|
sRefId = aTextFieldHandler.sId;
|
|
}
|
|
else if( aPlaceholderShape && aPlaceholderShape.element && aPlaceholderShape.element.firstElementChild
|
|
&& !aPlaceholderShape.textElement && !aTextFieldContentProvider )
|
|
{
|
|
sRefId = aPlaceholderShape.element.firstElementChild.getAttribute('id');
|
|
}
|
|
|
|
if( sRefId )
|
|
{
|
|
var aTextFieldElement = document.createElementNS(NSS['svg'], 'use');
|
|
aTextFieldElement.setAttribute('class', sClassName);
|
|
setNSAttribute('xlink', aTextFieldElement,
|
|
'href', '#' + sRefId);
|
|
this.aBackgroundObjectsElement.appendChild( aTextFieldElement );
|
|
}
|
|
return aTextFieldHandler;
|
|
};
|
|
|
|
function TextFieldHandler( aPlaceholderShape, aTextContentProvider )
|
|
{
|
|
this.aPlaceHolderShape = aPlaceholderShape;
|
|
this.aTextContentProvider = aTextContentProvider;
|
|
assert( this.aTextContentProvider,
|
|
'TextFieldHandler: text content provider not defined.' );
|
|
this.sId = 'tf' + String( TextFieldHandler.getUniqueId() );
|
|
this.aTextFieldElement = null;
|
|
this.aTextPlaceholderElement = null;
|
|
this.cloneElement();
|
|
}
|
|
|
|
|
|
TextFieldHandler.CURR_UNIQUE_ID = 0;
|
|
|
|
TextFieldHandler.getUniqueId = function()
|
|
{
|
|
++TextFieldHandler.CURR_UNIQUE_ID;
|
|
return TextFieldHandler.CURR_UNIQUE_ID;
|
|
};
|
|
|
|
TextFieldHandler.prototype.cloneElement = function()
|
|
{
|
|
assert( this.aPlaceHolderShape && this.aPlaceHolderShape.isValid(),
|
|
'TextFieldHandler.cloneElement: placeholder shape is not valid.' );
|
|
this.aTextFieldElement = this.aPlaceHolderShape.element.cloneNode( true /* deep clone */ );
|
|
assert( this.aTextFieldElement,
|
|
'TextFieldHandler.cloneElement: aTextFieldElement is not defined' );
|
|
this.aTextFieldElement.setAttribute( 'id', this.sId );
|
|
this.aTextFieldElement.removeAttribute( 'visibility' );
|
|
this.aTextPlaceholderElement = getElementByClassName( this.aTextFieldElement, 'PlaceholderText' );
|
|
assert( this.aTextPlaceholderElement,
|
|
'TextFieldHandler.cloneElement: aTextPlaceholderElement is not defined' );
|
|
};
|
|
|
|
|
|
TextFieldHandler.prototype.appendTo = function( aParentNode )
|
|
{
|
|
if( !this.aTextFieldElement )
|
|
{
|
|
log( 'TextFieldHandler.appendTo: aTextFieldElement is not defined' );
|
|
return;
|
|
}
|
|
if( !aParentNode )
|
|
{
|
|
log( 'TextFieldHandler.appendTo: parent node is not defined' );
|
|
return;
|
|
}
|
|
|
|
aParentNode.appendChild( this.aTextFieldElement );
|
|
};
|
|
|
|
TextFieldHandler.prototype.setTextContent = function( sText )
|
|
{
|
|
if( !this.aTextPlaceholderElement )
|
|
{
|
|
log( 'PlaceholderShape.setTextContent: text element is not valid in placeholder of type '
|
|
+ this.className + ' that belongs to master slide ' + this.masterPage.id );
|
|
return;
|
|
}
|
|
this.aTextPlaceholderElement.textContent = sText;
|
|
};
|
|
|
|
TextFieldHandler.prototype.update = function()
|
|
{
|
|
if( !this.aTextContentProvider )
|
|
log('TextFieldHandler.update: text content provider not defined.');
|
|
else
|
|
this.aTextContentProvider.update( this );
|
|
};
|
|
|
|
function SlideNumberFieldHandler( aPlaceholderShape, aTextContentProvider )
|
|
{
|
|
SlideNumberFieldHandler.superclass.constructor.call( this, aPlaceholderShape, aTextContentProvider );
|
|
}
|
|
extend( SlideNumberFieldHandler, TextFieldHandler );
|
|
|
|
|
|
SlideNumberFieldHandler.prototype.update = function( nPageNumber )
|
|
{
|
|
if( !this.aTextContentProvider )
|
|
log('TextFieldHandler.update: text content provider not defined.');
|
|
else
|
|
this.aTextContentProvider.update( this, nPageNumber );
|
|
};
|
|
|
|
|
|
function TextFieldContentProvider()
|
|
{
|
|
this.sId = TextFieldContentProvider.getUniqueId();
|
|
}
|
|
|
|
|
|
TextFieldContentProvider.CURR_UNIQUE_ID = 0;
|
|
|
|
TextFieldContentProvider.getUniqueId = function()
|
|
{
|
|
++TextFieldContentProvider.CURR_UNIQUE_ID;
|
|
return TextFieldContentProvider.CURR_UNIQUE_ID;
|
|
};
|
|
|
|
function FixedTextProvider( aText )
|
|
{
|
|
FixedTextProvider.superclass.constructor.call( this );
|
|
this.text = aText;
|
|
}
|
|
extend( FixedTextProvider, TextFieldContentProvider );
|
|
|
|
|
|
FixedTextProvider.prototype.update = function( aFixedTextField )
|
|
{
|
|
aFixedTextField.setTextContent( this.text );
|
|
};
|
|
|
|
function FixedTextByElementProvider( aTextFieldContentElement )
|
|
{
|
|
FixedTextByElementProvider.superclass.constructor.call( this, aTextFieldContentElement.textContent );
|
|
}
|
|
extend( FixedTextByElementProvider, FixedTextProvider );
|
|
|
|
function CurrentDateTimeProvider( aTextFieldContentElement, sDateTimeFormat )
|
|
{
|
|
CurrentDateTimeProvider.superclass.constructor.call( this, aTextFieldContentElement );
|
|
if( aTextFieldContentElement )
|
|
this.dateTimeFormat = getOOOAttribute( aTextFieldContentElement, aOOOAttrDateTimeFormat );
|
|
else
|
|
{
|
|
this.dateTimeFormat = sDateTimeFormat;
|
|
}
|
|
}
|
|
extend( CurrentDateTimeProvider, TextFieldContentProvider );
|
|
|
|
|
|
CurrentDateTimeProvider.prototype.update = function( aDateTimeField )
|
|
{
|
|
var sText = this.createDateTimeText();
|
|
aDateTimeField.setTextContent( sText );
|
|
};
|
|
|
|
|
|
CurrentDateTimeProvider.prototype.createDateTimeText = function()
|
|
{
|
|
var sDate;
|
|
if( this.dateTimeFormat === '<date>' )
|
|
sDate = new Date().toLocaleDateString();
|
|
else if( this.dateTimeFormat === '<time>' )
|
|
sDate = new Date().toLocaleTimeString();
|
|
else
|
|
sDate = new Date().toLocaleDateString();
|
|
return sDate;
|
|
};
|
|
|
|
function SlideNumberProvider( nInitialSlideNumber, sPageNumberingType )
|
|
{
|
|
SlideNumberProvider.superclass.constructor.call( this );
|
|
this.nInitialSlideNumber = nInitialSlideNumber;
|
|
this.pageNumberingType = sPageNumberingType;
|
|
|
|
}
|
|
extend( SlideNumberProvider, TextFieldContentProvider );
|
|
|
|
|
|
SlideNumberProvider.prototype.getNumberingType = function()
|
|
{
|
|
return this.pageNumberingType;
|
|
};
|
|
|
|
|
|
SlideNumberProvider.prototype.update = function( aSlideNumberField, nSlideNumber )
|
|
{
|
|
if( nSlideNumber === undefined )
|
|
{
|
|
if( nCurSlide === undefined )
|
|
nSlideNumber = this.nInitialSlideNumber;
|
|
else
|
|
nSlideNumber = nCurSlide + 1;
|
|
}
|
|
var sText = this.createSlideNumberText( nSlideNumber, this.getNumberingType() );
|
|
aSlideNumberField.setTextContent( sText );
|
|
};
|
|
|
|
|
|
SlideNumberProvider.prototype.createSlideNumberText = function( nSlideNumber /*, sNumberingType*/ )
|
|
{
|
|
return String( nSlideNumber );
|
|
};
|
|
|
|
|
|
function SlideIndexPage()
|
|
{
|
|
this.pageElementId = 'slide_index';
|
|
this.pageBgColor = 'rgb(252,252,252)';
|
|
this.pageElement = this.createPageElement();
|
|
assert( this.pageElement, 'SlideIndexPage: pageElement is not valid' );
|
|
this.indexColumns = INDEX_COLUMNS_DEFAULT;
|
|
this.totalThumbnails = this.indexColumns * this.indexColumns;
|
|
this.selectedSlideIndex = undefined;
|
|
|
|
this.xSpacingFactor = 600/28000;
|
|
this.ySpacingFactor = 450/21000;
|
|
this.xSpacing = WIDTH * this.xSpacingFactor;
|
|
this.ySpacing = HEIGHT * this.ySpacingFactor;
|
|
this.halfBorderWidthFactor = ( 300/28000 ) * ( this.indexColumns / 3 );
|
|
this.halfBorderWidth = WIDTH * this.halfBorderWidthFactor;
|
|
this.borderWidth = 2 * this.halfBorderWidth;
|
|
this.scaleFactor = ( 1 - ( this.indexColumns + 1 ) * this.xSpacingFactor ) /
|
|
( this.indexColumns * ( 1 + 2 * this.halfBorderWidthFactor ) );
|
|
|
|
this.thumbnailMouseAreaTemplateId = 'thumbnail_mouse_area';
|
|
this.thumbnailMouseAreaTemplateElement = null;
|
|
this.thumbnailBorderTemplateId = 'thumbnail_border';
|
|
this.thumbnailBorderTemplateElement = null;
|
|
this.createTemplateElements();
|
|
|
|
this.aThumbnailSet = new Array( this.totalThumbnails );
|
|
for( var i = 0; i < this.totalThumbnails; ++i )
|
|
{
|
|
this.aThumbnailSet[i] = new Thumbnail( this, i );
|
|
this.aThumbnailSet[i].updateView();
|
|
}
|
|
|
|
this.curThumbnailIndex = 0;
|
|
}
|
|
|
|
|
|
SlideIndexPage.prototype.getTotalThumbnails = function()
|
|
{
|
|
return this.totalThumbnails;
|
|
};
|
|
|
|
SlideIndexPage.prototype.show = function()
|
|
{
|
|
this.pageElement.setAttribute( 'display', 'inherit' );
|
|
};
|
|
|
|
SlideIndexPage.prototype.hide = function()
|
|
{
|
|
this.pageElement.setAttribute( 'display', 'none' );
|
|
};
|
|
|
|
SlideIndexPage.prototype.setSelection = function( nIndex )
|
|
{
|
|
nIndex = getSafeIndex( nIndex, 0, this.getTotalThumbnails() - 1 );
|
|
if( this.curThumbnailIndex != nIndex )
|
|
{
|
|
this.aThumbnailSet[ this.curThumbnailIndex ].unselect();
|
|
this.aThumbnailSet[ nIndex ].select();
|
|
this.curThumbnailIndex = nIndex;
|
|
}
|
|
this.selectedSlideIndex = this.aThumbnailSet[ nIndex ].slideIndex;
|
|
};
|
|
|
|
SlideIndexPage.prototype.createPageElement = function()
|
|
{
|
|
var aPageElement = document.createElementNS( NSS['svg'], 'g' );
|
|
aPageElement.setAttribute( 'id', this.pageElementId );
|
|
aPageElement.setAttribute( 'display', 'none' );
|
|
aPageElement.setAttribute( 'visibility', 'visible' );
|
|
|
|
var sPageBgColor = this.pageBgColor + ';';
|
|
var aRectElement = document.createElementNS( NSS['svg'], 'rect' );
|
|
aRectElement.setAttribute( 'x', 0 );
|
|
aRectElement.setAttribute( 'y', 0 );
|
|
aRectElement.setAttribute( 'width', WIDTH );
|
|
aRectElement.setAttribute( 'height', HEIGHT );
|
|
aRectElement.setAttribute( 'style', 'stroke:none;fill:' + sPageBgColor );
|
|
|
|
aPageElement.appendChild( aRectElement );
|
|
ROOT_NODE.appendChild( aPageElement );
|
|
return( document.getElementById( this.pageElementId ) );
|
|
};
|
|
|
|
SlideIndexPage.prototype.createTemplateElements = function()
|
|
{
|
|
var aDefsElement = document.createElementNS( NSS['svg'], 'defs' );
|
|
var aRectElement = document.createElementNS( NSS['svg'], 'rect' );
|
|
aRectElement.setAttribute( 'id', this.thumbnailBorderTemplateId );
|
|
aRectElement.setAttribute( 'x', -this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'y', -this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'rx', this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'ry', this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'width', WIDTH + this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'height', HEIGHT + this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'stroke-width', this.borderWidth );
|
|
aRectElement.setAttribute( 'fill', 'none' );
|
|
aDefsElement.appendChild( aRectElement );
|
|
|
|
aRectElement = document.createElementNS( NSS['svg'], 'rect' );
|
|
aRectElement.setAttribute( 'id', this.thumbnailMouseAreaTemplateId );
|
|
aRectElement.setAttribute( 'x', 0 );
|
|
aRectElement.setAttribute( 'y', 0 );
|
|
aRectElement.setAttribute( 'width', WIDTH );
|
|
aRectElement.setAttribute( 'height', HEIGHT );
|
|
aRectElement.setAttribute( 'fill', this.pageBgColor );
|
|
aDefsElement.appendChild( aRectElement );
|
|
|
|
this.pageElement.appendChild( aDefsElement );
|
|
|
|
this.thumbnailMouseAreaTemplateElement = document.getElementById( this.thumbnailMouseAreaTemplateId );
|
|
this.thumbnailBorderTemplateElement = document.getElementById( this.thumbnailBorderTemplateId );
|
|
};
|
|
|
|
SlideIndexPage.prototype.decreaseNumberOfColumns = function()
|
|
{
|
|
this.setNumberOfColumns( this.indexColumns - 1 );
|
|
};
|
|
|
|
SlideIndexPage.prototype.increaseNumberOfColumns = function()
|
|
{
|
|
this.setNumberOfColumns( this.indexColumns + 1 );
|
|
};
|
|
|
|
SlideIndexPage.prototype.resetNumberOfColumns = function()
|
|
{
|
|
this.setNumberOfColumns( INDEX_COLUMNS_DEFAULT );
|
|
};
|
|
|
|
SlideIndexPage.prototype.setNumberOfColumns = function( nNumberOfColumns )
|
|
{
|
|
if( this.indexColumns == nNumberOfColumns ) return;
|
|
if( nNumberOfColumns < 2 || nNumberOfColumns > 6 ) return;
|
|
|
|
var suspendHandle = ROOT_NODE.suspendRedraw(500);
|
|
|
|
var nOldTotalThumbnails = this.totalThumbnails;
|
|
this.indexColumns = nNumberOfColumns;
|
|
this.totalThumbnails = nNumberOfColumns * nNumberOfColumns;
|
|
|
|
this.aThumbnailSet[this.curThumbnailIndex].unselect();
|
|
|
|
var i;
|
|
for( i = this.totalThumbnails; i < nOldTotalThumbnails; ++i )
|
|
{
|
|
this.aThumbnailSet[i].removeElement();
|
|
}
|
|
|
|
for( i = nOldTotalThumbnails; i < this.totalThumbnails; ++i )
|
|
{
|
|
this.aThumbnailSet[i] = new Thumbnail( this, i );
|
|
}
|
|
|
|
this.halfBorderWidthFactor = ( 300/28000 ) * ( this.indexColumns / 3 );
|
|
this.halfBorderWidth = WIDTH * this.halfBorderWidthFactor;
|
|
this.borderWidth = 2 * this.halfBorderWidth;
|
|
this.scaleFactor = ( 1 - ( this.indexColumns + 1 ) * this.xSpacingFactor ) /
|
|
( this.indexColumns * ( 1 + 2 * this.halfBorderWidthFactor ) );
|
|
|
|
var aRectElement = this.thumbnailBorderTemplateElement;
|
|
aRectElement.setAttribute( 'x', -this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'y', -this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'rx', this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'ry', this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'width', WIDTH + this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'height', HEIGHT + this.halfBorderWidth );
|
|
aRectElement.setAttribute( 'stroke-width', this.borderWidth );
|
|
|
|
for( i = 0; i < this.totalThumbnails; ++i )
|
|
{
|
|
this.aThumbnailSet[i].updateView();
|
|
}
|
|
|
|
this.curThumbnailIndex = this.selectedSlideIndex % this.totalThumbnails;
|
|
this.aThumbnailSet[this.curThumbnailIndex].select();
|
|
|
|
INDEX_OFFSET = -1;
|
|
indexSetPageSlide( this.selectedSlideIndex );
|
|
|
|
ROOT_NODE.unsuspendRedraw( suspendHandle );
|
|
ROOT_NODE.forceRedraw();
|
|
};
|
|
|
|
|
|
function Thumbnail( aSlideIndexPage, nIndex )
|
|
{
|
|
this.container = aSlideIndexPage;
|
|
this.index = nIndex;//= getSafeIndex( nIndex, 0, this.container.getTotalThumbnails() );
|
|
this.pageElement = this.container.pageElement;
|
|
this.thumbnailId = 'thumbnail' + this.index;
|
|
this.thumbnailElement = this.createThumbnailElement();
|
|
this.slideElement = getElementByClassName( this.thumbnailElement, 'Slide' );
|
|
this.borderElement = getElementByClassName( this.thumbnailElement, 'Border' );
|
|
this.mouseAreaElement = getElementByClassName( this.thumbnailElement, 'MouseArea' );
|
|
this.aTransformSet = new Array( 3 );
|
|
this.visibility = VISIBLE;
|
|
this.isSelected = false;
|
|
}
|
|
|
|
Thumbnail.prototype.sNormalBorderColor = 'rgb(216,216,216)';
|
|
Thumbnail.prototype.sSelectionBorderColor = 'rgb(92,92,255)';
|
|
|
|
Thumbnail.prototype.removeElement = function()
|
|
{
|
|
if( this.thumbnailElement )
|
|
this.container.pageElement.removeChild( this.thumbnailElement );
|
|
};
|
|
|
|
Thumbnail.prototype.show = function()
|
|
{
|
|
if( this.visibility == HIDDEN )
|
|
{
|
|
this.thumbnailElement.setAttribute( 'display', 'inherit' );
|
|
this.visibility = VISIBLE;
|
|
}
|
|
};
|
|
|
|
Thumbnail.prototype.hide = function()
|
|
{
|
|
if( this.visibility == VISIBLE )
|
|
{
|
|
this.thumbnailElement.setAttribute( 'display', 'none' );
|
|
this.visibility = HIDDEN;
|
|
}
|
|
};
|
|
|
|
Thumbnail.prototype.select = function()
|
|
{
|
|
if( !this.isSelected )
|
|
{
|
|
this.borderElement.setAttribute( 'stroke', this.sSelectionBorderColor );
|
|
this.isSelected = true;
|
|
}
|
|
};
|
|
|
|
Thumbnail.prototype.unselect = function()
|
|
{
|
|
if( this.isSelected )
|
|
{
|
|
this.borderElement.setAttribute( 'stroke', this.sNormalBorderColor );
|
|
this.isSelected = false;
|
|
}
|
|
};
|
|
|
|
Thumbnail.prototype.updateView = function()
|
|
{
|
|
this.column = this.index % this.container.indexColumns;
|
|
this.row = ( this.index - this.column ) / this.container.indexColumns;
|
|
this.halfBorderWidth = this.container.halfBorderWidth;
|
|
this.borderWidth = this.container.borderWidth;
|
|
this.width = ( WIDTH + this.borderWidth ) * this.container.scaleFactor;
|
|
this.height = ( HEIGHT + this.borderWidth ) * this.container.scaleFactor;
|
|
this.aTransformSet[2] = 'translate(' + this.halfBorderWidth + ' ' + this.halfBorderWidth + ')';
|
|
this.aTransformSet[1] = 'scale(' + this.container.scaleFactor + ')';
|
|
var sTransformAttrValue = this.computeTransform();
|
|
this.thumbnailElement.setAttribute( 'transform', sTransformAttrValue );
|
|
this.mouseAreaElement.setAttribute( 'onmouseover', 'theSlideIndexPage.aThumbnailSet[' + this.index + '].onMouseOver()' );
|
|
};
|
|
|
|
Thumbnail.prototype.update = function( nIndex )
|
|
{
|
|
if( this.slideIndex == nIndex ) return;
|
|
|
|
var aMetaSlide = theMetaDoc.aMetaSlideSet[nIndex];
|
|
aMetaSlide.updateMasterPageView();
|
|
setNSAttribute( 'xlink', this.slideElement, 'href', '#' + aMetaSlide.slideId );
|
|
this.slideIndex = nIndex;
|
|
};
|
|
|
|
Thumbnail.prototype.clear = function( )
|
|
{
|
|
setNSAttribute( 'xlink', this.slideElement, 'href', '' );
|
|
};
|
|
|
|
Thumbnail.prototype.createThumbnailElement = function()
|
|
{
|
|
var aThumbnailElement = document.createElementNS( NSS['svg'], 'g' );
|
|
aThumbnailElement.setAttribute( 'id', this.thumbnailId );
|
|
aThumbnailElement.setAttribute( 'display', 'inherit' );
|
|
|
|
var aSlideElement = document.createElementNS( NSS['svg'], 'use' );
|
|
setNSAttribute( 'xlink', aSlideElement, 'href', '' );
|
|
aSlideElement.setAttribute( 'class', 'Slide' );
|
|
aThumbnailElement.appendChild( aSlideElement );
|
|
|
|
var aMouseAreaElement = document.createElementNS( NSS['svg'], 'use' );
|
|
setNSAttribute( 'xlink', aMouseAreaElement, 'href', '#' + this.container.thumbnailMouseAreaTemplateId );
|
|
aMouseAreaElement.setAttribute( 'class', 'MouseArea' );
|
|
aMouseAreaElement.setAttribute( 'opacity', 0.0 );
|
|
aThumbnailElement.appendChild( aMouseAreaElement );
|
|
|
|
var aBorderElement = document.createElementNS( NSS['svg'], 'use' );
|
|
setNSAttribute( 'xlink', aBorderElement, 'href', '#' + this.container.thumbnailBorderTemplateId );
|
|
aBorderElement.setAttribute( 'stroke', this.sNormalBorderColor );
|
|
aBorderElement.setAttribute( 'class', 'Border' );
|
|
aThumbnailElement.appendChild( aBorderElement );
|
|
|
|
this.container.pageElement.appendChild( aThumbnailElement );
|
|
return( document.getElementById( this.thumbnailId ) );
|
|
};
|
|
|
|
Thumbnail.prototype.computeTransform = function()
|
|
{
|
|
var nXSpacing = this.container.xSpacing;
|
|
var nYSpacing = this.container.ySpacing;
|
|
|
|
var nXOffset = nXSpacing + ( this.width + nXSpacing ) * this.column;
|
|
var nYOffset = nYSpacing + ( this.height + nYSpacing ) * this.row;
|
|
|
|
this.aTransformSet[0] = 'translate(' + nXOffset + ' ' + nYOffset + ')';
|
|
|
|
var sTransform = this.aTransformSet.join( ' ' );
|
|
|
|
return sTransform;
|
|
};
|
|
|
|
Thumbnail.prototype.onMouseOver = function()
|
|
{
|
|
if( ( currentMode == INDEX_MODE ) && ( this.container.curThumbnailIndex != this.index ) )
|
|
{
|
|
this.container.setSelection( this.index );
|
|
}
|
|
};
|
|
|
|
|
|
function init()
|
|
{
|
|
var VIEWBOX = ROOT_NODE.getAttribute('viewBox');
|
|
|
|
if( VIEWBOX )
|
|
{
|
|
WIDTH = ROOT_NODE.viewBox.animVal.width;
|
|
HEIGHT = ROOT_NODE.viewBox.animVal.height;
|
|
}
|
|
|
|
aSlideShow = new SlideShow();
|
|
theMetaDoc = new MetaDocument();
|
|
aSlideShow.bIsEnabled = theMetaDoc.bIsAnimated;
|
|
theSlideIndexPage = new SlideIndexPage();
|
|
aSlideShow.displaySlide( theMetaDoc.nStartSlideNumber, false );
|
|
|
|
var hammer = new Hammer(ROOT_NODE);
|
|
hammer.on('swipeleft', function() {
|
|
switchSlide(1, false);
|
|
});
|
|
hammer.on('swiperight', function() {
|
|
switchSlide(-1, false);
|
|
});
|
|
hammer.get('swipe').set({ direction: Hammer.DIRECTION_ALL });
|
|
hammer.on('swipeup', function() {
|
|
aSlideShow.exitSlideShowInApp();
|
|
});
|
|
hammer.on('swipedown', function() {
|
|
aSlideShow.exitSlideShowInApp();
|
|
});
|
|
}
|
|
|
|
function presentationEngineStop(message)
|
|
{
|
|
alert( message + '\nThe presentation engine will be stopped' );
|
|
document.onkeydown = null;
|
|
document.onkeypress = null;
|
|
document.onclick = null;
|
|
window.onmousewheel = null;
|
|
}
|
|
|
|
function assert( condition, message )
|
|
{
|
|
if (!condition)
|
|
{
|
|
presentationEngineStop( message );
|
|
if (typeof console == 'object')
|
|
console.trace();
|
|
throw new Error( message );
|
|
}
|
|
}
|
|
|
|
function dispatchEffects(dir)
|
|
{
|
|
|
|
if( dir == 1 )
|
|
{
|
|
var bRet = aSlideShow.nextEffect();
|
|
|
|
if( !bRet )
|
|
{
|
|
switchSlide( 1, false );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switchSlide( dir, false );
|
|
}
|
|
}
|
|
|
|
function skipAllEffects()
|
|
{
|
|
var bRet = aSlideShow.skipAllEffects();
|
|
if( !bRet )
|
|
{
|
|
switchSlide( 1, true );
|
|
}
|
|
}
|
|
|
|
function skipEffects(dir)
|
|
{
|
|
if( dir == 1 )
|
|
{
|
|
var bRet = aSlideShow.skipPlayingOrNextEffect();
|
|
|
|
if( !bRet )
|
|
{
|
|
switchSlide( 1, true );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switchSlide( dir, true );
|
|
}
|
|
}
|
|
|
|
function switchSlide( nOffset, bSkipTransition )
|
|
{
|
|
var nNextSlide = nCurSlide + nOffset;
|
|
aSlideShow.displaySlide( nNextSlide, bSkipTransition );
|
|
}
|
|
|
|
function displayIndex( offsetNumber )
|
|
{
|
|
var aMetaSlideSet = theMetaDoc.aMetaSlideSet;
|
|
offsetNumber = getSafeIndex( offsetNumber, 0, aMetaSlideSet.length - 1 );
|
|
|
|
var nTotalThumbnails = theSlideIndexPage.getTotalThumbnails();
|
|
var nEnd = Math.min( offsetNumber + nTotalThumbnails, aMetaSlideSet.length);
|
|
|
|
var aThumbnailSet = theSlideIndexPage.aThumbnailSet;
|
|
var j = 0;
|
|
for( var i = offsetNumber; i < nEnd; ++i, ++j )
|
|
{
|
|
aThumbnailSet[j].update( i );
|
|
aThumbnailSet[j].show();
|
|
}
|
|
for( ; j < nTotalThumbnails; ++j )
|
|
{
|
|
aThumbnailSet[j].hide();
|
|
}
|
|
|
|
if (INDEX_OFFSET != offsetNumber)
|
|
INDEX_OFFSET = offsetNumber;
|
|
}
|
|
|
|
function toggleSlideIndex()
|
|
{
|
|
if( currentMode == SLIDE_MODE )
|
|
{
|
|
|
|
theMetaDoc.getCurrentSlide().hide();
|
|
INDEX_OFFSET = -1;
|
|
indexSetPageSlide( nCurSlide );
|
|
theSlideIndexPage.show();
|
|
currentMode = INDEX_MODE;
|
|
}
|
|
else if( currentMode == INDEX_MODE )
|
|
{
|
|
theSlideIndexPage.hide();
|
|
var nNewSlide = theSlideIndexPage.selectedSlideIndex;
|
|
|
|
aSlideShow.displaySlide( nNewSlide, true );
|
|
currentMode = SLIDE_MODE;
|
|
}
|
|
}
|
|
|
|
function abandonIndexMode()
|
|
{
|
|
theSlideIndexPage.selectedSlideIndex = nCurSlide;
|
|
toggleSlideIndex();
|
|
}
|
|
|
|
|
|
var CURR_UNIQUE_ID = 0;
|
|
|
|
function getUniqueId()
|
|
{
|
|
++CURR_UNIQUE_ID;
|
|
return CURR_UNIQUE_ID;
|
|
}
|
|
|
|
function mem_fn( sMethodName )
|
|
{
|
|
return function( aObject )
|
|
{
|
|
var aMethod = aObject[ sMethodName ];
|
|
if( aMethod )
|
|
aMethod.call( aObject );
|
|
else
|
|
log( 'method sMethodName not found' );
|
|
};
|
|
}
|
|
|
|
function bind( aObject, aMethod )
|
|
{
|
|
return function()
|
|
{
|
|
return aMethod.call( aObject, arguments[0] );
|
|
};
|
|
}
|
|
|
|
function bind2( aFunction )
|
|
{
|
|
if( !aFunction )
|
|
log( 'bind2: passed function is not valid.' );
|
|
|
|
var aBoundArgList = arguments;
|
|
|
|
var aResultFunction = null;
|
|
|
|
switch( aBoundArgList.length )
|
|
{
|
|
case 1: aResultFunction = function()
|
|
{
|
|
return aFunction.call( arguments[0], arguments[1],
|
|
arguments[2], arguments[3],
|
|
arguments[4] );
|
|
};
|
|
break;
|
|
case 2: aResultFunction = function()
|
|
{
|
|
return aFunction.call( aBoundArgList[1], arguments[0],
|
|
arguments[1], arguments[2],
|
|
arguments[3] );
|
|
};
|
|
break;
|
|
case 3: aResultFunction = function()
|
|
{
|
|
return aFunction.call( aBoundArgList[1], aBoundArgList[2],
|
|
arguments[0], arguments[1],
|
|
arguments[2] );
|
|
};
|
|
break;
|
|
case 4: aResultFunction = function()
|
|
{
|
|
return aFunction.call( aBoundArgList[1], aBoundArgList[2],
|
|
aBoundArgList[3], arguments[0],
|
|
arguments[1] );
|
|
};
|
|
break;
|
|
case 5: aResultFunction = function()
|
|
{
|
|
return aFunction.call( aBoundArgList[1], aBoundArgList[2],
|
|
aBoundArgList[3], aBoundArgList[4],
|
|
arguments[0] );
|
|
};
|
|
break;
|
|
default:
|
|
log( 'bind2: arity not handled.' );
|
|
}
|
|
|
|
return aResultFunction;
|
|
}
|
|
|
|
function getCurrentSystemTime()
|
|
{
|
|
return ( new Date() ).getTime();
|
|
}
|
|
|
|
function getSlideAnimationsRoot( sSlideId )
|
|
{
|
|
return theMetaDoc.aSlideAnimationsMap[ sSlideId ];
|
|
}
|
|
|
|
function getElementChildren( aElement )
|
|
{
|
|
var aChildrenArray = [];
|
|
|
|
var nSize = aElement.childNodes.length;
|
|
|
|
for( var i = 0; i < nSize; ++i )
|
|
{
|
|
if( aElement.childNodes[i].nodeType == 1 )
|
|
aChildrenArray.push( aElement.childNodes[i] );
|
|
}
|
|
|
|
return aChildrenArray;
|
|
}
|
|
|
|
function removeWhiteSpaces( str )
|
|
{
|
|
if( !str )
|
|
return '';
|
|
|
|
var re = / */;
|
|
var aSplitString = str.split( re );
|
|
return aSplitString.join('');
|
|
}
|
|
|
|
function clamp( nValue, nMinimum, nMaximum )
|
|
{
|
|
if( nValue < nMinimum )
|
|
{
|
|
return nMinimum;
|
|
}
|
|
else if( nValue > nMaximum )
|
|
{
|
|
return nMaximum;
|
|
}
|
|
else
|
|
{
|
|
return nValue;
|
|
}
|
|
}
|
|
|
|
function makeMatrixString( a, b, c, d, e, f )
|
|
{
|
|
var s = 'matrix(';
|
|
s += a + ', ';
|
|
s += b + ', ';
|
|
s += c + ', ';
|
|
s += d + ', ';
|
|
s += e + ', ';
|
|
s += f + ')';
|
|
|
|
return s;
|
|
}
|
|
|
|
function matrixToString( aSVGMatrix )
|
|
{
|
|
return makeMatrixString( aSVGMatrix.a, aSVGMatrix.b, aSVGMatrix.c,
|
|
aSVGMatrix.d, aSVGMatrix.e, aSVGMatrix.f );
|
|
}
|
|
|
|
|
|
function numberParser( sValue )
|
|
{
|
|
if( typeof sValue !== 'string' )
|
|
return undefined;
|
|
if( sValue === '.' )
|
|
return undefined;
|
|
var reFloatNumber = /^[+-]?[0-9]*[.]?[0-9]*$/;
|
|
|
|
if( reFloatNumber.test( sValue ) )
|
|
return parseFloat( sValue );
|
|
else
|
|
return undefined;
|
|
}
|
|
|
|
function booleanParser( sValue )
|
|
{
|
|
if( typeof sValue !== 'string' )
|
|
return undefined;
|
|
|
|
sValue = sValue.toLowerCase();
|
|
if( sValue === 'true' )
|
|
return true;
|
|
else if( sValue === 'false' )
|
|
return false;
|
|
else
|
|
return undefined;
|
|
}
|
|
|
|
function colorParser( sValue )
|
|
{
|
|
if( typeof sValue !== 'string' )
|
|
return undefined;
|
|
|
|
|
|
function hsl( nHue, nSaturation, nLuminance )
|
|
{
|
|
return new HSLColor( nHue, nSaturation / 100, nLuminance / 100 );
|
|
}
|
|
|
|
function rgb( nRed, nGreen, nBlue )
|
|
{
|
|
return new RGBColor( nRed / 255, nGreen / 255, nBlue / 255 );
|
|
}
|
|
|
|
function prgb( nRed, nGreen, nBlue )
|
|
{
|
|
return new RGBColor( nRed / 100, nGreen / 100, nBlue / 100 );
|
|
}
|
|
|
|
var sCommaPattern = ' *[,] *';
|
|
var sIntegerPattern = '[+-]?[0-9]+';
|
|
var sHexDigitPattern = '[0-9A-Fa-f]';
|
|
|
|
var sHexColorPattern = '#(' + sHexDigitPattern + '{2})('
|
|
+ sHexDigitPattern + '{2})('
|
|
+ sHexDigitPattern + '{2})';
|
|
|
|
var sRGBIntegerPattern = 'rgb[(] *' + sIntegerPattern + sCommaPattern
|
|
+ sIntegerPattern + sCommaPattern
|
|
+ sIntegerPattern + ' *[)]';
|
|
|
|
var sRGBPercentPattern = 'rgb[(] *' + sIntegerPattern + '%' + sCommaPattern
|
|
+ sIntegerPattern + '%' + sCommaPattern
|
|
+ sIntegerPattern + '%' + ' *[)]';
|
|
|
|
var sHSLPercentPattern = 'hsl[(] *' + sIntegerPattern + sCommaPattern
|
|
+ sIntegerPattern + '%' + sCommaPattern
|
|
+ sIntegerPattern + '%' + ' *[)]';
|
|
|
|
var reHexColor = new RegExp( sHexColorPattern );
|
|
var reRGBInteger = new RegExp( sRGBIntegerPattern );
|
|
var reRGBPercent = new RegExp( sRGBPercentPattern );
|
|
var reHSLPercent = new RegExp( sHSLPercentPattern );
|
|
|
|
if( reHexColor.test( sValue ) )
|
|
{
|
|
var aRGBTriple = reHexColor.exec( sValue );
|
|
|
|
var nRed = parseInt( aRGBTriple[1], 16 ) / 255;
|
|
var nGreen = parseInt( aRGBTriple[2], 16 ) / 255;
|
|
var nBlue = parseInt( aRGBTriple[3], 16 ) / 255;
|
|
|
|
return new RGBColor( nRed, nGreen, nBlue );
|
|
}
|
|
else if( reHSLPercent.test( sValue ) )
|
|
{
|
|
sValue = sValue.replace( '%', '' ).replace( '%', '' );
|
|
return eval( sValue );
|
|
}
|
|
else if( reRGBInteger.test( sValue ) )
|
|
{
|
|
return eval( sValue );
|
|
}
|
|
else if( reRGBPercent.test( sValue ) )
|
|
{
|
|
sValue = 'p' + sValue.replace( '%', '' ).replace( '%', '' ).replace( '%', '' );
|
|
return eval( sValue );
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
function RGBColor( nRed, nGreen, nBlue )
|
|
{
|
|
this.eColorSpace = COLOR_SPACE_RGB;
|
|
this.nRed = nRed;
|
|
this.nGreen = nGreen;
|
|
this.nBlue = nBlue;
|
|
}
|
|
|
|
|
|
RGBColor.prototype.clone = function()
|
|
{
|
|
return new RGBColor( this.nRed, this.nGreen, this.nBlue );
|
|
};
|
|
|
|
RGBColor.prototype.equal = function( aRGBColor )
|
|
{
|
|
return ( this.nRed == aRGBColor.nRed ) &&
|
|
( this.nGreen == aRGBColor.nGreen ) &&
|
|
( this.nBlue == aRGBColor.nBlue );
|
|
};
|
|
|
|
RGBColor.prototype.add = function( aRGBColor )
|
|
{
|
|
this.nRed += aRGBColor.nRed;
|
|
this.nGreen += aRGBColor.nGreen;
|
|
this.nBlue += aRGBColor.nBlue;
|
|
return this;
|
|
};
|
|
|
|
RGBColor.prototype.scale = function( aT )
|
|
{
|
|
this.nRed *= aT;
|
|
this.nGreen *= aT;
|
|
this.nBlue *= aT;
|
|
return this;
|
|
};
|
|
|
|
RGBColor.clamp = function( aRGBColor )
|
|
{
|
|
var aClampedRGBColor = new RGBColor( 0, 0, 0 );
|
|
|
|
aClampedRGBColor.nRed = clamp( aRGBColor.nRed, 0.0, 1.0 );
|
|
aClampedRGBColor.nGreen = clamp( aRGBColor.nGreen, 0.0, 1.0 );
|
|
aClampedRGBColor.nBlue = clamp( aRGBColor.nBlue, 0.0, 1.0 );
|
|
|
|
return aClampedRGBColor;
|
|
};
|
|
|
|
RGBColor.prototype.convertToHSL = function()
|
|
{
|
|
var nRed = clamp( this.nRed, 0.0, 1.0 );
|
|
var nGreen = clamp( this.nGreen, 0.0, 1.0 );
|
|
var nBlue = clamp( this.nBlue, 0.0, 1.0 );
|
|
|
|
var nMax = Math.max( nRed, nGreen, nBlue );
|
|
var nMin = Math.min( nRed, nGreen, nBlue );
|
|
var nDelta = nMax - nMin;
|
|
|
|
var nLuminance = ( nMax + nMin ) / 2.0;
|
|
var nSaturation = 0.0;
|
|
var nHue = 0.0;
|
|
if( nDelta !== 0 )
|
|
{
|
|
nSaturation = ( nLuminance > 0.5 ) ?
|
|
( nDelta / ( 2.0 - nMax - nMin) ) :
|
|
( nDelta / ( nMax + nMin ) );
|
|
|
|
if( nRed == nMax )
|
|
nHue = ( nGreen - nBlue ) / nDelta;
|
|
else if( nGreen == nMax )
|
|
nHue = 2.0 + ( nBlue - nRed ) / nDelta;
|
|
else if( nBlue == nMax )
|
|
nHue = 4.0 + ( nRed - nGreen ) / nDelta;
|
|
|
|
nHue *= 60.0;
|
|
|
|
if( nHue < 0.0 )
|
|
nHue += 360.0;
|
|
}
|
|
|
|
return new HSLColor( nHue, nSaturation, nLuminance );
|
|
|
|
};
|
|
|
|
RGBColor.prototype.toString = function( bClamped )
|
|
{
|
|
var aRGBColor;
|
|
if( bClamped )
|
|
{
|
|
aRGBColor = RGBColor.clamp( this );
|
|
}
|
|
else
|
|
{
|
|
aRGBColor = this;
|
|
}
|
|
|
|
var nRed = Math.round( aRGBColor.nRed * 255 );
|
|
var nGreen = Math.round( aRGBColor.nGreen * 255 );
|
|
var nBlue = Math.round( aRGBColor.nBlue * 255 );
|
|
|
|
return ( 'rgb(' + nRed + ',' + nGreen + ',' + nBlue + ')' );
|
|
};
|
|
|
|
RGBColor.interpolate = function( aStartRGB , aEndRGB, nT )
|
|
{
|
|
var aResult = aStartRGB.clone();
|
|
var aTEndRGB = aEndRGB.clone();
|
|
aResult.scale( 1.0 - nT );
|
|
aTEndRGB.scale( nT );
|
|
aResult.add( aTEndRGB );
|
|
|
|
return aResult;
|
|
};
|
|
|
|
|
|
function HSLColor( nHue, nSaturation, nLuminance )
|
|
{
|
|
this.eColorSpace = COLOR_SPACE_HSL;
|
|
this.nHue = nHue;
|
|
this.nSaturation = nSaturation;
|
|
this.nLuminance = nLuminance;
|
|
|
|
this.normalizeHue();
|
|
}
|
|
|
|
|
|
HSLColor.prototype.clone = function()
|
|
{
|
|
return new HSLColor( this.nHue, this.nSaturation, this.nLuminance );
|
|
};
|
|
|
|
HSLColor.prototype.equal = function( aHSLColor )
|
|
{
|
|
return ( this.nHue == aHSLColor.nHue ) &&
|
|
( this.nSaturation += aHSLColor.nSaturation ) &&
|
|
( this.nLuminance += aHSLColor.nLuminance );
|
|
};
|
|
|
|
HSLColor.prototype.add = function( aHSLColor )
|
|
{
|
|
this.nHue += aHSLColor.nHue;
|
|
this.nSaturation += aHSLColor.nSaturation;
|
|
this.nLuminance += aHSLColor.nLuminance;
|
|
this.normalizeHue();
|
|
return this;
|
|
};
|
|
|
|
HSLColor.prototype.scale = function( aT )
|
|
{
|
|
this.nHue *= aT;
|
|
this.nSaturation *= aT;
|
|
this.nLuminance *= aT;
|
|
this.normalizeHue();
|
|
return this;
|
|
};
|
|
|
|
HSLColor.clamp = function( aHSLColor )
|
|
{
|
|
var aClampedHSLColor = new HSLColor( 0, 0, 0 );
|
|
|
|
aClampedHSLColor.nHue = aHSLColor.nHue % 360;
|
|
if( aClampedHSLColor.nHue < 0 )
|
|
aClampedHSLColor.nHue += 360;
|
|
aClampedHSLColor.nSaturation = clamp( aHSLColor.nSaturation, 0.0, 1.0 );
|
|
aClampedHSLColor.nLuminance = clamp( aHSLColor.nLuminance, 0.0, 1.0 );
|
|
};
|
|
|
|
HSLColor.prototype.normalizeHue = function()
|
|
{
|
|
this.nHue = this.nHue % 360;
|
|
if( this.nHue < 0 ) this.nHue += 360;
|
|
};
|
|
|
|
HSLColor.prototype.toString = function()
|
|
{
|
|
return 'hsl(' + this.nHue.toFixed( 3 ) + ','
|
|
+ this.nSaturation.toFixed( 3 ) + ','
|
|
+ this.nLuminance.toFixed( 3 ) + ')';
|
|
};
|
|
|
|
HSLColor.prototype.convertToRGB = function()
|
|
{
|
|
|
|
var nHue = this.nHue % 360;
|
|
if( nHue < 0 ) nHue += 360;
|
|
var nSaturation = clamp( this.nSaturation, 0.0, 1.0 );
|
|
var nLuminance = clamp( this.nLuminance, 0.0, 1.0 );
|
|
|
|
|
|
if( nSaturation === 0 )
|
|
{
|
|
return new RGBColor( nLuminance, nLuminance, nLuminance );
|
|
}
|
|
|
|
var nVal1 = ( nLuminance <= 0.5 ) ?
|
|
( nLuminance * (1.0 + nSaturation) ) :
|
|
( nLuminance + nSaturation - nLuminance * nSaturation );
|
|
|
|
var nVal2 = 2.0 * nLuminance - nVal1;
|
|
|
|
var nRed = HSLColor.hsl2rgbHelper( nVal2, nVal1, nHue + 120 );
|
|
var nGreen = HSLColor.hsl2rgbHelper( nVal2, nVal1, nHue );
|
|
var nBlue = HSLColor.hsl2rgbHelper( nVal2, nVal1, nHue - 120 );
|
|
|
|
return new RGBColor( nRed, nGreen, nBlue );
|
|
};
|
|
|
|
HSLColor.hsl2rgbHelper = function( nValue1, nValue2, nHue )
|
|
{
|
|
nHue = nHue % 360;
|
|
if( nHue < 0 )
|
|
nHue += 360;
|
|
|
|
if( nHue < 60.0 )
|
|
return nValue1 + ( nValue2 - nValue1 ) * nHue / 60.0;
|
|
else if( nHue < 180.0 )
|
|
return nValue2;
|
|
else if( nHue < 240.0 )
|
|
return ( nValue1 + ( nValue2 - nValue1 ) * ( 240.0 - nHue ) / 60.0 );
|
|
else
|
|
return nValue1;
|
|
};
|
|
|
|
HSLColor.interpolate = function( aFrom, aTo, nT, bCCW )
|
|
{
|
|
var nS = 1.0 - nT;
|
|
|
|
var nHue = 0.0;
|
|
if( aFrom.nHue <= aTo.nHue && !bCCW )
|
|
{
|
|
nHue = nS * (aFrom.nHue + 360.0) + nT * aTo.nHue;
|
|
}
|
|
else if( aFrom.nHue > aTo.nHue && bCCW )
|
|
{
|
|
nHue = nS * aFrom.nHue + nT * (aTo.nHue + 360.0);
|
|
}
|
|
else
|
|
{
|
|
nHue = nS * aFrom.nHue + nT * aTo.nHue;
|
|
}
|
|
|
|
var nSaturation = nS * aFrom.nSaturation + nT * aTo.nSaturation;
|
|
var nLuminance = nS * aFrom.nLuminance + nT * aTo.nLuminance;
|
|
|
|
return new HSLColor( nHue, nSaturation, nLuminance );
|
|
};
|
|
|
|
|
|
var SVGIdentityMatrix = document.documentElement.createSVGMatrix();
|
|
|
|
SVGMatrix.prototype.setToIdentity = function()
|
|
{
|
|
this.a = this.d = 1;
|
|
this.b = this.c = this.d = this.e = 0;
|
|
};
|
|
|
|
SVGMatrix.prototype.setToRotationAroundPoint = function( nX, nY, nAngle )
|
|
{
|
|
nAngle = Math.PI * nAngle / 180;
|
|
var nSin = Math.sin( nAngle );
|
|
var nCos = Math.cos( nAngle );
|
|
|
|
this.a = nCos; this.c = -nSin; this.e = nX * (1 - nCos) + nY * nSin;
|
|
this.b = nSin; this.d = nCos; this.f = nY * (1 - nCos) - nX * nSin;
|
|
};
|
|
|
|
|
|
SVGPathElement.prototype.prependPath = function( aPath )
|
|
{
|
|
var sPathData = aPath.getAttribute( 'd' );
|
|
sPathData += ( ' ' + this.getAttribute( 'd' ) );
|
|
this.setAttribute( 'd', sPathData );
|
|
};
|
|
|
|
SVGPathElement.prototype.appendPath = function( aPath )
|
|
{
|
|
var sPathData = this.getAttribute( 'd' );
|
|
sPathData += ( ' ' + aPath.getAttribute( 'd' ) );
|
|
this.setAttribute( 'd', sPathData );
|
|
};
|
|
|
|
function flipOnYAxis( aPath )
|
|
{
|
|
var aPolyPath = aPath.cloneNode(true);
|
|
var aTransform = document.documentElement.createSVGMatrix();
|
|
aTransform.a = -1;
|
|
aTransform.e = 1;
|
|
aPolyPath.matrixTransform(aTransform);
|
|
return aPolyPath;
|
|
}
|
|
|
|
function flipOnXAxis( aPath )
|
|
{
|
|
var aPolyPath = aPath.cloneNode(true);
|
|
var aTransform = document.documentElement.createSVGMatrix();
|
|
aTransform.d = -1;
|
|
aTransform.f = 1;
|
|
aPolyPath.matrixTransform(aTransform);
|
|
return aPolyPath;
|
|
}
|
|
|
|
SVGPathElement.prototype.matrixTransform = function( aSVGMatrix )
|
|
{
|
|
if( SVGPathSegList.prototype.matrixTransform )
|
|
{
|
|
this.pathSegList.matrixTransform( aSVGMatrix );
|
|
return;
|
|
}
|
|
|
|
var aPathSegList = this.pathSegList;
|
|
var nLength = aPathSegList.numberOfItems;
|
|
var i;
|
|
for( i = 0; i < nLength; ++i )
|
|
{
|
|
aPathSegList.getItem( i ).matrixTransform( aSVGMatrix );
|
|
}
|
|
};
|
|
|
|
SVGPathElement.prototype.changeOrientation = function()
|
|
{
|
|
var aPathSegList = this.pathSegList;
|
|
var nLength = aPathSegList.numberOfItems;
|
|
if( nLength == 0 ) return;
|
|
|
|
if( SVGPathSegList.prototype.changeOrientation )
|
|
{
|
|
aPathSegList.changeOrientation();
|
|
return;
|
|
}
|
|
|
|
var nCurrentX = 0;
|
|
var nCurrentY = 0;
|
|
|
|
var aPathSeg = aPathSegList.getItem( 0 );
|
|
if( aPathSeg.pathSegTypeAsLetter == 'M' )
|
|
{
|
|
nCurrentX = aPathSeg.x;
|
|
nCurrentY = aPathSeg.y;
|
|
aPathSegList.removeItem( 0 );
|
|
--nLength;
|
|
}
|
|
|
|
var i;
|
|
for( i = 0; i < nLength; ++i )
|
|
{
|
|
aPathSeg = aPathSegList.getItem( i );
|
|
var aPoint = aPathSeg.changeOrientation( nCurrentX, nCurrentY );
|
|
nCurrentX = aPoint.x;
|
|
nCurrentY = aPoint.y;
|
|
}
|
|
|
|
|
|
for( i = nLength - 2; i >= 0; --i )
|
|
{
|
|
aPathSeg = aPathSegList.removeItem( i );
|
|
aPathSegList.appendItem( aPathSeg );
|
|
}
|
|
|
|
var aMovePathSeg = this.createSVGPathSegMovetoAbs( nCurrentX, nCurrentY );
|
|
aPathSegList.insertItemBefore( aMovePathSeg, 0 );
|
|
|
|
};
|
|
|
|
|
|
try
|
|
{ // Firefox, Google Chrome, Internet Explorer, Safari.
|
|
|
|
SVGPathSegMovetoAbs.prototype.matrixTransform = function( aSVGMatrix )
|
|
{
|
|
SVGPathMatrixTransform( this, aSVGMatrix );
|
|
};
|
|
|
|
SVGPathSegLinetoAbs.prototype.matrixTransform = function( aSVGMatrix )
|
|
{
|
|
SVGPathMatrixTransform( this, aSVGMatrix );
|
|
};
|
|
|
|
SVGPathSegCurvetoQuadraticAbs.prototype.matrixTransform = function( aSVGMatrix )
|
|
{
|
|
SVGPathMatrixTransform( this, aSVGMatrix );
|
|
var nX = this.x1;
|
|
this.x1 = aSVGMatrix.a * nX + aSVGMatrix.c * this.y1 + aSVGMatrix.e;
|
|
this.y1 = aSVGMatrix.b * nX + aSVGMatrix.d * this.y1 + aSVGMatrix.f;
|
|
};
|
|
|
|
SVGPathSegCurvetoCubicAbs.prototype.matrixTransform = function( aSVGMatrix )
|
|
{
|
|
SVGPathMatrixTransform( this, aSVGMatrix );
|
|
var nX = this.x1;
|
|
this.x1 = aSVGMatrix.a * nX + aSVGMatrix.c * this.y1 + aSVGMatrix.e;
|
|
this.y1 = aSVGMatrix.b * nX + aSVGMatrix.d * this.y1 + aSVGMatrix.f;
|
|
nX = this.x2;
|
|
this.x2 = aSVGMatrix.a * nX + aSVGMatrix.c * this.y2 + aSVGMatrix.e;
|
|
this.y2 = aSVGMatrix.b * nX + aSVGMatrix.d * this.y2 + aSVGMatrix.f;
|
|
};
|
|
|
|
|
|
SVGPathSegMovetoAbs.prototype.changeOrientation = function( nCurrentX, nCurrentY )
|
|
{
|
|
var aPoint = { x: this.x, y: this.y };
|
|
this.x = nCurrentX;
|
|
this.y = nCurrentY;
|
|
return aPoint;
|
|
};
|
|
|
|
SVGPathSegLinetoAbs.prototype.changeOrientation = function( nCurrentX, nCurrentY )
|
|
{
|
|
var aPoint = { x: this.x, y: this.y };
|
|
this.x = nCurrentX;
|
|
this.y = nCurrentY;
|
|
return aPoint;
|
|
};
|
|
|
|
SVGPathSegCurvetoQuadraticAbs.prototype.changeOrientation = function( nCurrentX, nCurrentY )
|
|
{
|
|
var aPoint = { x: this.x, y: this.y };
|
|
this.x = nCurrentX;
|
|
this.y = nCurrentY;
|
|
return aPoint;
|
|
};
|
|
|
|
SVGPathSegCurvetoCubicAbs.prototype.changeOrientation = function( nCurrentX, nCurrentY )
|
|
{
|
|
var aPoint = { x: this.x, y: this.y };
|
|
this.x = nCurrentX;
|
|
this.y = nCurrentY;
|
|
var nX = this.x1;
|
|
this.x1 = this.x2;
|
|
this.x2 = nX;
|
|
var nY = this.y1;
|
|
this.y1 = this.y2;
|
|
this.y2 = nY;
|
|
return aPoint;
|
|
};
|
|
|
|
}
|
|
catch( e )
|
|
{ // Opera
|
|
|
|
if( e.name == 'ReferenceError' )
|
|
{
|
|
SVGPathSeg.prototype.matrixTransform = function( aSVGMatrix )
|
|
{
|
|
var nX;
|
|
switch( this.pathSegTypeAsLetter )
|
|
{
|
|
case 'C':
|
|
nX = this.x2;
|
|
this.x2 = aSVGMatrix.a * nX + aSVGMatrix.c * this.y2 + aSVGMatrix.e;
|
|
this.y2 = aSVGMatrix.b * nX + aSVGMatrix.d * this.y2 + aSVGMatrix.f;
|
|
case 'Q':
|
|
nX = this.x1;
|
|
this.x1 = aSVGMatrix.a * nX + aSVGMatrix.c * this.y1 + aSVGMatrix.e;
|
|
this.y1 = aSVGMatrix.b * nX + aSVGMatrix.d * this.y1 + aSVGMatrix.f;
|
|
case 'M':
|
|
case 'L':
|
|
SVGPathMatrixTransform( this, aSVGMatrix );
|
|
break;
|
|
default:
|
|
log( 'SVGPathSeg.matrixTransform: unexpected path segment type: '
|
|
+ this.pathSegTypeAsLetter );
|
|
}
|
|
};
|
|
|
|
SVGPathSeg.prototype.changeOrientation = function( nCurrentX, nCurrentY )
|
|
{
|
|
switch( this.pathSegTypeAsLetter )
|
|
{
|
|
case 'C':
|
|
var nX = this.x1;
|
|
this.x1 = this.x2;
|
|
this.x2 = nX;
|
|
var nY = this.y1;
|
|
this.y1 = this.y2;
|
|
this.y2 = nY;
|
|
case 'M':
|
|
case 'L':
|
|
case 'Q':
|
|
var aPoint = { x: this.x, y: this.y };
|
|
this.x = nCurrentX;
|
|
this.y = nCurrentY;
|
|
return aPoint;
|
|
default:
|
|
log( 'SVGPathSeg.changeOrientation: unexpected path segment type: '
|
|
+ this.pathSegTypeAsLetter );
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
else throw e;
|
|
}
|
|
|
|
function SVGPathMatrixTransform( aPath, aSVGMatrix )
|
|
{
|
|
var nX = aPath.x;
|
|
aPath.x = aSVGMatrix.a * nX + aSVGMatrix.c * aPath.y + aSVGMatrix.e;
|
|
aPath.y = aSVGMatrix.b * nX + aSVGMatrix.d * aPath.y + aSVGMatrix.f;
|
|
}
|
|
|
|
|
|
function PriorityQueue( aCompareFunc )
|
|
{
|
|
this.aSequence = [];
|
|
this.aCompareFunc = aCompareFunc;
|
|
}
|
|
|
|
PriorityQueue.prototype.clone = function()
|
|
{
|
|
var aCopy = new PriorityQueue( this.aCompareFunc );
|
|
var src = this.aSequence;
|
|
var dest = [];
|
|
var i, l;
|
|
for( i = 0, l = src.length; i < l; ++i )
|
|
{
|
|
if( i in src )
|
|
{
|
|
dest.push( src[i] );
|
|
}
|
|
}
|
|
aCopy.aSequence = dest;
|
|
return aCopy;
|
|
};
|
|
|
|
PriorityQueue.prototype.top = function()
|
|
{
|
|
return this.aSequence[this.aSequence.length - 1];
|
|
};
|
|
|
|
PriorityQueue.prototype.isEmpty = function()
|
|
{
|
|
return ( this.aSequence.length === 0 );
|
|
};
|
|
|
|
PriorityQueue.prototype.push = function( aValue )
|
|
{
|
|
this.aSequence.unshift( aValue );
|
|
this.aSequence.sort(this.aCompareFunc);
|
|
};
|
|
|
|
PriorityQueue.prototype.clear = function()
|
|
{
|
|
this.aSequence = [];
|
|
};
|
|
|
|
PriorityQueue.prototype.pop = function()
|
|
{
|
|
return this.aSequence.pop();
|
|
};
|
|
|
|
|
|
var ANIMATION_NODE_CUSTOM = 0;
|
|
var ANIMATION_NODE_PAR = 1;
|
|
var ANIMATION_NODE_SEQ = 2;
|
|
var ANIMATION_NODE_ITERATE = 3;
|
|
var ANIMATION_NODE_ANIMATE = 4;
|
|
var ANIMATION_NODE_SET = 5;
|
|
var ANIMATION_NODE_ANIMATEMOTION = 6;
|
|
var ANIMATION_NODE_ANIMATECOLOR = 7;
|
|
var ANIMATION_NODE_ANIMATETRANSFORM = 8;
|
|
var ANIMATION_NODE_TRANSITIONFILTER = 9;
|
|
var ANIMATION_NODE_AUDIO = 10;
|
|
var ANIMATION_NODE_COMMAND = 11;
|
|
|
|
var aAnimationNodeTypeInMap = {
|
|
'par' : ANIMATION_NODE_PAR,
|
|
'seq' : ANIMATION_NODE_SEQ,
|
|
'iterate' : ANIMATION_NODE_ITERATE,
|
|
'animate' : ANIMATION_NODE_ANIMATE,
|
|
'set' : ANIMATION_NODE_SET,
|
|
'animatemotion' : ANIMATION_NODE_ANIMATEMOTION,
|
|
'animatecolor' : ANIMATION_NODE_ANIMATECOLOR,
|
|
'animatetransform' : ANIMATION_NODE_ANIMATETRANSFORM,
|
|
'transitionfilter' : ANIMATION_NODE_TRANSITIONFILTER,
|
|
'audio' : ANIMATION_NODE_AUDIO,
|
|
'command' : ANIMATION_NODE_COMMAND
|
|
};
|
|
|
|
|
|
function getAnimationElementType( aElement )
|
|
{
|
|
var sName = aElement.localName.toLowerCase();
|
|
|
|
if( sName && aAnimationNodeTypeInMap[ sName ] )
|
|
return aAnimationNodeTypeInMap[ sName ];
|
|
else
|
|
return ANIMATION_NODE_CUSTOM;
|
|
}
|
|
|
|
|
|
var INVALID_NODE = 0;
|
|
var UNRESOLVED_NODE = 1;
|
|
var RESOLVED_NODE = 2;
|
|
var ACTIVE_NODE = 4;
|
|
var FROZEN_NODE = 8;
|
|
var ENDED_NODE = 16;
|
|
|
|
function getNodeStateName( eNodeState )
|
|
{
|
|
switch( eNodeState )
|
|
{
|
|
case INVALID_NODE:
|
|
return 'INVALID';
|
|
case UNRESOLVED_NODE:
|
|
return 'UNRESOLVED';
|
|
case RESOLVED_NODE:
|
|
return 'RESOLVED';
|
|
case ACTIVE_NODE:
|
|
return 'ACTIVE';
|
|
case FROZEN_NODE:
|
|
return 'FROZEN';
|
|
case ENDED_NODE:
|
|
return 'ENDED';
|
|
default:
|
|
return 'UNKNOWN';
|
|
}
|
|
}
|
|
|
|
|
|
var IMPRESS_DEFAULT_NODE = 0;
|
|
var IMPRESS_ON_CLICK_NODE = 1;
|
|
var IMPRESS_WITH_PREVIOUS_NODE = 2;
|
|
var IMPRESS_AFTER_PREVIOUS_NODE = 3;
|
|
var IMPRESS_MAIN_SEQUENCE_NODE = 4;
|
|
var IMPRESS_TIMING_ROOT_NODE = 5;
|
|
var IMPRESS_INTERACTIVE_SEQUENCE_NODE = 6;
|
|
|
|
var aImpressNodeTypeInMap = {
|
|
'on-click' : IMPRESS_ON_CLICK_NODE,
|
|
'with-previous' : IMPRESS_WITH_PREVIOUS_NODE,
|
|
'after-previous' : IMPRESS_AFTER_PREVIOUS_NODE,
|
|
'main-sequence' : IMPRESS_MAIN_SEQUENCE_NODE,
|
|
'timing-root' : IMPRESS_TIMING_ROOT_NODE,
|
|
'interactive-sequence' : IMPRESS_INTERACTIVE_SEQUENCE_NODE
|
|
};
|
|
|
|
var aImpressNodeTypeOutMap = [ 'default', 'on-click', 'with-previous', 'after-previous',
|
|
'main-sequence', 'timing-root', 'interactive-sequence' ];
|
|
|
|
|
|
var aPresetClassInMap = {};
|
|
|
|
|
|
var aPresetIdInMap = {};
|
|
|
|
|
|
var RESTART_MODE_DEFAULT = 0;
|
|
var RESTART_MODE_INHERIT = 0; // eslint-disable-line no-unused-vars
|
|
var RESTART_MODE_ALWAYS = 1;
|
|
var RESTART_MODE_WHEN_NOT_ACTIVE = 2;
|
|
var RESTART_MODE_NEVER = 3;
|
|
|
|
var aRestartModeInMap = {
|
|
'inherit' : RESTART_MODE_DEFAULT,
|
|
'always' : RESTART_MODE_ALWAYS,
|
|
'whenNotActive' : RESTART_MODE_WHEN_NOT_ACTIVE,
|
|
'never' : RESTART_MODE_NEVER
|
|
};
|
|
|
|
var aRestartModeOutMap = [ 'inherit','always', 'whenNotActive', 'never' ];
|
|
|
|
|
|
var FILL_MODE_DEFAULT = 0;
|
|
var FILL_MODE_INHERIT = 0; // eslint-disable-line no-unused-vars
|
|
var FILL_MODE_REMOVE = 1;
|
|
var FILL_MODE_FREEZE = 2;
|
|
var FILL_MODE_HOLD = 3;
|
|
var FILL_MODE_TRANSITION = 4;
|
|
var FILL_MODE_AUTO = 5;
|
|
|
|
var aFillModeInMap = {
|
|
'inherit' : FILL_MODE_DEFAULT,
|
|
'remove' : FILL_MODE_REMOVE,
|
|
'freeze' : FILL_MODE_FREEZE,
|
|
'hold' : FILL_MODE_HOLD,
|
|
'transition' : FILL_MODE_TRANSITION,
|
|
'auto' : FILL_MODE_AUTO
|
|
};
|
|
|
|
var aFillModeOutMap = [ 'inherit', 'remove', 'freeze', 'hold', 'transition', 'auto' ];
|
|
|
|
|
|
var ADDITIVE_MODE_UNKNOWN = 0; // eslint-disable-line no-unused-vars
|
|
var ADDITIVE_MODE_BASE = 1;
|
|
var ADDITIVE_MODE_SUM = 2;
|
|
var ADDITIVE_MODE_REPLACE = 3;
|
|
var ADDITIVE_MODE_MULTIPLY = 4;
|
|
var ADDITIVE_MODE_NONE = 5;
|
|
|
|
var aAddittiveModeInMap = {
|
|
'base' : ADDITIVE_MODE_BASE,
|
|
'sum' : ADDITIVE_MODE_SUM,
|
|
'replace' : ADDITIVE_MODE_REPLACE,
|
|
'multiply' : ADDITIVE_MODE_MULTIPLY,
|
|
'none' : ADDITIVE_MODE_NONE
|
|
};
|
|
|
|
var aAddittiveModeOutMap = [ 'unknown', 'base', 'sum', 'replace', 'multiply', 'none' ];
|
|
|
|
|
|
var ACCUMULATE_MODE_NONE = 0;
|
|
var ACCUMULATE_MODE_SUM = 1;
|
|
|
|
var aAccumulateModeOutMap = [ 'none', 'sum' ];
|
|
|
|
var CALC_MODE_DISCRETE = 1;
|
|
var CALC_MODE_LINEAR = 2;
|
|
var CALC_MODE_PACED = 3;
|
|
var CALC_MODE_SPLINE = 4;
|
|
|
|
var aCalcModeInMap = {
|
|
'discrete' : CALC_MODE_DISCRETE,
|
|
'linear' : CALC_MODE_LINEAR,
|
|
'paced' : CALC_MODE_PACED,
|
|
'spline' : CALC_MODE_SPLINE
|
|
};
|
|
|
|
var aCalcModeOutMap = [ 'unknown', 'discrete', 'linear', 'paced', 'spline' ];
|
|
|
|
|
|
var COLOR_SPACE_RGB = 0;
|
|
var COLOR_SPACE_HSL = 1;
|
|
|
|
var aColorSpaceInMap = { 'rgb': COLOR_SPACE_RGB, 'hsl': COLOR_SPACE_HSL };
|
|
|
|
var aColorSpaceOutMap = [ 'rgb', 'hsl' ];
|
|
|
|
|
|
var CLOCKWISE = 0;
|
|
var COUNTERCLOCKWISE = 1;
|
|
|
|
var aClockDirectionInMap = { 'clockwise': CLOCKWISE, 'counter-clockwise': COUNTERCLOCKWISE };
|
|
|
|
var aClockDirectionOutMap = [ 'clockwise', 'counter-clockwise' ];
|
|
|
|
|
|
var UNKNOWN_PROPERTY = 0; // eslint-disable-line no-unused-vars
|
|
var NUMBER_PROPERTY = 1;
|
|
var ENUM_PROPERTY = 2;
|
|
var COLOR_PROPERTY = 3;
|
|
var STRING_PROPERTY = 4;
|
|
var BOOL_PROPERTY = 5;
|
|
var TUPLE_NUMBER_PROPERTY = 6;
|
|
|
|
var aValueTypeOutMap = [ 'unknown', 'number', 'enum', 'color', 'string', 'boolean' ];
|
|
|
|
|
|
var aAttributeMap =
|
|
{
|
|
'height': { 'type': NUMBER_PROPERTY,
|
|
'get': 'getHeight',
|
|
'set': 'setHeight',
|
|
'getmod': 'makeScaler( 1/nHeight )',
|
|
'setmod': 'makeScaler( nHeight)' },
|
|
|
|
'opacity': { 'type': NUMBER_PROPERTY,
|
|
'get': 'getOpacity',
|
|
'set': 'setOpacity' },
|
|
|
|
'scale': { 'type': TUPLE_NUMBER_PROPERTY,
|
|
'get': 'getSize',
|
|
'set': 'setSize' },
|
|
|
|
'translate': { 'type': TUPLE_NUMBER_PROPERTY,
|
|
'get': 'getPos',
|
|
'set': 'setPos' },
|
|
|
|
'rotate': { 'type': NUMBER_PROPERTY,
|
|
'get': 'getRotationAngle',
|
|
'set': 'setRotationAngle' },
|
|
|
|
'width': { 'type': NUMBER_PROPERTY,
|
|
'get': 'getWidth',
|
|
'set': 'setWidth',
|
|
'getmod': 'makeScaler( 1/nWidth )',
|
|
'setmod': 'makeScaler( nWidth)' },
|
|
|
|
'x': { 'type': NUMBER_PROPERTY,
|
|
'get': 'getX',
|
|
'set': 'setX',
|
|
'getmod': 'makeScaler( 1/nWidth )',
|
|
'setmod': 'makeScaler( nWidth)' },
|
|
|
|
'y': { 'type': NUMBER_PROPERTY,
|
|
'get': 'getY',
|
|
'set': 'setY',
|
|
'getmod': 'makeScaler( 1/nHeight )',
|
|
'setmod': 'makeScaler( nHeight)' },
|
|
|
|
'fill': { 'type': ENUM_PROPERTY,
|
|
'get': 'getFillStyle',
|
|
'set': 'setFillStyle' },
|
|
|
|
'stroke': { 'type': ENUM_PROPERTY,
|
|
'get': 'getStrokeStyle',
|
|
'set': 'setStrokeStyle' },
|
|
|
|
'visibility': { 'type': ENUM_PROPERTY,
|
|
'get': 'getVisibility',
|
|
'set': 'setVisibility' },
|
|
|
|
'fill-color': { 'type': COLOR_PROPERTY,
|
|
'get': 'getFillColor',
|
|
'set': 'setFillColor' },
|
|
|
|
'stroke-color': { 'type': COLOR_PROPERTY,
|
|
'get': 'getStrokeColor',
|
|
'set': 'setStrokeColor' },
|
|
|
|
'color': { 'type': COLOR_PROPERTY,
|
|
'get': 'getFontColor',
|
|
'set': 'setFontColor' }
|
|
|
|
};
|
|
|
|
|
|
var TRANSITION_INVALID = 0; // Invalid type
|
|
var TRANSITION_CLIP_POLYPOLYGON = 1; // Transition expressed by parametric clip polygon
|
|
var TRANSITION_SPECIAL = 2; // Transition expressed by hand-crafted function
|
|
|
|
|
|
var BARWIPE_TRANSITION = 1;
|
|
var BOXWIPE_TRANSITION = 2;
|
|
var FOURBOXWIPE_TRANSITION = 3;
|
|
var ELLIPSEWIPE_TRANSITION = 4; // 17
|
|
var CLOCKWIPE_TRANSITION = 5; // 22
|
|
var PINWHEELWIPE_TRANSITION = 6; // 23
|
|
var PUSHWIPE_TRANSITION = 7; // 35
|
|
var SLIDEWIPE_TRANSITION = 8; // 36
|
|
var FADE_TRANSITION = 9; // 37
|
|
var RANDOMBARWIPE_TRANSITION = 10; // 38
|
|
var CHECKERBOARDWIPE_TRANSITION = 11; // 39
|
|
var DISSOLVE_TRANSITION = 12; // 40
|
|
var SNAKEWIPE_TRANSITION = 13; // 30
|
|
var PARALLELSNAKESWIPE_TRANSITION = 14; // 32
|
|
var IRISWIPE_TRANSITION = 15; // 12
|
|
var BARNDOORWIPE_TRANSITION = 16; // 4
|
|
var VEEWIPE_TRANSITION = 17; // 8
|
|
var ZIGZAGWIPE_TRANSITION = 18; // 10
|
|
var BARNZIGZAGWIPE_TRANSITION = 19; // 11
|
|
var FANWIPE_TRANSITION = 20; // 25
|
|
var SINGLESWEEPWIPE_TRANSITION = 21; // 24
|
|
var WATERFALLWIPE_TRANSITION = 22; // 34
|
|
var SPIRALWIPE_TRANSITION = 23; // 31
|
|
var MISCDIAGONALWIPE_TRANSITION = 24; // 7
|
|
var BOXSNAKESWIPE_TRANSITION = 25; // 33
|
|
|
|
var aTransitionTypeInMap = {
|
|
'barWipe' : BARWIPE_TRANSITION,
|
|
'boxWipe' : BOXWIPE_TRANSITION,
|
|
'barnDoorWipe' : BARNDOORWIPE_TRANSITION,
|
|
'fourBoxWipe' : FOURBOXWIPE_TRANSITION,
|
|
'ellipseWipe' : ELLIPSEWIPE_TRANSITION,
|
|
'clockWipe' : CLOCKWIPE_TRANSITION,
|
|
'pinWheelWipe' : PINWHEELWIPE_TRANSITION,
|
|
'miscDiagonalWipe' : MISCDIAGONALWIPE_TRANSITION,
|
|
'pushWipe' : PUSHWIPE_TRANSITION,
|
|
'slideWipe' : SLIDEWIPE_TRANSITION,
|
|
'fade' : FADE_TRANSITION,
|
|
'fanWipe' : FANWIPE_TRANSITION,
|
|
'randomBarWipe' : RANDOMBARWIPE_TRANSITION,
|
|
'checkerBoardWipe' : CHECKERBOARDWIPE_TRANSITION,
|
|
'dissolve' : DISSOLVE_TRANSITION,
|
|
'singleSweepWipe' : SINGLESWEEPWIPE_TRANSITION,
|
|
'snakeWipe' : SNAKEWIPE_TRANSITION,
|
|
'parallelSnakesWipe': PARALLELSNAKESWIPE_TRANSITION,
|
|
'spiralWipe' : SPIRALWIPE_TRANSITION,
|
|
'boxSnakesWipe' : BOXSNAKESWIPE_TRANSITION,
|
|
'irisWipe' : IRISWIPE_TRANSITION,
|
|
'veeWipe' : VEEWIPE_TRANSITION,
|
|
'zigZagWipe' : ZIGZAGWIPE_TRANSITION,
|
|
'barnZigZagWipe' : BARNZIGZAGWIPE_TRANSITION,
|
|
'waterfallWipe' : WATERFALLWIPE_TRANSITION
|
|
};
|
|
|
|
var DEFAULT_TRANS_SUBTYPE = 0;
|
|
var LEFTTORIGHT_TRANS_SUBTYPE = 1;
|
|
var TOPTOBOTTOM_TRANS_SUBTYPE = 2;
|
|
var CORNERSIN_TRANS_SUBTYPE = 3; // 11
|
|
var CORNERSOUT_TRANS_SUBTYPE = 4;
|
|
var VERTICAL_TRANS_SUBTYPE = 5;
|
|
var HORIZONTAL_TRANS_SUBTYPE = 6; // 14
|
|
var DOWN_TRANS_SUBTYPE = 7; // 19
|
|
var CIRCLE_TRANS_SUBTYPE = 8; // 27
|
|
var CLOCKWISETWELVE_TRANS_SUBTYPE = 9; // 33
|
|
var CLOCKWISETHREE_TRANS_SUBTYPE = 10;
|
|
var CLOCKWISESIX_TRANS_SUBTYPE = 11;
|
|
var CLOCKWISENINE_TRANS_SUBTYPE = 12;
|
|
var TWOBLADEVERTICAL_TRANS_SUBTYPE = 13;
|
|
var TWOBLADEHORIZONTAL_TRANS_SUBTYPE = 14;
|
|
var FOURBLADE_TRANS_SUBTYPE = 15; // 39
|
|
var FROMLEFT_TRANS_SUBTYPE = 16; // 97
|
|
var FROMTOP_TRANS_SUBTYPE = 17;
|
|
var FROMRIGHT_TRANS_SUBTYPE = 18;
|
|
var FROMBOTTOM_TRANS_SUBTYPE = 19;
|
|
var CROSSFADE_TRANS_SUBTYPE = 20;
|
|
var FADETOCOLOR_TRANS_SUBTYPE = 21;
|
|
var FADEFROMCOLOR_TRANS_SUBTYPE = 22;
|
|
var FADEOVERCOLOR_TRANS_SUBTYPE = 23;
|
|
var THREEBLADE_TRANS_SUBTYPE = 24;
|
|
var EIGHTBLADE_TRANS_SUBTYPE = 25;
|
|
var ONEBLADE_TRANS_SUBTYPE = 26; // 107
|
|
var ACROSS_TRANS_SUBTYPE = 27;
|
|
var TOPLEFTVERTICAL_TRANS_SUBTYPE = 28; // 109
|
|
var TOPLEFTHORIZONTAL_TRANS_SUBTYPE = 29; // 64
|
|
var TOPLEFTDIAGONAL_TRANS_SUBTYPE = 30; // 65
|
|
var TOPRIGHTDIAGONAL_TRANS_SUBTYPE = 31; // 66
|
|
var BOTTOMRIGHTDIAGONAL_TRANS_SUBTYPE = 32; // 67
|
|
var BOTTOMLEFTDIAGONAL_TRANS_SUBTYPE = 33; // 68
|
|
var RECTANGLE_TRANS_SUBTYPE = 34; // 101
|
|
var DIAMOND_TRANS_SUBTYPE = 35; // 102
|
|
var TOPLEFT_TRANS_SUBTYPE = 36; // 3
|
|
var TOPRIGHT_TRANS_SUBTYPE = 37; // 4
|
|
var BOTTOMRIGHT_TRANS_SUBTYPE = 38; // 5
|
|
var BOTTOMLEFT_TRANS_SUBTYPE = 39; // 6
|
|
var TOPCENTER_TRANS_SUBTYPE = 40; // 7
|
|
var RIGHTCENTER_TRANS_SUBTYPE = 41; // 8
|
|
var BOTTOMCENTER_TRANS_SUBTYPE = 42; // 9
|
|
var LEFTCENTER_TRANS_SUBTYPE = 43; // 10
|
|
var LEFT_TRANS_SUBTYPE = 44; // 20
|
|
var UP_TRANS_SUBTYPE = 45; // 21
|
|
var RIGHT_TRANS_SUBTYPE = 46; // 22
|
|
var DIAGONALBOTTOMLEFT_TRANS_SUBTYPE = 47; // 15
|
|
var DIAGONALTOPLEFT_TRANS_SUBTYPE = 48; // 16
|
|
var CENTERTOP_TRANS_SUBTYPE = 49; // 48
|
|
var CENTERRIGHT_TRANS_SUBTYPE = 50; // 49
|
|
var TOP_TRANS_SUBTYPE = 51; // 50
|
|
var BOTTOM_TRANS_SUBTYPE = 52; // 52
|
|
var CLOCKWISETOP_TRANS_SUBTYPE = 53; // 40
|
|
var CLOCKWISERIGHT_TRANS_SUBTYPE = 54; // 41
|
|
var CLOCKWISEBOTTOM_TRANS_SUBTYPE = 55; // 42
|
|
var CLOCKWISELEFT_TRANS_SUBTYPE = 56; // 43
|
|
var CLOCKWISETOPLEFT_TRANS_SUBTYPE = 57; // 44
|
|
var COUNTERCLOCKWISEBOTTOMLEFT_TRANS_SUBTYPE = 58; // 45
|
|
var CLOCKWISEBOTTOMRIGHT_TRANS_SUBTYPE = 59; // 46
|
|
var COUNTERCLOCKWISETOPRIGHT_TRANS_SUBTYPE = 60; // 47
|
|
var VERTICALLEFT_TRANS_SUBTYPE = 61; // 93
|
|
var VERTICALRIGHT_TRANS_SUBTYPE = 62; // 94
|
|
var HORIZONTALLEFT_TRANS_SUBTYPE = 63; // 95
|
|
var HORIZONTALRIGHT_TRANS_SUBTYPE = 64; // 96
|
|
var TOPLEFTCLOCKWISE_TRANS_SUBTYPE = 65; // 69
|
|
var TOPRIGHTCLOCKWISE_TRANS_SUBTYPE = 66; // 70
|
|
var BOTTOMRIGHTCLOCKWISE_TRANS_SUBTYPE = 67; // 71
|
|
var BOTTOMLEFTCLOCKWISE_TRANS_SUBTYPE = 68; // 72
|
|
var TOPLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE = 69; // 73
|
|
var TOPRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE = 70; // 74
|
|
var BOTTOMRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE = 71; // 75
|
|
var BOTTOMLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE = 72; // 76
|
|
var DOUBLEBARNDOOR_TRANS_SUBTYPE = 73; // 17
|
|
var DOUBLEDIAMOND_TRANS_SUBTYPE = 74; // 18
|
|
var VERTICALTOPSAME_TRANS_SUBTYPE = 75; // 77
|
|
var VERTICALBOTTOMSAME_TRANS_SUBTYPE = 76; // 78
|
|
var VERTICALTOPLEFTOPPOSITE_TRANS_SUBTYPE = 77; // 79
|
|
var VERTICALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE = 78; // 80
|
|
var HORIZONTALLEFTSAME_TRANS_SUBTYPE = 79; // 81
|
|
var HORIZONTALRIGHTSAME_TRANS_SUBTYPE = 80; // 82
|
|
var HORIZONTALTOPLEFTOPPOSITE_TRANS_SUBTYPE = 81; // 83
|
|
var HORIZONTALTOPRIGHTOPPOSITE_TRANS_SUBTYPE = 82; // 84
|
|
var DIAGONALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE = 83; // 85
|
|
var DIAGONALTOPLEFTOPPOSITE_TRANS_SUBTYPE = 84; // 86
|
|
var TWOBOXTOP_TRANS_SUBTYPE = 85; // 87
|
|
var TWOBOXBOTTOM_TRANS_SUBTYPE = 86; // 88
|
|
var TWOBOXLEFT_TRANS_SUBTYPE = 87; // 89
|
|
var TWOBOXRIGHT_TRANS_SUBTYPE = 88; // 90
|
|
var FOURBOXVERTICAL_TRANS_SUBTYPE = 89; // 91
|
|
var FOURBOXHORIZONTAL_TRANS_SUBTYPE = 90; // 92
|
|
|
|
var aTransitionSubtypeInMap = {
|
|
'default' : DEFAULT_TRANS_SUBTYPE,
|
|
'leftToRight' : LEFTTORIGHT_TRANS_SUBTYPE,
|
|
'topToBottom' : TOPTOBOTTOM_TRANS_SUBTYPE,
|
|
'cornersIn' : CORNERSIN_TRANS_SUBTYPE,
|
|
'cornersOut' : CORNERSOUT_TRANS_SUBTYPE,
|
|
'vertical' : VERTICAL_TRANS_SUBTYPE,
|
|
'centerTop' : CENTERTOP_TRANS_SUBTYPE,
|
|
'centerRight' : CENTERRIGHT_TRANS_SUBTYPE,
|
|
'top' : TOP_TRANS_SUBTYPE,
|
|
'right' : RIGHT_TRANS_SUBTYPE,
|
|
'bottom' : BOTTOM_TRANS_SUBTYPE,
|
|
'left' : LEFT_TRANS_SUBTYPE,
|
|
'horizontal' : HORIZONTAL_TRANS_SUBTYPE,
|
|
'down' : DOWN_TRANS_SUBTYPE,
|
|
'circle' : CIRCLE_TRANS_SUBTYPE,
|
|
'clockwiseTwelve' : CLOCKWISETWELVE_TRANS_SUBTYPE,
|
|
'clockwiseThree' : CLOCKWISETHREE_TRANS_SUBTYPE,
|
|
'clockwiseSix' : CLOCKWISESIX_TRANS_SUBTYPE,
|
|
'clockwiseNine' : CLOCKWISENINE_TRANS_SUBTYPE,
|
|
'clockwiseRight' : CLOCKWISERIGHT_TRANS_SUBTYPE,
|
|
'clockwiseTop' : CLOCKWISETOP_TRANS_SUBTYPE,
|
|
'clockwiseBottom' : CLOCKWISEBOTTOM_TRANS_SUBTYPE,
|
|
'clockwiseLeft' : CLOCKWISELEFT_TRANS_SUBTYPE,
|
|
'clockwiseTopLeft' : CLOCKWISETOPLEFT_TRANS_SUBTYPE,
|
|
'counterClockwiseBottomLeft' : COUNTERCLOCKWISEBOTTOMLEFT_TRANS_SUBTYPE,
|
|
'clockwiseBottomRight' : CLOCKWISEBOTTOMRIGHT_TRANS_SUBTYPE,
|
|
'counterClockwiseTopRight' : COUNTERCLOCKWISETOPRIGHT_TRANS_SUBTYPE,
|
|
'twoBladeVertical' : TWOBLADEVERTICAL_TRANS_SUBTYPE,
|
|
'twoBladeHorizontal' : TWOBLADEHORIZONTAL_TRANS_SUBTYPE,
|
|
'fourBlade' : FOURBLADE_TRANS_SUBTYPE,
|
|
'fromLeft' : FROMLEFT_TRANS_SUBTYPE,
|
|
'fromTop' : FROMTOP_TRANS_SUBTYPE,
|
|
'fromRight' : FROMRIGHT_TRANS_SUBTYPE,
|
|
'fromBottom' : FROMBOTTOM_TRANS_SUBTYPE,
|
|
'crossfade' : CROSSFADE_TRANS_SUBTYPE,
|
|
'fadeToColor' : FADETOCOLOR_TRANS_SUBTYPE,
|
|
'fadeFromColor' : FADEFROMCOLOR_TRANS_SUBTYPE,
|
|
'fadeOverColor' : FADEOVERCOLOR_TRANS_SUBTYPE,
|
|
'threeBlade' : THREEBLADE_TRANS_SUBTYPE,
|
|
'eightBlade' : EIGHTBLADE_TRANS_SUBTYPE,
|
|
'oneBlade' : ONEBLADE_TRANS_SUBTYPE,
|
|
'across' : ACROSS_TRANS_SUBTYPE,
|
|
'topLeftVertical' : TOPLEFTVERTICAL_TRANS_SUBTYPE,
|
|
'topLeftHorizontal' : TOPLEFTHORIZONTAL_TRANS_SUBTYPE,
|
|
'topLeftDiagonal' : TOPLEFTDIAGONAL_TRANS_SUBTYPE,
|
|
'topRightDiagonal' : TOPRIGHTDIAGONAL_TRANS_SUBTYPE,
|
|
'bottomRightDiagonal' : BOTTOMRIGHTDIAGONAL_TRANS_SUBTYPE,
|
|
'topLeftClockwise' : TOPLEFTCLOCKWISE_TRANS_SUBTYPE,
|
|
'topRightClockwise' : TOPRIGHTCLOCKWISE_TRANS_SUBTYPE,
|
|
'bottomRightClockwise' : BOTTOMRIGHTCLOCKWISE_TRANS_SUBTYPE,
|
|
'bottomLeftClockwise' : BOTTOMLEFTCLOCKWISE_TRANS_SUBTYPE,
|
|
'topLeftCounterClockwise' : TOPLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE,
|
|
'topRightCounterClockwise' : TOPRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE,
|
|
'bottomRightCounterClockwise' : BOTTOMRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE,
|
|
'bottomLeftCounterClockwise' : BOTTOMLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE,
|
|
'bottomLeftDiagonal' : BOTTOMLEFTDIAGONAL_TRANS_SUBTYPE,
|
|
'rectangle' : RECTANGLE_TRANS_SUBTYPE,
|
|
'diamond' : DIAMOND_TRANS_SUBTYPE,
|
|
'topLeft' : TOPLEFT_TRANS_SUBTYPE,
|
|
'topRight' : TOPRIGHT_TRANS_SUBTYPE,
|
|
'bottomRight' : BOTTOMRIGHT_TRANS_SUBTYPE,
|
|
'bottomLeft' : BOTTOMLEFT_TRANS_SUBTYPE,
|
|
'topCenter' : TOPCENTER_TRANS_SUBTYPE,
|
|
'rightCenter' : RIGHTCENTER_TRANS_SUBTYPE,
|
|
'bottomCenter' : BOTTOMCENTER_TRANS_SUBTYPE,
|
|
'leftCenter' : LEFTCENTER_TRANS_SUBTYPE,
|
|
'up' : UP_TRANS_SUBTYPE,
|
|
'diagonalBottomLeft' : DIAGONALBOTTOMLEFT_TRANS_SUBTYPE,
|
|
'diagonalTopLeft' : DIAGONALTOPLEFT_TRANS_SUBTYPE,
|
|
'verticalLeft' : VERTICALLEFT_TRANS_SUBTYPE,
|
|
'verticalRight' : VERTICALRIGHT_TRANS_SUBTYPE,
|
|
'horizontalLeft' : HORIZONTALLEFT_TRANS_SUBTYPE,
|
|
'horizontalRight' : HORIZONTALRIGHT_TRANS_SUBTYPE,
|
|
'doubleBarnDoor' : DOUBLEBARNDOOR_TRANS_SUBTYPE,
|
|
'doubleDiamond' : DOUBLEDIAMOND_TRANS_SUBTYPE,
|
|
'verticalTopSame' : VERTICALTOPSAME_TRANS_SUBTYPE,
|
|
'verticalBottomSame' : VERTICALBOTTOMSAME_TRANS_SUBTYPE,
|
|
'verticalTopLeftOpposite' : VERTICALTOPLEFTOPPOSITE_TRANS_SUBTYPE,
|
|
'verticalBottomLeftOpposite' : VERTICALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE,
|
|
'horizontalLeftSame' : HORIZONTALLEFTSAME_TRANS_SUBTYPE,
|
|
'horizontalRightSame' : HORIZONTALRIGHTSAME_TRANS_SUBTYPE,
|
|
'horizontalTopLeftOpposite' : HORIZONTALTOPLEFTOPPOSITE_TRANS_SUBTYPE,
|
|
'horizontalTopRightOpposite' : HORIZONTALTOPRIGHTOPPOSITE_TRANS_SUBTYPE,
|
|
'diagonalBottomLeftOpposite' : DIAGONALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE,
|
|
'diagonalTopLeftOpposite' : DIAGONALTOPLEFTOPPOSITE_TRANS_SUBTYPE,
|
|
'twoBoxTop' : TWOBOXTOP_TRANS_SUBTYPE,
|
|
'twoBoxBottom' : TWOBOXBOTTOM_TRANS_SUBTYPE,
|
|
'twoBoxLeft' : TWOBOXLEFT_TRANS_SUBTYPE,
|
|
'twoBoxRight' : TWOBOXRIGHT_TRANS_SUBTYPE,
|
|
'fourBoxVertical' : FOURBOXVERTICAL_TRANS_SUBTYPE,
|
|
'fourBoxHorizontal' : FOURBOXHORIZONTAL_TRANS_SUBTYPE
|
|
};
|
|
|
|
var TRANSITION_MODE_IN = 1;
|
|
var TRANSITION_MODE_OUT = 0;
|
|
|
|
var aTransitionModeOutMap = [ 'out', 'in' ];
|
|
|
|
|
|
var REVERSEMETHOD_IGNORE = 0;
|
|
var REVERSEMETHOD_INVERT_SWEEP = 1;
|
|
var REVERSEMETHOD_SUBTRACT_POLYGON = 2;
|
|
var REVERSEMETHOD_SUBTRACT_AND_INVERT = 3;
|
|
var REVERSEMETHOD_ROTATE_180 = 4;
|
|
var REVERSEMETHOD_FLIP_X = 5;
|
|
var REVERSEMETHOD_FLIP_Y = 6;
|
|
|
|
var aReverseMethodOutMap = ['ignore', 'invert sweep', 'subtract polygon',
|
|
'subtract and invert', 'rotate 180', 'flip x', 'flip y'];
|
|
|
|
|
|
var aTransitionInfoTable = {};
|
|
|
|
aTransitionInfoTable[0] = {};
|
|
aTransitionInfoTable[0][0] =
|
|
{
|
|
'class' : TRANSITION_INVALID,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 0.0,
|
|
'scaleY' : 0.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : false,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[SNAKEWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[SNAKEWIPE_TRANSITION][TOPLEFTVERTICAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SNAKEWIPE_TRANSITION][TOPLEFTHORIZONTAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SNAKEWIPE_TRANSITION][TOPLEFTDIAGONAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SNAKEWIPE_TRANSITION][TOPRIGHTDIAGONAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SNAKEWIPE_TRANSITION][BOTTOMRIGHTDIAGONAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SNAKEWIPE_TRANSITION][BOTTOMLEFTDIAGONAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
}
|
|
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][VERTICALTOPSAME_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][VERTICALBOTTOMSAME_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][VERTICALTOPLEFTOPPOSITE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][VERTICALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][HORIZONTALLEFTSAME_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][HORIZONTALRIGHTSAME_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][HORIZONTALTOPLEFTOPPOSITE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][HORIZONTALTOPRIGHTOPPOSITE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][DIAGONALTOPLEFTOPPOSITE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[PARALLELSNAKESWIPE_TRANSITION][DIAGONALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][TOPLEFTCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][TOPRIGHTCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][BOTTOMRIGHTCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][BOTTOMLEFTCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 270.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][TOPLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][TOPRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][BOTTOMRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 270.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SPIRALWIPE_TRANSITION][BOTTOMLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[BOXSNAKESWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[BOXSNAKESWIPE_TRANSITION][TWOBOXTOP_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXSNAKESWIPE_TRANSITION][TWOBOXBOTTOM_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXSNAKESWIPE_TRANSITION][TWOBOXLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXSNAKESWIPE_TRANSITION][TWOBOXRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXSNAKESWIPE_TRANSITION][FOURBOXVERTICAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXSNAKESWIPE_TRANSITION][FOURBOXHORIZONTAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[BARNDOORWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[BARNDOORWIPE_TRANSITION][VERTICAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': 0.0,
|
|
'scaleX': 1.0,
|
|
'scaleY': 1.0,
|
|
'reverseMethod': REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
aTransitionInfoTable[BARNDOORWIPE_TRANSITION][HORIZONTAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': 90.0,
|
|
'scaleX': 1.0,
|
|
'scaleY': 1.0,
|
|
'reverseMethod': REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
aTransitionInfoTable[BARNDOORWIPE_TRANSITION][DIAGONALBOTTOMLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': 45.0,
|
|
'scaleX': Math.SQRT2,
|
|
'scaleY': Math.SQRT2,
|
|
'reverseMethod': REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
aTransitionInfoTable[BARNDOORWIPE_TRANSITION][DIAGONALTOPLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': -45.0,
|
|
'scaleX': Math.SQRT2,
|
|
'scaleY': Math.SQRT2,
|
|
'reverseMethod': REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
|
|
aTransitionInfoTable[MISCDIAGONALWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[MISCDIAGONALWIPE_TRANSITION][DOUBLEBARNDOOR_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': 45.0,
|
|
'scaleX': Math.SQRT2,
|
|
'scaleY': Math.SQRT2,
|
|
'reverseMethod': REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
aTransitionInfoTable[MISCDIAGONALWIPE_TRANSITION][DOUBLEDIAMOND_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': 0.0,
|
|
'scaleX': 1,
|
|
'scaleY': 1,
|
|
'reverseMethod': REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
|
|
aTransitionInfoTable[IRISWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[IRISWIPE_TRANSITION][RECTANGLE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': 0.0,
|
|
'scaleX': 1.0,
|
|
'scaleY': 1.0,
|
|
'reverseMethod': REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
|
|
aTransitionInfoTable[IRISWIPE_TRANSITION][DIAMOND_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle': 45.0,
|
|
'scaleX': Math.SQRT2,
|
|
'scaleY': Math.SQRT2,
|
|
'reverseMethod': REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep': true,
|
|
'scaleIsotropically': false
|
|
};
|
|
|
|
aTransitionInfoTable[ZIGZAGWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[ZIGZAGWIPE_TRANSITION][LEFTTORIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[ZIGZAGWIPE_TRANSITION][TOPTOBOTTOM_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[BARNZIGZAGWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[BARNZIGZAGWIPE_TRANSITION][VERTICAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BARNZIGZAGWIPE_TRANSITION][HORIZONTAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[BARWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[BARWIPE_TRANSITION][LEFTTORIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : false,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BARWIPE_TRANSITION][TOPTOBOTTOM_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : false,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[WATERFALLWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[WATERFALLWIPE_TRANSITION][VERTICALLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[WATERFALLWIPE_TRANSITION][VERTICALRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[WATERFALLWIPE_TRANSITION][HORIZONTALLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[WATERFALLWIPE_TRANSITION][HORIZONTALRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_ROTATE_180,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][TOPLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][TOPRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][BOTTOMRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][BOTTOMLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][TOPCENTER_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][RIGHTCENTER_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][BOTTOMCENTER_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[BOXWIPE_TRANSITION][LEFTCENTER_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[FOURBOXWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[FOURBOXWIPE_TRANSITION][CORNERSIN_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[FOURBOXWIPE_TRANSITION][CORNERSOUT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[ELLIPSEWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[ELLIPSEWIPE_TRANSITION][CIRCLE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : true
|
|
};
|
|
aTransitionInfoTable[ELLIPSEWIPE_TRANSITION][HORIZONTAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[ELLIPSEWIPE_TRANSITION][VERTICAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[CLOCKWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[CLOCKWIPE_TRANSITION][CLOCKWISETWELVE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[CLOCKWIPE_TRANSITION][CLOCKWISETHREE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[CLOCKWIPE_TRANSITION][CLOCKWISESIX_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[CLOCKWIPE_TRANSITION][CLOCKWISENINE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 270.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[VEEWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[VEEWIPE_TRANSITION][DOWN_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[VEEWIPE_TRANSITION][LEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[VEEWIPE_TRANSITION][UP_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[VEEWIPE_TRANSITION][RIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[FANWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[FANWIPE_TRANSITION][CENTERTOP_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[FANWIPE_TRANSITION][CENTERRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[FANWIPE_TRANSITION][TOP_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[FANWIPE_TRANSITION][RIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[FANWIPE_TRANSITION][BOTTOM_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[FANWIPE_TRANSITION][LEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
|
|
aTransitionInfoTable[PINWHEELWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[PINWHEELWIPE_TRANSITION][ONEBLADE_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[PINWHEELWIPE_TRANSITION][TWOBLADEVERTICAL_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[PINWHEELWIPE_TRANSITION][THREEBLADE_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[PINWHEELWIPE_TRANSITION][FOURBLADE_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[PINWHEELWIPE_TRANSITION][EIGHTBLADE_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : true
|
|
};
|
|
aTransitionInfoTable[PINWHEELWIPE_TRANSITION][TWOBLADEHORIZONTAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : -90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : true
|
|
};
|
|
|
|
aTransitionInfoTable[PUSHWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[PUSHWIPE_TRANSITION][FROMLEFT_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[PUSHWIPE_TRANSITION][FROMTOP_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[PUSHWIPE_TRANSITION][FROMRIGHT_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[PUSHWIPE_TRANSITION][FROMBOTTOM_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_SPECIAL,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][CLOCKWISETOP_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][CLOCKWISERIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][CLOCKWISEBOTTOM_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][CLOCKWISELEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 270.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][CLOCKWISETOPLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][COUNTERCLOCKWISEBOTTOMLEFT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][CLOCKWISEBOTTOMRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 180.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[SINGLESWEEPWIPE_TRANSITION][COUNTERCLOCKWISETOPRIGHT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_SUBTRACT_AND_INVERT,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[SLIDEWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[SLIDEWIPE_TRANSITION][FROMLEFT_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[SLIDEWIPE_TRANSITION][FROMTOP_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[SLIDEWIPE_TRANSITION][FROMRIGHT_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[SLIDEWIPE_TRANSITION][FROMBOTTOM_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_SPECIAL,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[FADE_TRANSITION] = {};
|
|
aTransitionInfoTable[FADE_TRANSITION][CROSSFADE_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[FADE_TRANSITION][FADETOCOLOR_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[FADE_TRANSITION][FADEFROMCOLOR_TRANS_SUBTYPE] =
|
|
aTransitionInfoTable[FADE_TRANSITION][FADEOVERCOLOR_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_SPECIAL,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
|
|
aTransitionInfoTable[RANDOMBARWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[RANDOMBARWIPE_TRANSITION][VERTICAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[RANDOMBARWIPE_TRANSITION][HORIZONTAL_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[CHECKERBOARDWIPE_TRANSITION] = {};
|
|
aTransitionInfoTable[CHECKERBOARDWIPE_TRANSITION][DOWN_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 90.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_Y,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
aTransitionInfoTable[CHECKERBOARDWIPE_TRANSITION][ACROSS_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_FLIP_X,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : false
|
|
};
|
|
|
|
aTransitionInfoTable[DISSOLVE_TRANSITION] = {};
|
|
aTransitionInfoTable[DISSOLVE_TRANSITION][DEFAULT_TRANS_SUBTYPE] =
|
|
{
|
|
'class' : TRANSITION_CLIP_POLYPOLYGON,
|
|
'rotationAngle' : 0.0,
|
|
'scaleX' : 1.0,
|
|
'scaleY' : 1.0,
|
|
'reverseMethod' : REVERSEMETHOD_IGNORE,
|
|
'outInvertsSweep' : true,
|
|
'scaleIsotropically' : true
|
|
};
|
|
|
|
|
|
function createStateTransitionTable()
|
|
{
|
|
var aSTT = {};
|
|
|
|
aSTT[RESTART_MODE_NEVER] = {};
|
|
aSTT[RESTART_MODE_WHEN_NOT_ACTIVE] = {};
|
|
aSTT[RESTART_MODE_ALWAYS] = {};
|
|
|
|
var aTable =
|
|
aSTT[RESTART_MODE_NEVER][FILL_MODE_REMOVE] = {};
|
|
aTable[INVALID_NODE] = INVALID_NODE;
|
|
aTable[UNRESOLVED_NODE] = RESOLVED_NODE | ENDED_NODE;
|
|
aTable[RESOLVED_NODE] = ACTIVE_NODE | ENDED_NODE;
|
|
aTable[ACTIVE_NODE] = ENDED_NODE;
|
|
aTable[FROZEN_NODE] = INVALID_NODE; // this state is unreachable here
|
|
aTable[ENDED_NODE] = ENDED_NODE; // this state is a sink here (cannot restart)
|
|
|
|
aTable =
|
|
aSTT[RESTART_MODE_NEVER][FILL_MODE_FREEZE] =
|
|
aSTT[RESTART_MODE_NEVER][FILL_MODE_HOLD] =
|
|
aSTT[RESTART_MODE_NEVER][FILL_MODE_TRANSITION] = {};
|
|
aTable[INVALID_NODE] = INVALID_NODE;
|
|
aTable[UNRESOLVED_NODE] = RESOLVED_NODE | ENDED_NODE;
|
|
aTable[RESOLVED_NODE] = ACTIVE_NODE | ENDED_NODE;
|
|
aTable[ACTIVE_NODE] = FROZEN_NODE | ENDED_NODE;
|
|
aTable[FROZEN_NODE] = ENDED_NODE;
|
|
aTable[ENDED_NODE] = ENDED_NODE; // this state is a sink here (cannot restart)
|
|
|
|
aTable =
|
|
aSTT[RESTART_MODE_WHEN_NOT_ACTIVE][FILL_MODE_REMOVE] = {};
|
|
aTable[INVALID_NODE] = INVALID_NODE;
|
|
aTable[UNRESOLVED_NODE] = RESOLVED_NODE | ENDED_NODE;
|
|
aTable[RESOLVED_NODE] = ACTIVE_NODE | ENDED_NODE;
|
|
aTable[ACTIVE_NODE] = ENDED_NODE;
|
|
aTable[FROZEN_NODE] = INVALID_NODE; // this state is unreachable here
|
|
aTable[ENDED_NODE] = RESOLVED_NODE | ACTIVE_NODE | ENDED_NODE; // restart is possible
|
|
|
|
aTable =
|
|
aSTT[RESTART_MODE_WHEN_NOT_ACTIVE][FILL_MODE_FREEZE] =
|
|
aSTT[RESTART_MODE_WHEN_NOT_ACTIVE][FILL_MODE_HOLD] =
|
|
aSTT[RESTART_MODE_WHEN_NOT_ACTIVE][FILL_MODE_TRANSITION] = {};
|
|
aTable[INVALID_NODE] = INVALID_NODE;
|
|
aTable[UNRESOLVED_NODE] = RESOLVED_NODE | ENDED_NODE;
|
|
aTable[RESOLVED_NODE] = ACTIVE_NODE | ENDED_NODE;
|
|
aTable[ACTIVE_NODE] = FROZEN_NODE | ENDED_NODE;
|
|
aTable[FROZEN_NODE] = RESOLVED_NODE | ACTIVE_NODE | ENDED_NODE; // restart is possible
|
|
aTable[ENDED_NODE] = RESOLVED_NODE | ACTIVE_NODE | ENDED_NODE; // restart is possible
|
|
|
|
aTable =
|
|
aSTT[RESTART_MODE_ALWAYS][FILL_MODE_REMOVE] = {};
|
|
aTable[INVALID_NODE] = INVALID_NODE;
|
|
aTable[UNRESOLVED_NODE] = RESOLVED_NODE | ENDED_NODE;
|
|
aTable[RESOLVED_NODE] = ACTIVE_NODE | ENDED_NODE;
|
|
aTable[ACTIVE_NODE] = RESOLVED_NODE | ACTIVE_NODE | ENDED_NODE; // restart is possible
|
|
aTable[FROZEN_NODE] = INVALID_NODE; // this state is unreachable here
|
|
aTable[ENDED_NODE] = RESOLVED_NODE | ACTIVE_NODE | ENDED_NODE; // restart is possible
|
|
|
|
aTable =
|
|
aSTT[RESTART_MODE_ALWAYS][FILL_MODE_FREEZE] =
|
|
aSTT[RESTART_MODE_ALWAYS][FILL_MODE_HOLD] =
|
|
aSTT[RESTART_MODE_ALWAYS][FILL_MODE_TRANSITION] = {};
|
|
aTable[INVALID_NODE] = INVALID_NODE;
|
|
aTable[UNRESOLVED_NODE] = RESOLVED_NODE | ENDED_NODE;
|
|
aTable[RESOLVED_NODE] = ACTIVE_NODE | ENDED_NODE;
|
|
aTable[ACTIVE_NODE] = RESOLVED_NODE | ACTIVE_NODE | FROZEN_NODE | ENDED_NODE;
|
|
aTable[FROZEN_NODE] = RESOLVED_NODE | ACTIVE_NODE | ENDED_NODE; // restart is possible
|
|
aTable[ENDED_NODE] = RESOLVED_NODE | ACTIVE_NODE | ENDED_NODE; // restart is possible
|
|
|
|
return aSTT;
|
|
}
|
|
|
|
var aStateTransitionTable = createStateTransitionTable();
|
|
|
|
|
|
function getTransitionTable( eRestartMode, eFillMode )
|
|
{
|
|
if( eRestartMode == RESTART_MODE_DEFAULT )
|
|
{
|
|
log( 'getTransitionTable: unexpected restart mode: ' + eRestartMode
|
|
+ '. Used NEVER instead.');
|
|
eRestartMode = RESTART_MODE_NEVER;
|
|
}
|
|
|
|
if( eFillMode == FILL_MODE_DEFAULT ||
|
|
eFillMode == FILL_MODE_AUTO )
|
|
{
|
|
eFillMode = FILL_MODE_REMOVE;
|
|
}
|
|
|
|
return aStateTransitionTable[eRestartMode][eFillMode];
|
|
}
|
|
|
|
|
|
var EVENT_TRIGGER_UNKNOWN = 0;
|
|
var EVENT_TRIGGER_ON_SLIDE_BEGIN = 1; // eslint-disable-line no-unused-vars
|
|
var EVENT_TRIGGER_ON_SLIDE_END = 2; // eslint-disable-line no-unused-vars
|
|
var EVENT_TRIGGER_BEGIN_EVENT = 3;
|
|
var EVENT_TRIGGER_END_EVENT = 4;
|
|
var EVENT_TRIGGER_ON_CLICK = 5;
|
|
var EVENT_TRIGGER_ON_DBL_CLICK = 6; // eslint-disable-line no-unused-vars
|
|
var EVENT_TRIGGER_ON_MOUSE_ENTER = 7; // eslint-disable-line no-unused-vars
|
|
var EVENT_TRIGGER_ON_MOUSE_LEAVE = 8; // eslint-disable-line no-unused-vars
|
|
var EVENT_TRIGGER_ON_NEXT_EFFECT = 9;
|
|
var EVENT_TRIGGER_ON_PREV_EFFECT = 10;
|
|
var EVENT_TRIGGER_REPEAT = 11; // eslint-disable-line no-unused-vars
|
|
|
|
var aEventTriggerOutMap = [ 'unknown', 'slideBegin', 'slideEnd', 'begin', 'end', 'click',
|
|
'doubleClick', 'mouseEnter', 'mouseLeave', 'next', 'previous', 'repeat' ];
|
|
|
|
|
|
function getEventTriggerType( sEventTrigger )
|
|
{
|
|
if( sEventTrigger == 'begin' )
|
|
return EVENT_TRIGGER_BEGIN_EVENT;
|
|
else if( sEventTrigger == 'end' )
|
|
return EVENT_TRIGGER_END_EVENT;
|
|
else if( sEventTrigger == 'next' )
|
|
return EVENT_TRIGGER_ON_NEXT_EFFECT;
|
|
else if( sEventTrigger == 'prev' )
|
|
return EVENT_TRIGGER_ON_PREV_EFFECT;
|
|
else if( sEventTrigger == 'click' )
|
|
return EVENT_TRIGGER_ON_CLICK;
|
|
else
|
|
return EVENT_TRIGGER_UNKNOWN;
|
|
}
|
|
|
|
|
|
var UNKNOWN_TIMING = 0;
|
|
var OFFSET_TIMING = 1;
|
|
var WALLCLOCK_TIMING = 2; // eslint-disable-line no-unused-vars
|
|
var INDEFINITE_TIMING = 3;
|
|
var EVENT_TIMING = 4;
|
|
var SYNCBASE_TIMING = 5;
|
|
var MEDIA_TIMING = 6; // eslint-disable-line no-unused-vars
|
|
|
|
var aTimingTypeOutMap = [ 'unknown', 'offset', 'wallclock', 'indefinite', 'event', 'syncbase', 'media' ];
|
|
|
|
|
|
var CHARCODE_PLUS = '+'.charCodeAt(0);
|
|
var CHARCODE_MINUS = '-'.charCodeAt(0);
|
|
var CHARCODE_0 = '0'.charCodeAt(0);
|
|
var CHARCODE_9 = '9'.charCodeAt(0);
|
|
|
|
|
|
function Timing( aAnimationNode, sTimingAttribute )
|
|
{
|
|
this.aAnimationNode = aAnimationNode; // the node, the timing attribute belongs to
|
|
this.sTimingDescription = removeWhiteSpaces( sTimingAttribute );
|
|
this.eTimingType = UNKNOWN_TIMING;
|
|
this.nOffset = 0.0; // in seconds
|
|
this.sEventBaseElementId = ''; // the element id for event based timing
|
|
this.eEventType = EVENT_TRIGGER_UNKNOWN; // the event type
|
|
}
|
|
|
|
Timing.prototype.getAnimationNode = function()
|
|
{
|
|
return this.aAnimationNode;
|
|
};
|
|
|
|
Timing.prototype.getType = function()
|
|
{
|
|
return this.eTimingType;
|
|
};
|
|
|
|
Timing.prototype.getOffset = function()
|
|
{
|
|
return this.nOffset;
|
|
};
|
|
|
|
Timing.prototype.getEventBaseElementId = function()
|
|
{
|
|
return this.sEventBaseElementId;
|
|
};
|
|
|
|
Timing.prototype.getEventType = function()
|
|
{
|
|
return this.eEventType;
|
|
};
|
|
|
|
Timing.prototype.parse = function()
|
|
{
|
|
if( !this.sTimingDescription )
|
|
{
|
|
this.eTimingType = OFFSET_TIMING;
|
|
return;
|
|
}
|
|
|
|
if( this.sTimingDescription == 'indefinite' )
|
|
this.eTimingType = INDEFINITE_TIMING;
|
|
else
|
|
{
|
|
var nFirstCharCode = this.sTimingDescription.charCodeAt(0);
|
|
var bPositiveOffset = !( nFirstCharCode == CHARCODE_MINUS );
|
|
if ( ( nFirstCharCode == CHARCODE_PLUS ) ||
|
|
( nFirstCharCode == CHARCODE_MINUS ) ||
|
|
( ( nFirstCharCode >= CHARCODE_0 ) && ( nFirstCharCode <= CHARCODE_9 ) ) )
|
|
{
|
|
var sClockValue
|
|
= ( ( nFirstCharCode == CHARCODE_PLUS ) || ( nFirstCharCode == CHARCODE_MINUS ) )
|
|
? this.sTimingDescription.substr( 1 )
|
|
: this.sTimingDescription;
|
|
|
|
var TimeInSec = Timing.parseClockValue( sClockValue );
|
|
if( TimeInSec != undefined )
|
|
{
|
|
this.eTimingType = OFFSET_TIMING;
|
|
this.nOffset = bPositiveOffset ? TimeInSec : -TimeInSec;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var aTimingSplit = [];
|
|
bPositiveOffset = true;
|
|
if( this.sTimingDescription.indexOf( '+' ) != -1 )
|
|
{
|
|
aTimingSplit = this.sTimingDescription.split( '+' );
|
|
}
|
|
else if( this.sTimingDescription.indexOf( '-' ) != -1 )
|
|
{
|
|
aTimingSplit = this.sTimingDescription.split( '-' );
|
|
bPositiveOffset = false;
|
|
}
|
|
else
|
|
{
|
|
aTimingSplit[0] = this.sTimingDescription;
|
|
aTimingSplit[1] = '';
|
|
}
|
|
|
|
if( aTimingSplit[0].indexOf( '.' ) != -1 )
|
|
{
|
|
var aEventSplit = aTimingSplit[0].split( '.' );
|
|
this.sEventBaseElementId = aEventSplit[0];
|
|
this.eEventType = getEventTriggerType( aEventSplit[1] );
|
|
}
|
|
else
|
|
{
|
|
this.eEventType = getEventTriggerType( aTimingSplit[0] );
|
|
}
|
|
|
|
if( this.eEventType == EVENT_TRIGGER_UNKNOWN )
|
|
return;
|
|
|
|
if( ( this.eEventType == EVENT_TRIGGER_BEGIN_EVENT ) ||
|
|
( this.eEventType == EVENT_TRIGGER_END_EVENT ) )
|
|
{
|
|
this.eTimingType = SYNCBASE_TIMING;
|
|
}
|
|
else
|
|
{
|
|
this.eTimingType = EVENT_TIMING;
|
|
}
|
|
|
|
if( aTimingSplit[1] )
|
|
{
|
|
sClockValue = aTimingSplit[1];
|
|
TimeInSec = Timing.parseClockValue( sClockValue );
|
|
if( TimeInSec != undefined )
|
|
{
|
|
this.nOffset = ( bPositiveOffset ) ? TimeInSec : -TimeInSec;
|
|
}
|
|
else
|
|
{
|
|
this.eTimingType = UNKNOWN_TIMING;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
Timing.parseClockValue = function( sClockValue )
|
|
{
|
|
if( !sClockValue )
|
|
return 0.0;
|
|
|
|
var nTimeInSec = undefined;
|
|
|
|
var reFullClockValue = /^([0-9]+):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?$/;
|
|
var rePartialClockValue = /^([0-5][0-9]):([0-5][0-9])(.[0-9]+)?$/;
|
|
var reTimeCountValue = /^([0-9]+)(.[0-9]+)?(h|min|s|ms)?$/;
|
|
|
|
if( reFullClockValue.test( sClockValue ) )
|
|
{
|
|
var aClockTimeParts = reFullClockValue.exec( sClockValue );
|
|
|
|
var nHours = parseInt( aClockTimeParts[1] );
|
|
var nMinutes = parseInt( aClockTimeParts[2] );
|
|
var nSeconds = parseInt( aClockTimeParts[3] );
|
|
if( aClockTimeParts[4] )
|
|
nSeconds += parseFloat( aClockTimeParts[4] );
|
|
|
|
nTimeInSec = ( ( nHours * 60 ) + nMinutes ) * 60 + nSeconds;
|
|
|
|
}
|
|
else if( rePartialClockValue.test( sClockValue ) )
|
|
{
|
|
aClockTimeParts = rePartialClockValue.exec( sClockValue );
|
|
|
|
nMinutes = parseInt( aClockTimeParts[1] );
|
|
nSeconds = parseInt( aClockTimeParts[2] );
|
|
if( aClockTimeParts[3] )
|
|
nSeconds += parseFloat( aClockTimeParts[3] );
|
|
|
|
nTimeInSec = nMinutes * 60 + nSeconds;
|
|
}
|
|
else if( reTimeCountValue.test( sClockValue ) )
|
|
{
|
|
aClockTimeParts = reTimeCountValue.exec( sClockValue );
|
|
|
|
var nTimeCount = parseInt( aClockTimeParts[1] );
|
|
if( aClockTimeParts[2] )
|
|
nTimeCount += parseFloat( aClockTimeParts[2] );
|
|
|
|
if( aClockTimeParts[3] )
|
|
{
|
|
if( aClockTimeParts[3] == 'h' )
|
|
{
|
|
nTimeInSec = nTimeCount * 3600;
|
|
}
|
|
else if( aClockTimeParts[3] == 'min' )
|
|
{
|
|
nTimeInSec = nTimeCount * 60;
|
|
}
|
|
else if( aClockTimeParts[3] == 's' )
|
|
{
|
|
nTimeInSec = nTimeCount;
|
|
}
|
|
else if( aClockTimeParts[3] == 'ms' )
|
|
{
|
|
nTimeInSec = nTimeCount / 1000;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
nTimeInSec = nTimeCount;
|
|
}
|
|
|
|
}
|
|
|
|
if( nTimeInSec )
|
|
nTimeInSec = parseFloat( nTimeInSec.toFixed( 3 ) );
|
|
return nTimeInSec;
|
|
};
|
|
|
|
Timing.prototype.info = function( bVerbose )
|
|
{
|
|
|
|
var sInfo = '';
|
|
|
|
if( bVerbose )
|
|
{
|
|
sInfo = 'description: ' + this.sTimingDescription + ', ';
|
|
|
|
sInfo += ', type: ' + aTimingTypeOutMap[ this.getType() ];
|
|
sInfo += ', offset: ' + this.getOffset();
|
|
sInfo += ', event base element id: ' + this.getEventBaseElementId();
|
|
sInfo += ', timing event type: ' + aEventTriggerOutMap[ this.getEventType() ];
|
|
}
|
|
else
|
|
{
|
|
switch( this.getType() )
|
|
{
|
|
case INDEFINITE_TIMING:
|
|
sInfo += 'indefinite';
|
|
break;
|
|
case OFFSET_TIMING:
|
|
sInfo += this.getOffset();
|
|
break;
|
|
case EVENT_TIMING:
|
|
case SYNCBASE_TIMING:
|
|
if( this.getEventBaseElementId() )
|
|
sInfo += this.getEventBaseElementId() + '.';
|
|
sInfo += aEventTriggerOutMap[ this.getEventType() ];
|
|
if( this.getOffset() )
|
|
{
|
|
if( this.getOffset() > 0 )
|
|
sInfo += '+';
|
|
sInfo += this.getOffset();
|
|
}
|
|
}
|
|
}
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function Duration( sDurationAttribute )
|
|
{
|
|
this.bIndefinite = false;
|
|
this.bMedia = false;
|
|
this.nValue = undefined;
|
|
this.bDefined = false;
|
|
|
|
if( !sDurationAttribute )
|
|
return;
|
|
|
|
if( sDurationAttribute == 'indefinite' )
|
|
this.bIndefinite = true;
|
|
else if( sDurationAttribute == 'media' )
|
|
this.bMedia = true;
|
|
else
|
|
{
|
|
this.nValue = Timing.parseClockValue( sDurationAttribute );
|
|
if( this.nValue <= 0.0 )
|
|
this.nValue = 0.001; // duration must be always greater than 0
|
|
}
|
|
this.bDefined = true;
|
|
}
|
|
|
|
|
|
Duration.prototype.isSet = function()
|
|
{
|
|
return this.bDefined;
|
|
};
|
|
|
|
Duration.prototype.isIndefinite = function()
|
|
{
|
|
return this.bIndefinite;
|
|
};
|
|
|
|
Duration.prototype.isMedia = function()
|
|
{
|
|
return this.bMedia;
|
|
};
|
|
|
|
Duration.prototype.isValue = function()
|
|
{
|
|
return this.nValue != undefined;
|
|
};
|
|
|
|
Duration.prototype.getValue= function()
|
|
{
|
|
return this.nValue;
|
|
};
|
|
|
|
Duration.prototype.info= function()
|
|
{
|
|
var sInfo;
|
|
|
|
if( this.isIndefinite() )
|
|
sInfo = 'indefinite';
|
|
else if( this.isMedia() )
|
|
sInfo = 'media';
|
|
else if( this.getValue() )
|
|
sInfo = this.getValue();
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function AnimationNode()
|
|
{
|
|
}
|
|
|
|
AnimationNode.prototype.init = function() {};
|
|
AnimationNode.prototype.resolve = function() {};
|
|
AnimationNode.prototype.activate = function() {};
|
|
AnimationNode.prototype.deactivate = function() {};
|
|
AnimationNode.prototype.end = function() {};
|
|
AnimationNode.prototype.getState = function() {};
|
|
AnimationNode.prototype.registerDeactivatingListener = function() {};
|
|
AnimationNode.prototype.notifyDeactivating = function() {};
|
|
|
|
|
|
function NodeContext( aSlideShowContext )
|
|
{
|
|
this.aContext = aSlideShowContext;
|
|
this.aAnimationNodeMap = null;
|
|
this.aAnimatedElementMap = null;
|
|
this.aSourceEventElementMap = null;
|
|
this.nStartDelay = 0.0;
|
|
this.bFirstRun = undefined;
|
|
this.bIsInvalid = false;
|
|
this.aSlideHeight = HEIGHT;
|
|
this.aSlideWidth = WIDTH;
|
|
}
|
|
|
|
|
|
NodeContext.prototype.makeSourceEventElement = function( sId, aEventBaseElem )
|
|
{
|
|
if( !aEventBaseElem )
|
|
{
|
|
log( 'NodeContext.makeSourceEventElement: event base element is not valid' );
|
|
return null;
|
|
}
|
|
|
|
if( !this.aContext.aEventMultiplexer )
|
|
{
|
|
log( 'NodeContext.makeSourceEventElement: event multiplexer not initialized' );
|
|
return null;
|
|
}
|
|
|
|
if( !this.aSourceEventElementMap[ sId ] )
|
|
{
|
|
this.aSourceEventElementMap[ sId ] = new SourceEventElement( sId, aEventBaseElem, this.aContext.aEventMultiplexer );
|
|
}
|
|
return this.aSourceEventElementMap[ sId ];
|
|
};
|
|
|
|
|
|
function StateTransition( aBaseNode )
|
|
{
|
|
this.aNode = aBaseNode;
|
|
this.eToState = INVALID_NODE;
|
|
}
|
|
|
|
StateTransition.prototype.enter = function( eNodeState, bForce )
|
|
{
|
|
if( !bForce ) bForce = false;
|
|
|
|
if( this.eToState != INVALID_NODE )
|
|
{
|
|
log( 'StateTransition.enter: commit() before enter()ing again!' );
|
|
return false;
|
|
}
|
|
if( !bForce && !this.aNode.isTransition( this.aNode.getState(), eNodeState ) )
|
|
return false;
|
|
|
|
if( ( this.aNode.nCurrentStateTransition & eNodeState ) != 0 )
|
|
return false; // already in wanted transition
|
|
|
|
this.aNode.nCurrentStateTransition |= eNodeState;
|
|
this.eToState = eNodeState;
|
|
return true;
|
|
};
|
|
|
|
StateTransition.prototype.commit = function()
|
|
{
|
|
if( this.eToState != INVALID_NODE )
|
|
{
|
|
this.aNode.eCurrentState = this.eToState;
|
|
this.clear();
|
|
}
|
|
};
|
|
|
|
StateTransition.prototype.clear = function()
|
|
{
|
|
if( this.eToState != INVALID_NODE )
|
|
{
|
|
this.aNode.nCurrentStateTransition &= ~this.eToState;
|
|
this.eToState = INVALID_NODE;
|
|
}
|
|
};
|
|
|
|
|
|
function BaseNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
this.nId = getUniqueId();
|
|
this.sClassName = 'BaseNode';
|
|
|
|
if( !aAnimElem )
|
|
log( 'BaseNode(id:' + this.nId + ') constructor: aAnimElem is not valid' );
|
|
|
|
if( !aNodeContext )
|
|
log( 'BaseNode(id:' + this.nId + ') constructor: aNodeContext is not valid' );
|
|
|
|
if( !aNodeContext.aContext )
|
|
log( 'BaseNode(id:' + this.nId + ') constructor: aNodeContext.aContext is not valid' );
|
|
|
|
|
|
this.bIsContainer = false;
|
|
this.aElement = aAnimElem;
|
|
this.aParentNode = aParentNode;
|
|
this.aNodeContext = aNodeContext;
|
|
this.aContext = aNodeContext.aContext;
|
|
this.nStartDelay = aNodeContext.nStartDelay;
|
|
this.eCurrentState = UNRESOLVED_NODE;
|
|
this.nCurrentStateTransition = 0;
|
|
this.aDeactivatingListenerArray = [];
|
|
this.aActivationEvent = null;
|
|
this.aDeactivationEvent = null;
|
|
|
|
this.aBegin = null;
|
|
this.aDuration = null;
|
|
this.aEnd = null;
|
|
this.bMainSequenceRootNode = false;
|
|
this.bInteractiveSequenceRootNode = false;
|
|
this.eFillMode = FILL_MODE_FREEZE;
|
|
this.eRestartMode = RESTART_MODE_NEVER;
|
|
this.nRepeatCount = undefined;
|
|
this.nAccelerate = 0.0;
|
|
this.nDecelerate = 0.0;
|
|
this.bAutoReverse = false;
|
|
|
|
}
|
|
extend( BaseNode, AnimationNode );
|
|
|
|
|
|
BaseNode.prototype.getId = function()
|
|
{
|
|
return this.nId;
|
|
};
|
|
|
|
BaseNode.prototype.parseElement = function()
|
|
{
|
|
var aAnimElem = this.aElement;
|
|
|
|
var sIdAttr = aAnimElem.getAttributeNS( NSS['xml'], 'id' );
|
|
if( sIdAttr )
|
|
this.aNodeContext.aAnimationNodeMap[ sIdAttr ] = this;
|
|
|
|
this.aBegin = null;
|
|
var sBeginAttr = aAnimElem.getAttributeNS( NSS['smil'], 'begin' );
|
|
this.aBegin = new Timing( this, sBeginAttr );
|
|
this.aBegin.parse();
|
|
|
|
this.aEnd = null;
|
|
var sEndAttr = aAnimElem.getAttributeNS( NSS['smil'], 'end' );
|
|
if( sEndAttr )
|
|
{
|
|
this.aEnd = new Timing( this, sEndAttr );
|
|
this.aEnd.parse();
|
|
}
|
|
|
|
this.aDuration = null;
|
|
var sDurAttr = aAnimElem.getAttributeNS( NSS['smil'], 'dur' );
|
|
this.aDuration = new Duration( sDurAttr );
|
|
if( !this.aDuration.isSet() )
|
|
{
|
|
if( this.isContainer() )
|
|
this.aDuration = null;
|
|
else
|
|
this.aDuration = new Duration( 'indefinite' );
|
|
}
|
|
|
|
var sFillAttr = aAnimElem.getAttributeNS( NSS['smil'], 'fill' );
|
|
if( sFillAttr && aFillModeInMap[ sFillAttr ])
|
|
this.eFillMode = aFillModeInMap[ sFillAttr ];
|
|
else
|
|
this.eFillMode = FILL_MODE_DEFAULT;
|
|
|
|
var sRestartAttr = aAnimElem.getAttributeNS( NSS['smil'], 'restart' );
|
|
if( sRestartAttr && aRestartModeInMap[ sRestartAttr ] )
|
|
this.eRestartMode = aRestartModeInMap[ sRestartAttr ];
|
|
else
|
|
this.eRestartMode = RESTART_MODE_DEFAULT;
|
|
|
|
var sRepeatCount = aAnimElem.getAttributeNS( NSS['smil'], 'repeatCount' );
|
|
if( !sRepeatCount )
|
|
this.nRepeatCount = 1;
|
|
else
|
|
this.nRepeatCount = parseFloat( sRepeatCount );
|
|
if( ( isNaN(this.nRepeatCount) ) && ( sRepeatCount != 'indefinite' ) )
|
|
this.nRepeatCount = 1;
|
|
|
|
this.nAccelerate = 0.0;
|
|
var sAccelerateAttr = aAnimElem.getAttributeNS( NSS['smil'], 'accelerate' );
|
|
if( sAccelerateAttr )
|
|
this.nAccelerate = parseFloat( sAccelerateAttr );
|
|
if( isNaN(this.nAccelerate) )
|
|
this.nAccelerate = 0.0;
|
|
|
|
this.nDecelerate = 0.0;
|
|
var sDecelerateAttr = aAnimElem.getAttributeNS( NSS['smil'], 'decelerate' );
|
|
if( sDecelerateAttr )
|
|
this.nDecelerate = parseFloat( sDecelerateAttr );
|
|
if( isNaN(this.nDecelerate) )
|
|
this.nDecelerate = 0.0;
|
|
|
|
this.bAutoreverse = false;
|
|
var sAutoReverseAttr = aAnimElem.getAttributeNS( NSS['smil'], 'autoReverse' );
|
|
if( sAutoReverseAttr == 'true' )
|
|
this.bAutoreverse = true;
|
|
|
|
|
|
if( this.eFillMode == FILL_MODE_DEFAULT )
|
|
if( this.getParentNode() )
|
|
this.eFillMode = this.getParentNode().getFillMode();
|
|
else
|
|
this.eFillMode = FILL_MODE_AUTO;
|
|
|
|
if( this.eFillMode == FILL_MODE_AUTO ) // see SMIL recommendation document
|
|
{
|
|
this.eFillMode = ( this.aEnd ||
|
|
( this.nRepeatCount != 1) ||
|
|
( this.aDuration && !this.aDuration.isIndefinite() ) )
|
|
? FILL_MODE_REMOVE
|
|
: FILL_MODE_FREEZE;
|
|
}
|
|
|
|
if( this.eRestartMode == RESTART_MODE_DEFAULT )
|
|
if( this.getParentNode() )
|
|
this.eRestartMode = this.getParentNode().getRestartMode();
|
|
else
|
|
this.eRestartMode = RESTART_MODE_ALWAYS;
|
|
|
|
if( ( this.nAccelerate + this.nDecelerate ) > 1.0 )
|
|
{
|
|
this.nAccelerate = 0.0;
|
|
this.nDecelerate = 0.0;
|
|
}
|
|
|
|
this.aStateTransTable = getTransitionTable( this.getRestartMode(), this.getFillMode() );
|
|
|
|
return true;
|
|
};
|
|
|
|
BaseNode.prototype.getParentNode = function()
|
|
{
|
|
return this.aParentNode;
|
|
};
|
|
|
|
BaseNode.prototype.init = function()
|
|
{
|
|
this.DBG( this.callInfo( 'init' ) );
|
|
if( ! this.checkValidNode() )
|
|
return false;
|
|
if( this.aActivationEvent )
|
|
this.aActivationEvent.dispose();
|
|
if( this.aDeactivationEvent )
|
|
this.aDeactivationEvent.dispose();
|
|
|
|
this.eCurrentState = UNRESOLVED_NODE;
|
|
|
|
return this.init_st();
|
|
};
|
|
|
|
BaseNode.prototype.resolve = function()
|
|
{
|
|
if( this.aNodeContext.bIsInvalid || ! this.checkValidNode() )
|
|
return false;
|
|
|
|
this.DBG( this.callInfo( 'resolve' ) );
|
|
|
|
if( this.eCurrentState == RESOLVED_NODE )
|
|
log( 'BaseNode.resolve: already in RESOLVED state' );
|
|
|
|
var aStateTrans = new StateTransition( this );
|
|
|
|
if( aStateTrans.enter( RESOLVED_NODE ) &&
|
|
this.isTransition( RESOLVED_NODE, ACTIVE_NODE ) &&
|
|
this.resolve_st() )
|
|
{
|
|
aStateTrans.commit();
|
|
|
|
if( this.aActivationEvent )
|
|
{
|
|
this.aActivationEvent.charge();
|
|
}
|
|
else
|
|
{
|
|
this.aActivationEvent = makeDelay( bind( this, this.activate ), this.getBegin().getOffset() + this.nStartDelay );
|
|
}
|
|
registerEvent( this.getId(), this.getBegin(), this.aActivationEvent, this.aNodeContext );
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
BaseNode.prototype.activate = function()
|
|
{
|
|
if( ! this.checkValidNode() )
|
|
return false;
|
|
|
|
if( this.eCurrentState == ACTIVE_NODE )
|
|
log( 'BaseNode.activate: already in ACTIVE state' );
|
|
|
|
this.DBG( this.callInfo( 'activate' ), getCurrentSystemTime() );
|
|
|
|
var aStateTrans = new StateTransition( this );
|
|
|
|
if( aStateTrans.enter( ACTIVE_NODE ) )
|
|
{
|
|
this.activate_st();
|
|
aStateTrans.commit();
|
|
if( !this.aContext.aEventMultiplexer )
|
|
log( 'BaseNode.activate: this.aContext.aEventMultiplexer is not valid' );
|
|
this.aContext.aEventMultiplexer.notifyEvent( EVENT_TRIGGER_BEGIN_EVENT, this.getId() );
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
BaseNode.prototype.deactivate = function()
|
|
{
|
|
if( this.inStateOrTransition( ENDED_NODE | FROZEN_NODE ) || !this.checkValidNode() )
|
|
return;
|
|
|
|
if( this.isTransition( this.eCurrentState, FROZEN_NODE ) )
|
|
{
|
|
this.DBG( this.callInfo( 'deactivate' ), getCurrentSystemTime() );
|
|
|
|
var aStateTrans = new StateTransition( this );
|
|
if( aStateTrans.enter( FROZEN_NODE, true /* FORCE */ ) )
|
|
{
|
|
this.deactivate_st( FROZEN_NODE );
|
|
aStateTrans.commit();
|
|
|
|
this.notifyEndListeners();
|
|
|
|
if( this.aActivationEvent )
|
|
this.aActivationEvent.dispose();
|
|
if( this.aDeactivationEvent )
|
|
this.aDeactivationEvent.dispose();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.end();
|
|
}
|
|
};
|
|
|
|
BaseNode.prototype.end = function()
|
|
{
|
|
var bIsFrozenOrInTransitionToFrozen = this.inStateOrTransition( FROZEN_NODE );
|
|
if( this.inStateOrTransition( ENDED_NODE ) || !this.checkValidNode() )
|
|
return;
|
|
|
|
if( !(this.isTransition( this.eCurrentState, ENDED_NODE ) ) )
|
|
log( 'BaseNode.end: end state not reachable in transition table' );
|
|
|
|
this.DBG( this.callInfo( 'end' ), getCurrentSystemTime() );
|
|
|
|
var aStateTrans = new StateTransition( this );
|
|
if( aStateTrans.enter( ENDED_NODE, true /* FORCE */ ) )
|
|
{
|
|
this.deactivate_st( ENDED_NODE );
|
|
aStateTrans.commit();
|
|
|
|
if( !bIsFrozenOrInTransitionToFrozen )
|
|
this.notifyEndListeners();
|
|
|
|
if( this.aActivationEvent )
|
|
this.aActivationEvent.dispose();
|
|
if( this.aDeactivationEvent )
|
|
this.aDeactivationEvent.dispose();
|
|
}
|
|
};
|
|
|
|
BaseNode.prototype.dispose = function()
|
|
{
|
|
if( this.aActivationEvent )
|
|
this.aActivationEvent.dispose();
|
|
if( this.aDeactivationEvent )
|
|
this.aDeactivationEvent.dispose();
|
|
this.aDeactivatingListenerArray = [];
|
|
};
|
|
|
|
BaseNode.prototype.getState = function()
|
|
{
|
|
return this.eCurrentState;
|
|
};
|
|
|
|
BaseNode.prototype.registerDeactivatingListener = function( aNotifiee )
|
|
{
|
|
if (! this.checkValidNode())
|
|
return false;
|
|
|
|
if( !aNotifiee )
|
|
{
|
|
log( 'BaseNode.registerDeactivatingListener(): invalid notifiee' );
|
|
return false;
|
|
}
|
|
this.aDeactivatingListenerArray.push( aNotifiee );
|
|
|
|
return true;
|
|
};
|
|
|
|
BaseNode.prototype.notifyDeactivating = function( aNotifier )
|
|
{
|
|
assert( ( aNotifier.getState() == FROZEN_NODE ) || ( aNotifier.getState() == ENDED_NODE ),
|
|
'BaseNode.notifyDeactivating: Notifier node is neither in FROZEN nor in ENDED state' );
|
|
};
|
|
|
|
BaseNode.prototype.isMainSequenceRootNode = function()
|
|
{
|
|
return this.bMainSequenceRootNode;
|
|
};
|
|
|
|
BaseNode.prototype.isInteractiveSequenceRootNode = function()
|
|
{
|
|
return this.bInteractiveSequenceRootNode;
|
|
};
|
|
|
|
BaseNode.prototype.makeDeactivationEvent = function( nDelay )
|
|
{
|
|
if( this.aDeactivationEvent )
|
|
{
|
|
this.aDeactivationEvent.charge();
|
|
}
|
|
else
|
|
{
|
|
if( typeof( nDelay ) == typeof(0) )
|
|
this.aDeactivationEvent = makeDelay( bind( this, this.deactivate ), nDelay );
|
|
else
|
|
this.aDeactivationEvent = null;
|
|
}
|
|
return this.aDeactivationEvent;
|
|
};
|
|
|
|
BaseNode.prototype.scheduleDeactivationEvent = function( aEvent )
|
|
{
|
|
this.DBG( this.callInfo( 'scheduleDeactivationEvent' ) );
|
|
|
|
if( !aEvent )
|
|
{
|
|
if( this.getDuration() && this.getDuration().isValue() )
|
|
aEvent = this.makeDeactivationEvent( this.getDuration().getValue() );
|
|
}
|
|
if( aEvent )
|
|
{
|
|
this.aContext.aTimerEventQueue.addEvent( aEvent );
|
|
}
|
|
};
|
|
|
|
BaseNode.prototype.checkValidNode = function()
|
|
{
|
|
return ( this.eCurrentState != INVALID_NODE );
|
|
};
|
|
|
|
BaseNode.prototype.init_st = function()
|
|
{
|
|
return true;
|
|
};
|
|
|
|
BaseNode.prototype.resolve_st = function()
|
|
{
|
|
return true;
|
|
};
|
|
|
|
BaseNode.prototype.activate_st = function()
|
|
{
|
|
this.scheduleDeactivationEvent();
|
|
};
|
|
|
|
BaseNode.prototype.deactivate_st = function( /*aNodeState*/ )
|
|
{
|
|
};
|
|
|
|
BaseNode.prototype.notifyEndListeners = function()
|
|
{
|
|
var nDeactivatingListenerCount = this.aDeactivatingListenerArray.length;
|
|
|
|
for( var i = 0; i < nDeactivatingListenerCount; ++i )
|
|
{
|
|
this.aDeactivatingListenerArray[i].notifyDeactivating( this );
|
|
}
|
|
|
|
this.aContext.aEventMultiplexer.notifyEvent( EVENT_TRIGGER_END_EVENT, this.getId() );
|
|
if( this.getParentNode() && this.getParentNode().isMainSequenceRootNode() )
|
|
this.aContext.aEventMultiplexer.notifyNextEffectEndEvent();
|
|
|
|
if( this.isMainSequenceRootNode() )
|
|
this.aContext.aEventMultiplexer.notifyAnimationsEndEvent();
|
|
};
|
|
|
|
BaseNode.prototype.getContext = function()
|
|
{
|
|
return this.aContext;
|
|
};
|
|
|
|
BaseNode.prototype.isTransition = function( eFromState, eToState )
|
|
{
|
|
return ( ( this.aStateTransTable[ eFromState ] & eToState ) != 0 );
|
|
};
|
|
|
|
BaseNode.prototype.inStateOrTransition = function( nMask )
|
|
{
|
|
return ( ( ( this.eCurrentState & nMask ) != 0 ) || ( ( this.nCurrentStateTransition & nMask ) != 0 ) );
|
|
};
|
|
|
|
BaseNode.prototype.isContainer = function()
|
|
{
|
|
return this.bIsContainer;
|
|
};
|
|
|
|
BaseNode.prototype.getBegin = function()
|
|
{
|
|
return this.aBegin;
|
|
};
|
|
|
|
BaseNode.prototype.getDuration = function()
|
|
{
|
|
return this.aDuration;
|
|
};
|
|
|
|
BaseNode.prototype.getEnd = function()
|
|
{
|
|
return this.aEnd;
|
|
};
|
|
|
|
BaseNode.prototype.getFillMode = function()
|
|
{
|
|
return this.eFillMode;
|
|
};
|
|
|
|
BaseNode.prototype.getRestartMode = function()
|
|
{
|
|
return this.eRestartMode;
|
|
};
|
|
|
|
BaseNode.prototype.getRepeatCount = function()
|
|
{
|
|
return this.nRepeatCount;
|
|
};
|
|
|
|
BaseNode.prototype.getAccelerateValue = function()
|
|
{
|
|
return this.nAccelerate;
|
|
};
|
|
|
|
BaseNode.prototype.getDecelerateValue = function()
|
|
{
|
|
return this.nDecelerate;
|
|
};
|
|
|
|
BaseNode.prototype.isAutoReverseEnabled = function()
|
|
{
|
|
return this.bAutoreverse;
|
|
};
|
|
|
|
BaseNode.prototype.info = function( bVerbose )
|
|
{
|
|
var sInfo = 'class name: ' + this.sClassName;
|
|
sInfo += '; element name: ' + this.aElement.localName;
|
|
sInfo += '; id: ' + this.getId();
|
|
sInfo += '; state: ' + getNodeStateName( this.getState() );
|
|
|
|
if( bVerbose )
|
|
{
|
|
sInfo += '; is container: ' + this.isContainer();
|
|
|
|
if( this.getBegin() )
|
|
sInfo += '; begin: ' + this.getBegin().info();
|
|
|
|
if( this.getDuration() )
|
|
sInfo += '; dur: ' + this.getDuration().info();
|
|
|
|
if( this.getEnd() )
|
|
sInfo += '; end: ' + this.getEnd().info();
|
|
|
|
if( this.getFillMode() )
|
|
sInfo += '; fill: ' + aFillModeOutMap[ this.getFillMode() ];
|
|
|
|
if( this.getRestartMode() )
|
|
sInfo += '; restart: ' + aRestartModeOutMap[ this.getRestartMode() ];
|
|
|
|
if( this.getRepeatCount() && ( this.getRepeatCount() != 1.0 ) )
|
|
sInfo += '; repeatCount: ' + this.getRepeatCount();
|
|
|
|
if( this.getAccelerateValue() )
|
|
sInfo += '; accelerate: ' + this.getAccelerateValue();
|
|
|
|
if( this.getDecelerateValue() )
|
|
sInfo += '; decelerate: ' + this.getDecelerateValue();
|
|
|
|
if( this.isAutoReverseEnabled() )
|
|
sInfo += '; autoReverse: true';
|
|
|
|
}
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
BaseNode.prototype.callInfo = function( sMethodName )
|
|
{
|
|
var sInfo = this.sClassName +
|
|
'( ' + this.getId() +
|
|
', ' + getNodeStateName( this.getState() ) +
|
|
' ).' + sMethodName;
|
|
return sInfo;
|
|
};
|
|
|
|
BaseNode.prototype.DBG = function( sMessage, nTime )
|
|
{
|
|
ANIMDBG.print( sMessage, nTime );
|
|
};
|
|
|
|
|
|
function AnimationBaseNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
AnimationBaseNode.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'AnimationBaseNode';
|
|
this.bIsContainer = false;
|
|
this.aTargetElement = null;
|
|
this.bIsTargetTextElement = false;
|
|
this.aAnimatedElement = null;
|
|
this.aActivity = null;
|
|
|
|
this.nMinFrameCount = undefined;
|
|
this.eAdditiveMode = undefined;
|
|
|
|
}
|
|
extend( AnimationBaseNode, BaseNode );
|
|
|
|
|
|
AnimationBaseNode.prototype.parseElement = function()
|
|
{
|
|
var bRet = AnimationBaseNode.superclass.parseElement.call( this );
|
|
|
|
var aAnimElem = this.aElement;
|
|
|
|
this.aTargetElement = null;
|
|
var sTargetElementAttr = aAnimElem.getAttributeNS( NSS['smil'], 'targetElement' );
|
|
if( sTargetElementAttr )
|
|
this.aTargetElement = document.getElementById( sTargetElementAttr );
|
|
|
|
if( !this.aTargetElement )
|
|
{
|
|
this.eCurrentState = INVALID_NODE;
|
|
log( 'AnimationBaseNode.parseElement: target element not found: ' + sTargetElementAttr );
|
|
}
|
|
|
|
var sSubItemAttr = aAnimElem.getAttributeNS( NSS['anim'], 'sub-item' );
|
|
this.bIsTargetTextElement = ( sSubItemAttr && ( sSubItemAttr === 'text' ) );
|
|
|
|
var sAdditiveAttr = aAnimElem.getAttributeNS( NSS['smil'], 'additive' );
|
|
if( sAdditiveAttr && aAddittiveModeInMap[sAdditiveAttr] )
|
|
this.eAdditiveMode = aAddittiveModeInMap[sAdditiveAttr];
|
|
else
|
|
this.eAdditiveMode = ADDITIVE_MODE_REPLACE;
|
|
|
|
this.nMinFrameCount = ( this.getDuration().isValue() )
|
|
? ( this.getDuration().getValue() * MINIMUM_FRAMES_PER_SECONDS )
|
|
: MINIMUM_FRAMES_PER_SECONDS;
|
|
if( this.nMinFrameCount < 1.0 )
|
|
this.nMinFrameCount = 1;
|
|
else if( this.nMinFrameCount > MINIMUM_FRAMES_PER_SECONDS )
|
|
this.nMinFrameCount = MINIMUM_FRAMES_PER_SECONDS;
|
|
|
|
|
|
if( this.aTargetElement )
|
|
{
|
|
if( aAnimElem.getAttributeNS( NSS['smil'], 'attributeName' ) === 'visibility' )
|
|
{
|
|
if( aAnimElem.getAttributeNS( NSS['smil'], 'to' ) === 'visible' )
|
|
this.aTargetElement.setAttribute( 'visibility', 'hidden' );
|
|
}
|
|
|
|
if( !this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ] )
|
|
{
|
|
if( this.bIsTargetTextElement )
|
|
{
|
|
this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ]
|
|
= new AnimatedTextElement( this.aTargetElement );
|
|
}
|
|
else
|
|
{
|
|
this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ]
|
|
= new AnimatedElement( this.aTargetElement );
|
|
}
|
|
}
|
|
this.aAnimatedElement = this.aNodeContext.aAnimatedElementMap[ sTargetElementAttr ];
|
|
|
|
this.aAnimatedElement.setAdditiveMode( this.eAdditiveMode );
|
|
}
|
|
|
|
|
|
return bRet;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.init_st = function()
|
|
{
|
|
if( this.aActivity )
|
|
this.aActivity.activate( makeEvent( bind( this, this.deactivate ) ) );
|
|
else
|
|
this.aActivity = this.createActivity();
|
|
return true;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.resolve_st = function()
|
|
{
|
|
return true;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.activate_st = function()
|
|
{
|
|
if( this.aActivity )
|
|
{
|
|
this.saveStateOfAnimatedElement();
|
|
this.aActivity.setTargets( this.getAnimatedElement() );
|
|
if( this.getContext().bIsSkipping )
|
|
{
|
|
this.aActivity.end();
|
|
}
|
|
else
|
|
{
|
|
this.getContext().aActivityQueue.addActivity( this.aActivity );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AnimationBaseNode.superclass.scheduleDeactivationEvent.call( this );
|
|
}
|
|
};
|
|
|
|
AnimationBaseNode.prototype.deactivate_st = function( eDestState )
|
|
{
|
|
if( eDestState == FROZEN_NODE )
|
|
{
|
|
if( this.aActivity )
|
|
this.aActivity.end();
|
|
}
|
|
if( eDestState == ENDED_NODE )
|
|
{
|
|
if( this.aActivity )
|
|
this.aActivity.dispose();
|
|
if( ( this.getFillMode() == FILL_MODE_REMOVE ) && this.getAnimatedElement() )
|
|
this.removeEffect();
|
|
}
|
|
};
|
|
|
|
AnimationBaseNode.prototype.createActivity = function()
|
|
{
|
|
log( 'AnimationBaseNode.createActivity: abstract method called' );
|
|
};
|
|
|
|
AnimationBaseNode.prototype.fillActivityParams = function()
|
|
{
|
|
|
|
var nDuration = 0.001;
|
|
if( this.getDuration().isValue() )
|
|
{
|
|
nDuration = this.getDuration().getValue();
|
|
}
|
|
else
|
|
{
|
|
log( 'AnimationBaseNode.fillActivityParams: duration is not a number' );
|
|
}
|
|
|
|
var aActivityParamSet = new ActivityParamSet();
|
|
|
|
aActivityParamSet.aEndEvent = makeEvent( bind( this, this.deactivate ) );
|
|
aActivityParamSet.aTimerEventQueue = this.aContext.aTimerEventQueue;
|
|
aActivityParamSet.aActivityQueue = this.aContext.aActivityQueue;
|
|
aActivityParamSet.nMinDuration = nDuration;
|
|
aActivityParamSet.nMinNumberOfFrames = this.getMinFrameCount();
|
|
aActivityParamSet.bAutoReverse = this.isAutoReverseEnabled();
|
|
aActivityParamSet.nRepeatCount = this.getRepeatCount();
|
|
aActivityParamSet.nAccelerationFraction = this.getAccelerateValue();
|
|
aActivityParamSet.nDecelerationFraction = this.getDecelerateValue();
|
|
aActivityParamSet.nSlideWidth = this.aNodeContext.aSlideWidth;
|
|
aActivityParamSet.nSlideHeight = this.aNodeContext.aSlideHeight;
|
|
|
|
return aActivityParamSet;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.hasPendingAnimation = function()
|
|
{
|
|
return true;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.saveStateOfAnimatedElement = function()
|
|
{
|
|
this.getAnimatedElement().saveState( this.getId() );
|
|
};
|
|
|
|
AnimationBaseNode.prototype.removeEffect = function()
|
|
{
|
|
this.getAnimatedElement().restoreState( this.getId() );
|
|
};
|
|
|
|
AnimationBaseNode.prototype.getTargetElement = function()
|
|
{
|
|
return this.aTargetElement;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.getAnimatedElement = function()
|
|
{
|
|
return this.aAnimatedElement;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.dispose= function()
|
|
{
|
|
if( this.aActivity )
|
|
this.aActivity.dispose();
|
|
|
|
AnimationBaseNode.superclass.dispose.call( this );
|
|
};
|
|
|
|
AnimationBaseNode.prototype.getMinFrameCount = function()
|
|
{
|
|
return this.nMinFrameCount;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.getAdditiveMode = function()
|
|
{
|
|
return this.eAdditiveMode;
|
|
};
|
|
|
|
AnimationBaseNode.prototype.info = function( bVerbose )
|
|
{
|
|
var sInfo = AnimationBaseNode.superclass.info.call( this, bVerbose );
|
|
|
|
if( bVerbose )
|
|
{
|
|
if( this.getMinFrameCount() )
|
|
sInfo += '; min frame count: ' + this.getMinFrameCount();
|
|
|
|
sInfo += '; additive: ' + aAddittiveModeOutMap[ this.getAdditiveMode() ];
|
|
|
|
if( this.getTargetElement() )
|
|
{
|
|
var sElemId = this.getTargetElement().getAttribute( 'id' );
|
|
sInfo += '; targetElement: ' + sElemId;
|
|
}
|
|
}
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function AnimationBaseNode2( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
AnimationBaseNode2.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sAttributeName = '';
|
|
this.aToValue = null;
|
|
|
|
}
|
|
extend( AnimationBaseNode2, AnimationBaseNode );
|
|
|
|
|
|
AnimationBaseNode2.prototype.parseElement = function()
|
|
{
|
|
var bRet = AnimationBaseNode2.superclass.parseElement.call( this );
|
|
|
|
var aAnimElem = this.aElement;
|
|
|
|
this.sAttributeName = aAnimElem.getAttributeNS( NSS['smil'], 'attributeName' );
|
|
if( !this.sAttributeName )
|
|
{
|
|
this.eCurrentState = INVALID_NODE;
|
|
log( 'AnimationBaseNode2.parseElement: target attribute name not found: ' + this.sAttributeName );
|
|
}
|
|
|
|
this.aToValue = aAnimElem.getAttributeNS( NSS['smil'], 'to' );
|
|
|
|
return bRet;
|
|
};
|
|
|
|
AnimationBaseNode2.prototype.getAttributeName = function()
|
|
{
|
|
return this.sAttributeName;
|
|
};
|
|
|
|
AnimationBaseNode2.prototype.getToValue = function()
|
|
{
|
|
return this.aToValue;
|
|
};
|
|
|
|
AnimationBaseNode2.prototype.info = function( bVerbose )
|
|
{
|
|
var sInfo = AnimationBaseNode2.superclass.info.call( this, bVerbose );
|
|
|
|
if( bVerbose )
|
|
{
|
|
if( this.getAttributeName() )
|
|
sInfo += '; attributeName: ' + this.getAttributeName();
|
|
|
|
if( this.getToValue() )
|
|
sInfo += '; to: ' + this.getToValue();
|
|
}
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function AnimationBaseNode3( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
AnimationBaseNode3.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.eAccumulate = undefined;
|
|
this.eCalcMode = undefined;
|
|
this.aFromValue = null;
|
|
this.aByValue = null;
|
|
this.aKeyTimes = null;
|
|
this.aValues = null;
|
|
this.aFormula= null;
|
|
}
|
|
extend( AnimationBaseNode3, AnimationBaseNode2 );
|
|
|
|
|
|
AnimationBaseNode3.prototype.parseElement = function()
|
|
{
|
|
var bRet = AnimationBaseNode3.superclass.parseElement.call( this );
|
|
|
|
var aAnimElem = this.aElement;
|
|
|
|
this.eAccumulate = ACCUMULATE_MODE_NONE;
|
|
var sAccumulateAttr = aAnimElem.getAttributeNS( NSS['smil'], 'accumulate' );
|
|
if( sAccumulateAttr == 'sum' )
|
|
this.eAccumulate = ACCUMULATE_MODE_SUM;
|
|
|
|
this.eCalcMode = CALC_MODE_LINEAR;
|
|
var sCalcModeAttr = aAnimElem.getAttributeNS( NSS['smil'], 'calcMode' );
|
|
if( sCalcModeAttr && aCalcModeInMap[ sCalcModeAttr ] )
|
|
this.eCalcMode = aCalcModeInMap[ sCalcModeAttr ];
|
|
|
|
this.aFromValue = aAnimElem.getAttributeNS( NSS['smil'], 'from' );
|
|
|
|
this.aByValue = aAnimElem.getAttributeNS( NSS['smil'], 'by' );
|
|
|
|
this.aKeyTimes = [];
|
|
var sKeyTimesAttr = aAnimElem.getAttributeNS( NSS['smil'], 'keyTimes' );
|
|
sKeyTimesAttr = removeWhiteSpaces( sKeyTimesAttr );
|
|
if( sKeyTimesAttr )
|
|
{
|
|
var aKeyTimes = sKeyTimesAttr.split( ';' );
|
|
for( var i = 0; i < aKeyTimes.length; ++i )
|
|
this.aKeyTimes.push( parseFloat( aKeyTimes[i] ) );
|
|
}
|
|
|
|
var sValuesAttr = aAnimElem.getAttributeNS( NSS['smil'], 'values' );
|
|
if( sValuesAttr )
|
|
{
|
|
this.aValues = sValuesAttr.split( ';' );
|
|
}
|
|
else
|
|
{
|
|
this.aValues = [];
|
|
}
|
|
|
|
this.aFormula = aAnimElem.getAttributeNS( NSS['anim'], 'formula' );
|
|
|
|
return bRet;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.getAccumulate = function()
|
|
{
|
|
return this.eAccumulate;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.getCalcMode = function()
|
|
{
|
|
return this.eCalcMode;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.getFromValue = function()
|
|
{
|
|
return this.aFromValue;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.getByValue = function()
|
|
{
|
|
return this.aByValue;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.getKeyTimes = function()
|
|
{
|
|
return this.aKeyTimes;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.getValues = function()
|
|
{
|
|
return this.aValues;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.getFormula = function()
|
|
{
|
|
return this.aFormula;
|
|
};
|
|
|
|
AnimationBaseNode3.prototype.info = function( bVerbose )
|
|
{
|
|
var sInfo = AnimationBaseNode3.superclass.info.call( this, bVerbose );
|
|
|
|
if( bVerbose )
|
|
{
|
|
if( this.getAccumulate() )
|
|
sInfo += '; accumulate: ' + aAccumulateModeOutMap[ this.getAccumulate() ];
|
|
|
|
sInfo += '; calcMode: ' + aCalcModeOutMap[ this.getCalcMode() ];
|
|
|
|
if( this.getFromValue() )
|
|
sInfo += '; from: ' + this.getFromValue();
|
|
|
|
if( this.getByValue() )
|
|
sInfo += '; by: ' + this.getByValue();
|
|
|
|
if( this.getKeyTimes().length )
|
|
sInfo += '; keyTimes: ' + this.getKeyTimes().join( ',' );
|
|
|
|
if( this.getValues().length )
|
|
sInfo += '; values: ' + this.getValues().join( ',' );
|
|
|
|
if( this.getFormula() )
|
|
sInfo += '; formula: ' + this.getFormula();
|
|
}
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function BaseContainerNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
BaseContainerNode.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'BaseContainerNode';
|
|
this.bIsContainer = true;
|
|
this.aChildrenArray = [];
|
|
this.nFinishedChildren = 0;
|
|
this.bDurationIndefinite = false;
|
|
this.nLeftIterations = 1;
|
|
|
|
this.eImpressNodeType = undefined;
|
|
this.ePresetClass = undefined;
|
|
this.ePresetId = undefined;
|
|
}
|
|
extend( BaseContainerNode, BaseNode );
|
|
|
|
|
|
BaseContainerNode.prototype.parseElement= function()
|
|
{
|
|
var bRet = BaseContainerNode.superclass.parseElement.call( this );
|
|
|
|
var aAnimElem = this.aElement;
|
|
|
|
this.eImpressNodeType = IMPRESS_DEFAULT_NODE;
|
|
var sNodeTypeAttr = aAnimElem.getAttributeNS( NSS['presentation'], 'node-type' );
|
|
if( sNodeTypeAttr && aImpressNodeTypeInMap[ sNodeTypeAttr ] )
|
|
this.eImpressNodeType = aImpressNodeTypeInMap[ sNodeTypeAttr ];
|
|
this.bMainSequenceRootNode = ( this.eImpressNodeType == IMPRESS_MAIN_SEQUENCE_NODE );
|
|
this.bInteractiveSequenceRootNode = ( this.eImpressNodeType == IMPRESS_INTERACTIVE_SEQUENCE_NODE );
|
|
|
|
this.ePresetClass = undefined;
|
|
var sPresetClassAttr = aAnimElem.getAttributeNS( NSS['presentation'], 'preset-class' );
|
|
if( sPresetClassAttr && aPresetClassInMap[ sPresetClassAttr ] )
|
|
this.ePresetClass = aPresetClassInMap[ sPresetClassAttr ];
|
|
|
|
this.ePresetId = undefined;
|
|
var sPresetIdAttr = aAnimElem.getAttributeNS( NSS['presentation'], 'preset-id' );
|
|
if( sPresetIdAttr && aPresetIdInMap[ sPresetIdAttr ] )
|
|
this.ePresetId = aPresetIdInMap[ sPresetIdAttr ];
|
|
|
|
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
this.aChildrenArray[i].parseElement();
|
|
}
|
|
|
|
|
|
this.bDurationIndefinite
|
|
= ( !this.getDuration() || this.getDuration().isIndefinite() ) &&
|
|
( !this.getEnd() || ( this.getEnd().getType() != OFFSET_TIMING ) );
|
|
|
|
return bRet;
|
|
};
|
|
|
|
BaseContainerNode.prototype.appendChildNode = function( aAnimationNode )
|
|
{
|
|
if( ! this.checkValidNode() )
|
|
return ;
|
|
|
|
if( aAnimationNode.registerDeactivatingListener( this ) )
|
|
this.aChildrenArray.push( aAnimationNode );
|
|
};
|
|
|
|
BaseContainerNode.prototype.removeAllChildrenNodes = function()
|
|
{
|
|
this.aChildrenArray = [];
|
|
};
|
|
|
|
BaseContainerNode.prototype.init_st = function()
|
|
{
|
|
this.nLeftIterations = this.getRepeatCount();
|
|
|
|
return this.init_children();
|
|
};
|
|
|
|
BaseContainerNode.prototype.init_children = function()
|
|
{
|
|
this.nFinishedChildren = 0;
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
var nInitChildren = 0;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
if( this.aChildrenArray[i].init() )
|
|
{
|
|
++nInitChildren;
|
|
}
|
|
}
|
|
return ( nChildrenCount == nInitChildren );
|
|
};
|
|
|
|
|
|
BaseContainerNode.prototype.deactivate_st = function( eDestState )
|
|
{
|
|
this.nLeftIterations = 0;
|
|
if( eDestState == FROZEN_NODE )
|
|
{
|
|
this.forEachChildNode( mem_fn( 'deactivate' ), ~( FROZEN_NODE | ENDED_NODE ) );
|
|
}
|
|
else
|
|
{
|
|
this.forEachChildNode( mem_fn( 'end' ), ~ENDED_NODE );
|
|
if( this.getFillMode() == FILL_MODE_REMOVE )
|
|
this.removeEffect();
|
|
}
|
|
};
|
|
|
|
BaseContainerNode.prototype.hasPendingAnimation = function()
|
|
{
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
if( this.aChildrenArray[i].hasPendingAnimation() )
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
BaseContainerNode.prototype.activate_st = function()
|
|
{
|
|
log( 'BaseContainerNode.activate_st: abstract method called' );
|
|
};
|
|
|
|
BaseContainerNode.prototype.notifyDeactivating = function( /*aAnimationNode*/ )
|
|
{
|
|
log( 'BaseContainerNode.notifyDeactivating: abstract method called' );
|
|
};
|
|
|
|
BaseContainerNode.prototype.isDurationIndefinite = function()
|
|
{
|
|
return this.bDurationIndefinite;
|
|
};
|
|
|
|
BaseContainerNode.prototype.isChildNode = function( aAnimationNode )
|
|
{
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
if( this.aChildrenArray[i].getId() == aAnimationNode.getId() )
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
BaseContainerNode.prototype.notifyDeactivatedChild = function( aChildNode )
|
|
{
|
|
assert( ( aChildNode.getState() == FROZEN_NODE ) || ( aChildNode.getState() == ENDED_NODE ),
|
|
'BaseContainerNode.notifyDeactivatedChild: passed child node is neither in FROZEN nor in ENDED state' );
|
|
|
|
assert( this.getState() != INVALID_NODE,
|
|
'BaseContainerNode.notifyDeactivatedChild: this node is invalid' );
|
|
|
|
if( !this.isChildNode( aChildNode ) )
|
|
{
|
|
log( 'BaseContainerNode.notifyDeactivatedChild: unknown child notifier!' );
|
|
return false;
|
|
}
|
|
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
|
|
assert( ( this.nFinishedChildren < nChildrenCount ),
|
|
'BaseContainerNode.notifyDeactivatedChild: assert(this.nFinishedChildren < nChildrenCount) failed' );
|
|
|
|
++this.nFinishedChildren;
|
|
var bFinished = ( this.nFinishedChildren >= nChildrenCount );
|
|
|
|
if( bFinished && this.isDurationIndefinite() )
|
|
{
|
|
if( this.nLeftIterations >= 1.0 )
|
|
{
|
|
this.nLeftIterations -= 1.0;
|
|
}
|
|
if( this.nLeftIterations >= 1.0 )
|
|
{
|
|
bFinished = false;
|
|
var aRepetitionEvent = makeDelay( bind( this, this.repeat ), 0.0 );
|
|
this.aContext.aTimerEventQueue.addEvent( aRepetitionEvent );
|
|
}
|
|
else
|
|
{
|
|
this.deactivate();
|
|
}
|
|
}
|
|
|
|
return bFinished;
|
|
};
|
|
|
|
BaseContainerNode.prototype.repeat = function()
|
|
{
|
|
this.forEachChildNode( mem_fn( 'end' ), ~ENDED_NODE );
|
|
this.removeEffect();
|
|
var bInitialized = this.init_children();
|
|
if( bInitialized )
|
|
this.activate_st();
|
|
return bInitialized;
|
|
};
|
|
|
|
BaseContainerNode.prototype.removeEffect = function()
|
|
{
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
if( nChildrenCount == 0 )
|
|
return;
|
|
for( var i = nChildrenCount - 1; i >= 0; --i )
|
|
{
|
|
if( ( this.aChildrenArray[i].getState() & ( FROZEN_NODE | ENDED_NODE ) ) == 0 )
|
|
{
|
|
log( 'BaseContainerNode.removeEffect: child(id:'
|
|
+ this.aChildrenArray[i].getId() + ') is neither frozen nor ended;'
|
|
+ ' state: '
|
|
+ aTransitionModeOutMap[ this.aChildrenArray[i].getState() ] );
|
|
continue;
|
|
}
|
|
this.aChildrenArray[i].removeEffect();
|
|
}
|
|
};
|
|
|
|
BaseContainerNode.prototype.saveStateOfAnimatedElement = function()
|
|
{
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
this.aChildrenArray[i].saveStateOfAnimatedElement();
|
|
}
|
|
};
|
|
|
|
BaseContainerNode.prototype.forEachChildNode = function( aFunction, eNodeStateMask )
|
|
{
|
|
if( !eNodeStateMask )
|
|
eNodeStateMask = -1;
|
|
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
if( ( eNodeStateMask != -1 ) && ( ( this.aChildrenArray[i].getState() & eNodeStateMask ) == 0 ) )
|
|
continue;
|
|
aFunction( this.aChildrenArray[i] );
|
|
}
|
|
};
|
|
|
|
BaseContainerNode.prototype.dispose = function()
|
|
{
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
this.aChildrenArray[i].dispose();
|
|
}
|
|
|
|
BaseContainerNode.superclass.dispose.call( this );
|
|
};
|
|
|
|
BaseContainerNode.prototype.getImpressNodeType = function()
|
|
{
|
|
return this.eImpressNodeType;
|
|
};
|
|
|
|
BaseContainerNode.prototype.info = function( bVerbose )
|
|
{
|
|
var sInfo = BaseContainerNode.superclass.info.call( this, bVerbose );
|
|
|
|
if( bVerbose )
|
|
{
|
|
if( this.getImpressNodeType() )
|
|
sInfo += '; node-type: ' + aImpressNodeTypeOutMap[ this.getImpressNodeType() ];
|
|
}
|
|
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
sInfo += '\n';
|
|
sInfo += this.aChildrenArray[i].info( bVerbose );
|
|
}
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function ParallelTimeContainer( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
ParallelTimeContainer.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'ParallelTimeContainer';
|
|
}
|
|
extend( ParallelTimeContainer, BaseContainerNode );
|
|
|
|
|
|
ParallelTimeContainer.prototype.activate_st = function()
|
|
{
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
var nResolvedChildren = 0;
|
|
for( var i = 0; i < nChildrenCount; ++i )
|
|
{
|
|
if( this.aChildrenArray[i].resolve() )
|
|
{
|
|
++nResolvedChildren;
|
|
}
|
|
}
|
|
|
|
if( nChildrenCount != nResolvedChildren )
|
|
{
|
|
log( 'ParallelTimeContainer.activate_st: resolving all children failed' );
|
|
return;
|
|
}
|
|
|
|
|
|
if( this.isDurationIndefinite() && ( nChildrenCount == 0 ) )
|
|
{
|
|
this.scheduleDeactivationEvent( this.makeDeactivationEvent( 0.0 ) );
|
|
}
|
|
else
|
|
{
|
|
this.scheduleDeactivationEvent();
|
|
}
|
|
};
|
|
|
|
ParallelTimeContainer.prototype.notifyDeactivating = function( aAnimationNode )
|
|
{
|
|
this.notifyDeactivatedChild( aAnimationNode );
|
|
};
|
|
|
|
|
|
function SequentialTimeContainer( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
SequentialTimeContainer.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'SequentialTimeContainer';
|
|
this.bIsRewinding = false;
|
|
this.aCurrentSkipEvent = null;
|
|
this.aRewindCurrentEffectEvent = null;
|
|
this.aRewindLastEffectEvent = null;
|
|
}
|
|
extend( SequentialTimeContainer, BaseContainerNode );
|
|
|
|
|
|
SequentialTimeContainer.prototype.activate_st = function()
|
|
{
|
|
var nChildrenCount = this.aChildrenArray.length;
|
|
for( ; this.nFinishedChildren < nChildrenCount; ++this.nFinishedChildren )
|
|
{
|
|
if( this.resolveChild( this.aChildrenArray[ this.nFinishedChildren ] ) )
|
|
break;
|
|
else
|
|
log( 'SequentialTimeContainer.activate_st: resolving child failed!' );
|
|
}
|
|
|
|
if( this.isDurationIndefinite() && ( ( nChildrenCount == 0 ) || ( this.nFinishedChildren >= nChildrenCount ) ) )
|
|
{
|
|
this.scheduleDeactivationEvent( this.makeDeactivationEvent( 0.0 ) );
|
|
}
|
|
else
|
|
{
|
|
this.scheduleDeactivationEvent();
|
|
}
|
|
};
|
|
|
|
SequentialTimeContainer.prototype.notifyDeactivating = function( aNotifier )
|
|
{
|
|
if( this.bIsRewinding )
|
|
return;
|
|
|
|
if( this.notifyDeactivatedChild( aNotifier ) )
|
|
return;
|
|
|
|
assert( this.nFinishedChildren < this.aChildrenArray.length,
|
|
'SequentialTimeContainer.notifyDeactivating: assertion (this.nFinishedChildren < this.aChildrenArray.length) failed' );
|
|
|
|
var aNextChild = this.aChildrenArray[ this.nFinishedChildren ];
|
|
|
|
assert( aNextChild.getState() == UNRESOLVED_NODE,
|
|
'SequentialTimeContainer.notifyDeactivating: assertion (aNextChild.getState == UNRESOLVED_NODE) failed' );
|
|
|
|
if( !this.resolveChild( aNextChild ) )
|
|
{
|
|
this.deactivate();
|
|
}
|
|
};
|
|
|
|
SequentialTimeContainer.prototype.skipEffect = function( aChildNode )
|
|
{
|
|
if( this.isChildNode( aChildNode ) )
|
|
{
|
|
this.getContext().aActivityQueue.endAll();
|
|
this.getContext().bIsSkipping = true;
|
|
this.getContext().aTimerEventQueue.forceEmpty();
|
|
this.getContext().bIsSkipping = false;
|
|
var aEvent = makeEvent( bind2( aChildNode.deactivate, aChildNode ) );
|
|
this.getContext().aTimerEventQueue.addEvent( aEvent );
|
|
}
|
|
else
|
|
{
|
|
log( 'SequentialTimeContainer.skipEffect: unknown child: '
|
|
+ aChildNode.getId() );
|
|
}
|
|
};
|
|
|
|
SequentialTimeContainer.prototype.rewindCurrentEffect = function( aChildNode )
|
|
{
|
|
if( this.isChildNode( aChildNode ) )
|
|
{
|
|
assert( !this.bIsRewinding,
|
|
'SequentialTimeContainer.rewindCurrentEffect: is already rewinding.' );
|
|
|
|
this.bIsRewinding = true;
|
|
this.getContext().aActivityQueue.endAll();
|
|
this.getContext().bIsSkipping = true;
|
|
this.getContext().aTimerEventQueue.forceEmpty();
|
|
this.getContext().bIsSkipping = false;
|
|
this.getContext().aActivityQueue.endAll();
|
|
|
|
aChildNode.end();
|
|
aChildNode.removeEffect();
|
|
aChildNode.init();
|
|
this.resolveChild( aChildNode );
|
|
this.notifyRewindedEvent( aChildNode );
|
|
this.bIsRewinding = false;
|
|
}
|
|
else
|
|
{
|
|
log( 'SequentialTimeContainer.rewindCurrentEffect: unknown child: '
|
|
+ aChildNode.getId() );
|
|
}
|
|
};
|
|
|
|
SequentialTimeContainer.prototype.rewindLastEffect = function( aChildNode )
|
|
{
|
|
if( this.isChildNode( aChildNode ) )
|
|
{
|
|
assert( !this.bIsRewinding,
|
|
'SequentialTimeContainer.rewindLastEffect: is already rewinding.' );
|
|
|
|
this.bIsRewinding = true;
|
|
this.getContext().aTimerEventQueue.forceEmpty();
|
|
this.getContext().aActivityQueue.clear();
|
|
aChildNode.end();
|
|
|
|
--this.nFinishedChildren;
|
|
var aPreviousChildNode = this.aChildrenArray[ this.nFinishedChildren ];
|
|
|
|
aPreviousChildNode.removeEffect();
|
|
aPreviousChildNode.init();
|
|
aChildNode.init();
|
|
this.resolveChild( aPreviousChildNode );
|
|
this.notifyRewindedEvent( aChildNode );
|
|
this.bIsRewinding = false;
|
|
}
|
|
else
|
|
{
|
|
log( 'SequentialTimeContainer.rewindLastEffect: unknown child: '
|
|
+ aChildNode.getId() );
|
|
}
|
|
};
|
|
|
|
SequentialTimeContainer.prototype.resolveChild = function( aChildNode )
|
|
{
|
|
var bResolved = aChildNode.resolve();
|
|
|
|
if( bResolved && ( this.isMainSequenceRootNode() || this.isInteractiveSequenceRootNode() ) )
|
|
{
|
|
if( this.aCurrentSkipEvent )
|
|
this.aCurrentSkipEvent.dispose();
|
|
this.aCurrentSkipEvent = makeEvent( bind2( SequentialTimeContainer.prototype.skipEffect, this, aChildNode ) );
|
|
|
|
if( this.aRewindCurrentEffectEvent )
|
|
this.aRewindCurrentEffectEvent.dispose();
|
|
this.aRewindCurrentEffectEvent = makeEvent( bind2( SequentialTimeContainer.prototype.rewindCurrentEffect, this, aChildNode ) );
|
|
|
|
if( this.aRewindLastEffectEvent )
|
|
this.aRewindLastEffectEvent.dispose();
|
|
this.aRewindLastEffectEvent = makeEvent( bind2( SequentialTimeContainer.prototype.rewindLastEffect, this, aChildNode ) );
|
|
|
|
if( this.isMainSequenceRootNode() )
|
|
{
|
|
this.aContext.aEventMultiplexer.registerSkipEffectEvent( this.aCurrentSkipEvent );
|
|
this.aContext.aEventMultiplexer.registerRewindCurrentEffectEvent( this.aRewindCurrentEffectEvent );
|
|
this.aContext.aEventMultiplexer.registerRewindLastEffectEvent( this.aRewindLastEffectEvent );
|
|
}
|
|
else if( this.isInteractiveSequenceRootNode() )
|
|
{
|
|
this.aContext.aEventMultiplexer.registerSkipInteractiveEffectEvent( aChildNode.getId(), this.aCurrentSkipEvent );
|
|
this.aContext.aEventMultiplexer.registerRewindRunningInteractiveEffectEvent( aChildNode.getId(), this.aRewindCurrentEffectEvent );
|
|
this.aContext.aEventMultiplexer.registerRewindEndedInteractiveEffectEvent( aChildNode.getId(), this.aRewindLastEffectEvent );
|
|
}
|
|
}
|
|
return bResolved;
|
|
};
|
|
|
|
SequentialTimeContainer.prototype.notifyRewindedEvent = function( aChildNode )
|
|
{
|
|
if( this.isInteractiveSequenceRootNode() )
|
|
{
|
|
this.aContext.aEventMultiplexer.notifyRewindedEffectEvent( aChildNode.getId() );
|
|
|
|
var sId = aChildNode.getBegin().getEventBaseElementId();
|
|
if( sId )
|
|
{
|
|
this.aContext.aEventMultiplexer.notifyRewindedEffectEvent( sId );
|
|
}
|
|
}
|
|
};
|
|
|
|
SequentialTimeContainer.prototype.dispose = function()
|
|
{
|
|
if( this.aCurrentSkipEvent )
|
|
this.aCurrentSkipEvent.dispose();
|
|
|
|
SequentialTimeContainer.superclass.dispose.call( this );
|
|
};
|
|
|
|
|
|
function PropertyAnimationNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
PropertyAnimationNode.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'PropertyAnimationNode';
|
|
}
|
|
extend( PropertyAnimationNode, AnimationBaseNode3 );
|
|
|
|
|
|
PropertyAnimationNode.prototype.createActivity = function()
|
|
{
|
|
var aActivityParamSet = this.fillActivityParams();
|
|
|
|
var aAnimation = createPropertyAnimation( this.getAttributeName(),
|
|
this.getAnimatedElement(),
|
|
this.aNodeContext.aSlideWidth,
|
|
this.aNodeContext.aSlideHeight );
|
|
|
|
var aInterpolator = null; // createActivity will compute it;
|
|
return createActivity( aActivityParamSet, this, aAnimation, aInterpolator );
|
|
};
|
|
|
|
|
|
function isValidTransformation( sType )
|
|
{
|
|
return ( sType === 'translate' || sType === 'scale' || sType === 'rotate'
|
|
|| sType === 'skewX' || sType === 'skewY' );
|
|
}
|
|
|
|
function AnimationTransformNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
AnimationTransformNode.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'AnimationTransformNode';
|
|
}
|
|
extend( AnimationTransformNode, AnimationBaseNode3 );
|
|
|
|
|
|
AnimationTransformNode.prototype.parseElement = function()
|
|
{
|
|
var bRet = AnimationTransformNode.superclass.parseElement.call(this);
|
|
|
|
var aAnimElem = this.aElement;
|
|
|
|
var sTransformType = aAnimElem.getAttribute( 'svg:type' );
|
|
if( !isValidTransformation( sTransformType ) )
|
|
{
|
|
this.eCurrentState = INVALID_NODE;
|
|
log( 'AnimationTransformNode.parseElement: transformation type not found: ' + sTransformType );
|
|
}
|
|
else
|
|
{
|
|
this.sAttributeName = sTransformType;
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
AnimationTransformNode.prototype.createActivity = function()
|
|
{
|
|
var aActivityParamSet = this.fillActivityParams();
|
|
var aAnimation;
|
|
|
|
if( this.getAttributeName() === 'scale' || this.getAttributeName() === 'translate' )
|
|
{
|
|
aAnimation = createPairPropertyAnimation( this.getAttributeName(),
|
|
this.getAnimatedElement(),
|
|
this.aNodeContext.aSlideWidth,
|
|
this.aNodeContext.aSlideHeight );
|
|
|
|
}
|
|
else
|
|
{
|
|
aAnimation = createPropertyAnimation( this.getAttributeName(),
|
|
this.getAnimatedElement(),
|
|
this.aNodeContext.aSlideWidth,
|
|
this.aNodeContext.aSlideHeight );
|
|
}
|
|
|
|
var aInterpolator = null; // createActivity will compute it;
|
|
return createActivity( aActivityParamSet, this, aAnimation, aInterpolator );
|
|
};
|
|
|
|
|
|
function AnimationSetNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
AnimationSetNode.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'AnimationSetNode';
|
|
}
|
|
extend( AnimationSetNode, AnimationBaseNode2 );
|
|
|
|
|
|
AnimationSetNode.prototype.createActivity = function()
|
|
{
|
|
var aAnimation = createPropertyAnimation( this.getAttributeName(),
|
|
this.getAnimatedElement(),
|
|
this.aNodeContext.aSlideWidth,
|
|
this.aNodeContext.aSlideHeight );
|
|
|
|
var aActivityParamSet = this.fillActivityParams();
|
|
|
|
return new SetActivity( aActivityParamSet, aAnimation, this.getToValue() );
|
|
};
|
|
|
|
|
|
function AnimationColorNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
AnimationColorNode.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'AnimationColorNode';
|
|
|
|
this.eColorInterpolation = undefined;
|
|
this.eColorInterpolationDirection = undefined;
|
|
}
|
|
extend( AnimationColorNode, AnimationBaseNode3 );
|
|
|
|
|
|
AnimationColorNode.prototype.parseElement = function()
|
|
{
|
|
var bRet = AnimationColorNode.superclass.parseElement.call( this );
|
|
|
|
var aAnimElem = this.aElement;
|
|
|
|
this.eColorInterpolation = COLOR_SPACE_RGB;
|
|
var sColorInterpolationAttr = aAnimElem.getAttributeNS( NSS['anim'], 'color-interpolation' );
|
|
if( sColorInterpolationAttr && aColorSpaceInMap[ sColorInterpolationAttr ] )
|
|
this.eColorInterpolation = aColorSpaceInMap[ sColorInterpolationAttr ];
|
|
|
|
this.eColorInterpolationDirection = CLOCKWISE;
|
|
var sColorInterpolationDirectionAttr = aAnimElem.getAttributeNS( NSS['anim'], 'color-interpolation-direction' );
|
|
if( sColorInterpolationDirectionAttr && aClockDirectionInMap[ sColorInterpolationDirectionAttr ] )
|
|
this.eColorInterpolationDirection = aClockDirectionInMap[ sColorInterpolationDirectionAttr ];
|
|
|
|
return bRet;
|
|
};
|
|
|
|
AnimationColorNode.prototype.createActivity = function()
|
|
{
|
|
var aActivityParamSet = this.fillActivityParams();
|
|
|
|
var aAnimation = createPropertyAnimation( this.getAttributeName(),
|
|
this.getAnimatedElement(),
|
|
this.aNodeContext.aSlideWidth,
|
|
this.aNodeContext.aSlideHeight );
|
|
|
|
var aColorAnimation;
|
|
var aInterpolator;
|
|
if( this.getColorInterpolation() === COLOR_SPACE_HSL )
|
|
{
|
|
ANIMDBG.print( 'AnimationColorNode.createActivity: color space hsl' );
|
|
aColorAnimation = new HSLAnimationWrapper( aAnimation );
|
|
var aInterpolatorMaker = aInterpolatorHandler.getInterpolator( this.getCalcMode(),
|
|
COLOR_PROPERTY,
|
|
COLOR_SPACE_HSL );
|
|
aInterpolator = aInterpolatorMaker( this.getColorInterpolationDirection() );
|
|
}
|
|
else
|
|
{
|
|
ANIMDBG.print( 'AnimationColorNode.createActivity: color space rgb' );
|
|
aColorAnimation = aAnimation;
|
|
aInterpolator = aInterpolatorHandler.getInterpolator( this.getCalcMode(),
|
|
COLOR_PROPERTY,
|
|
COLOR_SPACE_RGB );
|
|
}
|
|
|
|
return createActivity( aActivityParamSet, this, aColorAnimation, aInterpolator );
|
|
};
|
|
|
|
AnimationColorNode.prototype.getColorInterpolation = function()
|
|
{
|
|
return this.eColorInterpolation;
|
|
};
|
|
|
|
AnimationColorNode.prototype.getColorInterpolationDirection = function()
|
|
{
|
|
return this.eColorInterpolationDirection;
|
|
};
|
|
|
|
AnimationColorNode.prototype.info = function( bVerbose )
|
|
{
|
|
var sInfo = AnimationColorNode.superclass.info.call( this, bVerbose );
|
|
|
|
if( bVerbose )
|
|
{
|
|
sInfo += '; color-interpolation: ' + aColorSpaceOutMap[ this.getColorInterpolation() ];
|
|
|
|
sInfo += '; color-interpolation-direction: ' + aClockDirectionOutMap[ this.getColorInterpolationDirection() ];
|
|
}
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function AnimationTransitionFilterNode( aAnimElem, aParentNode, aNodeContext )
|
|
{
|
|
AnimationTransitionFilterNode.superclass.constructor.call( this, aAnimElem, aParentNode, aNodeContext );
|
|
|
|
this.sClassName = 'AnimationTransitionFilterNode';
|
|
|
|
this.eTransitionType = undefined;
|
|
this.eTransitionSubType = undefined;
|
|
this.bReverseDirection = undefined;
|
|
this.eTransitionMode = undefined;
|
|
}
|
|
extend( AnimationTransitionFilterNode, AnimationBaseNode );
|
|
|
|
|
|
AnimationTransitionFilterNode.prototype.createActivity = function()
|
|
{
|
|
var aActivityParamSet = this.fillActivityParams();
|
|
|
|
return createShapeTransition( aActivityParamSet,
|
|
this.getAnimatedElement(),
|
|
this.aNodeContext.aSlideWidth,
|
|
this.aNodeContext.aSlideHeight,
|
|
this );
|
|
};
|
|
|
|
AnimationTransitionFilterNode.prototype.parseElement = function()
|
|
{
|
|
var bRet = AnimationTransitionFilterNode.superclass.parseElement.call( this );
|
|
var bIsValidTransition = true;
|
|
|
|
var aAnimElem = this.aElement;
|
|
|
|
this.eTransitionType = undefined;
|
|
var sTypeAttr = aAnimElem.getAttributeNS( NSS['smil'], 'type' );
|
|
if( sTypeAttr && aTransitionTypeInMap[ sTypeAttr ] )
|
|
{
|
|
this.eTransitionType = aTransitionTypeInMap[ sTypeAttr ];
|
|
}
|
|
else
|
|
{
|
|
bIsValidTransition = false;
|
|
log( 'AnimationTransitionFilterNode.parseElement: transition type not valid: ' + sTypeAttr );
|
|
}
|
|
|
|
this.eTransitionSubType = undefined;
|
|
var sSubTypeAttr = aAnimElem.getAttributeNS( NSS['smil'], 'subtype' );
|
|
if( sSubTypeAttr === null )
|
|
sSubTypeAttr = 'default';
|
|
if( sSubTypeAttr && ( aTransitionSubtypeInMap[ sSubTypeAttr ] !== undefined ) )
|
|
{
|
|
this.eTransitionSubType = aTransitionSubtypeInMap[ sSubTypeAttr ];
|
|
}
|
|
else
|
|
{
|
|
bIsValidTransition = false;
|
|
log( 'AnimationTransitionFilterNode.parseElement: transition subtype not valid: ' + sSubTypeAttr );
|
|
}
|
|
|
|
if( !bIsValidTransition )
|
|
{
|
|
this.eTransitionType = FADE_TRANSITION;
|
|
this.eTransitionSubType = CROSSFADE_TRANS_SUBTYPE;
|
|
log( 'AnimationTransitionFilterNode.parseElement: in place of the invalid transition a crossfade transition is used' );
|
|
}
|
|
|
|
this.bReverseDirection = false;
|
|
var sDirectionAttr = aAnimElem.getAttributeNS( NSS['smil'], 'direction' );
|
|
if( sDirectionAttr == 'reverse' )
|
|
this.bReverseDirection = true;
|
|
|
|
this.eTransitionMode = TRANSITION_MODE_IN;
|
|
var sModeAttr = aAnimElem.getAttributeNS( NSS['smil'], 'mode' );
|
|
if( sModeAttr === 'out' )
|
|
this.eTransitionMode = TRANSITION_MODE_OUT;
|
|
|
|
return bRet;
|
|
};
|
|
|
|
AnimationTransitionFilterNode.prototype.getTransitionType = function()
|
|
{
|
|
return this.eTransitionType;
|
|
};
|
|
|
|
AnimationTransitionFilterNode.prototype.getTransitionSubType = function()
|
|
{
|
|
return this.eTransitionSubType;
|
|
};
|
|
|
|
AnimationTransitionFilterNode.prototype.getTransitionMode = function()
|
|
{
|
|
return this.eTransitionMode;
|
|
};
|
|
|
|
AnimationTransitionFilterNode.prototype.getReverseDirection = function()
|
|
{
|
|
return this.bReverseDirection;
|
|
};
|
|
|
|
AnimationTransitionFilterNode.prototype.info = function( bVerbose )
|
|
{
|
|
var sInfo = AnimationTransitionFilterNode.superclass.info.call( this, bVerbose );
|
|
|
|
if( bVerbose )
|
|
{
|
|
sInfo += '; type: ' + getKeyByValue(aTransitionTypeInMap, this.getTransitionType());
|
|
|
|
sInfo += '; subtype: ' + getKeyByValue(aTransitionSubtypeInMap, this.getTransitionSubType());
|
|
|
|
if( this.getReverseDirection() )
|
|
sInfo += '; direction: reverse';
|
|
}
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function createAnimationTree( aRootElement, aNodeContext )
|
|
{
|
|
return createAnimationNode( aRootElement, null, aNodeContext );
|
|
}
|
|
|
|
|
|
function createAnimationNode( aElement, aParentNode, aNodeContext )
|
|
{
|
|
assert( aElement, 'createAnimationNode: invalid animation element' );
|
|
|
|
var eAnimationNodeType = getAnimationElementType( aElement );
|
|
|
|
var aCreatedNode = null;
|
|
var aCreatedContainer = null;
|
|
|
|
switch( eAnimationNodeType )
|
|
{
|
|
case ANIMATION_NODE_PAR:
|
|
aCreatedNode = aCreatedContainer =
|
|
new ParallelTimeContainer( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_ITERATE:
|
|
aCreatedNode = aCreatedContainer =
|
|
new ParallelTimeContainer( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_SEQ:
|
|
aCreatedNode = aCreatedContainer =
|
|
new SequentialTimeContainer( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_ANIMATE:
|
|
aCreatedNode = new PropertyAnimationNode( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_SET:
|
|
aCreatedNode = new AnimationSetNode( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_ANIMATEMOTION:
|
|
log( 'createAnimationNode: ANIMATEMOTION not implemented' );
|
|
return null;
|
|
case ANIMATION_NODE_ANIMATECOLOR:
|
|
aCreatedNode = new AnimationColorNode( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_ANIMATETRANSFORM:
|
|
aCreatedNode = new AnimationTransformNode( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_TRANSITIONFILTER:
|
|
aCreatedNode = new AnimationTransitionFilterNode( aElement, aParentNode, aNodeContext );
|
|
break;
|
|
case ANIMATION_NODE_AUDIO:
|
|
log( 'createAnimationNode: AUDIO not implemented' );
|
|
return null;
|
|
case ANIMATION_NODE_COMMAND:
|
|
log( 'createAnimationNode: COMMAND not implemented' );
|
|
return null;
|
|
default:
|
|
log( 'createAnimationNode: invalid Animation Node Type: ' + eAnimationNodeType );
|
|
return null;
|
|
}
|
|
|
|
if( aCreatedContainer )
|
|
{
|
|
if( eAnimationNodeType == ANIMATION_NODE_ITERATE )
|
|
{
|
|
createIteratedNodes( aElement, aCreatedContainer, aNodeContext );
|
|
}
|
|
else
|
|
{
|
|
var aChildrenArray = getElementChildren( aElement );
|
|
for( var i = 0; i < aChildrenArray.length; ++i )
|
|
{
|
|
if( !createChildNode( aChildrenArray[i], aCreatedContainer, aNodeContext ) )
|
|
{
|
|
aCreatedContainer.removeAllChildrenNodes();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return aCreatedNode;
|
|
}
|
|
|
|
|
|
function createChildNode( aElement, aParentNode, aNodeContext )
|
|
{
|
|
var aChildNode = createAnimationNode( aElement, aParentNode, aNodeContext );
|
|
|
|
if( !aChildNode )
|
|
{
|
|
log( 'createChildNode: child node creation failed' );
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
aParentNode.appendChildNode( aChildNode );
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
function createIteratedNodes( /*aElement, aContainerNode, aNodeContext*/ )
|
|
{
|
|
}
|
|
|
|
|
|
function makeScaler( nScale )
|
|
{
|
|
if( ( typeof( nScale ) !== typeof( 0 ) ) || !isFinite( nScale ) )
|
|
{
|
|
log( 'makeScaler: not valid param passed: ' + nScale );
|
|
return null;
|
|
}
|
|
|
|
return function( nValue )
|
|
{
|
|
return ( nScale * nValue );
|
|
};
|
|
}
|
|
|
|
|
|
function createPropertyAnimation( sAttrName, aAnimatedElement, nWidth, nHeight )
|
|
{
|
|
if( !aAttributeMap[ sAttrName ] )
|
|
{
|
|
log( 'createPropertyAnimation: attribute is unknown' );
|
|
return null;
|
|
}
|
|
|
|
|
|
var aFunctorSet = aAttributeMap[ sAttrName ];
|
|
|
|
var sGetValueMethod = aFunctorSet.get;
|
|
var sSetValueMethod = aFunctorSet.set;
|
|
|
|
if( !sGetValueMethod || !sSetValueMethod )
|
|
{
|
|
log( 'createPropertyAnimation: attribute is not handled' );
|
|
return null;
|
|
}
|
|
|
|
var aGetModifier = eval( aFunctorSet.getmod );
|
|
var aSetModifier = eval( aFunctorSet.setmod );
|
|
|
|
|
|
return new GenericAnimation( bind( aAnimatedElement, aAnimatedElement[ sGetValueMethod ] ),
|
|
bind( aAnimatedElement, aAnimatedElement[ sSetValueMethod ] ),
|
|
aGetModifier,
|
|
aSetModifier);
|
|
}
|
|
|
|
|
|
function createPairPropertyAnimation( sTransformType, aAnimatedElement, nWidth, nHeight )
|
|
{
|
|
var aFunctorSet = aAttributeMap[ sTransformType ];
|
|
var sGetValueMethod = aFunctorSet.get;
|
|
var sSetValueMethod = aFunctorSet.set;
|
|
|
|
var aDefaultValue = [];
|
|
var aSizeReference = [];
|
|
if( sTransformType === 'scale' )
|
|
{
|
|
aDefaultValue[0] = aSizeReference[0] = aAnimatedElement.getBaseBBox().width;
|
|
aDefaultValue[1] = aSizeReference[1] = aAnimatedElement.getBaseBBox().height;
|
|
}
|
|
else if( sTransformType === 'translate' )
|
|
{
|
|
aDefaultValue[0] = aAnimatedElement.getBaseCenterX();
|
|
aDefaultValue[1] = aAnimatedElement.getBaseCenterY();
|
|
aSizeReference[0] = nWidth;
|
|
aSizeReference[1] = nHeight;
|
|
}
|
|
else
|
|
{
|
|
log( 'createPairPropertyAnimation: transform type is not handled' );
|
|
return null;
|
|
}
|
|
|
|
return new TupleAnimation( bind( aAnimatedElement, aAnimatedElement[ sGetValueMethod ] ),
|
|
bind( aAnimatedElement, aAnimatedElement[ sSetValueMethod ] ),
|
|
aDefaultValue,
|
|
aSizeReference );
|
|
}
|
|
|
|
|
|
function createShapeTransition( aActivityParamSet, aAnimatedElement,
|
|
nSlideWidth, nSlideHeight,
|
|
aAnimatedTransitionFilterNode )
|
|
{
|
|
if( !aAnimatedTransitionFilterNode )
|
|
{
|
|
log( 'createShapeTransition: the animated transition filter node is not valid.' );
|
|
return null;
|
|
}
|
|
var eTransitionType = aAnimatedTransitionFilterNode.getTransitionType();
|
|
var eTransitionSubType = aAnimatedTransitionFilterNode.getTransitionSubType();
|
|
var bDirectionForward = ! aAnimatedTransitionFilterNode.getReverseDirection();
|
|
var bModeIn = ( aAnimatedTransitionFilterNode.getTransitionMode() == FORWARD );
|
|
|
|
var aTransitionInfo = aTransitionInfoTable[eTransitionType][eTransitionSubType];
|
|
var eTransitionClass = aTransitionInfo['class'];
|
|
|
|
switch( eTransitionClass )
|
|
{
|
|
default:
|
|
case TRANSITION_INVALID:
|
|
log( 'createShapeTransition: transition class: TRANSITION_INVALID' );
|
|
return null;
|
|
|
|
case TRANSITION_CLIP_POLYPOLYGON:
|
|
var aParametricPolyPolygon
|
|
= createClipPolyPolygon( eTransitionType, eTransitionSubType );
|
|
var aClippingAnimation
|
|
= new ClippingAnimation( aParametricPolyPolygon, aTransitionInfo,
|
|
bDirectionForward, bModeIn );
|
|
return new SimpleActivity( aActivityParamSet, aClippingAnimation, true );
|
|
|
|
case TRANSITION_SPECIAL:
|
|
switch( eTransitionType )
|
|
{
|
|
default:
|
|
var aAnimation
|
|
= createPropertyAnimation( 'opacity',
|
|
aAnimatedElement,
|
|
nSlideWidth,
|
|
nSlideHeight );
|
|
return new SimpleActivity( aActivityParamSet, aAnimation, bModeIn );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
function ClippingAnimation( aParametricPolyPolygon, aTransitionInfo,
|
|
bDirectionForward, bModeIn )
|
|
{
|
|
this.aClippingFunctor = new ClippingFunctor( aParametricPolyPolygon,
|
|
aTransitionInfo,
|
|
bDirectionForward, bModeIn );
|
|
this.bAnimationStarted = false;
|
|
}
|
|
|
|
ClippingAnimation.prototype.start = function( aAnimatableElement )
|
|
{
|
|
assert( aAnimatableElement,
|
|
'ClippingAnimation.start: animatable element is not valid' );
|
|
this.aAnimatableElement = aAnimatableElement;
|
|
this.aAnimatableElement.initClipPath();
|
|
this.aAnimatableElement.notifyAnimationStart();
|
|
|
|
if( !this.bAnimationStarted )
|
|
this.bAnimationStarted = true;
|
|
|
|
};
|
|
|
|
ClippingAnimation.prototype.end = function()
|
|
{
|
|
if( this.bAnimationStarted )
|
|
{
|
|
this.aAnimatableElement.cleanClipPath();
|
|
this.bAnimationStarted = false;
|
|
this.aAnimatableElement.notifyAnimationEnd();
|
|
}
|
|
};
|
|
|
|
ClippingAnimation.prototype.perform = function( nValue )
|
|
{
|
|
var nWidth = this.aAnimatableElement.aClippingBBox.width;
|
|
var nHeight = this.aAnimatableElement.aClippingBBox.height;
|
|
var aPolyPolygonElement = this.aClippingFunctor.perform( nValue, nWidth, nHeight );
|
|
this.aAnimatableElement.setClipPath( aPolyPolygonElement );
|
|
};
|
|
|
|
ClippingAnimation.prototype.getUnderlyingValue = function()
|
|
{
|
|
return 0.0;
|
|
};
|
|
|
|
|
|
function GenericAnimation( aGetValueFunc, aSetValueFunc, aGetModifier, aSetModifier )
|
|
{
|
|
assert( aGetValueFunc && aSetValueFunc,
|
|
'GenericAnimation constructor: get value functor and/or set value functor are not valid' );
|
|
|
|
this.aGetValueFunc = aGetValueFunc;
|
|
this.aSetValueFunc = aSetValueFunc;
|
|
this.aGetModifier = aGetModifier;
|
|
this.aSetModifier = aSetModifier;
|
|
this.aAnimatableElement = null;
|
|
this.bAnimationStarted = false;
|
|
}
|
|
|
|
|
|
GenericAnimation.prototype.start = function( aAnimatableElement )
|
|
{
|
|
assert( aAnimatableElement, 'GenericAnimation.start: animatable element is not valid' );
|
|
|
|
this.aAnimatableElement = aAnimatableElement;
|
|
this.aAnimatableElement.notifyAnimationStart();
|
|
|
|
if( !this.bAnimationStarted )
|
|
this.bAnimationStarted = true;
|
|
};
|
|
|
|
GenericAnimation.prototype.end = function()
|
|
{
|
|
if( this.bAnimationStarted )
|
|
{
|
|
this.bAnimationStarted = false;
|
|
this.aAnimatableElement.notifyAnimationEnd();
|
|
}
|
|
};
|
|
|
|
GenericAnimation.prototype.perform = function( aValue )
|
|
{
|
|
if( this.aSetModifier )
|
|
aValue = this.aSetModifier( aValue );
|
|
|
|
this.aSetValueFunc( aValue );
|
|
};
|
|
|
|
GenericAnimation.prototype.getUnderlyingValue = function()
|
|
{
|
|
var aValue = this.aGetValueFunc();
|
|
if( this.aGetModifier )
|
|
aValue = this.aGetModifier( aValue );
|
|
return aValue;
|
|
};
|
|
|
|
|
|
function TupleAnimation( aGetValueFunc, aSetValueFunc, aDefaultValue, aReferenceSize )
|
|
{
|
|
TupleAnimation.superclass.constructor.call( this, aGetValueFunc, aSetValueFunc );
|
|
assert( aDefaultValue && aReferenceSize,
|
|
'TupleAnimation constructor: default value functor and/or reference size are not valid' );
|
|
|
|
this.aDefaultValue = aDefaultValue;
|
|
this.aReferenceSize = aReferenceSize;
|
|
}
|
|
extend( TupleAnimation, GenericAnimation );
|
|
|
|
TupleAnimation.prototype.perform = function( aNormValue )
|
|
{
|
|
assert(aNormValue.length === this.aReferenceSize.length);
|
|
|
|
var aValue = [];
|
|
for( var i = 0; i < aNormValue.length; ++i )
|
|
{
|
|
aValue.push( aNormValue[i] * this.aReferenceSize[i] );
|
|
}
|
|
|
|
this.aSetValueFunc( aValue );
|
|
};
|
|
|
|
TupleAnimation.prototype.getUnderlyingValue = function()
|
|
{
|
|
var aValue = this.aGetValueFunc();
|
|
assert(aValue.length === this.aReferenceSize.length);
|
|
|
|
var aNormValue = [];
|
|
for( var i = 0; i < aValue.length; ++i )
|
|
{
|
|
aNormValue.push( aValue[i] / this.aReferenceSize[i] );
|
|
}
|
|
|
|
return aNormValue;
|
|
};
|
|
|
|
|
|
function HSLAnimationWrapper( aColorAnimation )
|
|
{
|
|
assert( aColorAnimation,
|
|
'HSLAnimationWrapper constructor: invalid color animation delegate' );
|
|
|
|
this.aAnimation = aColorAnimation;
|
|
}
|
|
|
|
|
|
HSLAnimationWrapper.prototype.start = function( aAnimatableElement )
|
|
{
|
|
this.aAnimation.start( aAnimatableElement );
|
|
};
|
|
|
|
HSLAnimationWrapper.prototype.end = function()
|
|
{
|
|
this.aAnimation.end();
|
|
};
|
|
HSLAnimationWrapper.prototype.perform = function( aHSLValue )
|
|
{
|
|
this.aAnimation.perform( aHSLValue.convertToRGB() );
|
|
};
|
|
|
|
HSLAnimationWrapper.prototype.getUnderlyingValue = function()
|
|
{
|
|
return this.aAnimation.getUnderlyingValue().convertToHSL();
|
|
};
|
|
|
|
|
|
function SlideChangeBase(aLeavingSlide, aEnteringSlide)
|
|
{
|
|
this.aLeavingSlide = aLeavingSlide;
|
|
this.aEnteringSlide = aEnteringSlide;
|
|
this.bIsFinished = false;
|
|
}
|
|
|
|
SlideChangeBase.prototype.start = function()
|
|
{
|
|
};
|
|
|
|
SlideChangeBase.prototype.end = function()
|
|
{
|
|
if( this.bIsFinished )
|
|
return;
|
|
|
|
this.aLeavingSlide.hide();
|
|
this.aEnteringSlide.reset();
|
|
this.aLeavingSlide.reset();
|
|
|
|
this.bIsFinished = true;
|
|
};
|
|
|
|
SlideChangeBase.prototype.perform = function( nValue )
|
|
{
|
|
if( this.bIsFinished ) return false;
|
|
|
|
if( this.aLeavingSlide )
|
|
this.performOut( nValue );
|
|
|
|
if( this.aEnteringSlide )
|
|
this.performIn( nValue );
|
|
|
|
return true;
|
|
};
|
|
|
|
SlideChangeBase.prototype.getUnderlyingValue = function()
|
|
{
|
|
return 0.0;
|
|
};
|
|
|
|
SlideChangeBase.prototype.performIn = function( )
|
|
{
|
|
log( 'SlideChangeBase.performIn: abstract method called' );
|
|
};
|
|
|
|
SlideChangeBase.prototype.performOut = function( )
|
|
{
|
|
log( 'SlideChangeBase.performOut: abstract method called' );
|
|
};
|
|
|
|
|
|
function FadingSlideChange( aLeavingSlide, aEnteringSlide )
|
|
{
|
|
FadingSlideChange.superclass.constructor.call( this, aLeavingSlide, aEnteringSlide );
|
|
this.bFirstRun = true;
|
|
}
|
|
extend( FadingSlideChange, SlideChangeBase );
|
|
|
|
FadingSlideChange.prototype.start = function()
|
|
{
|
|
FadingSlideChange.superclass.start.call( this );
|
|
this.aEnteringSlide.notifyUsedAttribute( 'opacity' );
|
|
this.aLeavingSlide.notifyUsedAttribute( 'opacity' );
|
|
this.aEnteringSlide.setOpacity( 0.0 );
|
|
this.aEnteringSlide.show();
|
|
};
|
|
|
|
FadingSlideChange.prototype.performIn = function( nT )
|
|
{
|
|
this.aEnteringSlide.setOpacity( nT );
|
|
};
|
|
|
|
FadingSlideChange.prototype.performOut = function( nT )
|
|
{
|
|
|
|
this.aLeavingSlide.setOpacity( 1 - nT );
|
|
};
|
|
|
|
|
|
function FadingOverColorSlideChange( aLeavingSlide, aEnteringSlide, sFadeColor )
|
|
{
|
|
FadingSlideChange.superclass.constructor.call( this, aLeavingSlide, aEnteringSlide );
|
|
this.sFadeColor = sFadeColor;
|
|
if( !this.sFadeColor )
|
|
{
|
|
log( 'FadingOverColorSlideChange: sFadeColor not valid.' );
|
|
this.sFadeColor = '#000000';
|
|
}
|
|
this.aColorPlaneElement = this.createColorPlaneElement();
|
|
}
|
|
extend( FadingOverColorSlideChange, SlideChangeBase );
|
|
|
|
FadingOverColorSlideChange.prototype.start = function()
|
|
{
|
|
FadingOverColorSlideChange.superclass.start.call( this );
|
|
this.aEnteringSlide.notifyUsedAttribute( 'opacity' );
|
|
this.aLeavingSlide.notifyUsedAttribute( 'opacity' );
|
|
this.aLeavingSlide.insertBefore( this.aColorPlaneElement );
|
|
this.aEnteringSlide.setOpacity( 0.0 );
|
|
this.aEnteringSlide.show();
|
|
};
|
|
|
|
FadingOverColorSlideChange.prototype.end = function()
|
|
{
|
|
FadingOverColorSlideChange.superclass.end.call( this );
|
|
this.aLeavingSlide.removeElement( this.aColorPlaneElement );
|
|
};
|
|
|
|
FadingOverColorSlideChange.prototype.performIn = function( nT )
|
|
{
|
|
this.aEnteringSlide.setOpacity( (nT > 0.55) ? 2.0*(nT-0.55) : 0.0 );
|
|
};
|
|
|
|
FadingOverColorSlideChange.prototype.performOut = function( nT )
|
|
{
|
|
this.aLeavingSlide.setOpacity( (nT > 0.45) ? 0.0 : 2.0*(0.45-nT) );
|
|
};
|
|
|
|
FadingOverColorSlideChange.prototype.createColorPlaneElement = function()
|
|
{
|
|
var aColorPlaneElement = document.createElementNS( NSS['svg'], 'rect' );
|
|
aColorPlaneElement.setAttribute( 'width', String( this.aLeavingSlide.getWidth() ) );
|
|
aColorPlaneElement.setAttribute( 'height', String( this.aLeavingSlide.getHeight() ) );
|
|
aColorPlaneElement.setAttribute( 'fill', this.sFadeColor );
|
|
return aColorPlaneElement;
|
|
};
|
|
|
|
|
|
function MovingSlideChange( aLeavingSlide, aEnteringSlide,
|
|
aLeavingDirection, aEnteringDirection )
|
|
{
|
|
MovingSlideChange.superclass.constructor.call( this, aLeavingSlide, aEnteringSlide );
|
|
this.aLeavingDirection = aLeavingDirection;
|
|
this.aEnteringDirection = aEnteringDirection;
|
|
}
|
|
extend( MovingSlideChange, SlideChangeBase );
|
|
|
|
MovingSlideChange.prototype.start = function()
|
|
{
|
|
MovingSlideChange.superclass.start.call( this );
|
|
this.aEnteringSlide.notifyUsedAttribute( 'transform' );
|
|
this.aLeavingSlide.notifyUsedAttribute( 'transform' );
|
|
this.performIn( 0 );
|
|
this.aEnteringSlide.show();
|
|
};
|
|
|
|
MovingSlideChange.prototype.performIn = function( nT )
|
|
{
|
|
var nS = nT - 1;
|
|
var dx = nS * this.aEnteringDirection.x * this.aEnteringSlide.getWidth();
|
|
var dy = nS * this.aEnteringDirection.y * this.aEnteringSlide.getHeight();
|
|
this.aEnteringSlide.translate( dx, dy );
|
|
};
|
|
|
|
MovingSlideChange.prototype.performOut = function( nT )
|
|
{
|
|
var dx = nT * this.aLeavingDirection.x * this.aLeavingSlide.getWidth();
|
|
var dy = nT * this.aLeavingDirection.y * this.aLeavingSlide.getHeight();
|
|
this.aLeavingSlide.translate( dx, dy );
|
|
};
|
|
|
|
|
|
function ClippedSlideChange( aLeavingSlide, aEnteringSlide, aParametricPolyPolygon,
|
|
aTransitionInfo, bIsDirectionForward )
|
|
{
|
|
ClippedSlideChange.superclass.constructor.call( this, aLeavingSlide, aEnteringSlide );
|
|
|
|
var bIsModeIn = true;
|
|
this.aClippingFunctor= new ClippingFunctor( aParametricPolyPolygon, aTransitionInfo,
|
|
bIsDirectionForward, bIsModeIn );
|
|
}
|
|
extend( ClippedSlideChange, SlideChangeBase );
|
|
|
|
ClippedSlideChange.prototype.start = function()
|
|
{
|
|
ClippedSlideChange.superclass.start.call( this );
|
|
this.aEnteringSlide.notifyUsedAttribute( 'clip-path' );
|
|
this.performIn( 0 );
|
|
this.aEnteringSlide.show();
|
|
};
|
|
|
|
ClippedSlideChange.prototype.performIn = function( nT )
|
|
{
|
|
var nWidth = this.aEnteringSlide.getWidth();
|
|
var nHeight = this.aEnteringSlide.getHeight();
|
|
var aPolyPolygonElement = this.aClippingFunctor.perform( nT, nWidth, nHeight );
|
|
this.aEnteringSlide.setClipPath( aPolyPolygonElement );
|
|
};
|
|
|
|
ClippedSlideChange.prototype.performOut = function( )
|
|
{
|
|
};
|
|
|
|
|
|
function ClippingFunctor( aParametricPolyPolygon, aTransitionInfo,
|
|
bIsDirectionForward, bIsModeIn)
|
|
{
|
|
this.aParametricPolyPolygon = aParametricPolyPolygon;
|
|
this.aStaticTransformation = null;
|
|
this.bForwardParameterSweep = true;
|
|
this.bSubtractPolygon = false;
|
|
this.bScaleIsotropically = aTransitionInfo.scaleIsotropically;
|
|
this.bFlip = false;
|
|
|
|
assert( this.aParametricPolyPolygon,
|
|
'ClippingFunctor: parametric polygon is not valid' );
|
|
|
|
if( aTransitionInfo.rotationAngle != 0.0 ||
|
|
aTransitionInfo.scaleX != 1.0 || aTransitionInfo.scaleY != 1.0 )
|
|
{
|
|
this.aStaticTransformation = SVGIdentityMatrix.translate( 0.5, 0.5 );
|
|
if( aTransitionInfo.scaleX != 1.0 || aTransitionInfo.scaleY != 1.0 )
|
|
this.aStaticTransformation
|
|
= this.aStaticTransformation.scaleNonUniform( aTransitionInfo.scaleX,
|
|
aTransitionInfo.scaleY );
|
|
if( aTransitionInfo.rotationAngle != 0.0 )
|
|
this.aStaticTransformation
|
|
= this.aStaticTransformation.rotate( aTransitionInfo.rotationAngle );
|
|
this.aStaticTransformation = this.aStaticTransformation.translate( -0.5, -0.5 );
|
|
}
|
|
else
|
|
{
|
|
this.aStaticTransformation = document.documentElement.createSVGMatrix();
|
|
}
|
|
|
|
if( !bIsDirectionForward )
|
|
{
|
|
var aMatrix = null;
|
|
switch( aTransitionInfo.reverseMethod )
|
|
{
|
|
default:
|
|
log( 'ClippingFunctor: unexpected reverse method.' );
|
|
break;
|
|
case REVERSEMETHOD_IGNORE:
|
|
break;
|
|
case REVERSEMETHOD_INVERT_SWEEP:
|
|
this.bForwardParameterSweep = !this.bForwardParameterSweep;
|
|
break;
|
|
case REVERSEMETHOD_SUBTRACT_POLYGON:
|
|
this.bSubtractPolygon = !this.bSubtractPolygon;
|
|
break;
|
|
case REVERSEMETHOD_SUBTRACT_AND_INVERT:
|
|
this.bForwardParameterSweep = !this.bForwardParameterSweep;
|
|
this.bSubtractPolygon = !this.bSubtractPolygon;
|
|
break;
|
|
case REVERSEMETHOD_ROTATE_180:
|
|
aMatrix = document.documentElement.createSVGMatrix();
|
|
aMatrix.setToRotationAroundPoint( 0.5, 0.5, 180 );
|
|
this.aStaticTransformation = aMatrix.multiply( this.aStaticTransformation );
|
|
break;
|
|
case REVERSEMETHOD_FLIP_X:
|
|
aMatrix = document.documentElement.createSVGMatrix();
|
|
aMatrix.a = -1; aMatrix.e = 1.0;
|
|
this.aStaticTransformation = aMatrix.multiply( this.aStaticTransformation );
|
|
this.bFlip = true;
|
|
break;
|
|
case REVERSEMETHOD_FLIP_Y:
|
|
aMatrix = document.documentElement.createSVGMatrix();
|
|
aMatrix.d = -1; aMatrix.f = 1.0;
|
|
this.aStaticTransformation = aMatrix.multiply( this.aStaticTransformation );
|
|
this.bFlip = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( !bIsModeIn )
|
|
{
|
|
if( aTransitionInfo.outInvertsSweep )
|
|
{
|
|
this.bForwardParameterSweep = !this.bForwardParameterSweep;
|
|
}
|
|
else
|
|
{
|
|
this.bSubtractPolygon = !this.bSubtractPolygon;
|
|
}
|
|
}
|
|
}
|
|
|
|
ClippingFunctor.aBoundingPath = document.createElementNS( NSS['svg'], 'path' );
|
|
ClippingFunctor.aBoundingPath.setAttribute( 'd', 'M -1 -1 L 2 -1 L 2 2 L -1 2 L -1 -1' );
|
|
|
|
ClippingFunctor.prototype.perform = function( nT, nWidth, nHeight )
|
|
{
|
|
var aClipPoly = this.aParametricPolyPolygon.perform( this.bForwardParameterSweep ? nT : (1 - nT) );
|
|
|
|
|
|
if( this.bSubtractPolygon )
|
|
{
|
|
aClipPoly.changeOrientation();
|
|
aClipPoly.prependPath( ClippingFunctor.aBoundingPath );
|
|
}
|
|
|
|
var aMatrix;
|
|
if( this.bScaleIsotropically )
|
|
{
|
|
var nScaleFactor = Math.max( nWidth, nHeight );
|
|
aMatrix = SVGIdentityMatrix.translate( -( nScaleFactor - nWidth ) / 2.0,
|
|
-( nScaleFactor - nHeight ) / 2.0 );
|
|
aMatrix = aMatrix.scale( nScaleFactor );
|
|
aMatrix = aMatrix.multiply( this.aStaticTransformation );
|
|
}
|
|
else
|
|
{
|
|
aMatrix = SVGIdentityMatrix.scaleNonUniform( nWidth, nHeight );
|
|
aMatrix = aMatrix.multiply( this.aStaticTransformation );
|
|
}
|
|
|
|
aClipPoly.matrixTransform( aMatrix );
|
|
|
|
return aClipPoly;
|
|
};
|
|
|
|
|
|
function createClipPolyPolygon( nType, nSubtype )
|
|
{
|
|
switch( nType )
|
|
{
|
|
default:
|
|
log( 'createClipPolyPolygon: unknown transition type: ' + nType );
|
|
return null;
|
|
case BARWIPE_TRANSITION:
|
|
return new BarWipePath( 1 );
|
|
case FOURBOXWIPE_TRANSITION:
|
|
return new FourBoxWipePath( nSubtype === CORNERSOUT_TRANS_SUBTYPE );
|
|
case BOXWIPE_TRANSITION:
|
|
return new BoxWipePath( nSubtype == LEFTCENTER_TRANS_SUBTYPE ||
|
|
nSubtype == TOPCENTER_TRANS_SUBTYPE ||
|
|
nSubtype == RIGHTCENTER_TRANS_SUBTYPE ||
|
|
nSubtype == BOTTOMCENTER_TRANS_SUBTYPE );
|
|
case ELLIPSEWIPE_TRANSITION:
|
|
return new EllipseWipePath( nSubtype );
|
|
case FANWIPE_TRANSITION:
|
|
return new FanWipePath(nSubtype == CENTERTOP_TRANS_SUBTYPE ||
|
|
nSubtype == CENTERRIGHT_TRANS_SUBTYPE, true, false);
|
|
case PINWHEELWIPE_TRANSITION:
|
|
var nBlades;
|
|
switch( nSubtype )
|
|
{
|
|
case ONEBLADE_TRANS_SUBTYPE:
|
|
nBlades = 1;
|
|
break;
|
|
case DEFAULT_TRANS_SUBTYPE:
|
|
case TWOBLADEVERTICAL_TRANS_SUBTYPE:
|
|
nBlades = 2;
|
|
break;
|
|
case TWOBLADEHORIZONTAL_TRANS_SUBTYPE:
|
|
nBlades = 2;
|
|
break;
|
|
case THREEBLADE_TRANS_SUBTYPE:
|
|
nBlades = 3;
|
|
break;
|
|
case FOURBLADE_TRANS_SUBTYPE:
|
|
nBlades = 4;
|
|
break;
|
|
case EIGHTBLADE_TRANS_SUBTYPE:
|
|
nBlades = 8;
|
|
break;
|
|
default:
|
|
log( 'createClipPolyPolygon: unknown subtype: ' + nSubtype );
|
|
return null;
|
|
}
|
|
return new PinWheelWipePath( nBlades );
|
|
case CLOCKWIPE_TRANSITION:
|
|
return new ClockWipePath();
|
|
case RANDOMBARWIPE_TRANSITION:
|
|
return new RandomWipePath( 128, true /* bars */ );
|
|
case CHECKERBOARDWIPE_TRANSITION:
|
|
return new CheckerBoardWipePath( 10 );
|
|
case ZIGZAGWIPE_TRANSITION:
|
|
return new ZigZagWipePath( 5 );
|
|
case BARNZIGZAGWIPE_TRANSITION:
|
|
return new BarnZigZagWipePath( 5 );
|
|
case IRISWIPE_TRANSITION:
|
|
switch(nSubtype)
|
|
{
|
|
case RECTANGLE_TRANS_SUBTYPE:
|
|
return new IrisWipePath(0);
|
|
case DIAMOND_TRANS_SUBTYPE:
|
|
return new IrisWipePath(1);
|
|
default:
|
|
log( 'createClipPolyPolygon: unknown subtype: ' + nSubtype );
|
|
return null;
|
|
}
|
|
case BARNDOORWIPE_TRANSITION:
|
|
return new BarnDoorWipePath(false);
|
|
case SINGLESWEEPWIPE_TRANSITION:
|
|
return new SweepWipePath(
|
|
nSubtype == CLOCKWISETOP_TRANS_SUBTYPE ||
|
|
nSubtype == CLOCKWISERIGHT_TRANS_SUBTYPE ||
|
|
nSubtype == CLOCKWISEBOTTOM_TRANS_SUBTYPE ||
|
|
nSubtype == CLOCKWISELEFT_TRANS_SUBTYPE,
|
|
true,
|
|
false,
|
|
nSubtype == COUNTERCLOCKWISEBOTTOMLEFT_TRANS_SUBTYPE ||
|
|
nSubtype == COUNTERCLOCKWISETOPRIGHT_TRANS_SUBTYPE );
|
|
case WATERFALLWIPE_TRANSITION:
|
|
return new WaterfallWipePath(128, // flipOnYAxis
|
|
nSubtype == VERTICALRIGHT_TRANS_SUBTYPE ||
|
|
nSubtype == HORIZONTALLEFT_TRANS_SUBTYPE);
|
|
case MISCDIAGONALWIPE_TRANSITION:
|
|
switch(nSubtype) {
|
|
case DOUBLEBARNDOOR_TRANS_SUBTYPE:
|
|
return new BarnDoorWipePath(true /* Doubled */);
|
|
case DOUBLEDIAMOND_TRANS_SUBTYPE:
|
|
return new DoubleDiamondWipePath();
|
|
default:
|
|
log( 'createClipPolyPolygon: unhandled subtype: ' + nSubtype );
|
|
return null;
|
|
}
|
|
case DISSOLVE_TRANSITION:
|
|
return new RandomWipePath( 16 * 16, false /* dissolve */ );
|
|
case VEEWIPE_TRANSITION:
|
|
return new VeeWipePath();
|
|
case SNAKEWIPE_TRANSITION:
|
|
return new SnakeWipePath( 8 * 8, // diagonal
|
|
nSubtype == TOPLEFTDIAGONAL_TRANS_SUBTYPE ||
|
|
nSubtype == TOPRIGHTDIAGONAL_TRANS_SUBTYPE ||
|
|
nSubtype == BOTTOMRIGHTDIAGONAL_TRANS_SUBTYPE ||
|
|
nSubtype == BOTTOMLEFTDIAGONAL_TRANS_SUBTYPE ,
|
|
nSubtype == TOPLEFTVERTICAL_TRANS_SUBTYPE ||
|
|
nSubtype == TOPRIGHTDIAGONAL_TRANS_SUBTYPE ||
|
|
nSubtype == BOTTOMLEFTDIAGONAL_TRANS_SUBTYPE
|
|
);
|
|
case PARALLELSNAKESWIPE_TRANSITION:
|
|
return new ParallelSnakesWipePath(
|
|
8 * 8, // elements
|
|
nSubtype == DIAGONALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == DIAGONALTOPLEFTOPPOSITE_TRANS_SUBTYPE,
|
|
nSubtype == VERTICALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == HORIZONTALTOPLEFTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == DIAGONALTOPLEFTOPPOSITE_TRANS_SUBTYPE,
|
|
nSubtype == VERTICALTOPLEFTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == VERTICALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == HORIZONTALTOPLEFTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == HORIZONTALTOPRIGHTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == DIAGONALBOTTOMLEFTOPPOSITE_TRANS_SUBTYPE ||
|
|
nSubtype == DIAGONALTOPLEFTOPPOSITE_TRANS_SUBTYPE
|
|
);
|
|
|
|
case SPIRALWIPE_TRANSITION:
|
|
return new SpiralWipePath(
|
|
8 * 8, // elements
|
|
nSubtype == TOPLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE ||
|
|
nSubtype == TOPRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE ||
|
|
nSubtype == BOTTOMRIGHTCOUNTERCLOCKWISE_TRANS_SUBTYPE ||
|
|
nSubtype == BOTTOMLEFTCOUNTERCLOCKWISE_TRANS_SUBTYPE );
|
|
|
|
case BOXSNAKESWIPE_TRANSITION:
|
|
return new BoxSnakesWipePath(
|
|
8 * 8,
|
|
nSubtype == FOURBOXVERTICAL_TRANS_SUBTYPE ||
|
|
nSubtype == FOURBOXHORIZONTAL_TRANS_SUBTYPE );
|
|
}
|
|
}
|
|
|
|
|
|
function createUnitSquarePath()
|
|
{
|
|
var aPath = document.createElementNS( NSS['svg'], 'path' );
|
|
var sD = 'M 0 0 L 1 0 L 1 1 L 0 1 L 0 0';
|
|
aPath.setAttribute( 'd', sD );
|
|
return aPath;
|
|
}
|
|
|
|
function createEmptyPath()
|
|
{
|
|
var aPath = document.createElementNS( NSS['svg'], 'path' );
|
|
var sD = 'M 0 0 L 0 0';
|
|
aPath.setAttribute( 'd', sD );
|
|
return aPath;
|
|
}
|
|
|
|
function pruneScaleValue( nVal )
|
|
{
|
|
if( nVal < 0.0 )
|
|
return (nVal < -0.00001 ? nVal : -0.00001);
|
|
else
|
|
return (nVal > 0.00001 ? nVal : 0.00001);
|
|
}
|
|
|
|
|
|
function BarWipePath( nBars /* nBars > 1: blinds effect */ )
|
|
{
|
|
this.nBars = nBars;
|
|
if( this.nBars === undefined || this.nBars < 1 )
|
|
this.nBars = 1;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
BarWipePath.prototype.perform = function( nT )
|
|
{
|
|
|
|
var aMatrix = SVGIdentityMatrix.scaleNonUniform( pruneScaleValue( nT / this.nBars ), 1.0 );
|
|
|
|
var aPolyPath = this.aBasePath.cloneNode( true );
|
|
aPolyPath.matrixTransform( aMatrix );
|
|
|
|
if( this.nBars > 1 )
|
|
{
|
|
var i;
|
|
var aTransform;
|
|
var aPath;
|
|
for( i = this.nBars - 1; i > 0; --i )
|
|
{
|
|
aTransform = SVGIdentityMatrix.translate( i / this.nBars, 0.0 );
|
|
aTransform = aTransform.multiply( aMatrix );
|
|
aPath = this.aBasePath.cloneNode( true );
|
|
aPath.matrixTransform( aTransform );
|
|
aPolyPath.appendPath( aPath );
|
|
}
|
|
}
|
|
return aPolyPath;
|
|
};
|
|
|
|
|
|
function BoxWipePath(bIsTopCentered) {
|
|
this.bIsTopCentered = bIsTopCentered;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
BoxWipePath.prototype.perform = function( nT ) {
|
|
var d = pruneScaleValue(nT);
|
|
var aTransform = SVGIdentityMatrix;
|
|
if(this.bIsTopCentered) {
|
|
aTransform = aTransform.translate(-0.5, 0.0).scale(d, d).translate(0.5, 0.0);
|
|
}
|
|
else {
|
|
aTransform = aTransform.scale(d, d);
|
|
}
|
|
var aPath = this.aBasePath.cloneNode(true);
|
|
aPath.matrixTransform(aTransform);
|
|
return aPath;
|
|
}
|
|
|
|
function SweepWipePath(bCenter, bSingle, bOppositeVertical, bFlipOnYAxis) {
|
|
this.bCenter = bCenter;
|
|
this.bSingle = bSingle;
|
|
this.bOppositeVertical = bOppositeVertical;
|
|
this.bFlipOnYAxis = bFlipOnYAxis;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
SweepWipePath.prototype.perform = function( nT ) {
|
|
nT /= 2.0;
|
|
if(!this.bCenter)
|
|
nT /= 2.0;
|
|
if(!this.bSingle && !this.bOppositeVertical)
|
|
nT /= 2.0;
|
|
|
|
var poly = PinWheelWipePath.calcCenteredClock( nT + 0.25, 1.0 );
|
|
var aTransform;
|
|
|
|
if(this.bCenter) {
|
|
aTransform = SVGIdentityMatrix.translate(0.5, 0.0);
|
|
poly.matrixTransform(aTransform);
|
|
}
|
|
var res = poly;
|
|
|
|
if(!this.bSingle) {
|
|
if(this.bOppositeVertical) {
|
|
aTransform = SVGIdentityMatrix.scale(1.0, -1.0);
|
|
aTransform.translate(0.0, 1.0);
|
|
poly.matrixTransform(aTransform);
|
|
poly.changeOrientation();
|
|
}
|
|
else {
|
|
aTransform = SVGIdentityMatrix.translate(-0.5, -0.5);
|
|
aTransform.rotate(Math.PI);
|
|
aTransform.translate(0.5, 0.5);
|
|
poly.matrixTransform(aTransform);
|
|
}
|
|
res.appendPath(poly);
|
|
}
|
|
return this.bFlipOnYAxis ? flipOnYAxis(res) : res;
|
|
}
|
|
|
|
function FourBoxWipePath( bCornersOut )
|
|
{
|
|
this.bCornersOut = bCornersOut;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
FourBoxWipePath.prototype.perform = function( nT )
|
|
{
|
|
var aMatrix;
|
|
var d = pruneScaleValue( nT / 2.0 );
|
|
|
|
if( this.bCornersOut )
|
|
{
|
|
aMatrix = SVGIdentityMatrix.translate( -0.25, -0.25 ).scale( d ).translate( -0.5, -0.5 );
|
|
}
|
|
else
|
|
{
|
|
aMatrix = SVGIdentityMatrix.translate( -0.5, -0.5 ).scale( d );
|
|
}
|
|
|
|
|
|
var aTransform = aMatrix;
|
|
var aSquare = this.aBasePath.cloneNode( true );
|
|
aSquare.matrixTransform( aTransform );
|
|
var aPolyPath = aSquare;
|
|
aMatrix = SVGIdentityMatrix.flipY();
|
|
aTransform = aMatrix.multiply( aTransform );
|
|
aSquare = this.aBasePath.cloneNode( true );
|
|
aSquare.matrixTransform( aTransform );
|
|
aSquare.changeOrientation();
|
|
aPolyPath.appendPath( aSquare );
|
|
aMatrix = SVGIdentityMatrix.flipX();
|
|
aTransform = aMatrix.multiply( aTransform );
|
|
aSquare = this.aBasePath.cloneNode( true );
|
|
aSquare.matrixTransform( aTransform );
|
|
aPolyPath.appendPath( aSquare );
|
|
aMatrix = SVGIdentityMatrix.flipY();
|
|
aTransform = aMatrix.multiply( aTransform );
|
|
aSquare = this.aBasePath.cloneNode( true );
|
|
aSquare.matrixTransform( aTransform );
|
|
aSquare.changeOrientation();
|
|
aPolyPath.appendPath( aSquare );
|
|
|
|
aMatrix = SVGIdentityMatrix.translate( 0.5, 0.5 );
|
|
aMatrix = aMatrix.scale( 1.1 );
|
|
aPolyPath.matrixTransform( aMatrix );
|
|
|
|
return aPolyPath;
|
|
};
|
|
|
|
|
|
function EllipseWipePath( eSubtype )
|
|
{
|
|
this.eSubtype = eSubtype;
|
|
|
|
var sPathData = 'M 0.5 -0.207107 ' +
|
|
'C 0.687536 -0.207107 0.867392 -0.132608 1 0 ' +
|
|
'C 1.13261 0.132608 1.20711 0.312464 1.20711 0.5 ' +
|
|
'C 1.20711 0.687536 1.13261 0.867392 1 1 ' +
|
|
'C 0.867392 1.13261 0.687536 1.20711 0.5 1.20711 ' +
|
|
'C 0.312464 1.20711 0.132608 1.13261 0 1 ' +
|
|
'C -0.132608 0.867392 -0.207107 0.687536 -0.207107 0.5 ' +
|
|
'C -0.207107 0.312464 -0.132608 0.132608 0 0 ' +
|
|
'C 0.132608 -0.132608 0.312464 -0.207107 0.5 -0.207107';
|
|
|
|
this.aBasePath = document.createElementNS( NSS['svg'], 'path' );
|
|
this.aBasePath.setAttribute( 'd', sPathData );
|
|
}
|
|
|
|
EllipseWipePath.prototype.perform = function( nT )
|
|
{
|
|
|
|
var aTransform = SVGIdentityMatrix.translate( 0.5, 0.5 ).scale( nT ).translate( -0.5, -0.5 );
|
|
var aEllipse = this.aBasePath.cloneNode( true );
|
|
aEllipse.matrixTransform( aTransform );
|
|
|
|
return aEllipse;
|
|
};
|
|
|
|
function FanWipePath(bIsCenter, bIsSingle, bIsFanIn) {
|
|
this.bCenter = bIsCenter;
|
|
this.bSingle = bIsSingle;
|
|
this.bFanIn = bIsFanIn;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
FanWipePath.prototype.perform = function( nT ) {
|
|
var res = this.aBasePath.cloneNode(true);
|
|
var poly = PinWheelWipePath.calcCenteredClock(
|
|
nT / ((this.bCenter && this.bSingle) ? 2.0 : 4.0), 1.0);
|
|
res.appendPath(poly);
|
|
var aTransform = SVGIdentityMatrix.flipY();
|
|
aTransform = aTransform.scaleNonUniform(-1.0, 1.0);
|
|
poly.matrixTransform(aTransform);
|
|
res.appendPath(poly);
|
|
|
|
if(this.bCenter) {
|
|
aTransform = SVGIdentityMatrix.scaleNonUniform(0.5, 0.5).translate(0.5, 0.5);
|
|
res.matrixTransform(aTransform);
|
|
|
|
if(!this.bSingle)
|
|
res.appendPath(flipOnXAxis(res));
|
|
}
|
|
else {
|
|
aTransform = SVGIdentityMatrix.scaleNonUniform(0.5, 1.0).translate(0.5, 1.0);
|
|
res.matrixTransform(aTransform);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
function ClockWipePath() { }
|
|
|
|
ClockWipePath.prototype.perform = function( nT ) {
|
|
const aTransform = SVGIdentityMatrix.scaleNonUniform(0.5, 0.5).translate(0.5, 0.5);
|
|
var aPolyPath = PinWheelWipePath.calcCenteredClock(nT, 1.0);
|
|
aPolyPath.matrixTransform( aTransform );
|
|
|
|
return aPolyPath;
|
|
}
|
|
|
|
function PinWheelWipePath( nBlades )
|
|
{
|
|
this.nBlades = nBlades;
|
|
if( !this.nBlades || this.nBlades < 1 )
|
|
this.nBlades = 1;
|
|
}
|
|
|
|
PinWheelWipePath.calcCenteredClock = function( nT, nE )
|
|
{
|
|
var nMAX_EDGE = 2;
|
|
|
|
var aTransform = SVGIdentityMatrix.rotate( nT * 360 );
|
|
|
|
var aPoint = document.documentElement.createSVGPoint();
|
|
aPoint.y = -nMAX_EDGE;
|
|
aPoint = aPoint.matrixTransform( aTransform );
|
|
|
|
var sPathData = 'M ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
if( nT >= 0.875 )
|
|
sPathData += 'L ' + '-' + nE + ' -' + nE + ' ';
|
|
if( nT >= 0.625 )
|
|
sPathData += 'L ' + '-' + nE + ' ' + nE + ' ';
|
|
if( nT >= 0.375 )
|
|
sPathData += 'L ' + nE + ' ' + nE + ' ';
|
|
if( nT >= 0.125 )
|
|
sPathData += 'L ' + nE + ' -' + nE + ' ';
|
|
|
|
sPathData += 'L 0 -' + nE + ' ';
|
|
sPathData += 'L 0 0 ';
|
|
sPathData += 'L ' + aPoint.x + ' ' + aPoint.y;
|
|
|
|
var aPath = document.createElementNS( NSS['svg'], 'path' );
|
|
aPath.setAttribute( 'd', sPathData );
|
|
return aPath;
|
|
};
|
|
|
|
PinWheelWipePath.prototype.perform = function( nT )
|
|
{
|
|
var aBasePath = PinWheelWipePath.calcCenteredClock( nT / this.nBlades,
|
|
2.0 /* max edge when rotating */ );
|
|
|
|
var aPolyPath = aBasePath.cloneNode( true );
|
|
var aPath;
|
|
var aRotation;
|
|
var i;
|
|
for( i = this.nBlades - 1; i > 0; --i )
|
|
{
|
|
aRotation = SVGIdentityMatrix.rotate( (i * 360) / this.nBlades );
|
|
aPath = aBasePath.cloneNode( true );
|
|
aPath.matrixTransform( aRotation );
|
|
aPolyPath.appendPath( aPath );
|
|
}
|
|
|
|
var aTransform = SVGIdentityMatrix.translate( 0.5, 0.5 ).scale( 0.5 );
|
|
aPolyPath.matrixTransform( aTransform );
|
|
|
|
return aPolyPath;
|
|
};
|
|
|
|
function BarnDoorWipePath(doubled) {
|
|
this.aBasePath = createUnitSquarePath();
|
|
this.doubled = doubled;
|
|
}
|
|
|
|
BarnDoorWipePath.prototype.perform = function( nT ) {
|
|
if(this.doubled)
|
|
nT /= 2.0;
|
|
var aTransform = SVGIdentityMatrix.translate(-0.5, -0.5);
|
|
aTransform = aTransform.scaleNonUniform(pruneScaleValue(nT), 1.0).translate(0.5, 0.5);
|
|
var aPath = this.aBasePath.cloneNode(true);
|
|
aPath.matrixTransform(aTransform);
|
|
var res = aPath;
|
|
|
|
if(this.doubled) {
|
|
aTransform = SVGIdentityMatrix.translate(-0.5, -0.5);
|
|
aTransform = aTransform.rotate(Math.PI / 2).translate(0.5, 0.5);
|
|
aPath.matrixTransform(aTransform);
|
|
res.appendPath(aPath);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
function WaterfallWipePath(nElements, bFlipOnYAxis) {
|
|
this.bFlipOnYAxis = bFlipOnYAxis;
|
|
|
|
var sqrtElements = Math.floor(Math.sqrt(nElements));
|
|
var elementEdge = 1.0/sqrtElements;
|
|
|
|
var aPath = 'M '+ 0.0 + ' ' + -1.0 + ' ';
|
|
for(var pos = sqrtElements; pos--; ) {
|
|
var xPos = sqrtElements - pos - 1;
|
|
var yPos = pruneScaleValue( ((pos+1) * elementEdge) - 1.0);
|
|
|
|
aPath += 'L ' + pruneScaleValue(xPos * elementEdge) + ' ' + yPos + ' ';
|
|
aPath += 'L ' + pruneScaleValue((xPos+1)*elementEdge) + ' ' + yPos + ' ';
|
|
}
|
|
aPath += 'L ' + 1.0 + ' ' + -1.0 + ' ';
|
|
aPath += 'L ' + 0.0 + ' ' + -1.0 + ' ';
|
|
this.aBasePath = document.createElementNS( NSS['svg'], 'path');
|
|
this.aBasePath.setAttribute('d', aPath);
|
|
}
|
|
|
|
WaterfallWipePath.prototype.perform = function( nT ) {
|
|
var poly = this.aBasePath.cloneNode(true);
|
|
var aTransform = SVGIdentityMatrix.translate(0.0, pruneScaleValue(2.0 * nT));
|
|
poly.matrixTransform(aTransform);
|
|
var aHead = 'M ' + 0.0 + ' ' + -1.0 + ' ';
|
|
var aHeadPath= document.createElementNS( NSS['svg'], 'path');
|
|
aHeadPath.setAttribute('d', aHead);
|
|
|
|
var aTail = 'M ' + 1.0 + ' ' + -1.0 + ' ';
|
|
var aTailPath = document.createElementNS( NSS['svg'], 'path');
|
|
aTailPath.setAttribute('d', aTail);
|
|
|
|
poly.prependPath(aHeadPath);
|
|
poly.appendPath(aTailPath);
|
|
|
|
return this.bFlipOnYAxis ? flipOnYAxis(poly) : poly;
|
|
}
|
|
|
|
function DoubleDiamondWipePath() { }
|
|
|
|
DoubleDiamondWipePath.prototype.perform = function( nT ) {
|
|
var a = pruneScaleValue(0.25 + (nT * 0.75));
|
|
var aPath = 'M ' + (0.5 + a) + ' ' + 0.5 + ' ';
|
|
aPath += 'L ' + 0.5 + ' ' + (0.5 - a) + ' ';
|
|
aPath += 'L ' + (0.5 - a) + ' ' + 0.5 + ' ';
|
|
aPath += 'L ' + 0.5 + ' ' + (0.5 + a) + ' ';
|
|
aPath += 'L ' + (0.5 + a) + ' ' + 0.5 + ' ';
|
|
var poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
var res = poly.cloneNode(true);
|
|
|
|
var b = pruneScaleValue( (1.0 - nT) * 0.25);
|
|
aPath = 'M ' + (0.5 + b) + ' ' + 0.5 + ' ';
|
|
aPath += 'L ' + 0.5 + ' ' + (0.5 + b) + ' ';
|
|
aPath += 'L ' + (0.5 - b) + ' ' + 0.5 + ' ';
|
|
aPath += 'L ' + 0.5 + ' ' + (0.5 - b) + ' ';
|
|
aPath += 'L ' + (0.5 + b) + ' ' + 0.5 + ' ';
|
|
poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
res.appendPath(poly);
|
|
|
|
return res;
|
|
}
|
|
|
|
function IrisWipePath(unitRect) {
|
|
this.unitRect = unitRect;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
|
|
IrisWipePath.prototype.perform = function( nT ) {
|
|
var d = pruneScaleValue(nT);
|
|
var aTransform = SVGIdentityMatrix.translate(-0.5, -0.5);
|
|
aTransform = aTransform.multiply(SVGIdentityMatrix.scaleNonUniform(d, d).translate(0.5, 0.5));
|
|
var aPath = this.aBasePath.cloneNode(true);
|
|
aPath.matrixTransform(aTransform);
|
|
return aPath;
|
|
}
|
|
|
|
function ZigZagWipePath(nZigs) {
|
|
this.zigEdge = 1.0/nZigs;
|
|
const d = this.zigEdge;
|
|
const d2 = (d / 2.0);
|
|
this.aBasePath = 'M ' + (-1.0 - d) + ' ' + -d + ' ';
|
|
this.aBasePath += 'L ' + (-1.0 - d) + ' ' + (1.0 + d) + ' ';
|
|
this.aBasePath += 'L ' + -d + ' ' + (1.0 + d) + ' ';
|
|
|
|
for(var pos = (nZigs + 2); pos--; ) {
|
|
this.aBasePath += 'L ' + 0.0 + ' ' + ((pos - 1) * d + d2) + ' ';
|
|
this.aBasePath += 'L ' + -d + ' ' + (pos - 1) * d + ' ';
|
|
}
|
|
this.aBasePath += 'L ' + (-1.0 - d) + ' ' + -d + ' ';
|
|
}
|
|
|
|
ZigZagWipePath.prototype.perform = function( nT ) {
|
|
var res = document.createElementNS( NSS['svg'], 'path');
|
|
res.setAttribute('d', this.aBasePath);
|
|
res.matrixTransform(SVGIdentityMatrix.translate((1.0 + this.zigEdge) * nT, 0.0));
|
|
return res;
|
|
}
|
|
|
|
function BarnZigZagWipePath( nZigs ) { ZigZagWipePath.call(this, nZigs); }
|
|
|
|
BarnZigZagWipePath.prototype = Object.create(ZigZagWipePath);
|
|
|
|
BarnZigZagWipePath.prototype.perform = function( nT ) {
|
|
var res = createEmptyPath();
|
|
var poly = document.createElementNS( NSS['svg'], 'path');
|
|
var aTransform = SVGIdentityMatrix.translate(
|
|
((1.0 + this.zigEdge) * (1.0 - nT)) / 2.0, 0.0);
|
|
poly.setAttribute('d', this.aBasePath);
|
|
poly.changeOrientation();
|
|
poly.matrixTransform(aTransform);
|
|
res.appendPath(poly);
|
|
|
|
aTransform = SVGIdentityMatrix.scale(-1.0, 1.0);
|
|
aTransform.translate(1.0, this.zigEdge / 2.0);
|
|
poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', this.aBasePath);
|
|
poly.matrixTransform(aTransform);
|
|
res.appendPath(poly);
|
|
|
|
return res;
|
|
}
|
|
|
|
function CheckerBoardWipePath( unitsPerEdge )
|
|
{
|
|
this.unitsPerEdge = unitsPerEdge;
|
|
if( this.unitsPerEdge === undefined || this.unitsPerEdge < 1 )
|
|
this.unitsPerEdge = 10;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
CheckerBoardWipePath.prototype.perform = function( nT )
|
|
{
|
|
var d = pruneScaleValue(1.0 / this.unitsPerEdge);
|
|
var aMatrix = SVGIdentityMatrix.scaleNonUniform(pruneScaleValue( d*2.0*nT ),
|
|
pruneScaleValue( d ) );
|
|
|
|
var aPolyPath = null;
|
|
var i, j;
|
|
var aTransform;
|
|
var aPath;
|
|
for ( i = this.unitsPerEdge; i--; )
|
|
{
|
|
aTransform = SVGIdentityMatrix;
|
|
|
|
if ((i % 2) == 1) // odd line
|
|
aTransform = aTransform.translate( -d, 0.0 );
|
|
|
|
aTransform = aTransform.multiply( aMatrix );
|
|
|
|
for ( j = (this.unitsPerEdge / 2) + 1; j--;)
|
|
{
|
|
aPath = this.aBasePath.cloneNode( true );
|
|
aPath.matrixTransform( aTransform );
|
|
if (aPolyPath == null) aPolyPath = aPath;
|
|
else aPolyPath.appendPath( aPath );
|
|
aTransform = SVGIdentityMatrix.translate( d*2.0, 0.0 ).multiply( aTransform );
|
|
}
|
|
|
|
aMatrix = SVGIdentityMatrix.translate( 0.0, d ).multiply( aMatrix ); // next line
|
|
}
|
|
|
|
return aPolyPath;
|
|
};
|
|
|
|
|
|
function RandomWipePath( nElements, bRandomBars )
|
|
{
|
|
this.nElements = nElements;
|
|
this.aBasePath = createUnitSquarePath();
|
|
this.aPositionArray = new Array( nElements );
|
|
this.aClipPath = createEmptyPath();
|
|
this.nAlreadyAppendedElements = 0;
|
|
|
|
var fEdgeLength, nPos, aTransform;
|
|
|
|
if( bRandomBars ) // random bar wipe
|
|
{
|
|
fEdgeLength = 1.0 / nElements;
|
|
for( nPos = 0; nPos < nElements; ++nPos )
|
|
{
|
|
this.aPositionArray[nPos] = { x: 0.0, y: pruneScaleValue( nPos * fEdgeLength ) }
|
|
}
|
|
aTransform = SVGIdentityMatrix.scaleNonUniform( 1.0, pruneScaleValue( fEdgeLength ) );
|
|
}
|
|
else // dissolve wipe
|
|
{
|
|
var nSqrtElements = Math.round( Math.sqrt( nElements ) );
|
|
fEdgeLength = 1.0 / nSqrtElements;
|
|
for( nPos = 0; nPos < nElements; ++nPos )
|
|
{
|
|
this.aPositionArray[nPos] = {
|
|
x: pruneScaleValue( ( nPos % nSqrtElements ) * fEdgeLength ),
|
|
y: pruneScaleValue( ( nPos / nSqrtElements ) * fEdgeLength ) }
|
|
}
|
|
aTransform = SVGIdentityMatrix.scale( pruneScaleValue( fEdgeLength ) );
|
|
}
|
|
this.aBasePath.matrixTransform( aTransform );
|
|
|
|
var nPos1, nPos2;
|
|
var tmp;
|
|
for( nPos1 = nElements - 1; nPos1 > 0; --nPos1 )
|
|
{
|
|
nPos2 = getRandomInt( nPos1 + 1 );
|
|
tmp = this.aPositionArray[nPos1];
|
|
this.aPositionArray[nPos1] = this.aPositionArray[nPos2];
|
|
this.aPositionArray[nPos2] = tmp;
|
|
}
|
|
}
|
|
|
|
RandomWipePath.prototype.perform = function( nT )
|
|
{
|
|
var aPolyPath = createEmptyPath();
|
|
var aPoint;
|
|
var aPath;
|
|
var aTransform;
|
|
var nElements = Math.round( nT * this.nElements );
|
|
if( nElements === 0 )
|
|
{
|
|
return aPolyPath;
|
|
}
|
|
if( this.nAlreadyAppendedElements >= nElements )
|
|
{
|
|
this.nAlreadyAppendedElements = 0;
|
|
this.aClipPath = createEmptyPath();
|
|
}
|
|
var nPos;
|
|
for( nPos = this.nAlreadyAppendedElements; nPos < nElements; ++nPos )
|
|
{
|
|
aPoint = this.aPositionArray[nPos];
|
|
aPath = this.aBasePath.cloneNode( true );
|
|
aTransform = SVGIdentityMatrix.translate( aPoint.x, aPoint.y );
|
|
aPath.matrixTransform( aTransform );
|
|
aPolyPath.appendPath( aPath );
|
|
}
|
|
|
|
this.nAlreadyAppendedElements = nElements;
|
|
this.aClipPath.appendPath( aPolyPath );
|
|
|
|
return this.aClipPath.cloneNode( true );
|
|
};
|
|
|
|
function SnakeWipePath(nElements, bDiagonal, bflipOnYAxis)
|
|
{
|
|
this.sqrtElements = Math.floor(Math.sqrt(nElements));
|
|
this.elementEdge = (1.0 / this.sqrtElements);
|
|
this.diagonal = bDiagonal;
|
|
this.flipOnYAxis = bflipOnYAxis;
|
|
this.aBasePath = createUnitSquarePath();
|
|
}
|
|
|
|
SnakeWipePath.prototype.calcSnake = function(t)
|
|
{
|
|
var aPolyPath = createEmptyPath();
|
|
const area = (t * this.sqrtElements * this.sqrtElements);
|
|
const line_ = Math.floor(area) / this.sqrtElements;
|
|
const line = pruneScaleValue(line_ / this.sqrtElements);
|
|
const col = pruneScaleValue((area - (line_ * this.sqrtElements)) / this.sqrtElements);
|
|
|
|
if(line != 0) {
|
|
let aPath = 'M '+ 0.0 + ' ' + 0.0 + ' ';
|
|
aPath += 'L ' + 0.0 + ' ' + line + ' ';
|
|
aPath += 'L ' + 1.0 + ' ' + line + ' ';
|
|
aPath += 'L ' + 1.0 + ' ' + 0.0 + ' ';
|
|
aPath += 'L 0 0 ';
|
|
let poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
aPolyPath.appendPath(poly);
|
|
}
|
|
if(col != 0) {
|
|
var offset = 0.0;
|
|
if((line_ & 1) == 1) {
|
|
offset = (1.0 - col);
|
|
}
|
|
let aPath = 'M ' + offset + ' ' + line + ' ';
|
|
aPath += 'L '+ offset + ' ' + (line + this.elementEdge) + ' ';
|
|
aPath += 'L ' + (offset+col) + ' ' + (line + this.elementEdge) + ' ';
|
|
aPath += 'L ' + (offset+col) + ' ' + line + ' ';
|
|
aPath += 'L ' + offset + ' ' + line + ' ';
|
|
let poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
aPolyPath.appendPath(poly);
|
|
}
|
|
|
|
return aPolyPath;
|
|
}
|
|
|
|
SnakeWipePath.prototype.calcHalfDiagonalSnake = function(nT, bIn) {
|
|
var res = createEmptyPath();
|
|
|
|
if(bIn) {
|
|
const sqrtArea2 = Math.sqrt(nT * this.sqrtElements * this.sqrtElements);
|
|
const edge = pruneScaleValue(sqrtArea2 / this.sqrtElements);
|
|
|
|
var aPath, aPoint = document.documentElement.createSVGPoint();
|
|
if(edge) {
|
|
aPath = 'M ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.y = edge;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = edge;
|
|
aPoint.y = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
const poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
res.appendPath(poly);
|
|
}
|
|
const a = (Math.SQRT1_2 / this.sqrtElements);
|
|
const d = (sqrtArea2 - Math.floor(sqrtArea2));
|
|
const len = (nT * Math.SQRT1_2 * d);
|
|
const height = pruneScaleValue(Math.SQRT1_2 / this.sqrtElements);
|
|
aPath = 'M ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.y = height;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = len + a;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.y = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
const poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
let aTransform;
|
|
|
|
if((Math.floor(sqrtArea2) & 1) == 1) {
|
|
aTransform = SVGIdentityMatrix.rotate((Math.PI)/2 + (Math.PI)/4);
|
|
aTransform.translate(edge + this.elementEdge, 0.0);
|
|
}
|
|
else {
|
|
aTransform = SVGIdentityMatrix.translate(-a, 0.0);
|
|
aTransform.rotate(-(Math.PI/4));
|
|
aTransform.translate(0.0, edge);
|
|
}
|
|
|
|
poly.matrixTransform(aTransform);
|
|
res.appendPath(poly);
|
|
}
|
|
else { //out
|
|
const sqrtArea2 = Math.sqrt(nT * this.sqrtElements * this.sqrtElements);
|
|
const edge = pruneScaleValue(Math.floor(sqrtArea2)/this.sqrtElements);
|
|
|
|
let aPath, aPoint = document.documentElement.createSVGPoint();
|
|
if(edge != 0) {
|
|
aPoint.y = 1.0;
|
|
aPath = 'M ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = edge;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = 1.0;
|
|
aPoint.y = edge;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.y = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
const poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
res.appendPath(poly);
|
|
}
|
|
const a = (Math.SQRT1_2 / this.sqrtElements);
|
|
const d = (sqrtArea2 - Math.floor(sqrtArea2));
|
|
const len = ((1.0 - nT) * Math.SQRT2 * d);
|
|
const height = pruneScaleValue(Math.SQRT1_2 / this.sqrtElements);
|
|
aPath = 'M ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.y = height;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = len + a;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.y = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
aPoint.x = 0.0;
|
|
aPath += 'L ' + aPoint.x + ' ' + aPoint.y + ' ';
|
|
const poly = document.createElementNS( NSS['svg'], 'path');
|
|
poly.setAttribute('d', aPath);
|
|
let aTransform;
|
|
|
|
if((Math.floor(sqrtArea2) & 1) == 1) {
|
|
aTransform = SVGIdentityMatrix.translate(0.0, -height);
|
|
aTransform.rotate(Math.PI/2 + Math.PI/4);
|
|
aTransform.translate(1.0, edge);
|
|
}
|
|
else {
|
|
aTransform = SVGIdentityMatrix.rotate(-(Math.PI/4));
|
|
aTransform = aTransform.translate(edge, 1.0);
|
|
}
|
|
poly.matrixTransform(aTransform);
|
|
res.appendPath(poly);
|
|
}
|
|
return res;
|
|
}
|
|
|
|
SnakeWipePath.prototype.perform = function(nT) {
|
|
var res = createEmptyPath();
|
|
if(this.diagonal) {
|
|
if(nT >= 0.5) {
|
|
res.appendPath(this.calcHalfDiagonalSnake(1.0, true));
|
|
res.appendPath(this.calcHalfDiagonalSnake(2.0*(nT-0.5), false));
|
|
}
|
|
else
|
|
res.appendPath(this.calcHalfDiagonalSnake(2.0*nT, true));
|
|
}
|
|
else
|
|
res = this.calcSnake(nT);
|
|
|
|
return this.flipOnYAxis ? flipOnYAxis(res) : res;
|
|
}
|
|
|
|
function ParallelSnakesWipePath(nElements, bDiagonal, bFlipOnYAxis, bOpposite) {
|
|
SnakeWipePath.call(this, nElements, bDiagonal, bFlipOnYAxis);
|
|
this.bOpposite = bOpposite;
|
|
}
|
|
|
|
ParallelSnakesWipePath.prototype = Object.create(SnakeWipePath);
|
|
|
|
ParallelSnakesWipePath.prototype.perform = function( nT ) {
|
|
var res = createEmptyPath(), half, aTransform;
|
|
if(this.diagonal) {
|
|
assert(this.bOpposite);
|
|
half = SnakeWipePath.prototype.calcHalfDiagonalSnake.call(this, nT, false);
|
|
aTransform = SVGIdentityMatrix.scale(1, -1);
|
|
aTransform.translate(-0.5, 0.5);
|
|
aTransform.rotate(Math.PI/2);
|
|
aTransform.translate(0.5, 0.5);
|
|
half.matrixTransform(aTransform);
|
|
half.changeOrientation();
|
|
res.appendPath(half);
|
|
|
|
aTransform = SVGIdentityMatrix.translate(-0.5, -0.5);
|
|
aTransform.rotate(Math.PI);
|
|
aTransform.translate(0.5, 0.5);
|
|
half.matrixTransform(aTransform);
|
|
res.appendPath(half);
|
|
}
|
|
else {
|
|
half = SnakeWipePath.prototype.calcSnake.call(this, nT / 2.0 );
|
|
aTransform = SVGIdentityMatrix.translate(-0.5, -0.5);
|
|
aTransform = aTransform.rotate(Math.PI/2);
|
|
aTransform = aTransform.translate(0.5, 0.5);
|
|
half.matrixTransform(aTransform);
|
|
res.appendPath(flipOnYAxis(half));
|
|
res.appendPath(this.bOpposite ? flipOnXAxis(half) : half);
|
|
}
|
|
|
|
return this.flipOnYAxis ? flipOnYAxis(res) : res;
|
|
}
|
|
|
|
function SpiralWipePath(nElements, bFlipOnYAxis) {
|
|
this.nElements = nElements;
|
|
this.sqrtElements = Math.floor(Math.sqrt(nElements));
|
|
this.bFlipOnYAxis = bFlipOnYAxis;
|
|
}
|
|
|
|
SpiralWipePath.prototype.calcNegSpiral = function( nT ) {
|
|
var area = nT * this.nElements;
|
|
var e = (Math.sqrt(area) / 2.0);
|
|
var edge = Math.floor(e) * 2;
|
|
|
|
var aTransform = SVGIdentityMatrix.translate(-0.5, -0.5);
|
|
var edge_ = pruneScaleValue(edge / this.sqrtElements);
|
|
|
|
aTransform = aTransform.scale(edge_, edge_);
|
|
aTransform = aTransform.translate(0.5, 0.5);
|
|
var poly = createUnitSquarePath();
|
|
poly.matrixTransform(aTransform);
|
|
var res = poly.cloneNode(true);
|
|
|
|
if(1.0 - nT != 0) {
|
|
var edge1 = edge + 1;
|
|
var len = Math.floor( (e - edge/2) * edge1 * 4);
|
|
var w = Math.PI / 2;
|
|
|
|
while(len > 0) {
|
|
var alen = Math.min(len, edge1);
|
|
len -= alen;
|
|
poly = createUnitSquarePath();
|
|
aTransform = SVGIdentityMatrix.scale(
|
|
pruneScaleValue( alen / this.sqrtElements ),
|
|
pruneScaleValue( 1.0 / this.sqrtElements ));
|
|
aTransform = aTransform.translate(
|
|
- pruneScaleValue( (edge / 2) / this.sqrtElements ),
|
|
pruneScaleValue( (edge / 2) / this.sqrtElements ));
|
|
aTransform = aTransform.rotate( w );
|
|
w -= Math.PI / 2;
|
|
aTransform = aTransform.translate(0.5, 0.5);
|
|
poly.matrixTransform(aTransform);
|
|
res.appendPath(poly);
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
SpiralWipePath.prototype.perform = function( nT ) {
|
|
var res = createUnitSquarePath();
|
|
var innerSpiral = this.calcNegSpiral( 1.0 - nT );
|
|
innerSpiral.changeOrientation();
|
|
res.appendPath(innerSpiral);
|
|
|
|
return this.bFlipOnYAxis ? flipOnYAxis(res) : res;
|
|
}
|
|
|
|
function BoxSnakesWipePath(nElements, bFourBox) {
|
|
SpiralWipePath.call(this, nElements);
|
|
this.bFourBox = bFourBox;
|
|
}
|
|
|
|
BoxSnakesWipePath.prototype = Object.create(SpiralWipePath);
|
|
|
|
BoxSnakesWipePath.prototype.perform = function( nT ) {
|
|
var res = createUnitSquarePath(), aTransform;
|
|
var innerSpiral = SpiralWipePath.prototype.calcNegSpiral.call(this, 1.0 - nT);
|
|
innerSpiral.changeOrientation();
|
|
|
|
if(this.bFourBox) {
|
|
aTransform = SVGIdentityMatrix.scale(0.5, 0.5);
|
|
innerSpiral.matrixTransform(aTransform);
|
|
res.appendPath(innerSpiral);
|
|
res.appendPath(flipOnXAxis(innerSpiral));
|
|
innerSpiral = flipOnYAxis(innerSpiral);
|
|
res.appendPath(innerSpiral);
|
|
res.appendPath(flipOnXAxis(innerSpiral));
|
|
}
|
|
else {
|
|
aTransform = SVGIdentityMatrix.scale(1.0, 0.5);
|
|
innerSpiral.matrixTransform(aTransform);
|
|
res.appendPath(innerSpiral);
|
|
res.appendPath(flipOnXAxis(innerSpiral));
|
|
}
|
|
return this.bFlipOnYAxis ? flipOnYAxis(res) : res;
|
|
}
|
|
|
|
function VeeWipePath() { }
|
|
|
|
VeeWipePath.prototype.perform = function( nT ) {
|
|
const d = pruneScaleValue(2.0 * nT);
|
|
var polyPath = 'M ' + 0.0 + ' ' + -1.0 + ' ';
|
|
polyPath += 'L ' + 0.0 + ' ' + (d - 1.0) + ' ';
|
|
polyPath += 'L ' + 0.5 + ' ' + d + ' ';
|
|
polyPath += 'L ' + 1.0 + ' ' + (d - 1.0) + ' ';
|
|
polyPath += 'L ' + 1.0 + ' ' + -1.0 + ' ';
|
|
polyPath += 'L ' + 0.0 + ' ' + -1.0 + ' ';
|
|
|
|
var aPolyPolyPath = document.createElementNS( NSS['svg'], 'path');
|
|
aPolyPolyPath.setAttribute('d', polyPath);
|
|
return aPolyPolyPath;
|
|
}
|
|
|
|
|
|
function AnimatedSlide( aMetaSlide )
|
|
{
|
|
if( !aMetaSlide )
|
|
{
|
|
log( 'AnimatedSlide constructor: meta slide is not valid' );
|
|
}
|
|
|
|
this.aMetaSlide = aMetaSlide;
|
|
this.aSlideElement = this.aMetaSlide.slideElement;
|
|
this.sSlideId = this.aMetaSlide.slideId;
|
|
|
|
this.aUsedAttributeSet = [];
|
|
|
|
this.aClipPathElement = null;
|
|
this.aClipPathContent = null;
|
|
this.bIsClipped = false;
|
|
}
|
|
|
|
AnimatedSlide.prototype.show = function()
|
|
{
|
|
this.aMetaSlide.show();
|
|
};
|
|
|
|
AnimatedSlide.prototype.hide = function()
|
|
{
|
|
this.aMetaSlide.hide();
|
|
};
|
|
|
|
AnimatedSlide.prototype.notifyUsedAttribute = function( sName )
|
|
{
|
|
if( sName == 'clip-path' )
|
|
{
|
|
this.initClipPath();
|
|
this.bIsClipped = true;
|
|
}
|
|
else
|
|
{
|
|
this.aUsedAttributeSet.push( sName );
|
|
}
|
|
};
|
|
|
|
AnimatedSlide.prototype.reset = function()
|
|
{
|
|
if( this.bIsClipped )
|
|
{
|
|
this.cleanClipPath();
|
|
this.bIsClipped = false;
|
|
}
|
|
|
|
var i;
|
|
for( i = 0; i < this.aUsedAttributeSet.length; ++i )
|
|
{
|
|
var sAttrName = this.aUsedAttributeSet[i];
|
|
this.aSlideElement.removeAttribute( sAttrName );
|
|
}
|
|
this.aUsedAttributeSet = [];
|
|
};
|
|
|
|
AnimatedSlide.prototype.initClipPath = function()
|
|
{
|
|
this.aClipPathElement = document.createElementNS( NSS['svg'], 'clipPath' );
|
|
|
|
var sId = 'clip-path-' + this.sSlideId;
|
|
this.aClipPathElement.setAttribute( 'id', sId );
|
|
this.aClipPathElement.setAttribute( 'clipPathUnits', 'userSpaceOnUse' );
|
|
|
|
this.aClipPathContent = document.createElementNS( NSS['svg'], 'path' );
|
|
var sPathData = 'M 0 0 h ' + WIDTH + ' v ' + HEIGHT + ' h -' + WIDTH + ' z';
|
|
this.aClipPathContent.setAttribute( 'd', sPathData );
|
|
this.aClipPathElement.appendChild( this.aClipPathContent );
|
|
|
|
var aClipPathGroup = theMetaDoc.aClipPathGroup;
|
|
aClipPathGroup.appendChild( this.aClipPathElement );
|
|
|
|
var sRef = 'url(#' + sId + ')';
|
|
this.aSlideElement.parentNode.setAttribute( 'clip-path', sRef );
|
|
};
|
|
|
|
AnimatedSlide.prototype.cleanClipPath = function()
|
|
{
|
|
this.aSlideElement.parentNode.removeAttribute( 'clip-path' );
|
|
|
|
if( this.aClipPathElement )
|
|
{
|
|
var aClipPathGroup = theMetaDoc.aClipPathGroup;
|
|
aClipPathGroup.removeChild( this.aClipPathElement );
|
|
this.aClipPathElement = null;
|
|
this.aClipPathContent = null;
|
|
}
|
|
};
|
|
|
|
AnimatedSlide.prototype.insertBefore = function( aElement )
|
|
{
|
|
if( aElement )
|
|
{
|
|
this.aSlideElement.parentNode.insertBefore( aElement, this.aSlideElement );
|
|
}
|
|
};
|
|
|
|
AnimatedSlide.prototype.appendElement = function( aElement )
|
|
{
|
|
if( aElement )
|
|
{
|
|
this.aSlideElement.parentNode.appendChild( aElement );
|
|
}
|
|
};
|
|
|
|
AnimatedSlide.prototype.removeElement = function( aElement )
|
|
{
|
|
if( aElement )
|
|
{
|
|
this.aSlideElement.parentNode.removeChild( aElement );
|
|
}
|
|
};
|
|
|
|
AnimatedSlide.prototype.getWidth = function()
|
|
{
|
|
return WIDTH;
|
|
};
|
|
|
|
AnimatedSlide.prototype.getHeight = function()
|
|
{
|
|
return HEIGHT;
|
|
};
|
|
|
|
AnimatedSlide.prototype.setOpacity = function( nValue )
|
|
{
|
|
this.aSlideElement.setAttribute( 'opacity', nValue );
|
|
};
|
|
|
|
AnimatedSlide.prototype.translate = function( nDx, nDy )
|
|
{
|
|
var sTransformAttr = 'translate(' + nDx + ',' + nDy + ')';
|
|
this.aSlideElement.setAttribute( 'transform', sTransformAttr );
|
|
};
|
|
|
|
AnimatedSlide.prototype.setClipPath = function( aClipPathContent )
|
|
{
|
|
if( this.aClipPathContent )
|
|
{
|
|
var sPathData = aClipPathContent.getAttribute( 'd' );
|
|
this.aClipPathContent.setAttribute( 'd', sPathData );
|
|
}
|
|
};
|
|
|
|
|
|
function AnimatedElement( aElement )
|
|
{
|
|
if( !aElement )
|
|
{
|
|
log( 'AnimatedElement constructor: element is not valid' );
|
|
}
|
|
|
|
this.aSlideShowContext = null;
|
|
|
|
this.aBaseElement = aElement.cloneNode( true );
|
|
this.aActiveElement = aElement;
|
|
this.sElementId = this.aActiveElement.getAttribute( 'id' );
|
|
|
|
this.aBaseBBox = this.aActiveElement.getBBox();
|
|
this.nBaseCenterX = this.aBaseBBox.x + this.aBaseBBox.width / 2;
|
|
this.nBaseCenterY = this.aBaseBBox.y + this.aBaseBBox.height / 2;
|
|
|
|
|
|
this.aClipPathElement = null;
|
|
this.aClipPathContent = null;
|
|
|
|
this.aPreviousElement = null;
|
|
this.aStateSet = {};
|
|
|
|
this.eAdditiveMode = ADDITIVE_MODE_REPLACE;
|
|
this.bIsUpdated = true;
|
|
|
|
this.aTMatrix = document.documentElement.createSVGMatrix();
|
|
this.aCTM = document.documentElement.createSVGMatrix();
|
|
this.aICTM = document.documentElement.createSVGMatrix();
|
|
|
|
this.initElement();
|
|
}
|
|
|
|
AnimatedElement.prototype.initElement = function()
|
|
{
|
|
this.nCenterX = this.nBaseCenterX;
|
|
this.nCenterY = this.nBaseCenterY;
|
|
this.nScaleFactorX = 1.0;
|
|
this.nScaleFactorY = 1.0;
|
|
this.nRotationAngle = 0.0;
|
|
|
|
this.aActiveElement.setAttribute( 'transform', makeMatrixString( 1, 0, 0, 1, 0, 0 ) );
|
|
};
|
|
|
|
AnimatedElement.prototype.initClipPath = function()
|
|
{
|
|
this.aClipPathElement = document.createElementNS( NSS['svg'], 'clipPath' );
|
|
|
|
var sId = 'clip-path-' + this.sElementId;
|
|
this.aClipPathElement.setAttribute( 'id', sId );
|
|
this.aClipPathElement.setAttribute( 'clipPathUnits', 'userSpaceOnUse' );
|
|
|
|
this.aClipPathContent = document.createElementNS( NSS['svg'], 'path' );
|
|
this.aClippingBBox = this.getBBoxWithStroke();
|
|
var nWidth = this.aClippingBBox.width;
|
|
var nHeight = this.aClippingBBox.height;
|
|
var sPathData = 'M ' + this.aClippingBBox.x + ' ' + this.aClippingBBox.y +
|
|
' h ' + nWidth + ' v ' + nHeight + ' h -' + nWidth + ' z';
|
|
this.aClipPathContent.setAttribute( 'd', sPathData );
|
|
this.aClipPathElement.appendChild( this.aClipPathContent );
|
|
|
|
var aClipPathGroup = theMetaDoc.aClipPathGroup;
|
|
aClipPathGroup.appendChild( this.aClipPathElement );
|
|
|
|
var sRef = 'url(#' + sId + ')';
|
|
this.aActiveElement.setAttribute( 'clip-path', sRef );
|
|
};
|
|
|
|
AnimatedElement.prototype.cleanClipPath = function()
|
|
{
|
|
this.aActiveElement.removeAttribute( 'clip-path' );
|
|
|
|
if( this.aClipPathElement )
|
|
{
|
|
var aClipPathGroup = theMetaDoc.aClipPathGroup;
|
|
aClipPathGroup.removeChild( this.aClipPathElement );
|
|
this.aClipPathElement = null;
|
|
this.aClipPathContent = null;
|
|
}
|
|
};
|
|
|
|
AnimatedElement.prototype.getId = function()
|
|
{
|
|
return this.aActiveElement.getAttribute( 'id' );
|
|
};
|
|
|
|
AnimatedElement.prototype.getAdditiveMode = function()
|
|
{
|
|
return this.eAdditiveMode;
|
|
};
|
|
|
|
AnimatedElement.prototype.setAdditiveMode = function( eAdditiveMode )
|
|
{
|
|
this.eAdditiveMode = eAdditiveMode;
|
|
};
|
|
|
|
AnimatedElement.prototype.setToElement = function( aElement )
|
|
{
|
|
if( !aElement )
|
|
{
|
|
log( 'AnimatedElement(' + this.getId() + ').setToElement: element is not valid' );
|
|
return false;
|
|
}
|
|
|
|
var aClone = aElement.cloneNode( true );
|
|
this.aPreviousElement = this.aActiveElement.parentNode.replaceChild( aClone, this.aActiveElement );
|
|
this.aActiveElement = aClone;
|
|
|
|
return true;
|
|
};
|
|
|
|
AnimatedElement.prototype.notifySlideStart = function( aSlideShowContext )
|
|
{
|
|
if( !aSlideShowContext )
|
|
{
|
|
log( 'AnimatedElement.notifySlideStart: slideshow context is not valid' );
|
|
}
|
|
this.aSlideShowContext = aSlideShowContext;
|
|
|
|
var aClone = this.aBaseElement.cloneNode( true );
|
|
this.aActiveElement.parentNode.replaceChild( aClone, this.aActiveElement );
|
|
this.aActiveElement = aClone;
|
|
|
|
this.initElement();
|
|
this.DBG( '.notifySlideStart invoked' );
|
|
};
|
|
|
|
AnimatedElement.prototype.notifySlideEnd = function()
|
|
{
|
|
};
|
|
|
|
AnimatedElement.prototype.notifyAnimationStart = function()
|
|
{
|
|
};
|
|
|
|
AnimatedElement.prototype.notifyAnimationEnd = function()
|
|
{
|
|
};
|
|
|
|
AnimatedElement.prototype.notifyNextEffectStart = function( /*nEffectIndex*/ )
|
|
{
|
|
};
|
|
|
|
AnimatedElement.prototype.saveState = function( nAnimationNodeId )
|
|
{
|
|
ANIMDBG.print( 'AnimatedElement(' + this.getId() + ').saveState(' + nAnimationNodeId +')' );
|
|
if( !this.aStateSet[ nAnimationNodeId ] )
|
|
{
|
|
this.aStateSet[ nAnimationNodeId ] = {};
|
|
}
|
|
var aState = this.aStateSet[ nAnimationNodeId ];
|
|
aState.aElement = this.aActiveElement.cloneNode( true );
|
|
aState.nCenterX = this.nCenterX;
|
|
aState.nCenterY = this.nCenterY;
|
|
aState.nScaleFactorX = this.nScaleFactorX;
|
|
aState.nScaleFactorY = this.nScaleFactorY;
|
|
aState.nRotationAngle = this.nRotationAngle;
|
|
|
|
};
|
|
|
|
AnimatedElement.prototype.restoreState = function( nAnimationNodeId )
|
|
{
|
|
if( !this.aStateSet[ nAnimationNodeId ] )
|
|
{
|
|
log( 'AnimatedElement(' + this.getId() + ').restoreState: state '
|
|
+nAnimationNodeId + ' is not valid' );
|
|
return false;
|
|
}
|
|
|
|
ANIMDBG.print( 'AnimatedElement(' + this.getId() + ').restoreState(' + nAnimationNodeId +')' );
|
|
var aState = this.aStateSet[ nAnimationNodeId ];
|
|
var bRet = this.setToElement( aState.aElement );
|
|
if( bRet )
|
|
{
|
|
this.nCenterX = aState.nCenterX;
|
|
this.nCenterY = aState.nCenterY;
|
|
this.nScaleFactorX = aState.nScaleFactorX;
|
|
this.nScaleFactorY = aState.nScaleFactorY;
|
|
this.nRotationAngle = aState.nRotationAngle;
|
|
}
|
|
return bRet;
|
|
};
|
|
|
|
AnimatedElement.prototype.getBaseBBox = function()
|
|
{
|
|
return this.aBaseBBox;
|
|
};
|
|
|
|
AnimatedElement.prototype.getBaseCenterX = function()
|
|
{
|
|
return this.nBaseCenterX;
|
|
};
|
|
|
|
AnimatedElement.prototype.getBaseCenterY = function()
|
|
{
|
|
return this.nBaseCenterY;
|
|
};
|
|
|
|
AnimatedElement.prototype.getBBox = function()
|
|
{
|
|
return this.aActiveElement.parentNode.getBBox();
|
|
};
|
|
|
|
AnimatedElement.prototype.getBBoxWithStroke = function()
|
|
{
|
|
var aBBox = this.aActiveElement.parentNode.getBBox();
|
|
|
|
var aChildrenSet = this.aActiveElement.childNodes;
|
|
|
|
var sStroke, sStrokeWidth;
|
|
var nStrokeWidth = 0;
|
|
var i;
|
|
for( i = 0; i < aChildrenSet.length; ++i )
|
|
{
|
|
if( ! aChildrenSet[i].getAttribute )
|
|
continue;
|
|
|
|
sStroke = aChildrenSet[i].getAttribute( 'stroke' );
|
|
if( sStroke && sStroke != 'none' )
|
|
{
|
|
sStrokeWidth = aChildrenSet[i].getAttribute( 'stroke-width' );
|
|
var nSW = parseFloat( sStrokeWidth );
|
|
if( nSW > nStrokeWidth )
|
|
nStrokeWidth = nSW;
|
|
}
|
|
}
|
|
|
|
if( nStrokeWidth == 0 )
|
|
{
|
|
sStrokeWidth = ROOT_NODE.getAttribute( 'stroke-width' );
|
|
nStrokeWidth = parseFloat( sStrokeWidth );
|
|
}
|
|
if( nStrokeWidth != 0 )
|
|
{
|
|
nStrokeWidth *= 1.1;
|
|
var nHalfStrokeWidth = nStrokeWidth / 2;
|
|
var nDoubleStrokeWidth = nStrokeWidth * 2;
|
|
|
|
var aEBBox = document.documentElement.createSVGRect();
|
|
aEBBox.x = aBBox.x - nHalfStrokeWidth;
|
|
aEBBox.y = aBBox.y - nHalfStrokeWidth;
|
|
aEBBox.width = aBBox.width + nDoubleStrokeWidth;
|
|
aEBBox.height = aBBox.height + nDoubleStrokeWidth;
|
|
aBBox = aEBBox;
|
|
}
|
|
return aBBox;
|
|
};
|
|
|
|
AnimatedElement.prototype.setClipPath = function( aClipPathContent )
|
|
{
|
|
if( this.aClipPathContent )
|
|
{
|
|
var aTranslation = SVGIdentityMatrix.translate( this.aClippingBBox.x,
|
|
this.aClippingBBox.y);
|
|
aClipPathContent.matrixTransform( aTranslation );
|
|
var sPathData = aClipPathContent.getAttribute( 'd' );
|
|
this.aClipPathContent.setAttribute( 'd', sPathData );
|
|
}
|
|
};
|
|
|
|
|
|
AnimatedElement.prototype.getX = function()
|
|
{
|
|
return this.nCenterX;
|
|
};
|
|
|
|
AnimatedElement.prototype.getY = function()
|
|
{
|
|
return this.nCenterY;
|
|
};
|
|
|
|
AnimatedElement.prototype.getPos = function()
|
|
{
|
|
return [this.getX(), this.getY()];
|
|
};
|
|
|
|
AnimatedElement.prototype.getWidth = function()
|
|
{
|
|
return this.nScaleFactorX * this.getBaseBBox().width;
|
|
};
|
|
|
|
AnimatedElement.prototype.getHeight = function()
|
|
{
|
|
return this.nScaleFactorY * this.getBaseBBox().height;
|
|
};
|
|
|
|
AnimatedElement.prototype.getSize = function()
|
|
{
|
|
return [this.getWidth(), this.getHeight()];
|
|
};
|
|
|
|
AnimatedElement.prototype.updateTransformAttribute = function()
|
|
{
|
|
this.aTransformAttrList = this.aActiveElement.transform.baseVal;
|
|
this.aTransformAttr = this.aTransformAttrList.getItem( 0 );
|
|
this.aTransformAttr.setMatrix( this.aTMatrix );
|
|
};
|
|
|
|
AnimatedElement.prototype.setX = function( nNewCenterX )
|
|
{
|
|
if( nNewCenterX === this.nCenterX ) return;
|
|
|
|
this.aTransformAttrList = this.aActiveElement.transform.baseVal;
|
|
this.aTransformAttr = this.aTransformAttrList.getItem( 0 );
|
|
this.aTMatrix = this.aTransformAttr.matrix.translate( nNewCenterX - this.nCenterX, 0 );
|
|
this.aTransformAttr.setMatrix( this.aTMatrix );
|
|
this.nCenterX = nNewCenterX;
|
|
};
|
|
|
|
AnimatedElement.prototype.setY = function( nNewCenterY )
|
|
{
|
|
if( nNewCenterY === this.nCenterY ) return;
|
|
|
|
this.aTransformAttrList = this.aActiveElement.transform.baseVal;
|
|
this.aTransformAttr = this.aTransformAttrList.getItem( 0 );
|
|
this.aTMatrix = this.aTransformAttr.matrix.translate( 0, nNewCenterY - this.nCenterY );
|
|
this.aTransformAttr.setMatrix( this.aTMatrix );
|
|
this.nCenterY = nNewCenterY;
|
|
};
|
|
|
|
AnimatedElement.prototype.setPos = function( aNewPos )
|
|
{
|
|
var nNewCenterX = aNewPos[0];
|
|
var nNewCenterY = aNewPos[1];
|
|
|
|
if( nNewCenterX === this.nCenterX && nNewCenterY === this.nCenterY ) return;
|
|
|
|
this.aTransformAttrList = this.aActiveElement.transform.baseVal;
|
|
this.aTransformAttr = this.aTransformAttrList.getItem( 0 );
|
|
this.aTMatrix = this.aTransformAttr.matrix.translate( nNewCenterX - this.nCenterX, nNewCenterY - this.nCenterY );
|
|
this.aTransformAttr.setMatrix( this.aTMatrix );
|
|
this.nCenterX = nNewCenterX;
|
|
this.nCenterY = nNewCenterY;
|
|
};
|
|
|
|
AnimatedElement.prototype.setWidth = function( nNewWidth )
|
|
{
|
|
ANIMDBG.print( 'AnimatedElement.setWidth: nNewWidth = ' + nNewWidth );
|
|
if( nNewWidth < 0 )
|
|
{
|
|
log('AnimatedElement(' + this.getId() + ').setWidth: negative width!');
|
|
nNewWidth = 0;
|
|
}
|
|
|
|
var nBaseWidth = this.getBaseBBox().width;
|
|
var nScaleFactorX = nNewWidth / nBaseWidth;
|
|
|
|
if( nScaleFactorX < 1e-5 ) nScaleFactorX = 1e-5;
|
|
if( nScaleFactorX == this.nScaleFactorX ) return;
|
|
|
|
this.aTMatrix = document.documentElement.createSVGMatrix()
|
|
.translate( this.nCenterX, this.nCenterY )
|
|
.rotate(this.nRotationAngle)
|
|
.scaleNonUniform( nScaleFactorX, this.nScaleFactorY )
|
|
.translate( -this.nBaseCenterX, -this.nBaseCenterY );
|
|
this.updateTransformAttribute();
|
|
|
|
this.nScaleFactorX = nScaleFactorX;
|
|
};
|
|
|
|
AnimatedElement.prototype.setHeight = function( nNewHeight )
|
|
{
|
|
ANIMDBG.print( 'AnimatedElement.setWidth: nNewHeight = ' + nNewHeight );
|
|
if( nNewHeight < 0 )
|
|
{
|
|
log('AnimatedElement(' + this.getId() + ').setWidth: negative height!');
|
|
nNewHeight = 0;
|
|
}
|
|
|
|
var nBaseHeight = this.getBaseBBox().height;
|
|
var nScaleFactorY = nNewHeight / nBaseHeight;
|
|
|
|
if( nScaleFactorY < 1e-5 ) nScaleFactorY = 1e-5;
|
|
if( nScaleFactorY == this.nScaleFactorY ) return;
|
|
|
|
this.aTMatrix = document.documentElement.createSVGMatrix()
|
|
.translate( this.nCenterX, this.nCenterY )
|
|
.rotate(this.nRotationAngle)
|
|
.scaleNonUniform( this.nScaleFactorX, nScaleFactorY )
|
|
.translate( -this.nBaseCenterX, -this.nBaseCenterY );
|
|
this.updateTransformAttribute();
|
|
|
|
this.nScaleFactorY = nScaleFactorY;
|
|
};
|
|
|
|
AnimatedElement.prototype.setSize= function( aNewSize )
|
|
{
|
|
var nNewWidth = aNewSize[0];
|
|
var nNewHeight = aNewSize[1];
|
|
ANIMDBG.print( 'AnimatedElement.setSize: = [' + nNewWidth + ',' + nNewHeight + ']');
|
|
if( nNewWidth < 0 )
|
|
{
|
|
log('AnimatedElement(' + this.getId() + ').setSize: negative width!');
|
|
nNewWidth = 0;
|
|
}
|
|
if( nNewHeight < 0 )
|
|
{
|
|
log('AnimatedElement(' + this.getId() + ').setSize: negative height!');
|
|
nNewHeight = 0;
|
|
}
|
|
|
|
var nBaseWidth = this.getBaseBBox().width;
|
|
var nScaleFactorX = nNewWidth / nBaseWidth;
|
|
if( nScaleFactorX < 1e-5 ) nScaleFactorX = 1e-5;
|
|
|
|
var nBaseHeight = this.getBaseBBox().height;
|
|
var nScaleFactorY = nNewHeight / nBaseHeight;
|
|
if( nScaleFactorY < 1e-5 ) nScaleFactorY = 1e-5;
|
|
|
|
if( nScaleFactorX == this.nScaleFactorX && nScaleFactorY == this.nScaleFactorY ) return;
|
|
|
|
this.aTMatrix = document.documentElement.createSVGMatrix()
|
|
.translate( this.nCenterX, this.nCenterY )
|
|
.rotate(this.nRotationAngle)
|
|
.scaleNonUniform( nScaleFactorX, nScaleFactorY )
|
|
.translate( -this.nBaseCenterX, -this.nBaseCenterY );
|
|
this.updateTransformAttribute();
|
|
|
|
this.nScaleFactorX = nScaleFactorX;
|
|
this.nScaleFactorY = nScaleFactorY;
|
|
};
|
|
|
|
AnimatedElement.prototype.getOpacity = function()
|
|
{
|
|
return this.aActiveElement.getAttribute( 'opacity' );
|
|
};
|
|
|
|
AnimatedElement.prototype.setOpacity = function( nValue )
|
|
{
|
|
this.aActiveElement.setAttribute( 'opacity', nValue );
|
|
};
|
|
|
|
AnimatedElement.prototype.getRotationAngle = function()
|
|
{
|
|
return this.nRotationAngle;
|
|
};
|
|
|
|
AnimatedElement.prototype.setRotationAngle = function( nNewRotAngle )
|
|
{
|
|
this.aTMatrix = document.documentElement.createSVGMatrix()
|
|
.translate( this.nCenterX, this.nCenterY )
|
|
.rotate(nNewRotAngle)
|
|
.scaleNonUniform( this.nScaleFactorX, this.nScaleFactorY )
|
|
.translate( -this.nBaseCenterX, -this.nBaseCenterY );
|
|
this.updateTransformAttribute();
|
|
|
|
this.nRotationAngle = nNewRotAngle;
|
|
};
|
|
|
|
AnimatedElement.prototype.getVisibility = function()
|
|
{
|
|
|
|
var sVisibilityValue = this.aActiveElement.getAttribute( 'visibility' );
|
|
if( !sVisibilityValue || ( sVisibilityValue === 'inherit' ) )
|
|
return 'visible'; // TODO: look for parent visibility!
|
|
else
|
|
return sVisibilityValue;
|
|
};
|
|
|
|
AnimatedElement.prototype.setVisibility = function( sValue )
|
|
{
|
|
if( sValue == 'visible' )
|
|
sValue = 'inherit';
|
|
this.aActiveElement.setAttribute( 'visibility', sValue );
|
|
};
|
|
|
|
AnimatedElement.prototype.getStrokeStyle = function()
|
|
{
|
|
return 'solid';
|
|
};
|
|
|
|
AnimatedElement.prototype.setStrokeStyle = function( sValue )
|
|
{
|
|
ANIMDBG.print( 'AnimatedElement.setStrokeStyle(' + sValue + ')' );
|
|
};
|
|
|
|
AnimatedElement.prototype.getFillStyle = function()
|
|
{
|
|
return 'solid';
|
|
};
|
|
|
|
AnimatedElement.prototype.setFillStyle = function( sValue )
|
|
{
|
|
ANIMDBG.print( 'AnimatedElement.setFillStyle(' + sValue + ')' );
|
|
};
|
|
|
|
AnimatedElement.prototype.getFillColor = function()
|
|
{
|
|
var aChildSet = getElementChildren( this.aActiveElement );
|
|
var sFillColorValue = '';
|
|
for( var i = 0; i < aChildSet.length; ++i )
|
|
{
|
|
sFillColorValue = aChildSet[i].getAttribute( 'fill' );
|
|
if( sFillColorValue && ( sFillColorValue !== 'none' ) )
|
|
break;
|
|
}
|
|
|
|
return colorParser( sFillColorValue );
|
|
};
|
|
|
|
AnimatedElement.prototype.setFillColor = function( aRGBValue )
|
|
{
|
|
assert( aRGBValue instanceof RGBColor,
|
|
'AnimatedElement.setFillColor: value argument is not an instance of RGBColor' );
|
|
|
|
var sValue = aRGBValue.toString( true /* clamped values */ );
|
|
var aChildSet = getElementChildren( this.aActiveElement );
|
|
|
|
var sFillColorValue = '';
|
|
for( var i = 0; i < aChildSet.length; ++i )
|
|
{
|
|
sFillColorValue = aChildSet[i].getAttribute( 'fill' );
|
|
if( sFillColorValue && ( sFillColorValue !== 'none' ) )
|
|
{
|
|
aChildSet[i].setAttribute( 'fill', sValue );
|
|
}
|
|
}
|
|
};
|
|
|
|
AnimatedElement.prototype.getStrokeColor = function()
|
|
{
|
|
var aChildSet = getElementChildren( this.aActiveElement );
|
|
var sStrokeColorValue = '';
|
|
for( var i = 0; i < aChildSet.length; ++i )
|
|
{
|
|
sStrokeColorValue = aChildSet[i].getAttribute( 'stroke' );
|
|
if( sStrokeColorValue && ( sStrokeColorValue !== 'none' ) )
|
|
break;
|
|
}
|
|
|
|
return colorParser( sStrokeColorValue );
|
|
};
|
|
|
|
AnimatedElement.prototype.setStrokeColor = function( aRGBValue )
|
|
{
|
|
assert( aRGBValue instanceof RGBColor,
|
|
'AnimatedElement.setFillColor: value argument is not an instance of RGBColor' );
|
|
|
|
var sValue = aRGBValue.toString( true /* clamped values */ );
|
|
var aChildSet = getElementChildren( this.aActiveElement );
|
|
|
|
var sStrokeColorValue = '';
|
|
for( var i = 0; i < aChildSet.length; ++i )
|
|
{
|
|
sStrokeColorValue = aChildSet[i].getAttribute( 'stroke' );
|
|
if( sStrokeColorValue && ( sStrokeColorValue !== 'none' ) )
|
|
{
|
|
aChildSet[i].setAttribute( 'stroke', sValue );
|
|
}
|
|
}
|
|
};
|
|
|
|
AnimatedElement.prototype.getFontColor = function()
|
|
{
|
|
return new RGBColor( 0, 0, 0 );
|
|
};
|
|
|
|
AnimatedElement.prototype.setFontColor = function( sValue )
|
|
{
|
|
ANIMDBG.print( 'AnimatedElement.setFontColor(' + sValue + ')' );
|
|
};
|
|
|
|
AnimatedElement.prototype.DBG = function( sMessage, nTime )
|
|
{
|
|
aAnimatedElementDebugPrinter.print( 'AnimatedElement(' + this.getId() + ')' + sMessage, nTime );
|
|
};
|
|
|
|
|
|
function AnimatedTextElement( aElement, aEventMultiplexer )
|
|
{
|
|
var theDocument = document;
|
|
|
|
var sTextType = aElement.getAttribute( 'class' );
|
|
var bIsListItem = ( sTextType === 'ListItem' );
|
|
if( ( sTextType !== 'TextParagraph' ) && !bIsListItem )
|
|
{
|
|
log( 'AnimatedTextElement: passed element is not a paragraph.' );
|
|
return;
|
|
}
|
|
var aTextShapeElement = aElement.parentNode;
|
|
sTextType = aTextShapeElement.getAttribute( 'class' );
|
|
if( sTextType !== 'SVGTextShape' )
|
|
{
|
|
log( 'AnimatedTextElement: element parent is not a text shape.' );
|
|
return;
|
|
}
|
|
var aTextShapeGroup = aTextShapeElement.parentNode;
|
|
var aAnimatedElementGroup = getElementByClassName( aTextShapeGroup, 'AnimatedElements' );
|
|
if( !aAnimatedElementGroup )
|
|
{
|
|
aAnimatedElementGroup = theDocument.createElementNS( NSS['svg'], 'g' );
|
|
aAnimatedElementGroup.setAttribute( 'class', 'AnimatedElements' );
|
|
aTextShapeGroup.appendChild( aAnimatedElementGroup );
|
|
}
|
|
|
|
var aAnimatableElement = theDocument.createElementNS( NSS['svg'], 'g' );
|
|
var aTextElement = theDocument.createElementNS( NSS['svg'], 'text' );
|
|
var aParagraphElement = aElement.cloneNode( true );
|
|
|
|
this.aGraphicGroupElement = theDocument.createElementNS( NSS['svg'], 'g' );
|
|
this.aGraphicGroupElement.setAttribute( 'class', 'GraphicGroup' );
|
|
|
|
var aBulletCharClone = null;
|
|
var aBulletCharElem = null;
|
|
var bIsBulletCharStyle =
|
|
( aElement.getAttributeNS( NSS['ooo'], aOOOAttrListItemNumberingType ) === 'bullet-style' );
|
|
if( bIsBulletCharStyle )
|
|
{
|
|
var aBulletCharGroupElem = getElementByClassName( aTextShapeGroup, 'BulletChars' );
|
|
if( aBulletCharGroupElem )
|
|
{
|
|
var aBulletPlaceholderElem = getElementByClassName( aElement, 'BulletPlaceholder' );
|
|
if( aBulletPlaceholderElem )
|
|
{
|
|
var sId = aBulletPlaceholderElem.getAttribute( 'id' );
|
|
sId = 'bullet-char-' + sId;
|
|
aBulletCharElem = theDocument.getElementById( sId );
|
|
if( aBulletCharElem )
|
|
{
|
|
aBulletCharClone = aBulletCharElem.cloneNode( true );
|
|
}
|
|
else
|
|
{
|
|
log( 'AnimatedTextElement: ' + sId + ' not found.' );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
log( 'AnimatedTextElement: no bullet placeholder found' );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
log( 'AnimatedTextElement: no bullet char group found' );
|
|
}
|
|
}
|
|
|
|
var aBitmapElemSet = [];
|
|
var aBitmapCloneSet = [];
|
|
var aBitmapPlaceholderSet = getElementsByClassName( aElement, 'BitmapPlaceholder' );
|
|
var i;
|
|
if( aBitmapPlaceholderSet )
|
|
{
|
|
for( i = 0; i < aBitmapPlaceholderSet.length; ++i )
|
|
{
|
|
sId = aBitmapPlaceholderSet[i].getAttribute( 'id' );
|
|
var sBitmapChecksum = sId.substring( 'bitmap-placeholder'.length + 1, sId.length - 1 );
|
|
sId = 'embedded-bitmap(' + sBitmapChecksum + ')';
|
|
aBitmapElemSet[i] = theDocument.getElementById( sId );
|
|
if( aBitmapElemSet[i] )
|
|
{
|
|
aBitmapCloneSet[i] = aBitmapElemSet[i].cloneNode( true );
|
|
}
|
|
else
|
|
{
|
|
log( 'AnimatedTextElement: ' + sId + ' not found.' );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
this.sParagraphId = sId = aParagraphElement.getAttribute( 'id' );
|
|
aParagraphElement.removeAttribute( 'id' );
|
|
aAnimatableElement.setAttribute( 'id', sId +'.a' );
|
|
if( aBulletCharClone )
|
|
aBulletCharClone.removeAttribute( 'id' );
|
|
for( i = 0; i < aBitmapCloneSet.length; ++i )
|
|
{
|
|
if( aBitmapCloneSet[i] )
|
|
aBitmapCloneSet[i].removeAttribute( 'id' );
|
|
}
|
|
|
|
var sVisibilityAttr = aElement.getAttribute( 'visibility' );
|
|
if( !sVisibilityAttr )
|
|
sVisibilityAttr = 'inherit';
|
|
aAnimatableElement.setAttribute( 'visibility', sVisibilityAttr );
|
|
aParagraphElement.setAttribute( 'visibility', 'inherit' );
|
|
this.aGraphicGroupElement.setAttribute( 'visibility', 'inherit' );
|
|
if( aBulletCharElem )
|
|
aBulletCharElem.setAttribute( 'visibility', 'hidden' );
|
|
for( i = 0; i < aBitmapCloneSet.length; ++i )
|
|
{
|
|
if( aBitmapElemSet[i] )
|
|
aBitmapElemSet[i].setAttribute( 'visibility', 'hidden' );
|
|
}
|
|
|
|
|
|
aTextElement.appendChild( aParagraphElement );
|
|
aAnimatableElement.appendChild( aTextElement );
|
|
|
|
if( aBulletCharClone )
|
|
this.aGraphicGroupElement.appendChild( aBulletCharClone );
|
|
for( i = 0; i < aBitmapCloneSet.length; ++i )
|
|
{
|
|
if( aBitmapCloneSet[i] )
|
|
this.aGraphicGroupElement.appendChild( aBitmapCloneSet[i] );
|
|
}
|
|
aAnimatableElement.appendChild( this.aGraphicGroupElement );
|
|
aAnimatedElementGroup.appendChild( aAnimatableElement );
|
|
|
|
this.aParentTextElement = aElement.parentNode;
|
|
this.aParagraphElement = aElement;
|
|
this.aAnimatedElementGroup = aAnimatedElementGroup;
|
|
this.nRunningAnimations = 0;
|
|
|
|
this.aHyperlinkIdSet = [];
|
|
var aHyperlinkElementSet = getElementsByClassName( this.aParagraphElement, 'UrlField' );
|
|
var sHyperlinkId;
|
|
for( i = 0; i < aHyperlinkElementSet.length; ++i )
|
|
{
|
|
sHyperlinkId = aHyperlinkElementSet[i].getAttribute( 'id' );
|
|
if( sHyperlinkId )
|
|
this.aHyperlinkIdSet.push( sHyperlinkId );
|
|
else
|
|
log( 'error: AnimatedTextElement constructor: hyperlink element has no id' );
|
|
}
|
|
|
|
AnimatedTextElement.superclass.constructor.call( this, aAnimatableElement, aEventMultiplexer );
|
|
|
|
}
|
|
extend( AnimatedTextElement, AnimatedElement );
|
|
|
|
|
|
AnimatedTextElement.prototype.setToElement = function( aElement )
|
|
{
|
|
var bRet = AnimatedTextElement.superclass.setToElement.call( this, aElement );
|
|
if( bRet )
|
|
{
|
|
this.aGraphicGroupElement = getElementByClassName( this.aActiveElement, 'GraphicGroup' );
|
|
}
|
|
return ( bRet && this.aGraphicGroupElement );
|
|
};
|
|
|
|
AnimatedTextElement.prototype.notifySlideStart = function( aSlideShowContext )
|
|
{
|
|
DBGLOG( 'AnimatedTextElement.notifySlideStart' );
|
|
AnimatedTextElement.superclass.notifySlideStart.call( this, aSlideShowContext );
|
|
this.aGraphicGroupElement = getElementByClassName( this.aActiveElement, 'GraphicGroup' );
|
|
this.restoreBaseTextParagraph();
|
|
};
|
|
|
|
AnimatedTextElement.prototype.notifySlideEnd = function()
|
|
{
|
|
DBGLOG( 'AnimatedTextElement.notifySlideEnd' );
|
|
this.aGraphicGroupElement.setAttribute( 'visibility', 'inherit' );
|
|
};
|
|
|
|
AnimatedTextElement.prototype.restoreBaseTextParagraph = function()
|
|
{
|
|
var aActiveParagraphElement = this.aActiveElement.firstElementChild.firstElementChild;
|
|
if( aActiveParagraphElement )
|
|
{
|
|
var sVisibilityAttr = this.aActiveElement.getAttribute( 'visibility' );
|
|
if( !sVisibilityAttr || ( sVisibilityAttr === 'visible' ) )
|
|
sVisibilityAttr = 'inherit';
|
|
if( sVisibilityAttr === 'inherit' )
|
|
this.aGraphicGroupElement.setAttribute( 'visibility', 'visible' );
|
|
else
|
|
this.aGraphicGroupElement.setAttribute( 'visibility', 'hidden' );
|
|
|
|
var aParagraphClone = aActiveParagraphElement.cloneNode( true );
|
|
aParagraphClone.setAttribute( 'id', this.sParagraphId );
|
|
aParagraphClone.setAttribute( 'visibility', sVisibilityAttr );
|
|
this.aParentTextElement.replaceChild( aParagraphClone, this.aParagraphElement );
|
|
this.aParagraphElement = aParagraphClone;
|
|
|
|
|
|
var aEventMultiplexer = this.aSlideShowContext.aEventMultiplexer;
|
|
var aHyperlinkIdSet = this.aHyperlinkIdSet;
|
|
var aHyperlinkElementSet = getElementsByClassName( this.aParagraphElement, 'UrlField' );
|
|
var i = 0;
|
|
for( ; i < aHyperlinkIdSet.length; ++i )
|
|
{
|
|
aEventMultiplexer.notifyElementChangedEvent( aHyperlinkIdSet[i], aHyperlinkElementSet[i] );
|
|
}
|
|
}
|
|
this.aActiveElement.setAttribute( 'visibility', 'hidden' );
|
|
};
|
|
|
|
AnimatedTextElement.prototype.notifyAnimationStart = function()
|
|
{
|
|
DBGLOG( 'AnimatedTextElement.notifyAnimationStart' );
|
|
if( this.nRunningAnimations === 0 )
|
|
{
|
|
var sVisibilityAttr = this.aParagraphElement.getAttribute( 'visibility' );
|
|
if( !sVisibilityAttr )
|
|
sVisibilityAttr = 'inherit';
|
|
this.aActiveElement.setAttribute( 'visibility', sVisibilityAttr );
|
|
this.aGraphicGroupElement.setAttribute( 'visibility', 'inherit' );
|
|
this.aParagraphElement.setAttribute( 'visibility', 'hidden' );
|
|
}
|
|
++this.nRunningAnimations;
|
|
};
|
|
|
|
AnimatedTextElement.prototype.notifyAnimationEnd = function()
|
|
{
|
|
DBGLOG( 'AnimatedTextElement.notifyAnimationEnd' );
|
|
--this.nRunningAnimations;
|
|
if( this.nRunningAnimations === 0 )
|
|
{
|
|
this.restoreBaseTextParagraph();
|
|
}
|
|
};
|
|
|
|
AnimatedTextElement.prototype.saveState = function( nAnimationNodeId )
|
|
{
|
|
if( this.nRunningAnimations === 0 )
|
|
{
|
|
var sVisibilityAttr = this.aParagraphElement.getAttribute( 'visibility' );
|
|
this.aActiveElement.setAttribute( 'visibility', sVisibilityAttr );
|
|
this.aGraphicGroupElement.setAttribute( 'visibility', 'inherit' );
|
|
}
|
|
AnimatedTextElement.superclass.saveState.call( this, nAnimationNodeId );
|
|
};
|
|
|
|
AnimatedTextElement.prototype.restoreState = function( nAnimationNodeId )
|
|
{
|
|
var bRet = AnimatedTextElement.superclass.restoreState.call( this, nAnimationNodeId );
|
|
if( bRet )
|
|
this.restoreBaseTextParagraph();
|
|
return bRet;
|
|
};
|
|
|
|
|
|
function SlideTransition( aAnimationsRootElement, aSlideId )
|
|
{
|
|
this.sSlideId = aSlideId;
|
|
this.bIsValid = false;
|
|
this.eTransitionType = undefined;
|
|
this.eTransitionSubType = undefined;
|
|
this.bReverseDirection = false;
|
|
this.eTransitionMode = TRANSITION_MODE_IN;
|
|
this.sFadeColor = null;
|
|
this.aDuration = null;
|
|
this.nMinFrameCount = undefined;
|
|
|
|
if( aAnimationsRootElement )
|
|
{
|
|
if( aAnimationsRootElement.firstElementChild &&
|
|
( aAnimationsRootElement.firstElementChild.getAttributeNS( NSS['smil'], 'begin' ) === (this.sSlideId + '.begin') ) )
|
|
{
|
|
var aTransitionFilterElement = aAnimationsRootElement.firstElementChild.firstElementChild;
|
|
if( aTransitionFilterElement && ( aTransitionFilterElement.localName === 'transitionFilter' ) )
|
|
{
|
|
this.aElement = aTransitionFilterElement;
|
|
this.parseElement();
|
|
}
|
|
aAnimationsRootElement.removeChild( aAnimationsRootElement.firstElementChild );
|
|
}
|
|
}
|
|
}
|
|
|
|
SlideTransition.prototype.createSlideTransition = function( aLeavingSlide, aEnteringSlide )
|
|
{
|
|
if( !this.isValid() )
|
|
return null;
|
|
if( this.eTransitionType == 0 )
|
|
return null;
|
|
|
|
if( !aEnteringSlide )
|
|
{
|
|
log( 'SlideTransition.createSlideTransition: invalid entering slide.' );
|
|
return null;
|
|
}
|
|
|
|
var aTransitionInfo = aTransitionInfoTable[this.eTransitionType][this.eTransitionSubType];
|
|
var eTransitionClass = aTransitionInfo['class'];
|
|
|
|
switch( eTransitionClass )
|
|
{
|
|
default:
|
|
case TRANSITION_INVALID:
|
|
log( 'SlideTransition.createSlideTransition: transition class: TRANSITION_INVALID' );
|
|
return null;
|
|
|
|
case TRANSITION_CLIP_POLYPOLYGON:
|
|
var aParametricPolyPolygon
|
|
= createClipPolyPolygon( this.eTransitionType, this.eTransitionSubType );
|
|
return new ClippedSlideChange( aLeavingSlide, aEnteringSlide, aParametricPolyPolygon,
|
|
aTransitionInfo, this.isDirectionForward() );
|
|
|
|
case TRANSITION_SPECIAL:
|
|
switch( this.eTransitionType )
|
|
{
|
|
default:
|
|
log( 'SlideTransition.createSlideTransition: ' +
|
|
'transition class: TRANSITION_SPECIAL, ' +
|
|
'unknown transition type: ' + this.eTransitionType );
|
|
return null;
|
|
|
|
case PUSHWIPE_TRANSITION:
|
|
{
|
|
var aDirection = null;
|
|
switch( this.eTransitionSubType )
|
|
{
|
|
default:
|
|
log( 'SlideTransition.createSlideTransition: ' +
|
|
'transition type: PUSHWIPE_TRANSITION, ' +
|
|
'unknown transition subtype: ' + this.eTransitionSubType );
|
|
return null;
|
|
case FROMTOP_TRANS_SUBTYPE:
|
|
aDirection = { x: 0.0, y: 1.0 };
|
|
break;
|
|
case FROMBOTTOM_TRANS_SUBTYPE:
|
|
aDirection = { x: 0.0, y: -1.0 };
|
|
break;
|
|
case FROMLEFT_TRANS_SUBTYPE:
|
|
aDirection = { x: 1.0, y: 0.0 };
|
|
break;
|
|
case FROMRIGHT_TRANS_SUBTYPE:
|
|
aDirection = { x: -1.0, y: 0.0 };
|
|
break;
|
|
}
|
|
return new MovingSlideChange( aLeavingSlide, aEnteringSlide, aDirection, aDirection );
|
|
}
|
|
|
|
case SLIDEWIPE_TRANSITION:
|
|
{
|
|
var aInDirection = null;
|
|
switch( this.eTransitionSubType )
|
|
{
|
|
default:
|
|
log( 'SlideTransition.createSlideTransition: ' +
|
|
'transition type: SLIDEWIPE_TRANSITION, ' +
|
|
'unknown transition subtype: ' + this.eTransitionSubType );
|
|
return null;
|
|
case FROMTOP_TRANS_SUBTYPE:
|
|
aInDirection = { x: 0.0, y: 1.0 };
|
|
break;
|
|
case FROMBOTTOM_TRANS_SUBTYPE:
|
|
aInDirection = { x: 0.0, y: -1.0 };
|
|
break;
|
|
case FROMLEFT_TRANS_SUBTYPE:
|
|
aInDirection = { x: 1.0, y: 0.0 };
|
|
break;
|
|
case FROMRIGHT_TRANS_SUBTYPE:
|
|
aInDirection = { x: -1.0, y: 0.0 };
|
|
break;
|
|
}
|
|
var aNoDirection = { x: 0.0, y: 0.0 };
|
|
if( !this.bReverseDirection )
|
|
{
|
|
return new MovingSlideChange( aLeavingSlide, aEnteringSlide, aNoDirection, aInDirection );
|
|
}
|
|
else
|
|
{
|
|
return new MovingSlideChange( aLeavingSlide, aEnteringSlide, aInDirection, aNoDirection );
|
|
}
|
|
}
|
|
|
|
case FADE_TRANSITION:
|
|
switch( this.eTransitionSubType )
|
|
{
|
|
default:
|
|
log( 'SlideTransition.createSlideTransition: ' +
|
|
'transition type: FADE_TRANSITION, ' +
|
|
'unknown transition subtype: ' + this.eTransitionSubType );
|
|
return null;
|
|
case CROSSFADE_TRANS_SUBTYPE:
|
|
return new FadingSlideChange( aLeavingSlide, aEnteringSlide );
|
|
case FADEOVERCOLOR_TRANS_SUBTYPE:
|
|
return new FadingOverColorSlideChange( aLeavingSlide, aEnteringSlide, this.getFadeColor() );
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
SlideTransition.prototype.parseElement = function()
|
|
{
|
|
this.bIsValid = true;
|
|
var aAnimElem = this.aElement;
|
|
|
|
this.eTransitionType = undefined;
|
|
var sTypeAttr = aAnimElem.getAttributeNS( NSS['smil'], 'type' );
|
|
if( sTypeAttr && aTransitionTypeInMap[ sTypeAttr ] )
|
|
{
|
|
this.eTransitionType = aTransitionTypeInMap[ sTypeAttr ];
|
|
}
|
|
else
|
|
{
|
|
this.bIsValid = false;
|
|
log( 'SlideTransition.parseElement: transition type not valid: ' + sTypeAttr );
|
|
}
|
|
|
|
this.eTransitionSubType = undefined;
|
|
var sSubTypeAttr = aAnimElem.getAttributeNS( NSS['smil'], 'subtype' );
|
|
if( sSubTypeAttr === null )
|
|
sSubTypeAttr = 'default';
|
|
if( sSubTypeAttr && ( aTransitionSubtypeInMap[ sSubTypeAttr ] !== undefined ) )
|
|
{
|
|
this.eTransitionSubType = aTransitionSubtypeInMap[ sSubTypeAttr ];
|
|
}
|
|
else
|
|
{
|
|
this.bIsValid = false;
|
|
log( 'SlideTransition.parseElement: transition subtype not valid: ' + sSubTypeAttr );
|
|
}
|
|
|
|
if( this.bIsValid && aTransitionInfoTable[this.eTransitionType][this.eTransitionSubType] === undefined )
|
|
{
|
|
this.bIsValid = false;
|
|
log( 'SlideTransition.parseElement: transition not valid: type: ' + sTypeAttr + ' subtype: ' + sSubTypeAttr );
|
|
}
|
|
|
|
this.bReverseDirection = false;
|
|
var sDirectionAttr = aAnimElem.getAttributeNS( NSS['smil'], 'direction' );
|
|
if( sDirectionAttr == 'reverse' )
|
|
this.bReverseDirection = true;
|
|
|
|
this.sFadeColor = null;
|
|
if( this.eTransitionType == FADE_TRANSITION &&
|
|
( this.eTransitionSubType == FADEFROMCOLOR_TRANS_SUBTYPE ||
|
|
this.eTransitionSubType == FADEOVERCOLOR_TRANS_SUBTYPE ||
|
|
this.eTransitionSubType == FADETOCOLOR_TRANS_SUBTYPE ) )
|
|
{
|
|
var sColorAttr = aAnimElem.getAttributeNS( NSS['smil'], 'fadeColor' );
|
|
if( sColorAttr )
|
|
this.sFadeColor = sColorAttr;
|
|
else
|
|
this.sFadeColor='#000000';
|
|
}
|
|
|
|
|
|
this.aDuration = null;
|
|
var sDurAttr = aAnimElem.getAttributeNS( NSS['smil'], 'dur' );
|
|
this.aDuration = new Duration( sDurAttr );
|
|
if( !this.aDuration.isSet() )
|
|
{
|
|
this.aDuration = new Duration( null ); // duration == 0.0
|
|
}
|
|
|
|
this.nMinFrameCount = ( this.getDuration().isValue() )
|
|
? ( this.getDuration().getValue() * MINIMUM_FRAMES_PER_SECONDS )
|
|
: MINIMUM_FRAMES_PER_SECONDS;
|
|
if( this.nMinFrameCount < 1.0 )
|
|
this.nMinFrameCount = 1;
|
|
else if( this.nMinFrameCount > MINIMUM_FRAMES_PER_SECONDS )
|
|
this.nMinFrameCount = MINIMUM_FRAMES_PER_SECONDS;
|
|
|
|
};
|
|
|
|
SlideTransition.prototype.isValid = function()
|
|
{
|
|
return this.bIsValid;
|
|
};
|
|
|
|
SlideTransition.prototype.getTransitionType = function()
|
|
{
|
|
return this.eTransitionType;
|
|
};
|
|
|
|
SlideTransition.prototype.getTransitionSubType = function()
|
|
{
|
|
return this.eTransitionSubType;
|
|
};
|
|
|
|
SlideTransition.prototype.getTransitionMode = function()
|
|
{
|
|
return this.eTransitionMode;
|
|
};
|
|
|
|
SlideTransition.prototype.getFadeColor = function()
|
|
{
|
|
return this.sFadeColor;
|
|
};
|
|
|
|
SlideTransition.prototype.isDirectionForward = function()
|
|
{
|
|
return !this.bReverseDirection;
|
|
};
|
|
|
|
SlideTransition.prototype.getDuration = function()
|
|
{
|
|
return this.aDuration;
|
|
};
|
|
|
|
SlideTransition.prototype.getMinFrameCount = function()
|
|
{
|
|
return this.nMinFrameCount;
|
|
};
|
|
|
|
SlideTransition.prototype.info = function()
|
|
{
|
|
|
|
var sInfo ='slide transition <' + this.sSlideId + '>: ';
|
|
sInfo += '; type: ' + getKeyByValue(aTransitionTypeInMap, this.getTransitionType());
|
|
|
|
sInfo += '; subtype: ' + getKeyByValue(aTransitionSubtypeInMap, this.getTransitionSubType());
|
|
|
|
if( !this.isDirectionForward() )
|
|
sInfo += '; direction: reverse';
|
|
|
|
sInfo += '; mode: ' + aTransitionModeOutMap[ this.getTransitionMode() ];
|
|
|
|
if( this.getDuration() )
|
|
sInfo += '; duration: ' + this.getDuration().info();
|
|
|
|
return sInfo;
|
|
};
|
|
|
|
|
|
function SlideAnimations( aSlideShowContext )
|
|
{
|
|
this.aContext = new NodeContext( aSlideShowContext );
|
|
this.aAnimationNodeMap = {};
|
|
this.aAnimatedElementMap = {};
|
|
this.aSourceEventElementMap = {};
|
|
this.aNextEffectEventArray = new NextEffectEventArray();
|
|
this.aInteractiveAnimationSequenceMap = {};
|
|
this.aEventMultiplexer = new EventMultiplexer( aSlideShowContext.aTimerEventQueue );
|
|
this.aRootNode = null;
|
|
this.bElementsParsed = false;
|
|
|
|
this.aContext.aAnimationNodeMap = this.aAnimationNodeMap;
|
|
this.aContext.aAnimatedElementMap = this.aAnimatedElementMap;
|
|
this.aContext.aSourceEventElementMap = this.aSourceEventElementMap;
|
|
|
|
this.aEventMultiplexer.registerMouseClickHandler( document, 100 );
|
|
}
|
|
|
|
|
|
SlideAnimations.prototype.importAnimations = function( aAnimationRootElement )
|
|
{
|
|
if( !aAnimationRootElement )
|
|
return false;
|
|
|
|
this.aRootNode = createAnimationTree( aAnimationRootElement, this.aContext );
|
|
|
|
return ( this.aRootNode ? true : false );
|
|
};
|
|
|
|
SlideAnimations.prototype.parseElements = function()
|
|
{
|
|
if( !this.aRootNode )
|
|
return false;
|
|
|
|
if( !this.aRootNode.parseElement() )
|
|
return false;
|
|
else
|
|
this.bElementsParsed = true;
|
|
};
|
|
|
|
SlideAnimations.prototype.elementsParsed = function()
|
|
{
|
|
return this.bElementsParsed;
|
|
};
|
|
|
|
SlideAnimations.prototype.isFirstRun = function()
|
|
{
|
|
return this.aContext.bFirstRun;
|
|
};
|
|
|
|
SlideAnimations.prototype.isAnimated = function()
|
|
{
|
|
if( !this.bElementsParsed )
|
|
return false;
|
|
|
|
return this.aRootNode.hasPendingAnimation();
|
|
};
|
|
|
|
SlideAnimations.prototype.start = function()
|
|
{
|
|
if( !this.bElementsParsed )
|
|
return false;
|
|
|
|
this.chargeSourceEvents();
|
|
this.chargeInterAnimEvents();
|
|
|
|
aSlideShow.setSlideEvents( this.aNextEffectEventArray,
|
|
this.aInteractiveAnimationSequenceMap,
|
|
this.aEventMultiplexer );
|
|
|
|
if( this.aContext.bFirstRun == undefined )
|
|
this.aContext.bFirstRun = true;
|
|
else if( this.aContext.bFirstRun )
|
|
this.aContext.bFirstRun = false;
|
|
|
|
this.aContext.bIsInvalid = !this.aRootNode.init();
|
|
if( this.aContext.bIsInvalid )
|
|
return false;
|
|
|
|
return this.aRootNode.resolve();
|
|
};
|
|
|
|
SlideAnimations.prototype.end = function( bLeftEffectsSkipped )
|
|
{
|
|
if( !this.bElementsParsed )
|
|
return; // no animations there
|
|
|
|
this.aRootNode.deactivate();
|
|
this.aRootNode.end();
|
|
|
|
if( bLeftEffectsSkipped && this.isFirstRun() )
|
|
{
|
|
this.aContext.bFirstRun = undefined;
|
|
}
|
|
else if( this.isFirstRun() )
|
|
{
|
|
this.aContext.bFirstRun = false;
|
|
}
|
|
|
|
this.aContext.bIsInvalid = false;
|
|
};
|
|
|
|
SlideAnimations.prototype.dispose = function()
|
|
{
|
|
if( this.aRootNode )
|
|
{
|
|
this.aRootNode.dispose();
|
|
}
|
|
};
|
|
|
|
SlideAnimations.prototype.clearNextEffectEvents = function()
|
|
{
|
|
ANIMDBG.print( 'SlideAnimations.clearNextEffectEvents: current slide: ' + nCurSlide );
|
|
this.aNextEffectEventArray.clear();
|
|
this.aContext.bFirstRun = undefined;
|
|
};
|
|
|
|
SlideAnimations.prototype.chargeSourceEvents = function()
|
|
{
|
|
for( var id in this.aSourceEventElementMap )
|
|
{
|
|
this.aSourceEventElementMap[id].charge();
|
|
}
|
|
};
|
|
|
|
SlideAnimations.prototype.chargeInterAnimEvents = function()
|
|
{
|
|
for( var id in this.aInteractiveAnimationSequenceMap )
|
|
{
|
|
this.aInteractiveAnimationSequenceMap[id].chargeEvents();
|
|
}
|
|
};
|
|
|
|
|
|
function Event()
|
|
{
|
|
this.nId = Event.getUniqueId();
|
|
}
|
|
|
|
|
|
Event.CURR_UNIQUE_ID = 0;
|
|
|
|
Event.getUniqueId = function()
|
|
{
|
|
++Event.CURR_UNIQUE_ID;
|
|
return Event.CURR_UNIQUE_ID;
|
|
};
|
|
|
|
Event.prototype.getId = function()
|
|
{
|
|
return this.nId;
|
|
};
|
|
|
|
|
|
function DelayEvent( aFunctor, nTimeout )
|
|
{
|
|
DelayEvent.superclass.constructor.call( this );
|
|
|
|
this.aFunctor = aFunctor;
|
|
this.nTimeout = nTimeout;
|
|
this.bWasFired = false;
|
|
}
|
|
extend( DelayEvent, Event );
|
|
|
|
|
|
DelayEvent.prototype.fire = function()
|
|
{
|
|
assert( this.isCharged(), 'DelayEvent.fire: assertion isCharged failed' );
|
|
|
|
this.bWasFired = true;
|
|
this.aFunctor();
|
|
return true;
|
|
};
|
|
|
|
DelayEvent.prototype.isCharged = function()
|
|
{
|
|
return !this.bWasFired;
|
|
};
|
|
|
|
DelayEvent.prototype.getActivationTime = function( nCurrentTime )
|
|
{
|
|
return ( this.nTimeout + nCurrentTime );
|
|
};
|
|
|
|
DelayEvent.prototype.dispose = function()
|
|
{
|
|
if( this.isCharged() )
|
|
this.bWasFired = true;
|
|
};
|
|
|
|
DelayEvent.prototype.charge = function()
|
|
{
|
|
if( !this.isCharged() )
|
|
this.bWasFired = false;
|
|
};
|
|
|
|
|
|
function WakeupEvent( aTimer, aActivityQueue )
|
|
{
|
|
WakeupEvent.superclass.constructor.call( this );
|
|
|
|
this.aTimer = new ElapsedTime( aTimer );
|
|
this.nNextTime = 0.0;
|
|
this.aActivity = null;
|
|
this.aActivityQueue = aActivityQueue;
|
|
}
|
|
extend( WakeupEvent, Event );
|
|
|
|
|
|
WakeupEvent.prototype.clone = function()
|
|
{
|
|
var aWakeupEvent = new WakeupEvent( this.aTimer.getTimeBase(), this.aActivityQueue );
|
|
aWakeupEvent.nNextTime = this.nNextTime;
|
|
aWakeupEvent.aActivity = this.aActivity;
|
|
return aWakeupEvent;
|
|
};
|
|
|
|
WakeupEvent.prototype.dispose = function()
|
|
{
|
|
this.aActivity = null;
|
|
};
|
|
|
|
WakeupEvent.prototype.fire = function()
|
|
{
|
|
if( !this.aActivity )
|
|
return false;
|
|
|
|
return this.aActivityQueue.addActivity( this.aActivity );
|
|
};
|
|
|
|
WakeupEvent.prototype.isCharged = function()
|
|
{
|
|
return true;
|
|
};
|
|
|
|
WakeupEvent.prototype.getActivationTime = function( nCurrentTime )
|
|
{
|
|
var nElapsedTime = this.aTimer.getElapsedTime();
|
|
|
|
return Math.max( nCurrentTime, nCurrentTime - nElapsedTime + this.nNextTime );
|
|
};
|
|
|
|
WakeupEvent.prototype.start = function()
|
|
{
|
|
this.aTimer.reset();
|
|
};
|
|
|
|
WakeupEvent.prototype.setNextTimeout = function( nNextTime )
|
|
{
|
|
this.nNextTime = nNextTime;
|
|
};
|
|
|
|
WakeupEvent.prototype.setActivity = function( aActivity )
|
|
{
|
|
this.aActivity = aActivity;
|
|
};
|
|
|
|
|
|
function makeEvent( aFunctor )
|
|
{
|
|
return new DelayEvent( aFunctor, 0.0 );
|
|
}
|
|
|
|
|
|
function makeDelay( aFunctor, nTimeout )
|
|
{
|
|
return new DelayEvent( aFunctor, nTimeout );
|
|
}
|
|
|
|
|
|
function registerEvent( nNodeId, aTiming, aEvent, aNodeContext )
|
|
{
|
|
var aSlideShowContext = aNodeContext.aContext;
|
|
var eTimingType = aTiming.getType();
|
|
|
|
registerEvent.DBG( aTiming );
|
|
|
|
if( eTimingType == OFFSET_TIMING )
|
|
{
|
|
aSlideShowContext.aTimerEventQueue.addEvent( aEvent );
|
|
}
|
|
else if ( aNodeContext.bFirstRun )
|
|
{
|
|
var aEventMultiplexer = aSlideShowContext.aEventMultiplexer;
|
|
if( !aEventMultiplexer )
|
|
{
|
|
log( 'registerEvent: event multiplexer not initialized' );
|
|
return;
|
|
}
|
|
var aNextEffectEventArray = aSlideShowContext.aNextEffectEventArray;
|
|
if( !aNextEffectEventArray )
|
|
{
|
|
log( 'registerEvent: next effect event array not initialized' );
|
|
return;
|
|
}
|
|
var aInteractiveAnimationSequenceMap =
|
|
aSlideShowContext.aInteractiveAnimationSequenceMap;
|
|
if( !aInteractiveAnimationSequenceMap )
|
|
{
|
|
log( 'registerEvent: interactive animation sequence map not initialized' );
|
|
return;
|
|
}
|
|
|
|
switch( eTimingType )
|
|
{
|
|
case EVENT_TIMING:
|
|
var eEventType = aTiming.getEventType();
|
|
var sEventBaseElemId = aTiming.getEventBaseElementId();
|
|
if( sEventBaseElemId )
|
|
{
|
|
var aEventBaseElem = document.getElementById( sEventBaseElemId );
|
|
if( !aEventBaseElem )
|
|
{
|
|
log( 'generateEvent: EVENT_TIMING: event base element not found: ' + sEventBaseElemId );
|
|
return;
|
|
}
|
|
var aSourceEventElement = aNodeContext.makeSourceEventElement( sEventBaseElemId, aEventBaseElem );
|
|
|
|
if( !aInteractiveAnimationSequenceMap[ nNodeId ] )
|
|
{
|
|
aInteractiveAnimationSequenceMap[ nNodeId ] = new InteractiveAnimationSequence(nNodeId);
|
|
}
|
|
|
|
var bEventRegistered = false;
|
|
switch( eEventType )
|
|
{
|
|
case EVENT_TRIGGER_ON_CLICK:
|
|
aEventMultiplexer.registerEvent( eEventType, aSourceEventElement.getId(), aEvent );
|
|
aEventMultiplexer.registerRewindedEffectHandler( aSourceEventElement.getId(),
|
|
bind2( aSourceEventElement.charge, aSourceEventElement ) );
|
|
bEventRegistered = true;
|
|
break;
|
|
default:
|
|
log( 'generateEvent: not handled event type: ' + eEventType );
|
|
}
|
|
if( bEventRegistered )
|
|
{
|
|
var aStartEvent = aInteractiveAnimationSequenceMap[ nNodeId ].getStartEvent();
|
|
var aEndEvent = aInteractiveAnimationSequenceMap[ nNodeId ].getEndEvent();
|
|
aEventMultiplexer.registerEvent( eEventType, aSourceEventElement.getId(), aStartEvent );
|
|
aEventMultiplexer.registerEvent( EVENT_TRIGGER_END_EVENT, nNodeId, aEndEvent );
|
|
aEventMultiplexer.registerRewindedEffectHandler(
|
|
nNodeId,
|
|
bind2( InteractiveAnimationSequence.prototype.chargeEvents,
|
|
aInteractiveAnimationSequenceMap[ nNodeId ] )
|
|
);
|
|
}
|
|
}
|
|
else // no base event element present
|
|
{
|
|
switch( eEventType )
|
|
{
|
|
case EVENT_TRIGGER_ON_NEXT_EFFECT:
|
|
aNextEffectEventArray.appendEvent( aEvent );
|
|
break;
|
|
default:
|
|
log( 'generateEvent: not handled event type: ' + eEventType );
|
|
}
|
|
}
|
|
break;
|
|
case SYNCBASE_TIMING:
|
|
eEventType = aTiming.getEventType();
|
|
sEventBaseElemId = aTiming.getEventBaseElementId();
|
|
if( sEventBaseElemId )
|
|
{
|
|
var aAnimationNode = aNodeContext.aAnimationNodeMap[ sEventBaseElemId ];
|
|
if( !aAnimationNode )
|
|
{
|
|
log( 'generateEvent: SYNCBASE_TIMING: event base element not found: ' + sEventBaseElemId );
|
|
return;
|
|
}
|
|
aEventMultiplexer.registerEvent( eEventType, aAnimationNode.getId(), aEvent );
|
|
}
|
|
else
|
|
{
|
|
log( 'generateEvent: SYNCBASE_TIMING: event base element not specified' );
|
|
}
|
|
break;
|
|
default:
|
|
log( 'generateEvent: not handled timing type: ' + eTimingType );
|
|
}
|
|
}
|
|
}
|
|
|
|
registerEvent.DEBUG = aRegisterEventDebugPrinter.isEnabled();
|
|
|
|
registerEvent.DBG = function( aTiming, nTime )
|
|
{
|
|
if( registerEvent.DEBUG )
|
|
{
|
|
aRegisterEventDebugPrinter.print( 'registerEvent( timing: ' + aTiming.info() + ' )', nTime );
|
|
}
|
|
};
|
|
|
|
|
|
function SourceEventElement( sId, aElement, aEventMultiplexer )
|
|
{
|
|
this.sId = sId;
|
|
this.aElement = aElement;
|
|
this.aEventMultiplexer = aEventMultiplexer;
|
|
|
|
this.aEventMultiplexer.registerMouseClickHandler( this, 1000 );
|
|
|
|
this.bClickHandled = false;
|
|
this.bIsPointerOver = false;
|
|
this.aElement.addEventListener( 'mouseover', bind2( SourceEventElement.prototype.onMouseEnter, this), false );
|
|
this.aElement.addEventListener( 'mouseout', bind2( SourceEventElement.prototype.onMouseLeave, this), false );
|
|
}
|
|
|
|
SourceEventElement.prototype.getId = function()
|
|
{
|
|
return this.sId;
|
|
};
|
|
|
|
SourceEventElement.prototype.onMouseEnter = function()
|
|
{
|
|
this.bIsPointerOver = true;
|
|
this.setPointerCursor();
|
|
};
|
|
|
|
SourceEventElement.prototype.onMouseLeave = function()
|
|
{
|
|
this.bIsPointerOver = false;
|
|
this.setDefaultCursor();
|
|
};
|
|
|
|
SourceEventElement.prototype.charge = function()
|
|
{
|
|
this.bClickHandled = false;
|
|
this.setPointerCursor();
|
|
};
|
|
|
|
SourceEventElement.prototype.handleClick = function( /*aMouseEvent*/ )
|
|
{
|
|
if( !this.bIsPointerOver ) return false;
|
|
|
|
if( this.bClickHandled )
|
|
return false;
|
|
|
|
this.aEventMultiplexer.notifyEvent( EVENT_TRIGGER_ON_CLICK, this.getId() );
|
|
aSlideShow.update();
|
|
this.bClickHandled = true;
|
|
this.setDefaultCursor();
|
|
return true;
|
|
};
|
|
|
|
SourceEventElement.prototype.setPointerCursor = function()
|
|
{
|
|
if( this.bClickHandled )
|
|
return;
|
|
|
|
this.aElement.setAttribute( 'style', 'cursor: pointer' );
|
|
};
|
|
|
|
SourceEventElement.prototype.setDefaultCursor = function()
|
|
{
|
|
this.aElement.setAttribute( 'style', 'cursor: default' );
|
|
};
|
|
|
|
|
|
function HyperlinkElement( sId, aEventMultiplexer )
|
|
{
|
|
var aElement = document.getElementById( sId );
|
|
if( !aElement )
|
|
{
|
|
log( 'error: HyperlinkElement: no element with id: <' + sId + '> found' );
|
|
return;
|
|
}
|
|
if( !aEventMultiplexer )
|
|
{
|
|
log( 'AnimatedElement constructor: event multiplexer is not valid' );
|
|
}
|
|
|
|
this.sId = sId;
|
|
this.aElement = aElement;
|
|
this.aEventMultiplexer = aEventMultiplexer;
|
|
this.nTargetSlideIndex = undefined;
|
|
|
|
this.sURL = getNSAttribute( 'xlink', this.aElement, 'href' );
|
|
if( this.sURL )
|
|
{
|
|
if( this.sURL[0] === '#' )
|
|
{
|
|
if( this.sURL.substr(1, 5) === 'Slide' )
|
|
{
|
|
var sSlideIndex = this.sURL.split( ' ' )[1];
|
|
this.nTargetSlideIndex = parseInt( sSlideIndex ) - 1;
|
|
}
|
|
}
|
|
|
|
this.aEventMultiplexer.registerElementChangedHandler( this.sId, bind2( HyperlinkElement.prototype.onElementChanged, this) );
|
|
this.aEventMultiplexer.registerMouseClickHandler( this, 1100 );
|
|
|
|
this.bIsPointerOver = false;
|
|
this.mouseEnterHandler = bind2( HyperlinkElement.prototype.onMouseEnter, this);
|
|
this.mouseLeaveHandler = bind2( HyperlinkElement.prototype.onMouseLeave, this);
|
|
this.aElement.addEventListener( 'mouseover', this.mouseEnterHandler, false );
|
|
this.aElement.addEventListener( 'mouseout', this.mouseLeaveHandler, false );
|
|
}
|
|
else
|
|
{
|
|
log( 'warning: HyperlinkElement(' + this.sId + '): url is empty' );
|
|
}
|
|
}
|
|
|
|
HyperlinkElement.prototype.onElementChanged = function( aElement )
|
|
{
|
|
if( !aElement )
|
|
{
|
|
log( 'error: HyperlinkElement: passed element is not valid' );
|
|
return;
|
|
}
|
|
|
|
if( this.sURL )
|
|
{
|
|
this.aElement.removeEventListener( 'mouseover', this.mouseEnterHandler, false );
|
|
this.aElement.removeEventListener( 'mouseout', this.mouseLeaveHandler, false );
|
|
this.aElement = aElement;
|
|
this.aElement.addEventListener( 'mouseover', this.mouseEnterHandler, false );
|
|
this.aElement.addEventListener( 'mouseout', this.mouseLeaveHandler, false );
|
|
}
|
|
};
|
|
|
|
HyperlinkElement.prototype.onMouseEnter = function()
|
|
{
|
|
this.bIsPointerOver = true;
|
|
this.setPointerCursor();
|
|
};
|
|
|
|
HyperlinkElement.prototype.onMouseLeave = function()
|
|
{
|
|
this.bIsPointerOver = false;
|
|
this.setDefaultCursor();
|
|
};
|
|
|
|
HyperlinkElement.prototype.handleClick = function( )
|
|
{
|
|
if( !this.bIsPointerOver ) return false;
|
|
|
|
if( this.nTargetSlideIndex !== undefined )
|
|
{
|
|
aSlideShow.displaySlide( this.nTargetSlideIndex, true );
|
|
}
|
|
else
|
|
{
|
|
var aWindowObject = document.defaultView;
|
|
if( aWindowObject )
|
|
{
|
|
aWindowObject.open( this.sURL, this.sId );
|
|
}
|
|
else
|
|
{
|
|
log( 'error: HyperlinkElement.handleClick: invalid window object.' );
|
|
}
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
HyperlinkElement.prototype.setPointerCursor = function()
|
|
{
|
|
if( this.bClickHandled )
|
|
return;
|
|
|
|
this.aElement.setAttribute( 'style', 'cursor: pointer' );
|
|
};
|
|
|
|
HyperlinkElement.prototype.setDefaultCursor = function()
|
|
{
|
|
this.aElement.setAttribute( 'style', 'cursor: default' );
|
|
};
|
|
|
|
|
|
function InteractiveAnimationSequence( nId )
|
|
{
|
|
this.nId = nId;
|
|
this.bIsRunning = false;
|
|
this.aStartEvent = null;
|
|
this.aEndEvent = null;
|
|
}
|
|
|
|
InteractiveAnimationSequence.prototype.getId = function()
|
|
{
|
|
return this.nId;
|
|
};
|
|
|
|
InteractiveAnimationSequence.prototype.getStartEvent = function()
|
|
{
|
|
if( !this.aStartEvent )
|
|
{
|
|
this.aStartEvent =
|
|
makeEvent( bind2( InteractiveAnimationSequence.prototype.start, this ) );
|
|
}
|
|
return this.aStartEvent;
|
|
};
|
|
|
|
InteractiveAnimationSequence.prototype.getEndEvent = function()
|
|
{
|
|
if( !this.aEndEvent )
|
|
{
|
|
this.aEndEvent =
|
|
makeEvent( bind2( InteractiveAnimationSequence.prototype.end, this ) );
|
|
}
|
|
return this.aEndEvent;
|
|
};
|
|
|
|
InteractiveAnimationSequence.prototype.chargeEvents = function()
|
|
{
|
|
if( this.aStartEvent ) this.aStartEvent.charge();
|
|
if( this.aEndEvent ) this.aEndEvent.charge();
|
|
};
|
|
|
|
InteractiveAnimationSequence.prototype.isRunning = function()
|
|
{
|
|
return this.bIsRunning;
|
|
};
|
|
|
|
InteractiveAnimationSequence.prototype.start = function()
|
|
{
|
|
aSlideShow.notifyInteractiveAnimationSequenceStart( this.getId() );
|
|
this.bIsRunning = true;
|
|
};
|
|
|
|
InteractiveAnimationSequence.prototype.end = function()
|
|
{
|
|
aSlideShow.notifyInteractiveAnimationSequenceEnd( this.getId() );
|
|
this.bIsRunning = false;
|
|
};
|
|
|
|
|
|
function PriorityEntry( aValue, nPriority )
|
|
{
|
|
this.aValue = aValue;
|
|
this.nPriority = nPriority;
|
|
}
|
|
|
|
PriorityEntry.compare = function( aLhsEntry, aRhsEntry )
|
|
{
|
|
if ( aLhsEntry.nPriority < aRhsEntry.nPriority )
|
|
{
|
|
return -1;
|
|
}
|
|
else if (aLhsEntry.nPriority > aRhsEntry.nPriority)
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
|
|
function EventMultiplexer( aTimerEventQueue )
|
|
{
|
|
this.nId = EventMultiplexer.getUniqueId();
|
|
this.aTimerEventQueue = aTimerEventQueue;
|
|
this.aEventMap = {};
|
|
this.aAnimationsEndHandler = null;
|
|
this.aSkipEffectEndHandlerSet = [];
|
|
this.aMouseClickHandlerSet = new PriorityQueue( PriorityEntry.compare );
|
|
this.aSkipEffectEvent = null;
|
|
this.aRewindCurrentEffectEvent = null;
|
|
this.aRewindLastEffectEvent = null;
|
|
this.aSkipInteractiveEffectEventSet = {};
|
|
this.aRewindRunningInteractiveEffectEventSet = {};
|
|
this.aRewindEndedInteractiveEffectEventSet = {};
|
|
this.aRewindedEffectHandlerSet = {};
|
|
this.aElementChangedHandlerSet = {};
|
|
}
|
|
|
|
EventMultiplexer.CURR_UNIQUE_ID = 0;
|
|
|
|
EventMultiplexer.getUniqueId = function()
|
|
{
|
|
++EventMultiplexer.CURR_UNIQUE_ID;
|
|
return EventMultiplexer.CURR_UNIQUE_ID;
|
|
};
|
|
|
|
EventMultiplexer.prototype.getId = function()
|
|
{
|
|
return this.nId;
|
|
};
|
|
|
|
EventMultiplexer.prototype.hasRegisteredMouseClickHandlers = function()
|
|
{
|
|
return !this.aMouseClickHandlerSet.isEmpty();
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerMouseClickHandler = function( aHandler, nPriority )
|
|
{
|
|
var aHandlerEntry = new PriorityEntry( aHandler, nPriority );
|
|
this.aMouseClickHandlerSet.push( aHandlerEntry );
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyMouseClick = function( aMouseEvent )
|
|
{
|
|
var aMouseClickHandlerSet = this.aMouseClickHandlerSet.clone();
|
|
while( !aMouseClickHandlerSet.isEmpty() )
|
|
{
|
|
var aHandlerEntry = aMouseClickHandlerSet.top();
|
|
aMouseClickHandlerSet.pop();
|
|
if( aHandlerEntry.aValue.handleClick( aMouseEvent ) )
|
|
break;
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerEvent = function( eEventType, aNotifierId, aEvent )
|
|
{
|
|
this.DBG( 'registerEvent', eEventType, aNotifierId );
|
|
if( !this.aEventMap[ eEventType ] )
|
|
{
|
|
this.aEventMap[ eEventType ] = {};
|
|
}
|
|
if( !this.aEventMap[ eEventType ][ aNotifierId ] )
|
|
{
|
|
this.aEventMap[ eEventType ][ aNotifierId ] = [];
|
|
}
|
|
this.aEventMap[ eEventType ][ aNotifierId ].push( aEvent );
|
|
};
|
|
|
|
|
|
EventMultiplexer.prototype.notifyEvent = function( eEventType, aNotifierId )
|
|
{
|
|
this.DBG( 'notifyEvent', eEventType, aNotifierId );
|
|
if( this.aEventMap[ eEventType ] )
|
|
{
|
|
if( this.aEventMap[ eEventType ][ aNotifierId ] )
|
|
{
|
|
var aEventArray = this.aEventMap[ eEventType ][ aNotifierId ];
|
|
var nSize = aEventArray.length;
|
|
for( var i = 0; i < nSize; ++i )
|
|
{
|
|
this.aTimerEventQueue.addEvent( aEventArray[i] );
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerAnimationsEndHandler = function( aHandler )
|
|
{
|
|
this.aAnimationsEndHandler = aHandler;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyAnimationsEndEvent = function()
|
|
{
|
|
if( this.aAnimationsEndHandler )
|
|
this.aAnimationsEndHandler();
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerNextEffectEndHandler = function( aHandler )
|
|
{
|
|
this.aSkipEffectEndHandlerSet.push( aHandler );
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyNextEffectEndEvent = function()
|
|
{
|
|
var nSize = this.aSkipEffectEndHandlerSet.length;
|
|
for( var i = 0; i < nSize; ++i )
|
|
{
|
|
(this.aSkipEffectEndHandlerSet[i])();
|
|
}
|
|
this.aSkipEffectEndHandlerSet = [];
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerSkipEffectEvent = function( aEvent )
|
|
{
|
|
this.aSkipEffectEvent = aEvent;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifySkipEffectEvent = function()
|
|
{
|
|
if( this.aSkipEffectEvent )
|
|
{
|
|
this.aTimerEventQueue.addEvent( this.aSkipEffectEvent );
|
|
this.aSkipEffectEvent = null;
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerRewindCurrentEffectEvent = function( aEvent )
|
|
{
|
|
this.aRewindCurrentEffectEvent = aEvent;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyRewindCurrentEffectEvent = function()
|
|
{
|
|
if( this.aRewindCurrentEffectEvent )
|
|
{
|
|
this.aTimerEventQueue.addEvent( this.aRewindCurrentEffectEvent );
|
|
this.aRewindCurrentEffectEvent = null;
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerRewindLastEffectEvent = function( aEvent )
|
|
{
|
|
this.aRewindLastEffectEvent = aEvent;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyRewindLastEffectEvent = function()
|
|
{
|
|
if( this.aRewindLastEffectEvent )
|
|
{
|
|
this.aTimerEventQueue.addEvent( this.aRewindLastEffectEvent );
|
|
this.aRewindLastEffectEvent = null;
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerSkipInteractiveEffectEvent = function( nNotifierId, aEvent )
|
|
{
|
|
this.aSkipInteractiveEffectEventSet[ nNotifierId ] = aEvent;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifySkipInteractiveEffectEvent = function( nNotifierId )
|
|
{
|
|
if( this.aSkipInteractiveEffectEventSet[ nNotifierId ] )
|
|
{
|
|
this.aTimerEventQueue.addEvent( this.aSkipInteractiveEffectEventSet[ nNotifierId ] );
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerRewindRunningInteractiveEffectEvent = function( nNotifierId, aEvent )
|
|
{
|
|
this.aRewindRunningInteractiveEffectEventSet[ nNotifierId ] = aEvent;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyRewindRunningInteractiveEffectEvent = function( nNotifierId )
|
|
{
|
|
if( this.aRewindRunningInteractiveEffectEventSet[ nNotifierId ] )
|
|
{
|
|
this.aTimerEventQueue.addEvent( this.aRewindRunningInteractiveEffectEventSet[ nNotifierId ] );
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerRewindEndedInteractiveEffectEvent = function( nNotifierId, aEvent )
|
|
{
|
|
this.aRewindEndedInteractiveEffectEventSet[ nNotifierId ] = aEvent;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyRewindEndedInteractiveEffectEvent = function( nNotifierId )
|
|
{
|
|
if( this.aRewindEndedInteractiveEffectEventSet[ nNotifierId ] )
|
|
{
|
|
this.aTimerEventQueue.addEvent( this.aRewindEndedInteractiveEffectEventSet[ nNotifierId ] );
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerRewindedEffectHandler = function( aNotifierId, aHandler )
|
|
{
|
|
this.aRewindedEffectHandlerSet[ aNotifierId ] = aHandler;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyRewindedEffectEvent = function( aNotifierId )
|
|
{
|
|
if( this.aRewindedEffectHandlerSet[ aNotifierId ] )
|
|
{
|
|
(this.aRewindedEffectHandlerSet[ aNotifierId ])();
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.prototype.registerElementChangedHandler = function( aNotifierId, aHandler )
|
|
{
|
|
this.aElementChangedHandlerSet[ aNotifierId ] = aHandler;
|
|
};
|
|
|
|
EventMultiplexer.prototype.notifyElementChangedEvent = function( aNotifierId, aElement )
|
|
{
|
|
if( this.aElementChangedHandlerSet[ aNotifierId ] )
|
|
{
|
|
(this.aElementChangedHandlerSet[ aNotifierId ])( aElement );
|
|
}
|
|
};
|
|
|
|
EventMultiplexer.DEBUG = aEventMultiplexerDebugPrinter.isEnabled();
|
|
|
|
EventMultiplexer.prototype.DBG = function( sMethodName, eEventType, aNotifierId, nTime )
|
|
{
|
|
if( EventMultiplexer.DEBUG )
|
|
{
|
|
var sInfo = 'EventMultiplexer.' + sMethodName;
|
|
sInfo += '( type: ' + aEventTriggerOutMap[ eEventType ];
|
|
sInfo += ', notifier: ' + aNotifierId + ' )';
|
|
aEventMultiplexerDebugPrinter.print( sInfo, nTime );
|
|
}
|
|
};
|
|
|
|
|
|
var aInterpolatorHandler = {};
|
|
|
|
aInterpolatorHandler.getInterpolator = function( eCalcMode, eValueType, eValueSubtype )
|
|
{
|
|
var bHasSubtype = ( typeof( eValueSubtype ) === typeof( 0 ) );
|
|
|
|
if( !bHasSubtype && aInterpolatorHandler.aLerpFunctorMap[ eCalcMode ][ eValueType ] )
|
|
{
|
|
return aInterpolatorHandler.aLerpFunctorMap[ eCalcMode ][ eValueType ];
|
|
}
|
|
else if( bHasSubtype && aInterpolatorHandler.aLerpFunctorMap[ eCalcMode ][ eValueType ][ eValueSubtype ] )
|
|
{
|
|
return aInterpolatorHandler.aLerpFunctorMap[ eCalcMode ][ eValueType ][ eValueSubtype ];
|
|
}
|
|
else
|
|
{
|
|
log( 'aInterpolatorHandler.getInterpolator: not found any valid interpolator for calc mode '
|
|
+ aCalcModeOutMap[eCalcMode] + ' and value type ' + aValueTypeOutMap[eValueType] );
|
|
return null;
|
|
}
|
|
};
|
|
|
|
aInterpolatorHandler.aLerpFunctorMap = [];
|
|
aInterpolatorHandler.aLerpFunctorMap[ CALC_MODE_DISCRETE ] = [];
|
|
aInterpolatorHandler.aLerpFunctorMap[ CALC_MODE_LINEAR ] = [];
|
|
|
|
|
|
aInterpolatorHandler.aLerpFunctorMap[ CALC_MODE_LINEAR ][ NUMBER_PROPERTY ] =
|
|
function ( nFrom, nTo, nT )
|
|
{
|
|
return ( ( 1.0 - nT )* nFrom + nT * nTo );
|
|
};
|
|
|
|
aInterpolatorHandler.aLerpFunctorMap[ CALC_MODE_LINEAR ][ COLOR_PROPERTY ] = [];
|
|
|
|
aInterpolatorHandler.aLerpFunctorMap[ CALC_MODE_LINEAR ][ COLOR_PROPERTY ][ COLOR_SPACE_RGB ] =
|
|
function ( nFrom, nTo, nT )
|
|
{
|
|
return RGBColor.interpolate( nFrom, nTo, nT );
|
|
};
|
|
|
|
aInterpolatorHandler.aLerpFunctorMap[ CALC_MODE_LINEAR ][ COLOR_PROPERTY ][ COLOR_SPACE_HSL ] =
|
|
function ( bCCW )
|
|
{
|
|
return function ( nFrom, nTo, nT )
|
|
{
|
|
return HSLColor.interpolate( nFrom, nTo, nT, bCCW );
|
|
};
|
|
};
|
|
|
|
aInterpolatorHandler.aLerpFunctorMap[ CALC_MODE_LINEAR ][ TUPLE_NUMBER_PROPERTY ] =
|
|
function ( aFrom, aTo, nT )
|
|
{
|
|
var aRes = [];
|
|
for( var i = 0; i < aFrom.length; ++i )
|
|
{
|
|
aRes.push( ( 1.0 - nT )* aFrom[i] + nT * aTo[i] );
|
|
}
|
|
return aRes;
|
|
};
|
|
|
|
|
|
function KeyStopLerp( aValueList )
|
|
{
|
|
KeyStopLerp.validateInput( aValueList );
|
|
|
|
this.aKeyStopList = [];
|
|
this.nLastIndex = 0;
|
|
this.nKeyStopDistance = aValueList[1] - aValueList[0];
|
|
if( this.nKeyStopDistance <= 0 )
|
|
this.nKeyStopDistance = 0.001;
|
|
|
|
for( var i = 0; i < aValueList.length; ++i )
|
|
this.aKeyStopList.push( aValueList[i] );
|
|
|
|
this.nUpperBoundIndex = this.aKeyStopList.length - 2;
|
|
}
|
|
|
|
|
|
KeyStopLerp.validateInput = function( aValueList )
|
|
{
|
|
var nSize = aValueList.length;
|
|
assert( nSize > 1, 'KeyStopLerp.validateInput: key stop vector must have two entries or more' );
|
|
|
|
for( var i = 1; i < nSize; ++i )
|
|
{
|
|
if( aValueList[i-1] > aValueList[i] )
|
|
log( 'KeyStopLerp.validateInput: time vector is not sorted in ascending order!' );
|
|
}
|
|
};
|
|
|
|
KeyStopLerp.prototype.reset = function()
|
|
{
|
|
KeyStopLerp.validateInput( this.aKeyStopList );
|
|
this.nLastIndex = 0;
|
|
this.nKeyStopDistance = this.aKeyStopList[1] - this.aKeyStopList[0];
|
|
if( this.nKeyStopDistance <= 0 )
|
|
this.nKeyStopDistance = 0.001;
|
|
|
|
};
|
|
|
|
KeyStopLerp.prototype.lerp = function( nAlpha )
|
|
{
|
|
if( nAlpha > this.aKeyStopList[ this.nLastIndex + 1 ] )
|
|
{
|
|
do
|
|
{
|
|
var nIndex = this.nLastIndex + 1;
|
|
this.nLastIndex = clamp( nIndex, 0, this.nUpperBoundIndex );
|
|
this.nKeyStopDistance = this.aKeyStopList[ this.nLastIndex + 1 ] - this.aKeyStopList[ this.nLastIndex ];
|
|
}
|
|
while( ( this.nKeyStopDistance <= 0 ) && ( this.nLastIndex < this.nUpperBoundIndex ) );
|
|
}
|
|
|
|
var nRawLerp = ( nAlpha - this.aKeyStopList[ this.nLastIndex ] ) / this.nKeyStopDistance;
|
|
|
|
nRawLerp = clamp( nRawLerp, 0.0, 1.0 );
|
|
|
|
var aResult = {};
|
|
aResult.nIndex = this.nLastIndex;
|
|
aResult.nLerp = nRawLerp;
|
|
|
|
return aResult;
|
|
};
|
|
|
|
KeyStopLerp.prototype.lerp_ported = function( nAlpha )
|
|
{
|
|
if( ( this.aKeyStopList[ this.nLastIndex ] < nAlpha ) ||
|
|
( this.aKeyStopList[ this.nLastIndex + 1 ] >= nAlpha ) )
|
|
{
|
|
var i = 0;
|
|
for( ; i < this.aKeyStopList.length; ++i )
|
|
{
|
|
if( this.aKeyStopList[i] >= nAlpha )
|
|
break;
|
|
}
|
|
if( this.aKeyStopList[i] > nAlpha )
|
|
--i;
|
|
var nIndex = i - 1;
|
|
this.nLastIndex = clamp( nIndex, 0, this.aKeyStopList.length - 2 );
|
|
}
|
|
|
|
var nRawLerp = ( nAlpha - this.aKeyStopList[ this.nLastIndex ] ) /
|
|
( this.aKeyStopList[ this.nLastIndex+1 ] - this.aKeyStopList[ this.nLastIndex ] );
|
|
|
|
nRawLerp = clamp( nRawLerp, 0.0, 1.0 );
|
|
|
|
var aResult = {};
|
|
aResult.nIndex = this.nLastIndex;
|
|
aResult.nLerp = nRawLerp;
|
|
|
|
return aResult;
|
|
};
|
|
|
|
|
|
var aOperatorSetMap = [];
|
|
|
|
aOperatorSetMap[ NUMBER_PROPERTY ] = {};
|
|
|
|
aOperatorSetMap[ NUMBER_PROPERTY ].equal = function( a, b )
|
|
{
|
|
return ( a === b );
|
|
};
|
|
|
|
aOperatorSetMap[ NUMBER_PROPERTY ].add = function( a, b )
|
|
{
|
|
return ( a + b );
|
|
};
|
|
|
|
aOperatorSetMap[ NUMBER_PROPERTY ].scale = function( k, v )
|
|
{
|
|
return ( k * v );
|
|
};
|
|
|
|
aOperatorSetMap[ COLOR_PROPERTY ] = {};
|
|
|
|
aOperatorSetMap[ COLOR_PROPERTY ].equal = function( a, b )
|
|
{
|
|
return a.equal( b );
|
|
};
|
|
|
|
aOperatorSetMap[ COLOR_PROPERTY ].add = function( a, b )
|
|
{
|
|
var c = a.clone();
|
|
c.add( b );
|
|
return c;
|
|
};
|
|
|
|
aOperatorSetMap[ COLOR_PROPERTY ].scale = function( k, v )
|
|
{
|
|
var r = v.clone();
|
|
r.scale( k );
|
|
return r;
|
|
};
|
|
|
|
aOperatorSetMap[ ENUM_PROPERTY ] = {};
|
|
|
|
aOperatorSetMap[ ENUM_PROPERTY ].equal = function( a, b )
|
|
{
|
|
return ( a === b );
|
|
};
|
|
|
|
aOperatorSetMap[ ENUM_PROPERTY ].add = function( a )
|
|
{
|
|
return a;
|
|
};
|
|
|
|
aOperatorSetMap[ ENUM_PROPERTY ].scale = function( k, v )
|
|
{
|
|
return v;
|
|
};
|
|
|
|
aOperatorSetMap[ STRING_PROPERTY ] = aOperatorSetMap[ ENUM_PROPERTY ];
|
|
|
|
aOperatorSetMap[ BOOL_PROPERTY ] = aOperatorSetMap[ ENUM_PROPERTY ];
|
|
|
|
aOperatorSetMap[ TUPLE_NUMBER_PROPERTY ] = {};
|
|
|
|
aOperatorSetMap[ TUPLE_NUMBER_PROPERTY ].equal = function( a, b )
|
|
{
|
|
assert( a.length === b.length, 'Tuples length mismatch.' );
|
|
return ( a.toString() === b.toString() );
|
|
};
|
|
|
|
aOperatorSetMap[ TUPLE_NUMBER_PROPERTY ].add = function( a, b )
|
|
{
|
|
assert( a.length === b.length, 'Tuples length mismatch.' );
|
|
var r = [];
|
|
for( var i = 0; i < a.length; ++i )
|
|
{
|
|
r.push(a[i] + b[i]);
|
|
}
|
|
return r;
|
|
};
|
|
|
|
aOperatorSetMap[ TUPLE_NUMBER_PROPERTY ].scale = function( k, v )
|
|
{
|
|
var r = [];
|
|
for( var i = 0; i < v.length; ++i )
|
|
{
|
|
r.push(k * v[i]);
|
|
}
|
|
return r;
|
|
};
|
|
|
|
|
|
function ActivityParamSet()
|
|
{
|
|
this.aEndEvent = null;
|
|
this.aWakeupEvent = null;
|
|
this.aTimerEventQueue = null;
|
|
this.aActivityQueue = null;
|
|
this.nMinDuration = undefined;
|
|
this.nMinNumberOfFrames = MINIMUM_FRAMES_PER_SECONDS;
|
|
this.bAutoReverse = false;
|
|
this.nRepeatCount = 1.0;
|
|
this.nAccelerationFraction = 0.0;
|
|
this.nDecelerationFraction = 0.0;
|
|
this.nSlideWidth = undefined;
|
|
this.nSlideHeight = undefined;
|
|
this.aFormula = null;
|
|
this.aDiscreteTimes = [];
|
|
}
|
|
|
|
|
|
function AnimationActivity()
|
|
{
|
|
this.nId = AnimationActivity.getUniqueId();
|
|
}
|
|
|
|
|
|
AnimationActivity.CURR_UNIQUE_ID = 0;
|
|
|
|
AnimationActivity.getUniqueId = function()
|
|
{
|
|
++AnimationActivity.CURR_UNIQUE_ID;
|
|
return AnimationActivity.CURR_UNIQUE_ID;
|
|
};
|
|
|
|
AnimationActivity.prototype.getId = function()
|
|
{
|
|
return this.nId;
|
|
};
|
|
|
|
|
|
function SetActivity( aCommonParamSet, aAnimation, aToAttr )
|
|
{
|
|
SetActivity.superclass.constructor.call( this );
|
|
|
|
this.aAnimation = aAnimation;
|
|
this.aTargetElement = null;
|
|
this.aEndEvent = aCommonParamSet.aEndEvent;
|
|
this.aTimerEventQueue = aCommonParamSet.aTimerEventQueue;
|
|
this.aToAttr = aToAttr;
|
|
this.bIsActive = true;
|
|
}
|
|
extend( SetActivity, AnimationActivity );
|
|
|
|
|
|
SetActivity.prototype.activate = function( aEndEvent )
|
|
{
|
|
this.aEndEvent = aEndEvent;
|
|
this.bIsActive = true;
|
|
};
|
|
|
|
SetActivity.prototype.dispose = function()
|
|
{
|
|
this.bIsActive = false;
|
|
if( this.aEndEvent && this.aEndEvent.isCharged() )
|
|
this.aEndEvent.dispose();
|
|
};
|
|
|
|
SetActivity.prototype.calcTimeLag = function()
|
|
{
|
|
return 0.0;
|
|
};
|
|
|
|
SetActivity.prototype.perform = function()
|
|
{
|
|
if( !this.isActive() )
|
|
return false;
|
|
|
|
this.bIsActive = false;
|
|
|
|
if( this.aAnimation && this.aTargetElement )
|
|
{
|
|
this.aAnimation.start( this.aTargetElement );
|
|
this.aAnimation.perform( this.aToAttr );
|
|
this.aAnimation.end();
|
|
}
|
|
|
|
if( this.aEndEvent )
|
|
this.aTimerEventQueue.addEvent( this.aEndEvent );
|
|
|
|
};
|
|
|
|
SetActivity.prototype.isActive = function()
|
|
{
|
|
return this.bIsActive;
|
|
};
|
|
|
|
SetActivity.prototype.dequeued = function()
|
|
{
|
|
};
|
|
|
|
SetActivity.prototype.end = function()
|
|
{
|
|
this.perform();
|
|
};
|
|
|
|
SetActivity.prototype.setTargets = function( aTargetElement )
|
|
{
|
|
assert( aTargetElement, 'SetActivity.setTargets: target element is not valid' );
|
|
this.aTargetElement = aTargetElement;
|
|
};
|
|
|
|
|
|
function ActivityBase( aCommonParamSet )
|
|
{
|
|
ActivityBase.superclass.constructor.call( this );
|
|
|
|
this.aTargetElement = null;
|
|
this.aEndEvent = aCommonParamSet.aEndEvent;
|
|
this.aTimerEventQueue = aCommonParamSet.aTimerEventQueue;
|
|
this.nRepeats = aCommonParamSet.nRepeatCount;
|
|
this.nAccelerationFraction = aCommonParamSet.nAccelerationFraction;
|
|
this.nDecelerationFraction = aCommonParamSet.nDecelerationFraction;
|
|
this.bAutoReverse = aCommonParamSet.bAutoReverse;
|
|
|
|
this.bFirstPerformCall = true;
|
|
this.bIsActive = true;
|
|
|
|
}
|
|
extend( ActivityBase, AnimationActivity );
|
|
|
|
|
|
ActivityBase.prototype.activate = function( aEndEvent )
|
|
{
|
|
this.aEndEvent = aEndEvent;
|
|
this.bFirstPerformCall = true;
|
|
this.bIsActive = true;
|
|
};
|
|
|
|
ActivityBase.prototype.dispose = function()
|
|
{
|
|
this.bIsActive = false;
|
|
|
|
if( this.aEndEvent )
|
|
this.aEndEvent.dispose();
|
|
|
|
this.aEndEvent = null;
|
|
};
|
|
|
|
ActivityBase.prototype.perform = function()
|
|
{
|
|
if( !this.isActive() )
|
|
return false; // no, early exit.
|
|
|
|
assert( !this.bFirstPerformCall, 'ActivityBase.perform: assertion (!this.FirstPerformCall) failed' );
|
|
|
|
return true;
|
|
};
|
|
|
|
ActivityBase.prototype.calcTimeLag = function()
|
|
{
|
|
if( this.isActive() && this.bFirstPerformCall )
|
|
{
|
|
this.bFirstPerformCall = false;
|
|
|
|
this.startAnimation();
|
|
}
|
|
return 0.0;
|
|
};
|
|
|
|
ActivityBase.prototype.isActive = function()
|
|
{
|
|
return this.bIsActive;
|
|
};
|
|
|
|
ActivityBase.prototype.isDisposed = function()
|
|
{
|
|
return ( !this.bIsActive && !this.aEndEvent );
|
|
};
|
|
|
|
ActivityBase.prototype.dequeued = function()
|
|
{
|
|
if( !this.isActive() )
|
|
this.endAnimation();
|
|
};
|
|
|
|
ActivityBase.prototype.setTargets = function( aTargetElement )
|
|
{
|
|
assert( aTargetElement, 'ActivityBase.setTargets: target element is not valid' );
|
|
|
|
this.aTargetElement = aTargetElement;
|
|
};
|
|
|
|
ActivityBase.prototype.startAnimation = function()
|
|
{
|
|
throw ( 'ActivityBase.startAnimation: abstract method invoked' );
|
|
};
|
|
|
|
ActivityBase.prototype.endAnimation = function()
|
|
{
|
|
throw ( 'ActivityBase.endAnimation: abstract method invoked' );
|
|
};
|
|
|
|
ActivityBase.prototype.endActivity = function()
|
|
{
|
|
this.bIsActive = false;
|
|
|
|
if( this.aEndEvent )
|
|
this.aTimerEventQueue.addEvent( this.aEndEvent );
|
|
|
|
this.aEndEvent = null;
|
|
|
|
};
|
|
|
|
ActivityBase.prototype.calcAcceleratedTime = function( nT )
|
|
{
|
|
|
|
|
|
nT = clamp( nT, 0.0, 1.0 );
|
|
|
|
if( ( this.nAccelerationFraction > 0.0 || this.nDecelerationFraction > 0.0 ) &&
|
|
( this.nAccelerationFraction + this.nDecelerationFraction <= 1.0 ) )
|
|
{
|
|
var nC = 1.0 - 0.5*this.nAccelerationFraction - 0.5*this.nDecelerationFraction;
|
|
|
|
var nTPrime = 0.0;
|
|
|
|
if( nT < this.nAccelerationFraction )
|
|
{
|
|
nTPrime += 0.5 * nT * nT / this.nAccelerationFraction; // partial first interval
|
|
}
|
|
else
|
|
{
|
|
nTPrime += 0.5 * this.nAccelerationFraction; // full first interval
|
|
|
|
if( nT <= ( 1.0 - this.nDecelerationFraction ) )
|
|
{
|
|
nTPrime += nT - this.nAccelerationFraction; // partial second interval
|
|
}
|
|
else
|
|
{
|
|
nTPrime += 1.0 - this.nAccelerationFraction - this.nDecelerationFraction; // full second interval
|
|
|
|
var nTRelative = nT - 1.0 + this.nDecelerationFraction;
|
|
|
|
nTPrime += nTRelative - 0.5*nTRelative*nTRelative / this.nDecelerationFraction;
|
|
}
|
|
}
|
|
|
|
nT = nTPrime / nC;
|
|
|
|
}
|
|
return nT;
|
|
};
|
|
|
|
ActivityBase.prototype.getEventQueue = function()
|
|
{
|
|
return this.aTimerEventQueue;
|
|
};
|
|
|
|
ActivityBase.prototype.getTargetElement = function()
|
|
{
|
|
return this.aTargetElement;
|
|
};
|
|
|
|
ActivityBase.prototype.isRepeatCountValid = function()
|
|
{
|
|
return !!this.nRepeats; // first ! convert to bool
|
|
};
|
|
|
|
ActivityBase.prototype.getRepeatCount = function()
|
|
{
|
|
return this.nRepeats;
|
|
};
|
|
|
|
ActivityBase.prototype.isAutoReverse = function()
|
|
{
|
|
return this.bAutoReverse;
|
|
};
|
|
|
|
ActivityBase.prototype.end = function()
|
|
{
|
|
if( !this.isActive() || this.isDisposed() )
|
|
return;
|
|
|
|
if( this.bFirstPerformCall )
|
|
{
|
|
this.bFirstPerformCall = false;
|
|
this.startAnimation();
|
|
}
|
|
|
|
this.performEnd();
|
|
this.endAnimation();
|
|
this.endActivity();
|
|
};
|
|
|
|
ActivityBase.prototype.performEnd = function()
|
|
{
|
|
throw ( 'ActivityBase.performEnd: abstract method invoked' );
|
|
};
|
|
|
|
|
|
function DiscreteActivityBase( aCommonParamSet )
|
|
{
|
|
DiscreteActivityBase.superclass.constructor.call( this, aCommonParamSet );
|
|
|
|
this.aOriginalWakeupEvent = aCommonParamSet.aWakeupEvent;
|
|
this.aOriginalWakeupEvent.setActivity( this );
|
|
this.aWakeupEvent = this.aOriginalWakeupEvent;
|
|
this.aWakeupEvent = aCommonParamSet.aWakeupEvent;
|
|
this.aDiscreteTimes = aCommonParamSet.aDiscreteTimes;
|
|
this.nMinSimpleDuration = aCommonParamSet.nMinDuration;
|
|
this.nCurrPerformCalls = 0;
|
|
}
|
|
extend( DiscreteActivityBase, ActivityBase );
|
|
|
|
|
|
DiscreteActivityBase.prototype.activate = function( aEndElement )
|
|
{
|
|
DiscreteActivityBase.superclass.activate.call( this, aEndElement );
|
|
|
|
this.aWakeupEvent = this.aOriginalWakeupEvent;
|
|
this.aWakeupEvent.setNextTimeout( 0 );
|
|
this.nCurrPerformCalls = 0;
|
|
};
|
|
|
|
DiscreteActivityBase.prototype.startAnimation = function()
|
|
{
|
|
this.aWakeupEvent.start();
|
|
};
|
|
|
|
DiscreteActivityBase.prototype.calcFrameIndex = function( nCurrCalls, nVectorSize )
|
|
{
|
|
if( this.isAutoReverse() )
|
|
{
|
|
var nFrameIndex = nCurrCalls % (2 * nVectorSize);
|
|
|
|
if( nFrameIndex >= nVectorSize )
|
|
nFrameIndex = 2*nVectorSize - nFrameIndex; // invert sweep
|
|
|
|
return nFrameIndex;
|
|
}
|
|
else
|
|
{
|
|
return nCurrCalls % nVectorSize;
|
|
}
|
|
};
|
|
|
|
DiscreteActivityBase.prototype.calcRepeatCount = function( nCurrCalls, nVectorSize )
|
|
{
|
|
if( this.isAutoReverse() )
|
|
{
|
|
return Math.floor( nCurrCalls / (2*nVectorSize) ); // we've got 2 cycles per repeat
|
|
}
|
|
else
|
|
{
|
|
return Math.floor( nCurrCalls / nVectorSize );
|
|
}
|
|
};
|
|
|
|
DiscreteActivityBase.prototype.performDiscreteHook = function( /*nFrame, nRepeatCount*/ )
|
|
{
|
|
throw ( 'DiscreteActivityBase.performDiscreteHook: abstract method invoked' );
|
|
};
|
|
|
|
DiscreteActivityBase.prototype.perform = function()
|
|
{
|
|
if( !SimpleContinuousActivityBase.superclass.perform.call( this ) )
|
|
return false; // done, we're ended
|
|
|
|
var nVectorSize = this.aDiscreteTimes.length;
|
|
|
|
var nFrameIndex = this.calcFrameIndex(this.nCurrPerformCalls, nVectorSize);
|
|
var nRepeatCount = this.calcRepeatCount( this.nCurrPerformCalls, nVectorSize );
|
|
this.performDiscreteHook( nFrameIndex, nRepeatCount );
|
|
|
|
++this.nCurrPerformCalls;
|
|
|
|
var nCurrRepeat = this.nCurrPerformCalls / nVectorSize;
|
|
|
|
if( this.isAutoReverse() )
|
|
nCurrRepeat /= 2;
|
|
|
|
if( !this.isRepeatCountValid() || nCurrRepeat < this.getRepeatCount() )
|
|
{
|
|
|
|
|
|
nFrameIndex = this.calcFrameIndex(this.nCurrPerformCalls, nVectorSize);
|
|
var nCurrentRepeatTime = this.aDiscreteTimes[nFrameIndex];
|
|
nRepeatCount = this.calcRepeatCount( this.nCurrPerformCalls, nVectorSize );
|
|
var nNextTimeout = this.nMinSimpleDuration * ( nRepeatCount + this.calcAcceleratedTime( nCurrentRepeatTime ) );
|
|
this.aWakeupEvent.setNextTimeout( nNextTimeout );
|
|
|
|
this.getEventQueue().addEvent( this.aWakeupEvent );
|
|
}
|
|
else
|
|
{
|
|
this.aWakeupEvent = null;
|
|
|
|
this.endActivity();
|
|
}
|
|
|
|
return false; // remove from queue, will be added back by the wakeup event.
|
|
};
|
|
|
|
DiscreteActivityBase.prototype.dispose = function()
|
|
{
|
|
if( this.aWakeupEvent )
|
|
this.aWakeupEvent.dispose();
|
|
|
|
this.aWakeupEvent = null;
|
|
|
|
DiscreteActivityBase.superclass.dispose.call(this);
|
|
};
|
|
|
|
|
|
function SimpleContinuousActivityBase( aCommonParamSet )
|
|
{
|
|
SimpleContinuousActivityBase.superclass.constructor.call( this, aCommonParamSet );
|
|
|
|
this.aTimer = new ElapsedTime( aCommonParamSet.aActivityQueue.getTimer() );
|
|
this.nMinSimpleDuration = aCommonParamSet.nMinDuration;
|
|
this.nMinNumberOfFrames = aCommonParamSet.nMinNumberOfFrames;
|
|
this.nCurrPerformCalls = 0;
|
|
|
|
}
|
|
extend( SimpleContinuousActivityBase, ActivityBase );
|
|
|
|
|
|
SimpleContinuousActivityBase.prototype.startAnimation = function()
|
|
{
|
|
this.aTimer.reset();
|
|
};
|
|
|
|
SimpleContinuousActivityBase.prototype.calcTimeLag = function()
|
|
{
|
|
SimpleContinuousActivityBase.superclass.calcTimeLag.call( this );
|
|
|
|
if( !this.isActive() )
|
|
return 0.0;
|
|
|
|
var nCurrElapsedTime = this.aTimer.getElapsedTime();
|
|
|
|
|
|
var nFractionElapsedTime = nCurrElapsedTime / this.nMinSimpleDuration;
|
|
|
|
var nFractionRequiredCalls = this.nCurrPerformCalls / this.nMinNumberOfFrames;
|
|
|
|
|
|
if( nFractionElapsedTime < nFractionRequiredCalls )
|
|
{
|
|
return 0.0;
|
|
}
|
|
else
|
|
{
|
|
return ( ( nFractionElapsedTime - nFractionRequiredCalls ) * this.nMinSimpleDuration );
|
|
}
|
|
};
|
|
|
|
SimpleContinuousActivityBase.prototype.perform = function()
|
|
{
|
|
if( !SimpleContinuousActivityBase.superclass.perform.call( this ) )
|
|
return false; // done, we're ended
|
|
|
|
var nCurrElapsedTime = this.aTimer.getElapsedTime();
|
|
var nT = nCurrElapsedTime / this.nMinSimpleDuration;
|
|
|
|
|
|
var bActivityEnding = false;
|
|
|
|
if( this.isRepeatCountValid() )
|
|
{
|
|
|
|
var nRepeatCount = this.getRepeatCount();
|
|
var nEffectiveRepeat = this.isAutoReverse() ? 2.0 * nRepeatCount : nRepeatCount;
|
|
|
|
if( nEffectiveRepeat <= nT )
|
|
{
|
|
bActivityEnding = true;
|
|
|
|
nT = nEffectiveRepeat;
|
|
}
|
|
}
|
|
|
|
|
|
var nRepeats;
|
|
var nRelativeSimpleTime;
|
|
if( this.isAutoReverse() )
|
|
{
|
|
nRepeats = Math.floor( nT );
|
|
var nFractionalActiveDuration = nT - nRepeats;
|
|
|
|
if( nRepeats % 2 )
|
|
{
|
|
nRelativeSimpleTime = 1.0 - nFractionalActiveDuration;
|
|
}
|
|
else
|
|
{
|
|
nRelativeSimpleTime = nFractionalActiveDuration;
|
|
}
|
|
|
|
nRepeats /= 2;
|
|
}
|
|
else
|
|
{
|
|
|
|
nRepeats = Math.floor( nT );
|
|
nRelativeSimpleTime = nT - nRepeats;
|
|
|
|
if( this.isRepeatCountValid() && ( nRepeats >= this.getRepeatCount() ) )
|
|
{
|
|
|
|
nRelativeSimpleTime = 1.0;
|
|
nRepeats -= 1.0;
|
|
}
|
|
}
|
|
|
|
|
|
this.simplePerform( nRelativeSimpleTime, nRepeats );
|
|
|
|
if( bActivityEnding )
|
|
this.endActivity();
|
|
|
|
++this.nCurrPerformCalls;
|
|
|
|
return this.isActive();
|
|
};
|
|
|
|
SimpleContinuousActivityBase.prototype.simplePerform = function( /*nSimpleTime, nRepeatCount*/ )
|
|
{
|
|
throw ( 'SimpleContinuousActivityBase.simplePerform: abstract method invoked' );
|
|
};
|
|
|
|
|
|
function ContinuousKeyTimeActivityBase( aCommonParamSet )
|
|
{
|
|
var nSize = aCommonParamSet.aDiscreteTimes.length;
|
|
assert( nSize > 1,
|
|
'ContinuousKeyTimeActivityBase constructor: assertion (aDiscreteTimes.length > 1) failed' );
|
|
|
|
assert( aCommonParamSet.aDiscreteTimes[0] == 0.0,
|
|
'ContinuousKeyTimeActivityBase constructor: assertion (aDiscreteTimes.front() == 0.0) failed' );
|
|
|
|
assert( aCommonParamSet.aDiscreteTimes[ nSize - 1 ] <= 1.0,
|
|
'ContinuousKeyTimeActivityBase constructor: assertion (aDiscreteTimes.back() <= 1.0) failed' );
|
|
|
|
ContinuousKeyTimeActivityBase.superclass.constructor.call( this, aCommonParamSet );
|
|
|
|
this.aLerper = new KeyStopLerp( aCommonParamSet.aDiscreteTimes );
|
|
}
|
|
extend( ContinuousKeyTimeActivityBase, SimpleContinuousActivityBase );
|
|
|
|
|
|
ContinuousKeyTimeActivityBase.prototype.activate = function( aEndElement )
|
|
{
|
|
ContinuousKeyTimeActivityBase.superclass.activate.call( this, aEndElement );
|
|
|
|
this.aLerper.reset();
|
|
};
|
|
|
|
ContinuousKeyTimeActivityBase.prototype.performContinuousHook = function( /*nIndex, nFractionalIndex, nRepeatCount*/ )
|
|
{
|
|
throw ( 'ContinuousKeyTimeActivityBase.performContinuousHook: abstract method invoked' );
|
|
};
|
|
|
|
ContinuousKeyTimeActivityBase.prototype.simplePerform = function( nSimpleTime, nRepeatCount )
|
|
{
|
|
var nAlpha = this.calcAcceleratedTime( nSimpleTime );
|
|
|
|
var aLerpResult = this.aLerper.lerp( nAlpha );
|
|
|
|
this.performContinuousHook( aLerpResult.nIndex, aLerpResult.nLerp, nRepeatCount );
|
|
};
|
|
|
|
|
|
function ContinuousActivityBase( aCommonParamSet )
|
|
{
|
|
ContinuousActivityBase.superclass.constructor.call( this, aCommonParamSet );
|
|
|
|
}
|
|
extend( ContinuousActivityBase, SimpleContinuousActivityBase );
|
|
|
|
|
|
ContinuousActivityBase.prototype.performContinuousHook = function( /*nModifiedTime, nRepeatCount*/ )
|
|
{
|
|
throw ( 'ContinuousActivityBase.performContinuousHook: abstract method invoked' );
|
|
};
|
|
|
|
ContinuousActivityBase.prototype.simplePerform = function( nSimpleTime, nRepeatCount )
|
|
{
|
|
this.performContinuousHook( this.calcAcceleratedTime( nSimpleTime ), nRepeatCount );
|
|
};
|
|
|
|
|
|
function SimpleActivity( aCommonParamSet, aNumberAnimation, eDirection )
|
|
{
|
|
assert( ( eDirection == BACKWARD ) || ( eDirection == FORWARD ),
|
|
'SimpleActivity constructor: animation direction is not valid' );
|
|
|
|
assert( aNumberAnimation, 'SimpleActivity constructor: animation object is not valid' );
|
|
|
|
SimpleActivity.superclass.constructor.call( this, aCommonParamSet );
|
|
|
|
this.aAnimation = aNumberAnimation;
|
|
this.nDirection = ( eDirection == FORWARD ) ? 1.0 : 0.0;
|
|
}
|
|
extend( SimpleActivity, ContinuousActivityBase );
|
|
|
|
|
|
SimpleActivity.prototype.startAnimation = function()
|
|
{
|
|
if( this.isDisposed() || !this.aAnimation )
|
|
return;
|
|
|
|
ANIMDBG.print( 'SimpleActivity.startAnimation invoked' );
|
|
SimpleActivity.superclass.startAnimation.call( this );
|
|
|
|
this.aAnimation.start( this.getTargetElement() );
|
|
};
|
|
|
|
SimpleActivity.prototype.endAnimation = function()
|
|
{
|
|
if( this.aAnimation )
|
|
this.aAnimation.end();
|
|
|
|
};
|
|
|
|
SimpleActivity.prototype.performContinuousHook = function( nModifiedTime /*, nRepeatCount*/ )
|
|
{
|
|
|
|
if( this.isDisposed() || !this.aAnimation )
|
|
return;
|
|
|
|
var nT = 1.0 - this.nDirection + nModifiedTime * ( 2.0*this.nDirection - 1.0 );
|
|
this.aAnimation.perform( nT );
|
|
};
|
|
|
|
SimpleActivity.prototype.performEnd = function()
|
|
{
|
|
if( this.aAnimation )
|
|
this.aAnimation.perform( this.nDirection );
|
|
};
|
|
|
|
|
|
function FromToByActivityTemplate( BaseType ) // template parameter
|
|
{
|
|
|
|
function FromToByActivity( aFromValue, aToValue, aByValue,
|
|
aActivityParamSet, aAnimation,
|
|
aInterpolator, aOperatorSet, bAccumulate )
|
|
{
|
|
assert( aAnimation, 'FromToByActivity constructor: invalid animation object' );
|
|
assert( ( aToValue != undefined ) || ( aByValue != undefined ),
|
|
'FromToByActivity constructor: one of aToValue or aByValue must be valid' );
|
|
|
|
FromToByActivity.superclass.constructor.call( this, aActivityParamSet );
|
|
|
|
this.aFrom = aFromValue;
|
|
this.aTo = aToValue;
|
|
this.aBy = aByValue;
|
|
this.aStartValue = null;
|
|
this.aEndValue = null;
|
|
this.aPreviousValue = null;
|
|
this.aStartInterpolationValue = null;
|
|
this.aAnimation = aAnimation;
|
|
this.aInterpolator = aInterpolator;
|
|
this.equal = aOperatorSet.equal;
|
|
this.add = aOperatorSet.add;
|
|
this.scale = aOperatorSet.scale;
|
|
this.bDynamicStartValue = false;
|
|
this.nIteration = 0;
|
|
this.bCumulative = bAccumulate;
|
|
this.aFormula = aActivityParamSet.aFormula;
|
|
}
|
|
extend( FromToByActivity, BaseType );
|
|
|
|
FromToByActivity.prototype.initAnimatedElement = function()
|
|
{
|
|
if( this.aAnimation && this.aFrom )
|
|
{
|
|
var aValue = this.aFormula ? this.aFormula( this.aFrom ) : this.aFrom;
|
|
this.aAnimation.perform(aValue);
|
|
}
|
|
};
|
|
|
|
FromToByActivity.prototype.startAnimation = function()
|
|
{
|
|
if( this.isDisposed() || !this.aAnimation )
|
|
{
|
|
log( 'FromToByActivity.startAnimation: activity disposed or not valid animation' );
|
|
return;
|
|
}
|
|
|
|
FromToByActivity.superclass.startAnimation.call( this );
|
|
|
|
this.aAnimation.start( this.getTargetElement() );
|
|
|
|
|
|
var aAnimationStartValue = this.aAnimation.getUnderlyingValue();
|
|
|
|
if( this.aFrom )
|
|
{
|
|
if( this.aTo )
|
|
{
|
|
this.aStartValue = this.aFrom;
|
|
this.aEndValue = this.aTo;
|
|
}
|
|
else if( this.aBy )
|
|
{
|
|
this.aStartValue = this.aFrom;
|
|
|
|
this.aEndValue = this.add( this.aStartValue, this.aBy );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.aStartValue = aAnimationStartValue;
|
|
this.aStartInterpolationValue = this.aStartValue;
|
|
|
|
if( this.aTo )
|
|
{
|
|
|
|
this.bDynamicStartValue = true;
|
|
this.aPreviousValue = this.aStartValue;
|
|
this.aEndValue = this.aTo;
|
|
}
|
|
else if( this.aBy )
|
|
{
|
|
this.aStartValue = aAnimationStartValue;
|
|
|
|
this.aEndValue = this.add( this.aStartValue, this.aBy );
|
|
}
|
|
}
|
|
|
|
ANIMDBG.print( 'FromToByActivity.startAnimation: aStartValue = ' + this.aStartValue + ', aEndValue = ' + this.aEndValue );
|
|
};
|
|
|
|
FromToByActivity.prototype.endAnimation = function()
|
|
{
|
|
if( this.aAnimation )
|
|
this.aAnimation.end();
|
|
};
|
|
|
|
FromToByActivity.prototype.performContinuousHook = function( nModifiedTime, nRepeatCount )
|
|
{
|
|
if( this.isDisposed() || !this.aAnimation )
|
|
{
|
|
log( 'FromToByActivity.performContinuousHook: activity disposed or not valid animation' );
|
|
return;
|
|
}
|
|
|
|
|
|
if( this.bDynamicStartValue )
|
|
{
|
|
if( this.nIteration != nRepeatCount )
|
|
{
|
|
this.nIteration = nRepeatCount;
|
|
this.aStartInterpolationValue = this.aStartValue;
|
|
}
|
|
else
|
|
{
|
|
var aActualValue = this.aAnimation.getUnderlyingValue();
|
|
if( !this.equal( aActualValue, this.aPreviousValue ) )
|
|
this.aStartInterpolationValue = aActualValue;
|
|
}
|
|
}
|
|
|
|
var aValue = this.aInterpolator( this.aStartInterpolationValue,
|
|
this.aEndValue, nModifiedTime );
|
|
|
|
if( this.bCumulative && !this.bDynamicStartValue )
|
|
{
|
|
aValue = this.add( this.scale( nRepeatCount, this.aEndValue ), aValue );
|
|
}
|
|
|
|
aValue = this.aFormula ? this.aFormula( aValue ) : aValue;
|
|
this.aAnimation.perform( aValue );
|
|
|
|
if( this.bDynamicStartValue )
|
|
{
|
|
this.aPreviousValue = this.aAnimation.getUnderlyingValue();
|
|
}
|
|
|
|
};
|
|
|
|
FromToByActivity.prototype.performDiscreteHook = function( /*nFrame, nRepeatCount*/ )
|
|
{
|
|
if (this.isDisposed() || !this.aAnimation) {
|
|
log('FromToByActivity.performDiscreteHook: activity disposed or not valid animation');
|
|
return;
|
|
}
|
|
};
|
|
|
|
FromToByActivity.prototype.performEnd = function()
|
|
{
|
|
if( this.aAnimation )
|
|
{
|
|
var aValue = this.isAutoReverse() ? this.aStartValue : this.aEndValue;
|
|
aValue = this.aFormula ? this.aFormula( aValue ) : aValue;
|
|
this.aAnimation.perform( aValue );
|
|
}
|
|
};
|
|
|
|
FromToByActivity.prototype.dispose = function()
|
|
{
|
|
FromToByActivity.superclass.dispose.call( this );
|
|
};
|
|
|
|
|
|
return FromToByActivity;
|
|
}
|
|
|
|
|
|
var LinearFromToByActivity = instantiate( FromToByActivityTemplate, ContinuousActivityBase );
|
|
var DiscreteFromToByActivity = instantiate( FromToByActivityTemplate, DiscreteActivityBase );
|
|
|
|
|
|
function ValueListActivityTemplate( BaseType ) // template parameter
|
|
{
|
|
|
|
function ValueListActivity( aValueList, aActivityParamSet,
|
|
aAnimation, aInterpolator,
|
|
aOperatorSet, bAccumulate )
|
|
{
|
|
assert( aAnimation, 'ValueListActivity constructor: invalid animation object' );
|
|
assert( aValueList.length != 0, 'ValueListActivity: value list is empty' );
|
|
|
|
ValueListActivity.superclass.constructor.call( this, aActivityParamSet );
|
|
|
|
this.aValueList = aValueList;
|
|
this.aAnimation = aAnimation;
|
|
this.aInterpolator = aInterpolator;
|
|
this.add = aOperatorSet.add;
|
|
this.scale = aOperatorSet.scale;
|
|
this.bCumulative = bAccumulate;
|
|
this.aLastValue = this.aValueList[ this.aValueList.length - 1 ];
|
|
this.aFormula = aActivityParamSet.aFormula;
|
|
}
|
|
extend( ValueListActivity, BaseType );
|
|
|
|
ValueListActivity.prototype.activate = function( aEndEvent )
|
|
{
|
|
ValueListActivity.superclass.activate.call( this, aEndEvent );
|
|
for( var i = 0; i < this.aValueList.length; ++i )
|
|
{
|
|
ANIMDBG.print( 'createValueListActivity: value[' + i + '] = ' + this.aValueList[i] );
|
|
}
|
|
};
|
|
|
|
ValueListActivity.prototype.initAnimatedElement = function()
|
|
{
|
|
if( this.aAnimation )
|
|
{
|
|
var aValue = this.aValueList[0];
|
|
aValue = this.aFormula ? this.aFormula( aValue ) : aValue;
|
|
this.aAnimation.perform(aValue);
|
|
}
|
|
};
|
|
|
|
ValueListActivity.prototype.startAnimation = function()
|
|
{
|
|
if( this.isDisposed() || !this.aAnimation )
|
|
{
|
|
log( 'ValueListActivity.startAnimation: activity disposed or not valid animation' );
|
|
return;
|
|
}
|
|
|
|
ValueListActivity.superclass.startAnimation.call( this );
|
|
|
|
this.aAnimation.start( this.getTargetElement() );
|
|
};
|
|
|
|
ValueListActivity.prototype.endAnimation = function()
|
|
{
|
|
if( this.aAnimation )
|
|
this.aAnimation.end();
|
|
};
|
|
|
|
ValueListActivity.prototype.performContinuousHook = function( nIndex, nFractionalIndex, nRepeatCount )
|
|
{
|
|
if( this.isDisposed() || !this.aAnimation )
|
|
{
|
|
log( 'ValueListActivity.performContinuousHook: activity disposed or not valid animation' );
|
|
return;
|
|
}
|
|
|
|
assert( ( nIndex + 1 ) < this.aValueList.length,
|
|
'ValueListActivity.performContinuousHook: assertion (nIndex + 1 < this.aValueList.length) failed' );
|
|
|
|
|
|
var aValue = this.aInterpolator( this.aValueList[ nIndex ],
|
|
this.aValueList[ nIndex+1 ],
|
|
nFractionalIndex );
|
|
|
|
if( this.bCumulative )
|
|
{
|
|
aValue = this.add( aValue, this.scale( nRepeatCount, this.aLastValue ) );
|
|
}
|
|
|
|
aValue = this.aFormula ? this.aFormula( aValue ) : aValue;
|
|
this.aAnimation.perform( aValue );
|
|
};
|
|
|
|
ValueListActivity.prototype.performDiscreteHook = function( nFrame, nRepeatCount )
|
|
{
|
|
if( this.isDisposed() || !this.aAnimation )
|
|
{
|
|
log( 'ValueListActivity.performDiscreteHook: activity disposed or not valid animation' );
|
|
return;
|
|
}
|
|
|
|
assert( nFrame < this.aValueList.length,
|
|
'ValueListActivity.performDiscreteHook: assertion ( nFrame < this.aValueList.length) failed' );
|
|
|
|
var aValue = this.aValueList[nFrame];
|
|
|
|
if( this.bCumulative )
|
|
{
|
|
aValue = this.add( aValue, this.scale( nRepeatCount, this.aLastValue ) );
|
|
}
|
|
|
|
aValue = this.aFormula ? this.aFormula( aValue ) : aValue;
|
|
this.aAnimation.perform( aValue );
|
|
};
|
|
|
|
ValueListActivity.prototype.performEnd = function()
|
|
{
|
|
if( this.aAnimation )
|
|
{
|
|
var aValue = this.aFormula ? this.aFormula( this.aLastValue ) : this.aLastValue;
|
|
this.aAnimation.perform( aValue );
|
|
}
|
|
};
|
|
|
|
ValueListActivity.prototype.dispose = function()
|
|
{
|
|
ValueListActivity.superclass.dispose.call( this );
|
|
};
|
|
|
|
|
|
return ValueListActivity;
|
|
}
|
|
|
|
|
|
var LinearValueListActivity = instantiate( ValueListActivityTemplate, ContinuousKeyTimeActivityBase );
|
|
var DiscreteValueListActivity = instantiate( ValueListActivityTemplate, DiscreteActivityBase );
|
|
|
|
|
|
function createActivity( aActivityParamSet, aAnimationNode, aAnimation, aInterpolator )
|
|
{
|
|
var eCalcMode = aAnimationNode.getCalcMode();
|
|
|
|
var sAttributeName = aAnimationNode.getAttributeName();
|
|
var aAttributeProp = aAttributeMap[ sAttributeName ];
|
|
|
|
var eValueType = aAttributeProp[ 'type' ];
|
|
var eValueSubtype = aAttributeProp[ 'subtype' ];
|
|
|
|
if( ! aInterpolator )
|
|
{
|
|
aInterpolator = aInterpolatorHandler.getInterpolator( eCalcMode,
|
|
eValueType,
|
|
eValueSubtype );
|
|
}
|
|
|
|
var bAccumulate = ( aAnimationNode.getAccumulate() === ACCUMULATE_MODE_SUM )
|
|
&& !( eValueType === BOOL_PROPERTY ||
|
|
eValueType === STRING_PROPERTY ||
|
|
eValueType === ENUM_PROPERTY );
|
|
|
|
if( aAnimationNode.getFormula() )
|
|
{
|
|
var sFormula = aAnimationNode.getFormula();
|
|
var reMath = /abs|sqrt|asin|acos|atan|sin|cos|tan|exp|log|min|max/g;
|
|
sFormula = sFormula.replace(reMath, 'Math.$&');
|
|
sFormula = sFormula.replace(/pi(?!\w)/g, 'Math.PI');
|
|
sFormula = sFormula.replace(/e(?!\w)/g, 'Math.E');
|
|
sFormula = sFormula.replace(/\$/g, '__PARAM0__');
|
|
|
|
var aAnimatedElement = aAnimationNode.getAnimatedElement();
|
|
var aBBox = aAnimatedElement.getBaseBBox();
|
|
|
|
var width = aBBox.width / aActivityParamSet.nSlideWidth;
|
|
var height = aBBox.height / aActivityParamSet.nSlideHeight;
|
|
var x = ( aBBox.x + aBBox.width / 2 ) / aActivityParamSet.nSlideWidth;
|
|
var y = ( aBBox.y + aBBox.height / 2 ) / aActivityParamSet.nSlideHeight;
|
|
|
|
aActivityParamSet.aFormula = function( __PARAM0__ ) {
|
|
|
|
return eval(sFormula);
|
|
};
|
|
}
|
|
|
|
aActivityParamSet.aDiscreteTimes = aAnimationNode.getKeyTimes();
|
|
|
|
var aValueSet = aAnimationNode.getValues();
|
|
var nValueSetSize = aValueSet.length;
|
|
|
|
if( nValueSetSize != 0 )
|
|
{
|
|
|
|
if( aActivityParamSet.aDiscreteTimes.length == 0 )
|
|
{
|
|
for( var i = 0; i < nValueSetSize; ++i )
|
|
aActivityParamSet.aDiscreteTimes[i].push( i / nValueSetSize );
|
|
}
|
|
|
|
switch( eCalcMode )
|
|
{
|
|
case CALC_MODE_DISCRETE:
|
|
aActivityParamSet.aWakeupEvent =
|
|
new WakeupEvent( aActivityParamSet.aTimerEventQueue.getTimer(),
|
|
aActivityParamSet.aActivityQueue );
|
|
|
|
return createValueListActivity( aActivityParamSet,
|
|
aAnimationNode,
|
|
aAnimation,
|
|
aInterpolator,
|
|
DiscreteValueListActivity,
|
|
bAccumulate,
|
|
eValueType );
|
|
|
|
default:
|
|
log( 'createActivity: unexpected calculation mode: ' + eCalcMode );
|
|
case CALC_MODE_PACED :
|
|
case CALC_MODE_SPLINE :
|
|
case CALC_MODE_LINEAR:
|
|
return createValueListActivity( aActivityParamSet,
|
|
aAnimationNode,
|
|
aAnimation,
|
|
aInterpolator,
|
|
LinearValueListActivity,
|
|
bAccumulate,
|
|
eValueType );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch( eCalcMode )
|
|
{
|
|
case CALC_MODE_DISCRETE:
|
|
log( 'createActivity: discrete calculation case not yet implemented' );
|
|
aActivityParamSet.aWakeupEvent =
|
|
new WakeupEvent( aActivityParamSet.aTimerEventQueue.getTimer(),
|
|
aActivityParamSet.aActivityQueue );
|
|
return createFromToByActivity( aActivityParamSet,
|
|
aAnimationNode,
|
|
aAnimation,
|
|
aInterpolator,
|
|
DiscreteFromToByActivity,
|
|
bAccumulate,
|
|
eValueType );
|
|
|
|
default:
|
|
log( 'createActivity: unexpected calculation mode: ' + eCalcMode );
|
|
case CALC_MODE_PACED :
|
|
case CALC_MODE_SPLINE :
|
|
case CALC_MODE_LINEAR:
|
|
return createFromToByActivity( aActivityParamSet,
|
|
aAnimationNode,
|
|
aAnimation,
|
|
aInterpolator,
|
|
LinearFromToByActivity,
|
|
bAccumulate,
|
|
eValueType );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function createValueListActivity( aActivityParamSet, aAnimationNode, aAnimation,
|
|
aInterpolator, ClassTemplateInstance, bAccumulate, eValueType )
|
|
{
|
|
var aAnimatedElement = aAnimationNode.getAnimatedElement();
|
|
var aOperatorSet = aOperatorSetMap[ eValueType ];
|
|
assert( aOperatorSet, 'createValueListActivity: no operator set found' );
|
|
|
|
var aValueSet = aAnimationNode.getValues();
|
|
|
|
var aValueList = [];
|
|
|
|
extractAttributeValues( eValueType,
|
|
aValueList,
|
|
aValueSet,
|
|
aAnimatedElement.getBaseBBox(),
|
|
aActivityParamSet.nSlideWidth,
|
|
aActivityParamSet.nSlideHeight );
|
|
|
|
for( var i = 0; i < aValueList.length; ++i )
|
|
{
|
|
ANIMDBG.print( 'createValueListActivity: value[' + i + '] = ' + aValueList[i] );
|
|
}
|
|
|
|
return new ClassTemplateInstance( aValueList, aActivityParamSet, aAnimation,
|
|
aInterpolator, aOperatorSet, bAccumulate );
|
|
}
|
|
|
|
|
|
function createFromToByActivity( aActivityParamSet, aAnimationNode, aAnimation,
|
|
aInterpolator, ClassTemplateInstance, bAccumulate, eValueType )
|
|
{
|
|
|
|
var aAnimatedElement = aAnimationNode.getAnimatedElement();
|
|
var aOperatorSet = aOperatorSetMap[ eValueType ];
|
|
assert( aOperatorSet, 'createFromToByActivity: no operator set found' );
|
|
|
|
var aValueSet = [];
|
|
aValueSet[0] = aAnimationNode.getFromValue();
|
|
aValueSet[1] = aAnimationNode.getToValue();
|
|
aValueSet[2] = aAnimationNode.getByValue();
|
|
|
|
ANIMDBG.print( 'createFromToByActivity: value type: ' + aValueTypeOutMap[eValueType] +
|
|
', aFrom = ' + aValueSet[0] +
|
|
', aTo = ' + aValueSet[1] +
|
|
', aBy = ' + aValueSet[2] );
|
|
|
|
var aValueList = [];
|
|
|
|
extractAttributeValues( eValueType,
|
|
aValueList,
|
|
aValueSet,
|
|
aAnimatedElement.getBaseBBox(),
|
|
aActivityParamSet.nSlideWidth,
|
|
aActivityParamSet.nSlideHeight );
|
|
|
|
ANIMDBG.print( 'createFromToByActivity: ' +
|
|
', aFrom = ' + aValueList[0] +
|
|
', aTo = ' + aValueList[1] +
|
|
', aBy = ' + aValueList[2] );
|
|
|
|
return new ClassTemplateInstance( aValueList[0], aValueList[1], aValueList[2],
|
|
aActivityParamSet, aAnimation,
|
|
aInterpolator, aOperatorSet, bAccumulate );
|
|
}
|
|
|
|
|
|
function extractAttributeValues( eValueType, aValueList, aValueSet, aBBox, nSlideWidth, nSlideHeight )
|
|
{
|
|
var i;
|
|
switch( eValueType )
|
|
{
|
|
case NUMBER_PROPERTY :
|
|
evalValuesAttribute( aValueList, aValueSet, aBBox, nSlideWidth, nSlideHeight );
|
|
break;
|
|
case BOOL_PROPERTY :
|
|
for( i = 0; i < aValueSet.length; ++i )
|
|
{
|
|
var aValue = booleanParser( aValueSet[i] );
|
|
aValueList.push( aValue );
|
|
}
|
|
break;
|
|
case STRING_PROPERTY :
|
|
for( i = 0; i < aValueSet.length; ++i )
|
|
{
|
|
aValueList.push( aValueSet[i] );
|
|
}
|
|
break;
|
|
case ENUM_PROPERTY :
|
|
for( i = 0; i < aValueSet.length; ++i )
|
|
{
|
|
aValueList.push( aValueSet[i] );
|
|
}
|
|
break;
|
|
case COLOR_PROPERTY :
|
|
for( i = 0; i < aValueSet.length; ++i )
|
|
{
|
|
aValue = colorParser( aValueSet[i] );
|
|
aValueList.push( aValue );
|
|
}
|
|
break;
|
|
case TUPLE_NUMBER_PROPERTY :
|
|
for( i = 0; i < aValueSet.length; ++i )
|
|
{
|
|
if( typeof aValueSet[i] === 'string' )
|
|
{
|
|
var aTuple = aValueSet[i].split(',');
|
|
aValue = [];
|
|
evalValuesAttribute(aValue, aTuple, aBBox, nSlideWidth, nSlideHeight);
|
|
aValueList.push(aValue);
|
|
}
|
|
else
|
|
{
|
|
aValueList.push( undefined );
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
log( 'createValueListActivity: unexpected value type: ' + eValueType );
|
|
}
|
|
|
|
}
|
|
|
|
|
|
function evalValuesAttribute( aValueList, aValueSet, aBBox, nSlideWidth, nSlideHeight )
|
|
{
|
|
var width = aBBox.width / nSlideWidth;
|
|
var height = aBBox.height / nSlideHeight;
|
|
var x = ( aBBox.x + aBBox.width / 2 ) / nSlideWidth;
|
|
var y = ( aBBox.y + aBBox.height / 2 ) / nSlideHeight;
|
|
|
|
var reMath = /abs|sqrt|asin|acos|atan|sin|cos|tan|exp|log|min|max/g;
|
|
|
|
for( var i = 0; i < aValueSet.length; ++i )
|
|
{
|
|
var sValue = aValueSet[i];
|
|
if(sValue)
|
|
{
|
|
sValue = sValue.replace(reMath, 'Math.$&');
|
|
sValue = sValue.replace(/pi(?!\w)/g, 'Math.PI');
|
|
sValue = sValue.replace(/e(?!\w)/g, 'Math.E');
|
|
}
|
|
var aValue = eval( sValue );
|
|
aValueList.push( aValue );
|
|
}
|
|
}
|
|
|
|
|
|
var BACKWARD = 0;
|
|
var FORWARD = 1;
|
|
|
|
var MAXIMUM_FRAME_COUNT = 60;
|
|
var MINIMUM_TIMEOUT = 1.0 / MAXIMUM_FRAME_COUNT;
|
|
var MAXIMUM_TIMEOUT = 4.0;
|
|
var MINIMUM_FRAMES_PER_SECONDS = 10;
|
|
var PREFERRED_FRAMES_PER_SECONDS = 50;
|
|
var PREFERRED_FRAME_RATE = 1.0 / PREFERRED_FRAMES_PER_SECONDS;
|
|
|
|
|
|
function Effect( nId )
|
|
{
|
|
this.nId = ( typeof( nId ) === typeof( 1 ) ) ? nId : -1;
|
|
this.eState = Effect.NOT_STARTED;
|
|
}
|
|
Effect.NOT_STARTED = 0;
|
|
Effect.PLAYING = 1;
|
|
Effect.ENDED = 2;
|
|
|
|
Effect.prototype.getId = function()
|
|
{
|
|
return this.nId;
|
|
};
|
|
|
|
Effect.prototype.isMainEffect = function()
|
|
{
|
|
return ( this.nId === -1 );
|
|
};
|
|
|
|
Effect.prototype.isPlaying = function()
|
|
{
|
|
return ( this.eState === Effect.PLAYING );
|
|
};
|
|
|
|
Effect.prototype.isEnded = function()
|
|
{
|
|
return ( this.eState === Effect.ENDED );
|
|
};
|
|
|
|
Effect.prototype.start = function()
|
|
{
|
|
assert( this.eState === Effect.NOT_STARTED, 'Effect.start: wrong state.' );
|
|
this.eState = Effect.PLAYING;
|
|
};
|
|
|
|
Effect.prototype.end = function()
|
|
{
|
|
assert( this.eState === Effect.PLAYING, 'Effect.end: wrong state.' );
|
|
this.eState = Effect.ENDED;
|
|
};
|
|
|
|
|
|
function SlideShow()
|
|
{
|
|
this.aTimer = new ElapsedTime();
|
|
this.aFrameSynchronization = new FrameSynchronization( PREFERRED_FRAME_RATE );
|
|
this.aTimerEventQueue = new TimerEventQueue( this.aTimer );
|
|
this.aActivityQueue = new ActivityQueue( this.aTimer );
|
|
this.aNextEffectEventArray = null;
|
|
this.aInteractiveAnimationSequenceMap = null;
|
|
this.aEventMultiplexer = null;
|
|
|
|
this.aContext = new SlideShowContext( this.aTimerEventQueue,
|
|
this.aEventMultiplexer,
|
|
this.aNextEffectEventArray,
|
|
this.aInteractiveAnimationSequenceMap,
|
|
this.aActivityQueue );
|
|
this.bIsIdle = true;
|
|
this.bIsEnabled = true;
|
|
this.bNoSlideTransition = false;
|
|
this.bIsTransitionRunning = false;
|
|
|
|
this.nCurrentEffect = 0;
|
|
this.bIsNextEffectRunning = false;
|
|
this.bIsRewinding = false;
|
|
this.bIsSkipping = false;
|
|
this.bIsSkippingAll = false;
|
|
this.nTotalInteractivePlayingEffects = 0;
|
|
this.aStartedEffectList = [];
|
|
this.aStartedEffectIndexMap = {};
|
|
this.aStartedEffectIndexMap[ -1 ] = undefined;
|
|
this.automaticAdvanceTimeout = null;
|
|
}
|
|
|
|
SlideShow.prototype.setSlideEvents = function( aNextEffectEventArray,
|
|
aInteractiveAnimationSequenceMap,
|
|
aEventMultiplexer )
|
|
{
|
|
if( !aNextEffectEventArray )
|
|
log( 'SlideShow.setSlideEvents: aNextEffectEventArray is not valid' );
|
|
|
|
if( !aInteractiveAnimationSequenceMap )
|
|
log( 'SlideShow.setSlideEvents:aInteractiveAnimationSequenceMap is not valid' );
|
|
|
|
if( !aEventMultiplexer )
|
|
log( 'SlideShow.setSlideEvents: aEventMultiplexer is not valid' );
|
|
|
|
this.aContext.aNextEffectEventArray = aNextEffectEventArray;
|
|
this.aNextEffectEventArray = aNextEffectEventArray;
|
|
this.aContext.aInteractiveAnimationSequenceMap = aInteractiveAnimationSequenceMap;
|
|
this.aInteractiveAnimationSequenceMap = aInteractiveAnimationSequenceMap;
|
|
this.aContext.aEventMultiplexer = aEventMultiplexer;
|
|
this.aEventMultiplexer = aEventMultiplexer;
|
|
this.nCurrentEffect = 0;
|
|
};
|
|
|
|
SlideShow.prototype.createSlideTransition = function( aSlideTransitionHandler, aLeavingSlide, aEnteringSlide, aTransitionEndEvent )
|
|
{
|
|
if( !aEnteringSlide )
|
|
{
|
|
log( 'SlideShow.createSlideTransition: entering slide element is not valid.' );
|
|
return null;
|
|
}
|
|
|
|
if( this.bNoSlideTransition ) return null;
|
|
|
|
var aAnimatedLeavingSlide = null;
|
|
if( aLeavingSlide )
|
|
aAnimatedLeavingSlide = new AnimatedSlide( aLeavingSlide );
|
|
var aAnimatedEnteringSlide = new AnimatedSlide( aEnteringSlide );
|
|
|
|
var aSlideTransition = aSlideTransitionHandler.createSlideTransition( aAnimatedLeavingSlide, aAnimatedEnteringSlide );
|
|
if( !aSlideTransition ) return null;
|
|
|
|
var nDuration = 0.001;
|
|
if( aSlideTransitionHandler.getDuration().isValue() )
|
|
{
|
|
nDuration = aSlideTransitionHandler.getDuration().getValue();
|
|
}
|
|
else
|
|
{
|
|
log( 'SlideShow.createSlideTransition: duration is not a number' );
|
|
}
|
|
|
|
var aCommonParameterSet = new ActivityParamSet();
|
|
aCommonParameterSet.aEndEvent = aTransitionEndEvent;
|
|
aCommonParameterSet.aTimerEventQueue = this.aTimerEventQueue;
|
|
aCommonParameterSet.aActivityQueue = this.aActivityQueue;
|
|
aCommonParameterSet.nMinDuration = nDuration;
|
|
aCommonParameterSet.nMinNumberOfFrames = aSlideTransitionHandler.getMinFrameCount();
|
|
aCommonParameterSet.nSlideWidth = WIDTH;
|
|
aCommonParameterSet.nSlideHeight = HEIGHT;
|
|
|
|
return new SimpleActivity( aCommonParameterSet, aSlideTransition, FORWARD );
|
|
|
|
};
|
|
|
|
SlideShow.prototype.isEnabled = function()
|
|
{
|
|
return this.bIsEnabled;
|
|
};
|
|
|
|
SlideShow.prototype.isRunning = function()
|
|
{
|
|
return !this.bIsIdle;
|
|
};
|
|
|
|
SlideShow.prototype.isTransitionPlaying = function()
|
|
{
|
|
return this.bIsTransitionRunning;
|
|
};
|
|
|
|
SlideShow.prototype.isMainEffectPlaying = function()
|
|
{
|
|
return this.bIsNextEffectRunning;
|
|
};
|
|
|
|
SlideShow.prototype.isInteractiveEffectPlaying = function()
|
|
{
|
|
return ( this.nTotalInteractivePlayingEffects > 0 );
|
|
};
|
|
|
|
SlideShow.prototype.isAnyEffectPlaying = function()
|
|
{
|
|
return ( this.isMainEffectPlaying() || this.isInteractiveEffectPlaying() );
|
|
};
|
|
|
|
SlideShow.prototype.hasAnyEffectStarted = function()
|
|
{
|
|
return ( this.aStartedEffectList.length > 0 );
|
|
};
|
|
|
|
SlideShow.prototype.notifyNextEffectStart = function()
|
|
{
|
|
assert( !this.bIsNextEffectRunning,
|
|
'SlideShow.notifyNextEffectStart: an effect is already started.' );
|
|
this.bIsNextEffectRunning = true;
|
|
this.aEventMultiplexer.registerNextEffectEndHandler( bind2( SlideShow.prototype.notifyNextEffectEnd, this ) );
|
|
var aEffect = new Effect();
|
|
aEffect.start();
|
|
this.aStartedEffectIndexMap[ -1 ] = this.aStartedEffectList.length;
|
|
this.aStartedEffectList.push( aEffect );
|
|
|
|
var aAnimatedElementMap = theMetaDoc.aMetaSlideSet[nCurSlide].aSlideAnimationsHandler.aAnimatedElementMap;
|
|
for( var sId in aAnimatedElementMap )
|
|
aAnimatedElementMap[ sId ].notifyNextEffectStart( this.nCurrentEffect );
|
|
};
|
|
|
|
SlideShow.prototype.notifyNextEffectEnd = function()
|
|
{
|
|
assert( this.bIsNextEffectRunning,
|
|
'SlideShow.notifyNextEffectEnd: effect already ended.' );
|
|
this.bIsNextEffectRunning = false;
|
|
|
|
this.aStartedEffectList[ this.aStartedEffectIndexMap[ -1 ] ].end();
|
|
if( this.automaticAdvanceTimeout !== null )
|
|
{
|
|
if( this.automaticAdvanceTimeout['rewindedEffect'] === this.nCurrentEffect )
|
|
{
|
|
this.automaticAdvanceTimeout = null;
|
|
this.notifyAnimationsEnd();
|
|
}
|
|
}
|
|
};
|
|
|
|
SlideShow.prototype.notifyAnimationsEnd = function()
|
|
{
|
|
if( nCurSlide + 1 === theMetaDoc.nNumberOfSlides )
|
|
return;
|
|
|
|
assert (this.automaticAdvanceTimeout === null,
|
|
'SlideShow.notifyAnimationsEnd: Timeout already set.')
|
|
|
|
var nTimeout = Math.ceil(theMetaDoc.aMetaSlideSet[nCurSlide].fDuration * 1000);
|
|
if( nTimeout < 0 )
|
|
return;
|
|
|
|
this.automaticAdvanceTimeout = window.setTimeout('switchSlide(1, false)', nTimeout);
|
|
};
|
|
|
|
SlideShow.prototype.notifySlideStart = function( nNewSlideIndex, nOldSlideIndex )
|
|
{
|
|
this.nCurrentEffect = 0;
|
|
this.bIsRewinding = false;
|
|
this.bIsSkipping = false;
|
|
this.bIsSkippingAll = false;
|
|
this.nTotalInteractivePlayingEffects = 0;
|
|
this.aStartedEffectList = [];
|
|
this.aStartedEffectIndexMap = {};
|
|
this.aStartedEffectIndexMap[ -1 ] = undefined;
|
|
|
|
var aAnimatedElementMap;
|
|
var sId;
|
|
if( nOldSlideIndex !== undefined )
|
|
{
|
|
aAnimatedElementMap = theMetaDoc.aMetaSlideSet[nOldSlideIndex].aSlideAnimationsHandler.aAnimatedElementMap;
|
|
for( sId in aAnimatedElementMap )
|
|
aAnimatedElementMap[ sId ].notifySlideEnd();
|
|
}
|
|
|
|
aAnimatedElementMap = theMetaDoc.aMetaSlideSet[nNewSlideIndex].aSlideAnimationsHandler.aAnimatedElementMap;
|
|
for( sId in aAnimatedElementMap )
|
|
aAnimatedElementMap[ sId ].notifySlideStart( this.aContext );
|
|
};
|
|
|
|
SlideShow.prototype.notifyTransitionEnd = function( nSlideIndex )
|
|
{
|
|
if( theMetaDoc.getCurrentSlide() )
|
|
{
|
|
var sRef = 'url(#' + aPresentationClipPathId + ')';
|
|
theMetaDoc.getCurrentSlide().slideElement.setAttribute('clip-path', sRef);
|
|
}
|
|
|
|
this.bIsTransitionRunning = false;
|
|
if( this.bIsRewinding )
|
|
{
|
|
theMetaDoc.aMetaSlideSet[nSlideIndex].hide();
|
|
var nIndex = nCurSlide !== undefined ? nCurSlide : -1;
|
|
this.displaySlide( nIndex, true );
|
|
this.skipAllEffects();
|
|
this.bIsRewinding = false;
|
|
return;
|
|
}
|
|
|
|
theMetaDoc.setCurrentSlide(nSlideIndex);
|
|
|
|
if( this.aSlideViewElement )
|
|
{
|
|
theMetaDoc.getCurrentSlide().aVisibilityStatusElement.parentNode.removeChild( this.aSlideViewElement );
|
|
this.aSlideViewElement = null;
|
|
}
|
|
if( this.isEnabled() )
|
|
{
|
|
this.dispose();
|
|
|
|
var aCurrentSlide = theMetaDoc.getCurrentSlide();
|
|
if( aCurrentSlide.aSlideAnimationsHandler.elementsParsed() )
|
|
{
|
|
aCurrentSlide.aSlideAnimationsHandler.start();
|
|
this.aEventMultiplexer.registerAnimationsEndHandler( bind2( SlideShow.prototype.notifyAnimationsEnd, this ) );
|
|
}
|
|
else
|
|
this.notifyAnimationsEnd();
|
|
|
|
this.update();
|
|
}
|
|
else
|
|
this.notifyAnimationsEnd();
|
|
};
|
|
|
|
SlideShow.prototype.notifyInteractiveAnimationSequenceStart = function( nNodeId )
|
|
{
|
|
++this.nTotalInteractivePlayingEffects;
|
|
var aEffect = new Effect( nNodeId );
|
|
aEffect.start();
|
|
this.aStartedEffectIndexMap[ nNodeId ] = this.aStartedEffectList.length;
|
|
this.aStartedEffectList.push( aEffect );
|
|
};
|
|
|
|
SlideShow.prototype.notifyInteractiveAnimationSequenceEnd = function( nNodeId )
|
|
{
|
|
assert( this.isInteractiveEffectPlaying(),
|
|
'SlideShow.notifyInteractiveAnimationSequenceEnd: no interactive effect playing.' );
|
|
|
|
this.aStartedEffectList[ this.aStartedEffectIndexMap[ nNodeId ] ].end();
|
|
--this.nTotalInteractivePlayingEffects;
|
|
};
|
|
|
|
SlideShow.prototype.nextEffect = function()
|
|
{
|
|
if( !this.isEnabled() )
|
|
return false;
|
|
|
|
if( this.isTransitionPlaying() )
|
|
{
|
|
this.skipTransition();
|
|
return true;
|
|
}
|
|
|
|
if( this.isAnyEffectPlaying() )
|
|
{
|
|
this.skipAllPlayingEffects();
|
|
return true;
|
|
}
|
|
|
|
if( !this.aNextEffectEventArray )
|
|
return false;
|
|
|
|
if( this.nCurrentEffect >= this.aNextEffectEventArray.size() )
|
|
return false;
|
|
|
|
this.notifyNextEffectStart();
|
|
|
|
this.aNextEffectEventArray.at( this.nCurrentEffect ).fire();
|
|
++this.nCurrentEffect;
|
|
this.update();
|
|
return true;
|
|
};
|
|
|
|
SlideShow.prototype.skipTransition = function()
|
|
{
|
|
if( this.bIsSkipping || this.bIsRewinding )
|
|
return;
|
|
|
|
this.bIsSkipping = true;
|
|
|
|
this.aActivityQueue.endAll();
|
|
this.aTimerEventQueue.forceEmpty();
|
|
this.aActivityQueue.endAll();
|
|
this.update();
|
|
this.bIsSkipping = false;
|
|
};
|
|
|
|
SlideShow.prototype.skipAllPlayingEffects = function()
|
|
{
|
|
if( this.bIsSkipping || this.bIsRewinding )
|
|
return true;
|
|
|
|
this.bIsSkipping = true;
|
|
for( var i = 0; i < this.aStartedEffectList.length; ++i )
|
|
{
|
|
var aEffect = this.aStartedEffectList[i];
|
|
if( aEffect.isPlaying() )
|
|
{
|
|
if( aEffect.isMainEffect() )
|
|
this.aEventMultiplexer.notifySkipEffectEvent();
|
|
else
|
|
this.aEventMultiplexer.notifySkipInteractiveEffectEvent( aEffect.getId() );
|
|
}
|
|
}
|
|
this.update();
|
|
this.bIsSkipping = false;
|
|
return true;
|
|
};
|
|
|
|
SlideShow.prototype.skipNextEffect = function()
|
|
{
|
|
if( this.bIsSkipping || this.bIsRewinding )
|
|
return true;
|
|
|
|
assert( !this.isAnyEffectPlaying(),
|
|
'SlideShow.skipNextEffect' );
|
|
|
|
if( !this.aNextEffectEventArray )
|
|
return false;
|
|
|
|
if( this.nCurrentEffect >= this.aNextEffectEventArray.size() )
|
|
return false;
|
|
|
|
this.notifyNextEffectStart();
|
|
|
|
this.bIsSkipping = true;
|
|
this.aNextEffectEventArray.at( this.nCurrentEffect ).fire();
|
|
this.aEventMultiplexer.notifySkipEffectEvent();
|
|
++this.nCurrentEffect;
|
|
this.update();
|
|
this.bIsSkipping = false;
|
|
return true;
|
|
};
|
|
|
|
SlideShow.prototype.skipPlayingOrNextEffect = function()
|
|
{
|
|
if( this.isTransitionPlaying() )
|
|
{
|
|
this.skipTransition();
|
|
return true;
|
|
}
|
|
|
|
if( this.isAnyEffectPlaying() )
|
|
return this.skipAllPlayingEffects();
|
|
else
|
|
return this.skipNextEffect();
|
|
};
|
|
|
|
|
|
SlideShow.prototype.skipAllEffects = function()
|
|
{
|
|
if( this.bIsSkippingAll )
|
|
return true;
|
|
|
|
this.bIsSkippingAll = true;
|
|
|
|
if( this.isTransitionPlaying() )
|
|
{
|
|
this.skipTransition();
|
|
}
|
|
|
|
if( this.isAnyEffectPlaying() )
|
|
{
|
|
this.skipAllPlayingEffects();
|
|
}
|
|
else if( !this.aNextEffectEventArray
|
|
|| ( this.nCurrentEffect >= this.aNextEffectEventArray.size() ) )
|
|
{
|
|
this.bIsSkippingAll = false;
|
|
return false;
|
|
}
|
|
|
|
while( this.nCurrentEffect < this.aNextEffectEventArray.size() )
|
|
{
|
|
this.skipNextEffect();
|
|
}
|
|
this.bIsSkippingAll = false;
|
|
return true;
|
|
};
|
|
|
|
SlideShow.prototype.rewindTransition = function()
|
|
{
|
|
if( this.bIsSkipping || this.bIsRewinding )
|
|
return;
|
|
|
|
this.bIsRewinding = true;
|
|
this.aActivityQueue.endAll();
|
|
this.update();
|
|
this.bIsRewinding = false;
|
|
};
|
|
|
|
SlideShow.prototype.rewindEffect = function()
|
|
{
|
|
if( this.bIsSkipping || this.bIsRewinding )
|
|
return;
|
|
|
|
if( this.automaticAdvanceTimeout !== null && !this.automaticAdvanceTimeout['rewindedEffect'] )
|
|
{
|
|
window.clearTimeout( this.automaticAdvanceTimeout );
|
|
this.automaticAdvanceTimeout = { 'rewindedEffect': this.nCurrentEffect };
|
|
}
|
|
|
|
if( !this.hasAnyEffectStarted() )
|
|
{
|
|
this.rewindToPreviousSlide();
|
|
return;
|
|
}
|
|
|
|
this.bIsRewinding = true;
|
|
|
|
var nFirstPlayingEffectIndex = undefined;
|
|
|
|
var i = 0;
|
|
for( ; i < this.aStartedEffectList.length; ++i )
|
|
{
|
|
var aEffect = this.aStartedEffectList[i];
|
|
if( aEffect.isPlaying() )
|
|
{
|
|
nFirstPlayingEffectIndex = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( nFirstPlayingEffectIndex !== undefined )
|
|
{
|
|
i = this.aStartedEffectList.length - 1;
|
|
for( ; i >= nFirstPlayingEffectIndex; --i )
|
|
{
|
|
aEffect = this.aStartedEffectList[i];
|
|
if( aEffect.isPlaying() )
|
|
{
|
|
if( aEffect.isMainEffect() )
|
|
{
|
|
this.aEventMultiplexer.notifyRewindCurrentEffectEvent();
|
|
if( this.nCurrentEffect > 0 )
|
|
--this.nCurrentEffect;
|
|
}
|
|
else
|
|
{
|
|
this.aEventMultiplexer.notifyRewindRunningInteractiveEffectEvent( aEffect.getId() );
|
|
}
|
|
}
|
|
else if( aEffect.isEnded() )
|
|
{
|
|
if( aEffect.isMainEffect() )
|
|
{
|
|
this.aEventMultiplexer.notifyRewindLastEffectEvent();
|
|
if( this.nCurrentEffect > 0 )
|
|
--this.nCurrentEffect;
|
|
}
|
|
else
|
|
{
|
|
this.aEventMultiplexer.notifyRewindEndedInteractiveEffectEvent( aEffect.getId() );
|
|
}
|
|
}
|
|
}
|
|
this.update();
|
|
|
|
i = this.aStartedEffectList.length - 1;
|
|
for( ; i >= nFirstPlayingEffectIndex; --i )
|
|
{
|
|
aEffect = this.aStartedEffectList.pop();
|
|
if( !aEffect.isMainEffect() )
|
|
delete this.aStartedEffectIndexMap[ aEffect.getId() ];
|
|
}
|
|
}
|
|
else // there is no playing effect
|
|
{
|
|
aEffect = this.aStartedEffectList.pop();
|
|
if( !aEffect.isMainEffect() )
|
|
delete this.aStartedEffectIndexMap[ aEffect.getId() ];
|
|
if( aEffect.isEnded() ) // Well that is almost an assertion.
|
|
{
|
|
if( aEffect.isMainEffect() )
|
|
{
|
|
this.aEventMultiplexer.notifyRewindLastEffectEvent();
|
|
if( this.nCurrentEffect > 0 )
|
|
--this.nCurrentEffect;
|
|
}
|
|
else
|
|
{
|
|
this.aEventMultiplexer.notifyRewindEndedInteractiveEffectEvent( aEffect.getId() );
|
|
}
|
|
}
|
|
this.update();
|
|
}
|
|
|
|
this.bIsRewinding = false;
|
|
};
|
|
|
|
SlideShow.prototype.rewindToPreviousSlide = function()
|
|
{
|
|
if( this.isTransitionPlaying() )
|
|
{
|
|
this.rewindTransition();
|
|
return;
|
|
}
|
|
if( this.isAnyEffectPlaying() )
|
|
return;
|
|
var nNewSlide = nCurSlide - 1;
|
|
this.displaySlide( nNewSlide, true );
|
|
this.skipAllEffects();
|
|
};
|
|
|
|
SlideShow.prototype.rewindAllEffects = function()
|
|
{
|
|
if( !this.hasAnyEffectStarted() )
|
|
{
|
|
this.rewindToPreviousSlide();
|
|
return;
|
|
}
|
|
|
|
while( this.hasAnyEffectStarted() )
|
|
{
|
|
this.rewindEffect();
|
|
}
|
|
};
|
|
|
|
SlideShow.prototype.exitSlideShowInApp = function()
|
|
{
|
|
if (window.webkit !== undefined &&
|
|
window.webkit.messageHandlers !== undefined &&
|
|
window.webkit.messageHandlers.lok !== undefined)
|
|
window.webkit.messageHandlers.lok.postMessage('EXITSLIDESHOW', '*');
|
|
}
|
|
|
|
SlideShow.prototype.displaySlide = function( nNewSlide, bSkipSlideTransition )
|
|
{
|
|
var aMetaDoc = theMetaDoc;
|
|
var nSlides = aMetaDoc.nNumberOfSlides;
|
|
if( nNewSlide < 0 && nSlides > 0 )
|
|
nNewSlide = nSlides - 1;
|
|
else if( nNewSlide >= nSlides ) {
|
|
nNewSlide = 0;
|
|
this.exitSlideShowInApp();
|
|
}
|
|
|
|
if( ( currentMode === INDEX_MODE ) && ( nNewSlide === nCurSlide ) )
|
|
{
|
|
aMetaDoc.getCurrentSlide().show();
|
|
return;
|
|
}
|
|
|
|
if( this.isTransitionPlaying() )
|
|
{
|
|
this.skipTransition();
|
|
}
|
|
|
|
var nOldSlide = nCurSlide;
|
|
if( nOldSlide !== undefined )
|
|
{
|
|
var oldMetaSlide = aMetaDoc.aMetaSlideSet[nOldSlide];
|
|
if( this.isEnabled() )
|
|
{
|
|
if( oldMetaSlide.aSlideAnimationsHandler.isAnimated() )
|
|
{
|
|
oldMetaSlide.aSlideAnimationsHandler.end( bSkipSlideTransition );
|
|
|
|
this.dispose();
|
|
}
|
|
}
|
|
|
|
if( this.automaticAdvanceTimeout !== null )
|
|
{
|
|
window.clearTimeout( this.automaticAdvanceTimeout );
|
|
this.automaticAdvanceTimeout = null;
|
|
}
|
|
}
|
|
|
|
this.notifySlideStart( nNewSlide, nOldSlide );
|
|
|
|
if( this.isEnabled() && !bSkipSlideTransition )
|
|
{
|
|
if ( ( ( nOldSlide !== undefined ) &&
|
|
( ( nNewSlide > nOldSlide ) ||
|
|
( ( nNewSlide == 0) && ( nOldSlide == (aMetaDoc.nNumberOfSlides - 1) ) ) ) ) ||
|
|
( ( nOldSlide === undefined ) && ( nNewSlide == 0) ) // for transition on first slide
|
|
)
|
|
{
|
|
|
|
var aOldMetaSlide = null;
|
|
if( nOldSlide === undefined ) // for transition on first slide
|
|
{
|
|
aOldMetaSlide = aMetaDoc.theMetaDummySlide;
|
|
}
|
|
else
|
|
{
|
|
aOldMetaSlide = aMetaDoc.aMetaSlideSet[nOldSlide];
|
|
}
|
|
var aNewMetaSlide = aMetaDoc.aMetaSlideSet[nNewSlide];
|
|
|
|
var aSlideTransitionHandler = aNewMetaSlide.aTransitionHandler;
|
|
if( aSlideTransitionHandler && aSlideTransitionHandler.isValid() )
|
|
{
|
|
var sRef = 'url(#' + aPresentationClipPathShrinkId + ')';
|
|
aOldMetaSlide.slideElement.setAttribute( 'clip-path', sRef );
|
|
|
|
if( nOldSlide > nNewSlide )
|
|
{
|
|
this.aSlideViewElement = document.createElementNS( NSS['svg'], 'use' );
|
|
setNSAttribute( 'xlink', this.aSlideViewElement, 'href', '#' + aOldMetaSlide.slideContainerId );
|
|
aNewMetaSlide.aVisibilityStatusElement.parentNode.insertBefore( this.aSlideViewElement, aNewMetaSlide.aVisibilityStatusElement );
|
|
aOldMetaSlide.hide();
|
|
}
|
|
|
|
var aLeavingSlide = aOldMetaSlide;
|
|
var aEnteringSlide = aNewMetaSlide;
|
|
var aTransitionEndEvent = makeEvent( bind2( this.notifyTransitionEnd, this, nNewSlide ) );
|
|
|
|
var aTransitionActivity =
|
|
this.createSlideTransition( aSlideTransitionHandler, aLeavingSlide,
|
|
aEnteringSlide, aTransitionEndEvent );
|
|
|
|
if( aTransitionActivity )
|
|
{
|
|
this.bIsTransitionRunning = true;
|
|
this.aActivityQueue.addActivity( aTransitionActivity );
|
|
this.update();
|
|
}
|
|
else
|
|
{
|
|
this.notifyTransitionEnd( nNewSlide );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.notifyTransitionEnd( nNewSlide );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.notifyTransitionEnd( nNewSlide );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.notifyTransitionEnd( nNewSlide );
|
|
}
|
|
|
|
};
|
|
|
|
SlideShow.prototype.update = function()
|
|
{
|
|
this.aTimer.holdTimer();
|
|
|
|
this.aTimerEventQueue.process();
|
|
this.aActivityQueue.process();
|
|
|
|
this.aFrameSynchronization.synchronize();
|
|
|
|
this.aActivityQueue.processDequeued();
|
|
|
|
this.aTimer.releaseTimer();
|
|
|
|
var bActivitiesLeft = ( ! this.aActivityQueue.isEmpty() );
|
|
var bTimerEventsLeft = ( ! this.aTimerEventQueue.isEmpty() );
|
|
var bEventsLeft = ( bActivitiesLeft || bTimerEventsLeft );
|
|
|
|
|
|
if( bEventsLeft )
|
|
{
|
|
var nNextTimeout;
|
|
if( bActivitiesLeft )
|
|
{
|
|
nNextTimeout = MINIMUM_TIMEOUT;
|
|
this.aFrameSynchronization.activate();
|
|
}
|
|
else
|
|
{
|
|
nNextTimeout = this.aTimerEventQueue.nextTimeout();
|
|
if( nNextTimeout < MINIMUM_TIMEOUT )
|
|
nNextTimeout = MINIMUM_TIMEOUT;
|
|
else if( nNextTimeout > MAXIMUM_TIMEOUT )
|
|
nNextTimeout = MAXIMUM_TIMEOUT;
|
|
this.aFrameSynchronization.deactivate();
|
|
}
|
|
|
|
this.bIsIdle = false;
|
|
window.setTimeout( 'aSlideShow.update()', nNextTimeout * 1000 );
|
|
}
|
|
else
|
|
{
|
|
this.bIsIdle = true;
|
|
}
|
|
};
|
|
|
|
SlideShow.prototype.dispose = function()
|
|
{
|
|
this.aTimerEventQueue.clear();
|
|
this.aActivityQueue.clear();
|
|
this.aNextEffectEventArray = null;
|
|
this.aEventMultiplexer = null;
|
|
};
|
|
|
|
SlideShow.prototype.getContext = function()
|
|
{
|
|
return this.aContext;
|
|
};
|
|
|
|
var aSlideShow = null;
|
|
|
|
|
|
function SlideShowContext( aTimerEventQueue, aEventMultiplexer, aNextEffectEventArray, aInteractiveAnimationSequenceMap, aActivityQueue)
|
|
{
|
|
this.aTimerEventQueue = aTimerEventQueue;
|
|
this.aEventMultiplexer = aEventMultiplexer;
|
|
this.aNextEffectEventArray = aNextEffectEventArray;
|
|
this.aInteractiveAnimationSequenceMap = aInteractiveAnimationSequenceMap;
|
|
this.aActivityQueue = aActivityQueue;
|
|
this.bIsSkipping = false;
|
|
}
|
|
|
|
|
|
function FrameSynchronization( nFrameDuration )
|
|
{
|
|
this.nFrameDuration = nFrameDuration;
|
|
this.aTimer = new ElapsedTime();
|
|
this.nNextFrameTargetTime = 0.0;
|
|
this.bIsActive = false;
|
|
|
|
this.markCurrentFrame();
|
|
}
|
|
|
|
|
|
FrameSynchronization.prototype.markCurrentFrame = function()
|
|
{
|
|
this.nNextFrameTargetTime = this.aTimer.getElapsedTime() + this.nFrameDuration;
|
|
};
|
|
|
|
FrameSynchronization.prototype.synchronize = function()
|
|
{
|
|
if( this.bIsActive )
|
|
{
|
|
while( this.aTimer.getElapsedTime() < this.nNextFrameTargetTime )
|
|
;
|
|
}
|
|
|
|
this.markCurrentFrame();
|
|
|
|
};
|
|
|
|
FrameSynchronization.prototype.activate = function()
|
|
{
|
|
this.bIsActive = true;
|
|
};
|
|
|
|
FrameSynchronization.prototype.deactivate = function()
|
|
{
|
|
this.bIsActive = false;
|
|
};
|
|
|
|
|
|
function NextEffectEventArray()
|
|
{
|
|
this.aEventArray = [];
|
|
}
|
|
|
|
|
|
NextEffectEventArray.prototype.size = function()
|
|
{
|
|
return this.aEventArray.length;
|
|
};
|
|
|
|
NextEffectEventArray.prototype.at = function( nIndex )
|
|
{
|
|
return this.aEventArray[ nIndex ];
|
|
};
|
|
|
|
NextEffectEventArray.prototype.appendEvent = function( aEvent )
|
|
{
|
|
var nSize = this.size();
|
|
for( var i = 0; i < nSize; ++i )
|
|
{
|
|
if( this.aEventArray[i].getId() == aEvent.getId() )
|
|
{
|
|
aNextEffectEventArrayDebugPrinter.print( 'NextEffectEventArray.appendEvent: event(' + aEvent.getId() + ') already present' );
|
|
return false;
|
|
}
|
|
}
|
|
this.aEventArray.push( aEvent );
|
|
aNextEffectEventArrayDebugPrinter.print( 'NextEffectEventArray.appendEvent: event(' + aEvent.getId() + ') appended' );
|
|
return true;
|
|
};
|
|
|
|
NextEffectEventArray.prototype.clear = function( )
|
|
{
|
|
this.aEventArray = [];
|
|
};
|
|
|
|
|
|
function TimerEventQueue( aTimer )
|
|
{
|
|
this.aTimer = aTimer;
|
|
this.aEventSet = new PriorityQueue( EventEntry.compare );
|
|
}
|
|
|
|
|
|
TimerEventQueue.prototype.addEvent = function( aEvent )
|
|
{
|
|
this.DBG( 'TimerEventQueue.addEvent event(' + aEvent.getId() + ') appended.' );
|
|
if( !aEvent )
|
|
{
|
|
log( 'TimerEventQueue.addEvent: null event' );
|
|
return false;
|
|
}
|
|
|
|
var nTime = aEvent.getActivationTime( this.aTimer.getElapsedTime() );
|
|
var aEventEntry = new EventEntry( aEvent, nTime );
|
|
this.aEventSet.push( aEventEntry );
|
|
|
|
return true;
|
|
};
|
|
|
|
TimerEventQueue.prototype.forceEmpty = function()
|
|
{
|
|
this.process_(true);
|
|
};
|
|
|
|
|
|
TimerEventQueue.prototype.process = function()
|
|
{
|
|
this.process_(false);
|
|
};
|
|
|
|
TimerEventQueue.prototype.process_ = function( bFireAllEvents )
|
|
{
|
|
var nCurrentTime = this.aTimer.getElapsedTime();
|
|
|
|
while( !this.isEmpty() && ( bFireAllEvents || ( this.aEventSet.top().nActivationTime <= nCurrentTime ) ) )
|
|
{
|
|
var aEventEntry = this.aEventSet.top();
|
|
this.aEventSet.pop();
|
|
|
|
var aEvent = aEventEntry.aEvent;
|
|
if( aEvent.isCharged() )
|
|
aEvent.fire();
|
|
}
|
|
};
|
|
|
|
TimerEventQueue.prototype.isEmpty = function()
|
|
{
|
|
return this.aEventSet.isEmpty();
|
|
};
|
|
|
|
TimerEventQueue.prototype.nextTimeout = function()
|
|
{
|
|
var nTimeout = Number.MAX_VALUE;
|
|
var nCurrentTime = this.aTimer.getElapsedTime();
|
|
if( !this.isEmpty() )
|
|
nTimeout = this.aEventSet.top().nActivationTime - nCurrentTime;
|
|
return nTimeout;
|
|
};
|
|
|
|
TimerEventQueue.prototype.clear = function()
|
|
{
|
|
this.DBG( 'TimerEventQueue.clear invoked' );
|
|
this.aEventSet.clear();
|
|
};
|
|
|
|
TimerEventQueue.prototype.getTimer = function()
|
|
{
|
|
return this.aTimer;
|
|
};
|
|
|
|
TimerEventQueue.prototype.DBG = function( sMessage, nTime )
|
|
{
|
|
aTimerEventQueueDebugPrinter.print( sMessage, nTime );
|
|
};
|
|
|
|
|
|
TimerEventQueue.prototype.insert = function( aEventEntry )
|
|
{
|
|
var nHoleIndex = this.aEventSet.length;
|
|
var nParent = Math.floor( ( nHoleIndex - 1 ) / 2 );
|
|
|
|
while( ( nHoleIndex > 0 ) && this.aEventSet[ nParent ].compare( aEventEntry ) )
|
|
{
|
|
this.aEventSet[ nHoleIndex ] = this.aEventSet[ nParent ];
|
|
nHoleIndex = nParent;
|
|
nParent = Math.floor( ( nHoleIndex - 1 ) / 2 );
|
|
}
|
|
this.aEventSet[ nHoleIndex ] = aEventEntry;
|
|
};
|
|
|
|
|
|
function EventEntry( aEvent, nTime )
|
|
{
|
|
this.aEvent = aEvent;
|
|
this.nActivationTime = nTime;
|
|
}
|
|
|
|
|
|
EventEntry.compare = function( aLhsEventEntry, aRhsEventEntry )
|
|
{
|
|
if ( aLhsEventEntry.nActivationTime > aRhsEventEntry.nActivationTime )
|
|
{
|
|
return -1;
|
|
}
|
|
else if ( aLhsEventEntry.nActivationTime < aRhsEventEntry.nActivationTime )
|
|
{
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
|
|
function ActivityQueue( aTimer )
|
|
{
|
|
this.aTimer = aTimer;
|
|
this.aCurrentActivityWaitingSet = [];
|
|
this.aCurrentActivityReinsertSet = [];
|
|
this.aDequeuedActivitySet = [];
|
|
}
|
|
|
|
|
|
ActivityQueue.prototype.dispose = function()
|
|
{
|
|
var nSize = this.aCurrentActivityWaitingSet.length;
|
|
var i;
|
|
for( i = 0; i < nSize; ++i )
|
|
this.aCurrentActivityWaitingSet[i].dispose();
|
|
|
|
nSize = this.aCurrentActivityReinsertSet.length;
|
|
for( i = 0; i < nSize; ++i )
|
|
this.aCurrentActivityReinsertSet[i].dispose();
|
|
};
|
|
|
|
ActivityQueue.prototype.addActivity = function( aActivity )
|
|
{
|
|
if( !aActivity )
|
|
{
|
|
log( 'ActivityQueue.addActivity: activity is not valid' );
|
|
return false;
|
|
}
|
|
|
|
this.aCurrentActivityWaitingSet.push( aActivity );
|
|
aActivityQueueDebugPrinter.print( 'ActivityQueue.addActivity: activity appended' );
|
|
return true;
|
|
};
|
|
|
|
ActivityQueue.prototype.process = function()
|
|
{
|
|
var nSize = this.aCurrentActivityWaitingSet.length;
|
|
var nLag = 0.0;
|
|
for( var i = 0; i < nSize; ++i )
|
|
{
|
|
nLag = Math.max( nLag,this.aCurrentActivityWaitingSet[i].calcTimeLag() );
|
|
}
|
|
|
|
if( nLag > 0.0 )
|
|
this.aTimer.adjustTimer( -nLag, true );
|
|
|
|
|
|
while( this.aCurrentActivityWaitingSet.length != 0 )
|
|
{
|
|
var aActivity = this.aCurrentActivityWaitingSet.shift();
|
|
var bReinsert = false;
|
|
|
|
bReinsert = aActivity.perform();
|
|
|
|
if( bReinsert )
|
|
{
|
|
this.aCurrentActivityReinsertSet.push( aActivity );
|
|
}
|
|
else
|
|
{
|
|
this.aDequeuedActivitySet.push( aActivity );
|
|
}
|
|
}
|
|
|
|
if( this.aCurrentActivityReinsertSet.length != 0 )
|
|
{
|
|
this.aCurrentActivityWaitingSet = this.aCurrentActivityReinsertSet;
|
|
this.aCurrentActivityReinsertSet = [];
|
|
}
|
|
};
|
|
|
|
ActivityQueue.prototype.processDequeued = function()
|
|
{
|
|
var nSize = this.aDequeuedActivitySet.length;
|
|
for( var i = 0; i < nSize; ++i )
|
|
this.aDequeuedActivitySet[i].dequeued();
|
|
|
|
this.aDequeuedActivitySet = [];
|
|
};
|
|
|
|
ActivityQueue.prototype.isEmpty = function()
|
|
{
|
|
return ( ( this.aCurrentActivityWaitingSet.length == 0 ) &&
|
|
( this.aCurrentActivityReinsertSet.length == 0 ) );
|
|
};
|
|
|
|
ActivityQueue.prototype.clear = function()
|
|
{
|
|
aActivityQueueDebugPrinter.print( 'ActivityQueue.clear invoked' );
|
|
var nSize = this.aCurrentActivityWaitingSet.length;
|
|
var i;
|
|
for( i = 0; i < nSize; ++i )
|
|
this.aCurrentActivityWaitingSet[i].dequeued();
|
|
this.aCurrentActivityWaitingSet = [];
|
|
|
|
nSize = this.aCurrentActivityReinsertSet.length;
|
|
for( i = 0; i < nSize; ++i )
|
|
this.aCurrentActivityReinsertSet[i].dequeued();
|
|
this.aCurrentActivityReinsertSet = [];
|
|
};
|
|
|
|
ActivityQueue.prototype.endAll = function()
|
|
{
|
|
aActivityQueueDebugPrinter.print( 'ActivityQueue.endAll invoked' );
|
|
var nSize = this.aCurrentActivityWaitingSet.length;
|
|
var i;
|
|
for( i = 0; i < nSize; ++i )
|
|
this.aCurrentActivityWaitingSet[i].end();
|
|
this.aCurrentActivityWaitingSet = [];
|
|
|
|
nSize = this.aCurrentActivityReinsertSet.length;
|
|
for( i = 0; i < nSize; ++i )
|
|
this.aCurrentActivityReinsertSet[i].end();
|
|
this.aCurrentActivityReinsertSet = [];
|
|
};
|
|
|
|
ActivityQueue.prototype.getTimer = function()
|
|
{
|
|
return this.aTimer;
|
|
};
|
|
|
|
ActivityQueue.prototype.size = function()
|
|
{
|
|
return ( this.aCurrentActivityWaitingSet.length +
|
|
this.aCurrentActivityReinsertSet.length +
|
|
this.aDequeuedActivitySet.length );
|
|
};
|
|
|
|
|
|
function ElapsedTime( aTimeBase )
|
|
{
|
|
this.aTimeBase = aTimeBase;
|
|
this.nLastQueriedTime = 0.0;
|
|
this.nStartTime = this.getCurrentTime();
|
|
this.nFrozenTime = 0.0;
|
|
this.bInPauseMode = false;
|
|
this.bInHoldMode = false;
|
|
}
|
|
|
|
|
|
ElapsedTime.prototype.getTimeBase = function()
|
|
{
|
|
return this.aTimeBase;
|
|
};
|
|
|
|
ElapsedTime.prototype.reset = function()
|
|
{
|
|
this.nLastQueriedTime = 0.0;
|
|
this.nStartTime = this.getCurrentTime();
|
|
this.nFrozenTime = 0.0;
|
|
this.bInPauseMode = false;
|
|
this.bInHoldMode = false;
|
|
};
|
|
|
|
ElapsedTime.prototype.getElapsedTime = function()
|
|
{
|
|
this.nLastQueriedTime = this.getElapsedTimeImpl();
|
|
return this.nLastQueriedTime;
|
|
};
|
|
|
|
ElapsedTime.prototype.pauseTimer = function()
|
|
{
|
|
this.nFrozenTime = this.getElapsedTimeImpl();
|
|
this.bInPauseMode = true;
|
|
};
|
|
|
|
ElapsedTime.prototype.continueTimer = function()
|
|
{
|
|
this.bInPauseMode = false;
|
|
|
|
var nPauseDuration = this.getElapsedTimeImpl() - this.nFrozenTime;
|
|
|
|
this.nStartTime += nPauseDuration;
|
|
};
|
|
|
|
ElapsedTime.prototype.adjustTimer = function( nOffset, bLimitToLastQueriedTime )
|
|
{
|
|
if( bLimitToLastQueriedTime == undefined )
|
|
bLimitToLastQueriedTime = true;
|
|
|
|
this.nStartTime -= nOffset;
|
|
|
|
if( this.bInHoldMode || this.bInPauseMode )
|
|
this.nFrozenTime += nOffset;
|
|
};
|
|
|
|
ElapsedTime.prototype.holdTimer = function()
|
|
{
|
|
this.nFrozenTime = this.getElapsedTimeImpl();
|
|
this.bInHoldMode = true;
|
|
};
|
|
|
|
ElapsedTime.prototype.releaseTimer = function()
|
|
{
|
|
this.bInHoldMode = false;
|
|
};
|
|
|
|
ElapsedTime.prototype.getSystemTime = function()
|
|
{
|
|
return ( getCurrentSystemTime() / 1000.0 );
|
|
};
|
|
|
|
ElapsedTime.prototype.getCurrentTime = function()
|
|
{
|
|
var nCurrentTime;
|
|
if ( !this.aTimeBase )
|
|
{
|
|
nCurrentTime = this.getSystemTime();
|
|
}
|
|
else
|
|
{
|
|
nCurrentTime = this.aTimeBase.getElapsedTimeImpl();
|
|
}
|
|
|
|
assert( ( typeof( nCurrentTime ) === typeof( 0 ) ) && isFinite( nCurrentTime ),
|
|
'ElapsedTime.getCurrentTime: assertion failed: nCurrentTime == ' + nCurrentTime );
|
|
|
|
|
|
return nCurrentTime;
|
|
};
|
|
|
|
ElapsedTime.prototype.getElapsedTimeImpl = function()
|
|
{
|
|
if( this.bInHoldMode || this.bInPauseMode )
|
|
{
|
|
return this.nFrozenTime;
|
|
}
|
|
|
|
var nCurTime = this.getCurrentTime();
|
|
return ( nCurTime - this.nStartTime );
|
|
};
|
|
|
|
|
|
/*****
|
|
* @libreofficeend
|
|
*
|
|
* Several parts of the above code are the result of the porting,
|
|
* started on August 2011, of the C++ code included in the source files
|
|
* placed under the folder '/slideshow/source' and subfolders.
|
|
* @source https://cgit.freedesktop.org/libreoffice/core/tree/slideshow/source
|
|
*
|
|
*/
|
|
|
|
]]>
|
|
</script>
|
|
</svg> |