Fix pdf paging and make-units rendering (svg to png).
[src/app-framework-main.git] / docs / pictures / make-units.svg
index e998f3e..d52a8c7 100644 (file)
@@ -1,21 +1,11 @@
 <?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 28000 21000" 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" xml:space="preserve">
+<svg version="1.2" width="280mm" height="210mm" viewBox="0 0 28000 21000" 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" xml:space="preserve">
  <defs class="ClipPathGroup">
   <clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse">
    <rect x="0" y="0" width="28000" height="21000"/>
   </clipPath>
-  <clipPath id="presentation_clip_path_shrink" clipPathUnits="userSpaceOnUse">
-   <rect x="28" y="21" width="27944" height="20958"/>
-  </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: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"/>
    <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="u" horiz-adv-x="980" d="M 313,268 C 313,213 326,170 351,141 376,111 416,96 473,96 510,96 549,99 589,104 629,109 668,116 705,127 L 705,870 563,895 563,940 870,940 870,70 989,45 989,0 715,0 707,76 C 688,65 665,54 638,43 611,32 584,21 555,12 526,3 496,-5 467,-11 438,-17 411,-20 387,-20 351,-20 318,-15 289,-5 260,5 235,21 214,43 193,65 176,94 165,129 153,164 147,206 147,256 L 147,870 27,895 27,940 313,940 313,268 Z"/>
-   <glyph unicode="t" horiz-adv-x="557" 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 441,84 465,86 490,89 514,92 536,96 557,100 L 557,35 C 547,28 534,22 518,15 501,8 483,3 464,-3 444,-7 423,-12 401,-15 379,-18 357,-20 334,-20 Z"/>
    <glyph unicode="r" horiz-adv-x="636" d="M 664,965 L 664,711 621,711 563,821 C 544,821 524,820 503,817 482,814 460,811 439,807 418,802 397,797 378,791 358,785 341,779 326,772 L 326,70 487,45 487,0 41,0 41,45 160,70 160,870 41,895 41,940 315,940 324,823 C 339,836 360,850 387,867 414,883 443,898 474,913 505,928 536,940 567,950 598,960 625,965 649,965 L 664,965 Z"/>
-   <glyph unicode="o" horiz-adv-x="901" d="M 946,475 C 946,316 910,193 839,108 768,23 657,-20 506,-20 365,-20 258,22 186,107 114,192 78,314 78,475 78,634 114,755 186,839 258,923 367,965 514,965 657,965 764,924 837,842 910,759 946,637 946,475 Z M 766,475 C 766,540 762,598 753,649 744,700 730,743 710,778 689,813 662,839 629,858 596,876 555,885 506,885 457,885 416,876 384,858 352,839 327,813 308,778 289,743 276,700 269,649 262,598 258,540 258,475 258,410 262,351 269,300 276,249 289,205 308,170 327,134 352,107 384,88 416,69 457,59 506,59 555,59 596,69 629,88 662,107 689,134 710,170 730,205 744,249 753,300 762,351 766,410 766,475 Z"/>
    <glyph unicode="n" horiz-adv-x="980" d="M 324,864 C 343,875 365,886 391,898 416,910 443,921 471,931 499,941 527,949 555,956 583,962 609,965 633,965 669,965 702,960 732,950 762,940 788,924 810,902 831,880 848,851 861,816 873,781 879,738 879,688 L 879,70 993,45 993,0 588,0 588,45 713,70 713,670 C 713,725 700,769 673,801 646,832 604,848 547,848 528,848 509,847 488,845 467,843 447,841 427,838 407,835 388,832 371,829 353,825 338,822 326,819 L 326,70 453,45 453,0 47,0 47,45 160,70 160,870 47,895 47,940 315,940 324,864 Z"/>
    <glyph unicode="m" horiz-adv-x="1536" d="M 326,864 C 345,875 367,886 393,898 418,910 445,921 472,931 499,941 527,949 555,956 583,962 609,965 633,965 679,965 722,956 761,939 800,922 829,894 848,856 869,868 895,881 925,894 955,907 986,918 1019,929 1051,940 1083,948 1115,955 1146,962 1175,965 1200,965 1236,965 1269,960 1298,950 1327,940 1353,924 1374,902 1395,880 1411,851 1423,816 1434,781 1440,738 1440,688 L 1440,70 1561,45 1561,0 1134,0 1134,45 1274,70 1274,670 C 1274,725 1262,768 1237,798 1212,827 1171,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 528,842 509,841 489,839 468,837 448,835 429,832 409,829 390,826 373,823 355,819 340,816 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="504" d="M 379,1247 C 379,1232 376,1219 371,1206 365,1193 357,1181 347,1171 337,1161 325,1153 312,1148 299,1142 285,1139 270,1139 255,1139 242,1142 229,1148 216,1153 204,1161 194,1171 184,1181 176,1193 171,1206 165,1219 162,1232 162,1247 162,1262 165,1276 171,1289 176,1302 184,1314 194,1324 204,1334 216,1342 229,1348 242,1353 255,1356 270,1356 285,1356 299,1353 312,1348 325,1342 337,1334 347,1324 357,1314 365,1302 371,1289 376,1276 379,1262 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="f" horiz-adv-x="636" d="M 225,856 L 63,856 63,905 225,944 225,1010 C 225,1081 232,1143 247,1197 261,1250 282,1295 309,1332 336,1368 369,1395 408,1414 447,1433 490,1442 539,1442 569,1442 596,1440 619,1437 642,1433 663,1428 682,1423 L 682,1218 633,1218 588,1341 C 577,1348 566,1353 553,1357 540,1360 525,1362 506,1362 483,1362 464,1357 449,1347 434,1336 423,1320 414,1299 405,1277 399,1249 396,1216 393,1183 391,1143 391,1096 L 391,940 641,940 641,856 391,856 391,78 594,45 594,0 86,0 86,45 225,78 225,856 Z"/>
    <glyph unicode="e" horiz-adv-x="769" d="M 260,473 L 260,455 C 260,406 264,360 271,315 278,270 292,231 313,197 334,162 363,135 401,115 439,94 489,84 551,84 571,84 592,85 614,87 636,88 658,90 680,93 702,96 723,99 744,102 765,105 784,109 801,113 L 801,57 C 786,47 767,38 746,29 724,20 700,11 674,4 648,-3 620,-9 591,-14 562,-18 532,-20 502,-20 424,-20 358,-9 305,12 251,33 207,65 174,107 141,149 117,201 102,263 87,325 80,396 80,477 80,641 114,763 183,844 252,925 350,965 477,965 527,965 574,958 618,945 661,932 699,909 732,878 765,847 791,805 810,752 829,699 838,634 838,555 L 838,473 260,473 Z M 477,885 C 440,885 408,877 381,862 354,846 331,824 314,795 296,766 283,732 275,691 266,650 262,604 262,553 L 664,553 C 664,604 661,650 656,691 650,732 640,766 626,795 611,824 592,846 568,862 544,877 514,885 477,885 Z"/>
-   <glyph unicode="d" horiz-adv-x="953" d="M 723,70 C 694,47 657,26 614,8 570,-11 518,-20 459,-20 202,-20 74,140 74,461 74,539 83,609 100,672 117,734 143,787 178,831 213,874 258,908 312,931 366,954 430,965 504,965 538,965 574,963 613,959 651,955 688,949 723,942 722,949 721,960 720,975 719,989 719,1004 719,1021 718,1037 718,1053 718,1069 717,1085 717,1098 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,391 260,332 273,284 285,236 302,197 325,168 348,138 375,117 407,104 439,91 475,84 514,84 554,84 592,88 627,96 662,103 692,112 717,123 L 717,866 C 689,871 657,876 620,879 583,882 548,883 514,883 425,883 360,847 318,776 275,705 254,600 254,461 Z"/>
    <glyph unicode="b" horiz-adv-x="954" d="M 766,496 C 766,564 760,621 748,668 735,714 718,751 695,780 672,809 644,829 612,842 579,854 543,860 504,860 488,860 471,859 453,858 434,857 416,855 398,852 380,849 363,845 346,841 329,837 315,832 303,827 L 303,82 C 331,77 363,73 399,70 435,67 470,66 504,66 596,66 663,102 704,174 745,246 766,353 766,496 Z M 137,1352 L 0,1376 0,1421 303,1421 303,1085 C 303,1072 303,1058 303,1042 302,1025 302,1008 302,991 301,973 301,955 300,938 299,920 298,903 297,887 327,910 364,929 407,944 450,958 497,965 549,965 677,965 775,926 844,849 912,771 946,653 946,496 946,417 937,345 920,282 903,218 876,164 840,119 804,74 759,40 704,16 649,-8 583,-20 508,-20 476,-20 444,-18 411,-15 378,-11 345,-6 313,0 281,6 250,13 220,22 190,30 162,39 137,49 L 137,1352 Z"/>
-   <glyph unicode="a" horiz-adv-x="848" d="M 465,961 C 508,961 547,957 584,949 621,941 652,927 679,908 706,889 727,863 742,830 757,797 764,755 764,705 L 764,70 881,45 881,0 623,0 604,94 C 594,84 581,72 564,59 547,46 526,33 502,22 478,10 450,0 419,-8 387,-16 352,-20 313,-20 268,-20 230,-13 199,1 168,15 143,35 124,60 105,85 92,115 84,149 76,184 72,221 72,261 72,302 77,338 87,369 97,399 111,425 129,446 147,466 168,483 193,496 217,509 243,520 272,527 300,534 330,539 362,542 393,545 425,546 457,546 L 598,546 598,694 C 598,723 596,748 591,771 586,795 579,815 568,832 557,848 542,861 523,871 504,880 481,885 453,885 421,885 389,881 356,872 323,863 295,852 270,838 L 236,721 180,721 180,926 C 223,935 268,944 315,951 361,958 411,961 465,961 Z M 598,476 L 467,476 C 428,476 394,473 365,466 336,460 313,449 294,434 275,418 261,397 252,370 243,343 238,309 238,267 238,149 286,90 381,90 426,90 466,95 499,106 532,116 565,129 598,145 L 598,476 Z"/>
    <glyph unicode="&gt;" horiz-adv-x="980" d="M 104,186 L 104,289 913,680 104,1071 104,1174 1057,705 1057,655 104,186 Z"/>
    <glyph unicode="&lt;" horiz-adv-x="980" 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="583" d="M 100,-20 L 0,-20 471,1350 569,1350 100,-20 Z"/>
   </font>
  </defs>
  <defs>
   <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 class="TextEmbeddedBitmaps"/>
- <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>
+  <g id="id2" class="Master_Slide">
    <g id="bg-id2" class="Background"/>
    <g id="bo-id2" class="BackgroundObjects">
-    <g visibility="hidden" ooo:text-adjust="left" class="Date/Time">
+    <g class="Date/Time">
      <g id="id3">
       <rect class="BoundingBox" stroke="none" fill="none" x="1400" y="19131" width="6524" height="1449"/>
-      <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Serif, serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="1400" y="19567"><tspan class="PlaceholderText" fill="rgb(0,0,0)" stroke="none">&lt;date/time&gt;</tspan></tspan></tspan></text>
      </g>
     </g>
-    <g visibility="hidden" ooo:text-adjust="center" class="Footer">
+    <g class="Footer">
      <g id="id4">
       <rect class="BoundingBox" stroke="none" fill="none" x="9576" y="19131" width="8876" height="1449"/>
-      <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Serif, serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="13152" y="19567"><tspan class="PlaceholderText" fill="rgb(0,0,0)" stroke="none">&lt;footer&gt;</tspan></tspan></tspan></text>
      </g>
     </g>
-    <g visibility="hidden" ooo:text-adjust="right" class="Slide_Number">
+    <g visibility="hidden" class="Slide_Number">
      <g id="id5">
       <rect class="BoundingBox" stroke="none" fill="none" x="20076" y="19131" width="6524" height="1449"/>
-      <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Serif, serif" font-size="493px" font-weight="400"><tspan class="TextPosition" x="24551" y="19567"><tspan class="PlaceholderText" fill="rgb(0,0,0)" stroke="none">&lt;number&gt;</tspan></tspan></tspan></text>
+      <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Serif, serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="24521" y="19571"><tspan class="PlaceholderText" fill="rgb(0,0,0)" stroke="none">&lt;number&gt;</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="573" y="721" width="4295" height="1607"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 2720,2286 L 614,2286 614,762 4826,762 4826,2286 2720,2286 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1294" y="1745"><tspan fill="rgb(0,0,0)" stroke="none">config.xml</tspan></tspan></tspan></text>
-       </g>
+  <g>
+   <g id="id1" class="Slide" clip-path="url(#presentation_clip_path)">
+    <g class="Page">
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id6">
+       <rect class="BoundingBox" stroke="none" fill="none" x="573" y="721" width="4295" height="1607"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 2720,2286 L 614,2286 614,762 4826,762 4826,2286 2720,2286 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="1294" y="1745"><tspan fill="rgb(0,0,0)" stroke="none">config.xml</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id7">
-        <rect class="BoundingBox" stroke="none" fill="none" x="15001" y="721" width="7957" height="1607"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 18979,2286 L 15042,2286 15042,762 22916,762 22916,2286 18979,2286 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15927" y="1745"><tspan fill="rgb(0,0,0)" stroke="none">/etc/afm/afm-unit.conf</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id7">
+       <rect class="BoundingBox" stroke="none" fill="none" x="15001" y="721" width="7957" height="1607"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 18979,2286 L 15042,2286 15042,762 22916,762 22916,2286 18979,2286 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15927" y="1745"><tspan fill="rgb(0,0,0)" stroke="none">/etc/afm/afm-unit.conf</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id8">
-        <rect class="BoundingBox" stroke="none" fill="none" x="5547" y="6563" width="5925" height="1607"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8561,8128 L 8509,8128 8349,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8190,8128 L 8030,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7871,8128 L 7711,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7552,8128 L 7392,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7232,8128 L 7073,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6913,8128 L 6754,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6594,8128 L 6435,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6275,8128 L 6115,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5956,8128 L 5796,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5637,8128 L 5588,8128 5588,8017"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,7858 L 5588,7698"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,7538 L 5588,7379"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,7219 L 5588,7060"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,6900 L 5588,6741"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5611,6604 L 5771,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5930,6604 L 6090,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6249,6604 L 6409,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6568,6604 L 6728,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6888,6604 L 7047,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7207,6604 L 7366,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7526,6604 L 7685,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7845,6604 L 8005,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8164,6604 L 8324,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8483,6604 L 8643,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8802,6604 L 8962,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9122,6604 L 9281,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9441,6604 L 9600,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9760,6604 L 9919,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10079,6604 L 10238,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10398,6604 L 10558,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10717,6604 L 10877,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11036,6604 L 11196,6604"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11355,6604 L 11430,6604 11430,6689"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,6849 L 11430,7008"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,7168 L 11430,7327"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,7487 L 11430,7646"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,7806 L 11430,7966"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,8125 L 11430,8128 11273,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11114,8128 L 10954,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10795,8128 L 10635,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10475,8128 L 10316,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10156,8128 L 9997,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9837,8128 L 9678,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9518,8128 L 9358,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9199,8128 L 9039,8128"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8880,8128 L 8720,8128"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="564px" font-style="italic" font-weight="400"><tspan class="TextPosition" x="6547" y="7561"><tspan fill="rgb(0,0,0)" stroke="none">json description</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id8">
+       <rect class="BoundingBox" stroke="none" fill="none" x="5547" y="6563" width="5925" height="1607"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8561,8128 L 8509,8128 8349,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8190,8128 L 8030,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7871,8128 L 7711,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7552,8128 L 7392,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7232,8128 L 7073,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6913,8128 L 6754,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6594,8128 L 6435,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6275,8128 L 6115,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5956,8128 L 5796,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5637,8128 L 5588,8128 5588,8017"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,7858 L 5588,7698"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,7538 L 5588,7379"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,7219 L 5588,7060"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5588,6900 L 5588,6741"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5611,6604 L 5771,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 5930,6604 L 6090,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6249,6604 L 6409,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6568,6604 L 6728,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 6888,6604 L 7047,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7207,6604 L 7366,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7526,6604 L 7685,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 7845,6604 L 8005,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8164,6604 L 8324,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8483,6604 L 8643,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8802,6604 L 8962,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9122,6604 L 9281,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9441,6604 L 9600,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9760,6604 L 9919,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10079,6604 L 10238,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10398,6604 L 10558,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10717,6604 L 10877,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11036,6604 L 11196,6604"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11355,6604 L 11430,6604 11430,6689"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,6849 L 11430,7008"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,7168 L 11430,7327"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,7487 L 11430,7646"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,7806 L 11430,7966"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11430,8125 L 11430,8128 11273,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11114,8128 L 10954,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10795,8128 L 10635,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10475,8128 L 10316,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 10156,8128 L 9997,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9837,8128 L 9678,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9518,8128 L 9358,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 9199,8128 L 9039,8128"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 8880,8128 L 8720,8128"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="564px" font-style="italic" font-weight="400"><tspan class="TextPosition" x="6547" y="7561"><tspan fill="rgb(0,0,0)" stroke="none">json description</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id9">
-        <rect class="BoundingBox" stroke="none" fill="none" x="8127" y="9397" width="6354" height="2036"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 11303,9398 C 13103,9398 14478,9838 14478,10414 14478,10990 13103,11430 11303,11430 9503,11430 8128,10990 8128,10414 8128,9838 9503,9398 11303,9398 Z"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 8128,9398 L 8128,9398 Z"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 14479,11431 L 14479,11431 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8892" y="10635"><tspan fill="rgb(0,0,0)" stroke="none">Mustache engine</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id9">
+       <rect class="BoundingBox" stroke="none" fill="none" x="8127" y="9397" width="6354" height="2036"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 11303,9398 C 13103,9398 14478,9838 14478,10414 14478,10990 13103,11430 11303,11430 9503,11430 8128,10990 8128,10414 8128,9838 9503,9398 11303,9398 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8128,9398 L 8128,9398 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 14479,11431 L 14479,11431 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="8892" y="10635"><tspan fill="rgb(0,0,0)" stroke="none">Mustache engine</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id10">
-        <rect class="BoundingBox" stroke="none" fill="none" x="11135" y="12437" width="5925" height="1575"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14097,13970 L 13937,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13778,13970 L 13618,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13459,13970 L 13299,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13140,13970 L 12980,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12820,13970 L 12661,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12501,13970 L 12342,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12182,13970 L 12023,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11863,13970 L 11703,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11544,13970 L 11384,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11225,13970 L 11176,13970 11176,13859"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,13700 L 11176,13540"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,13380 L 11176,13221"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,13061 L 11176,12902"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,12742 L 11176,12583"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11231,12478 L 11391,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11550,12478 L 11710,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11869,12478 L 12029,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12188,12478 L 12348,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12508,12478 L 12667,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12827,12478 L 12986,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13146,12478 L 13305,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13465,12478 L 13625,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13784,12478 L 13944,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14103,12478 L 14263,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14422,12478 L 14582,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14742,12478 L 14901,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15061,12478 L 15220,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15380,12478 L 15539,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15699,12478 L 15858,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16018,12478 L 16178,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16337,12478 L 16497,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16656,12478 L 16816,12478"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16975,12478 L 17018,12478 17018,12595"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,12755 L 17018,12914"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,13074 L 17018,13233"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,13393 L 17018,13552"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,13712 L 17018,13872"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16957,13970 L 16797,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16638,13970 L 16478,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16319,13970 L 16159,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15999,13970 L 15840,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15680,13970 L 15521,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15361,13970 L 15202,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15042,13970 L 14882,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14723,13970 L 14563,13970"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14404,13970 L 14244,13970"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="564px" font-style="italic" font-weight="400"><tspan class="TextPosition" x="12057" y="13419"><tspan fill="rgb(0,0,0)" stroke="none">units description</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id10">
+       <rect class="BoundingBox" stroke="none" fill="none" x="11135" y="12437" width="5925" height="1575"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14097,13970 L 13937,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13778,13970 L 13618,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13459,13970 L 13299,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13140,13970 L 12980,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12820,13970 L 12661,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12501,13970 L 12342,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12182,13970 L 12023,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11863,13970 L 11703,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11544,13970 L 11384,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11225,13970 L 11176,13970 11176,13859"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,13700 L 11176,13540"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,13380 L 11176,13221"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,13061 L 11176,12902"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11176,12742 L 11176,12583"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11231,12478 L 11391,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11550,12478 L 11710,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 11869,12478 L 12029,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12188,12478 L 12348,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12508,12478 L 12667,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 12827,12478 L 12986,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13146,12478 L 13305,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13465,12478 L 13625,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 13784,12478 L 13944,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14103,12478 L 14263,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14422,12478 L 14582,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14742,12478 L 14901,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15061,12478 L 15220,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15380,12478 L 15539,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15699,12478 L 15858,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16018,12478 L 16178,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16337,12478 L 16497,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16656,12478 L 16816,12478"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16975,12478 L 17018,12478 17018,12595"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,12755 L 17018,12914"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,13074 L 17018,13233"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,13393 L 17018,13552"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 17018,13712 L 17018,13872"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16957,13970 L 16797,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16638,13970 L 16478,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 16319,13970 L 16159,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15999,13970 L 15840,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15680,13970 L 15521,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15361,13970 L 15202,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 15042,13970 L 14882,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14723,13970 L 14563,13970"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 14404,13970 L 14244,13970"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="564px" font-style="italic" font-weight="400"><tspan class="TextPosition" x="12057" y="13419"><tspan fill="rgb(0,0,0)" stroke="none">units description</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id11">
-        <rect class="BoundingBox" stroke="none" fill="none" x="22819" y="13167" width="3639" height="1607"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 24638,14732 L 22860,14732 22860,13208 26416,13208 26416,14732 24638,14732 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="23423" y="14191"><tspan fill="rgb(0,0,0)" stroke="none">*.service</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id11">
+       <rect class="BoundingBox" stroke="none" fill="none" x="22819" y="13167" width="3639" height="1607"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 24638,14732 L 22860,14732 22860,13208 26416,13208 26416,14732 24638,14732 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="23423" y="14191"><tspan fill="rgb(0,0,0)" stroke="none">*.service</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id12">
-        <rect class="BoundingBox" stroke="none" fill="none" x="22813" y="15453" width="3645" height="1607"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 24635,17018 L 22854,17018 22854,15494 26416,15494 26416,17018 24635,17018 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="23507" y="16477"><tspan fill="rgb(0,0,0)" stroke="none">*.socket</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id12">
+       <rect class="BoundingBox" stroke="none" fill="none" x="22813" y="15453" width="3645" height="1607"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 24635,17018 L 22854,17018 22854,15494 26416,15494 26416,17018 24635,17018 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="23507" y="16477"><tspan fill="rgb(0,0,0)" stroke="none">*.socket</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.TextShape">
-       <g id="id13">
-        <rect class="BoundingBox" stroke="none" fill="none" x="4318" y="11273" width="2099" height="1428"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="4568" y="11876"><tspan fill="rgb(0,0,0)" stroke="none">virtual</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="4820" y="12464"><tspan fill="rgb(0,0,0)" stroke="none">data</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.TextShape">
+      <g id="id13">
+       <rect class="BoundingBox" stroke="none" fill="none" x="4318" y="11273" width="2099" height="1428"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="4568" y="11876"><tspan fill="rgb(0,0,0)" stroke="none">virtual</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="4820" y="12464"><tspan fill="rgb(0,0,0)" stroke="none">data</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id14">
-        <rect class="BoundingBox" stroke="none" fill="none" x="5587" y="8382" width="671" height="2796"/>
-        <path fill="none" stroke="rgb(0,0,0)" d="M 5588,11176 L 6109,8656"/>
-        <path fill="rgb(0,0,0)" stroke="none" d="M 6166,8382 L 6256,8686 6252,8706 6241,8704 6163,8444 6115,8678 6095,8674 6144,8440 5969,8648 5958,8645 5963,8625 6166,8382 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id14">
+       <rect class="BoundingBox" stroke="none" fill="none" x="5587" y="8382" width="671" height="2796"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 5588,11176 L 6109,8656"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 6166,8382 L 6256,8686 6252,8706 6241,8704 6163,8444 6115,8678 6095,8674 6144,8440 5969,8648 5958,8645 5963,8625 6166,8382 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id15">
-        <rect class="BoundingBox" stroke="none" fill="none" x="6095" y="12428" width="4828" height="392"/>
-        <path fill="none" stroke="rgb(0,0,0)" d="M 6096,12429 L 10642,12668"/>
-        <path fill="rgb(0,0,0)" stroke="none" d="M 10922,12683 L 10636,12818 10615,12817 10615,12806 10861,12690 10622,12677 10623,12657 10862,12670 10630,12529 10630,12517 10651,12519 10922,12683 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id15">
+       <rect class="BoundingBox" stroke="none" fill="none" x="6095" y="12428" width="4828" height="392"/>
+       <path fill="none" stroke="rgb(0,0,0)" d="M 6096,12429 L 10642,12668"/>
+       <path fill="rgb(0,0,0)" stroke="none" d="M 10922,12683 L 10636,12818 10615,12817 10615,12806 10861,12690 10622,12677 10623,12657 10862,12670 10630,12529 10630,12517 10651,12519 10922,12683 Z"/>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id16">
-        <rect class="BoundingBox" stroke="none" fill="none" x="13715" y="15239" width="6354" height="2036"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 16891,15240 C 18691,15240 20066,15680 20066,16256 20066,16832 18691,17272 16891,17272 15091,17272 13716,16832 13716,16256 13716,15680 15091,15240 16891,15240 Z"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 13716,15240 L 13716,15240 Z"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 20067,17273 L 20067,17273 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15149" y="16477"><tspan fill="rgb(0,0,0)" stroke="none">Unit installer</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id16">
+       <rect class="BoundingBox" stroke="none" fill="none" x="13715" y="15239" width="6354" height="2036"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 16891,15240 C 18691,15240 20066,15680 20066,16256 20066,16832 18691,17272 16891,17272 15091,17272 13716,16832 13716,16256 13716,15680 15091,15240 16891,15240 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 13716,15240 L 13716,15240 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 20067,17273 L 20067,17273 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="15149" y="16477"><tspan fill="rgb(0,0,0)" stroke="none">Unit installer</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id17">
-        <rect class="BoundingBox" stroke="none" fill="none" x="2539" y="3555" width="6354" height="2036"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 5715,3556 C 7515,3556 8890,3996 8890,4572 8890,5148 7515,5588 5715,5588 3915,5588 2540,5148 2540,4572 2540,3996 3915,3556 5715,3556 Z"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 2540,3556 L 2540,3556 Z"/>
-        <path fill="none" stroke="rgb(52,101,164)" d="M 8891,5589 L 8891,5589 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="3764" y="4793"><tspan fill="rgb(0,0,0)" stroke="none">Config engine</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id17">
+       <rect class="BoundingBox" stroke="none" fill="none" x="2539" y="3555" width="6354" height="2036"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 5715,3556 C 7515,3556 8890,3996 8890,4572 8890,5148 7515,5588 5715,5588 3915,5588 2540,5148 2540,4572 2540,3996 3915,3556 5715,3556 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 2540,3556 L 2540,3556 Z"/>
+       <path fill="none" stroke="rgb(52,101,164)" d="M 8891,5589 L 8891,5589 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="3764" y="4793"><tspan fill="rgb(0,0,0)" stroke="none">Config engine</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.CustomShape">
-       <g id="id18">
-        <rect class="BoundingBox" stroke="none" fill="none" x="22813" y="17739" width="3645" height="1607"/>
-        <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 24635,19304 L 22854,19304 22854,17780 26416,17780 26416,19304 24635,19304 Z"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="24369" y="18763"><tspan fill="rgb(0,0,0)" stroke="none">...</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.CustomShape">
+      <g id="id18">
+       <rect class="BoundingBox" stroke="none" fill="none" x="22813" y="17739" width="3645" height="1607"/>
+       <path fill="none" stroke="rgb(52,101,164)" stroke-width="81" stroke-linejoin="round" d="M 24635,19304 L 22854,19304 22854,17780 26416,17780 26416,19304 24635,19304 Z"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="635px" font-weight="400"><tspan class="TextPosition" x="24369" y="18763"><tspan fill="rgb(0,0,0)" stroke="none">...</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id19">
-        <rect class="BoundingBox" stroke="none" fill="none" x="3275" y="2259" width="1298" height="1298"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 3302,2286 L 4188,3172"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 4572,3556 L 4304,3020 4036,3288 4572,3556 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id19">
+       <rect class="BoundingBox" stroke="none" fill="none" x="3275" y="2259" width="1298" height="1298"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 3302,2286 L 4188,3172"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 4572,3556 L 4304,3020 4036,3288 4572,3556 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id20">
-        <rect class="BoundingBox" stroke="none" fill="none" x="6577" y="5561" width="1044" height="1044"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 6604,5588 L 7236,6220"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 7620,6604 L 7352,6068 7084,6336 7620,6604 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id20">
+       <rect class="BoundingBox" stroke="none" fill="none" x="6577" y="5561" width="1044" height="1044"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 6604,5588 L 7236,6220"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 7620,6604 L 7352,6068 7084,6336 7620,6604 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id21">
-        <rect class="BoundingBox" stroke="none" fill="none" x="9117" y="8101" width="1298" height="1298"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 9144,8128 L 10030,9014"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 10414,9398 L 10146,8862 9878,9130 10414,9398 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id21">
+       <rect class="BoundingBox" stroke="none" fill="none" x="9117" y="8101" width="1298" height="1298"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 9144,8128 L 10030,9014"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 10414,9398 L 10146,8862 9878,9130 10414,9398 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id22">
-        <rect class="BoundingBox" stroke="none" fill="none" x="12419" y="11403" width="1044" height="1076"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 12446,11430 L 13084,12088"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 13462,12478 L 13202,11938 12930,12202 13462,12478 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id22">
+       <rect class="BoundingBox" stroke="none" fill="none" x="12419" y="11403" width="1044" height="1076"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 12446,11430 L 13084,12088"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 13462,12478 L 13202,11938 12930,12202 13462,12478 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id23">
-        <rect class="BoundingBox" stroke="none" fill="none" x="14959" y="13943" width="1299" height="1298"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 14986,13970 L 15872,14856"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 16256,15240 L 15988,14704 15720,14972 16256,15240 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id23">
+       <rect class="BoundingBox" stroke="none" fill="none" x="14959" y="13943" width="1299" height="1298"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 14986,13970 L 15872,14856"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 16256,15240 L 15988,14704 15720,14972 16256,15240 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id24">
-        <rect class="BoundingBox" stroke="none" fill="none" x="20039" y="16066" width="2816" height="381"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 20066,16256 L 22311,16256"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 22854,16256 L 22286,16067 22286,16446 22854,16256 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id24">
+       <rect class="BoundingBox" stroke="none" fill="none" x="20039" y="16066" width="2816" height="381"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 20066,16256 L 22311,16256"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 22854,16256 L 22286,16067 22286,16446 22854,16256 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id25">
-        <rect class="BoundingBox" stroke="none" fill="none" x="21055" y="14732" width="1806" height="1552"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 21082,16256 L 22448,15086"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 22860,14732 L 22305,14958 22552,15246 22860,14732 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id25">
+       <rect class="BoundingBox" stroke="none" fill="none" x="21055" y="14732" width="1806" height="1552"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 21082,16256 L 22448,15086"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 22860,14732 L 22305,14958 22552,15246 22860,14732 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id26">
-        <rect class="BoundingBox" stroke="none" fill="none" x="21055" y="16229" width="1800" height="1552"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 21082,16256 L 22442,17426"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 22854,17780 L 22547,17266 22299,17553 22854,17780 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id26">
+       <rect class="BoundingBox" stroke="none" fill="none" x="21055" y="16229" width="1800" height="1552"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 21082,16256 L 22442,17426"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 22854,17780 L 22547,17266 22299,17553 22854,17780 Z"/>
       </g>
-      <g class="com.sun.star.drawing.LineShape">
-       <g id="id27">
-        <rect class="BoundingBox" stroke="none" fill="none" x="13462" y="2259" width="4346" height="7394"/>
-        <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 17780,2286 L 13737,9183"/>
-        <path fill="rgb(102,153,204)" stroke="none" d="M 13462,9652 L 13913,9257 13586,9066 13462,9652 Z"/>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.LineShape">
+      <g id="id27">
+       <rect class="BoundingBox" stroke="none" fill="none" x="13462" y="2259" width="4346" height="7394"/>
+       <path fill="none" stroke="rgb(102,153,204)" stroke-width="53" stroke-linejoin="round" d="M 17780,2286 L 13737,9183"/>
+       <path fill="rgb(102,153,204)" stroke="none" d="M 13462,9652 L 13913,9257 13586,9066 13462,9652 Z"/>
       </g>
-      <g class="com.sun.star.drawing.TextShape">
-       <g id="id28">
-        <rect class="BoundingBox" stroke="none" fill="none" x="8128" y="859" width="3885" height="1428"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="8378" y="1462"><tspan fill="rgb(0,0,0)" stroke="none">configuration</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="9684" y="2050"><tspan fill="rgb(0,0,0)" stroke="none">file</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.TextShape">
+      <g id="id28">
+       <rect class="BoundingBox" stroke="none" fill="none" x="8128" y="859" width="3885" height="1428"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="8378" y="1462"><tspan fill="rgb(0,0,0)" stroke="none">configuration</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="9684" y="2050"><tspan fill="rgb(0,0,0)" stroke="none">file</tspan></tspan></tspan></text>
       </g>
-      <g class="com.sun.star.drawing.TextShape">
-       <g id="id29">
-        <rect class="BoundingBox" stroke="none" fill="none" x="23251" y="11273" width="2658" height="1428"/>
-        <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="23501" y="11876"><tspan fill="rgb(0,0,0)" stroke="none">systemd</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="23946" y="12464"><tspan fill="rgb(0,0,0)" stroke="none">units</tspan></tspan></tspan></text>
-       </g>
+     </g>
+     <g class="com.sun.star.drawing.TextShape">
+      <g id="id29">
+       <rect class="BoundingBox" stroke="none" fill="none" x="23251" y="11273" width="2658" height="1428"/>
+       <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="23501" y="11876"><tspan fill="rgb(0,0,0)" stroke="none">systemd</tspan></tspan></tspan><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="529px" font-weight="700"><tspan class="TextPosition" x="23946" y="12464"><tspan fill="rgb(0,0,0)" stroke="none">units</tspan></tspan></tspan></text>
       </g>
      </g>
     </g>
    </g>
   </g>
  </g>
- <script type="text/ecmascript"><![CDATA[
-
-
-/*****
-* @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;
-}
-
-function onKeyDown( aEvt )
-{
-if ( !aEvt )
-aEvt = window.event;
-
-var code = aEvt.keyCode || aEvt.charCode;
-
-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[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( aEvt ) { 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 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 http://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 aOOOAttrHasTransition = 'has-transition';
-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 = 'Slide_Number';
-var aDateTimeClassName = 'Date/Time';
-var aFooterClassName = 'Footer';
-var aHeaderClassName = 'Header';
-
-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;
-var MOUSE_MOVE = 3;
-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 HIDDEN = 0;
-var VISIBLE = 1;
-var INHERIT = 2;
-var aVisibilityAttributeValue = [ 'hidden', 'visible', 'inherit' ];
-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 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 warning( bCondition, sMessage )
-{
-if( bCondition )
-log( sMessage );
-return bCondition;
-}
-
-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 setOOOAttribute( aElem, sAttrName, aValue )
-{
-return setNSAttribute( 'ooo', aElem, sAttrName, aValue );
-}
-
-function checkElemAndSetAttribute( aElem, sAttrName, aValue )
-{
-if( aElem )
-aElem.setAttribute( sAttrName, aValue );
-}
-
-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 setElementVisibility( aElement, nCurrentVisibility, nNewVisibility )
-{
-if( nCurrentVisibility !=  nNewVisibility )
-{
-checkElemAndSetAttribute( aElement, 'visibility', aVisibilityAttributeValue[nNewVisibility] );
-return nNewVisibility;
-}
-return nCurrentVisibility;
-}
-
-function getSafeIndex( nIndex, nMin, nMax )
-{
-if( nIndex < nMin )
-return nMin;
-else if( nIndex > nMax )
-return nMax;
-else
-return nIndex;
-}
-
-function getRandomInt( nMax )
-{
-return Math.floor( Math.random() * nMax );
-}
-
-function isTextFieldElement( aElement )
-{
-var sClassName = aElement.getAttribute( 'class' );
-return ( sClassName === aSlideNumberClassName ) ||
-( sClassName === aFooterClassName ) ||
-( sClassName === aHeaderClassName ) ||
-( sClassName === aDateTimeClassName );
-}
-
-
-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;
-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.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.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.masterPage = this.initMasterPage();
-
-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.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();
-},
-
-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 ];
-},
-
-initHasTransition : function()
-{
-var sHasTransition = this.element.getAttributeNS( NSS['ooo'], aOOOAttrHasTransition );
-return ( sHasTransition === '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 FixedTextProvider( 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 FixedTextProvider( 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 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' );
-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 = '';
-this.aBackgroundObjectSubGroupIdList = [];
-var i = 0;
-for( ; i < aBackgroundObjectList.length; ++i )
-{
-sClass = aBackgroundObjectList[i].getAttribute( 'class' );
-if( !sClass || ( ( sClass !== aDateTimeClassName ) && ( sClass !== aFooterClassName )
-&& ( sClass !== aHeaderClassName ) && ( sClass !== aSlideNumberClassName ) ) )
-{
-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()
-{
-this.aPlaceholderShapeSet[ aSlideNumberClassName ] = new PlaceholderShape( this, aSlideNumberClassName );
-this.aPlaceholderShapeSet[ aDateTimeClassName ] = new PlaceholderShape( this, aDateTimeClassName );
-this.aPlaceholderShapeSet[ aFooterClassName ] = new PlaceholderShape( this, aFooterClassName );
-this.aPlaceholderShapeSet[ aHeaderClassName ] = new PlaceholderShape( this, aHeaderClassName );
-}
-
-}; // 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 aPlaceholderElement = getElementByClassName( aTextFieldElement, 'PlaceholderText' );
-if( aPlaceholderElement )
-{
-var aSVGRectElem = getElementByClassName( aTextFieldElement, 'BoundingBox' );
-if( aSVGRectElem )
-{
-var aRect = new Rectangle( aSVGRectElem );
-var sTextAdjust = getOOOAttribute( aTextFieldElement, aOOOAttrTextAdjust ) || 'left';
-var sTextAnchor, sX;
-if( sTextAdjust == 'left' )
-{
-sTextAnchor = 'start';
-sX = String( aRect.left );
-}
-else if( sTextAdjust == 'right' )
-{
-sTextAnchor = 'end';
-sX = String( aRect.right );
-}
-else if( sTextAdjust == 'center' )
-{
-sTextAnchor = 'middle';
-var nMiddle = ( aRect.left + aRect.right ) / 2;
-sX = String( parseInt( String( nMiddle ) ) );
-}
-if( sTextAnchor )
-aPlaceholderElement.setAttribute( 'text-anchor', sTextAnchor );
-if( sX )
-aPlaceholderElement.setAttribute( 'x', sX );
-}
-
-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.element = aTextFieldElement;
-this.textElement = aPlaceholderElement;
-}
-}
-};
-
-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 )
-{
-this.aBackgroundElement = theDocument.createElementNS( NSS['svg'], 'use' );
-this.aBackgroundElement.setAttribute( 'class', 'Background' );
-setNSAttribute( 'xlink', this.aBackgroundElement,
-'href', '#' + this.aMasterPage.backgroundId );
-
-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 === aSlideNumberClassName )
-{
-if( aPlaceholderShapeSet[aSlideNumberClassName] &&
-aPlaceholderShapeSet[aSlideNumberClassName].isValid() &&
-this.aMetaSlide.nIsPageNumberVisible &&
-aTextFieldContentProviderSet[aSlideNumberClassName] )
-{
-this.aSlideNumberFieldHandler =
-new SlideNumberFieldHandler( aPlaceholderShapeSet[aSlideNumberClassName],
-aTextFieldContentProviderSet[aSlideNumberClassName] );
-this.aSlideNumberFieldHandler.update( this.aMetaSlide.nSlideNumber );
-this.aSlideNumberFieldHandler.appendTo( this.aBackgroundObjectsElement );
-}
-}
-else if( sId === aDateTimeClassName )
-{
-if( this.aMetaSlide.nIsDateTimeVisible )
-{
-this.aDateTimeFieldHandler =
-this.initTextFieldHandler( aDateTimeClassName, aPlaceholderShapeSet,
-aTextFieldContentProviderSet, aDefsElement,
-aTextFieldHandlerSet, sMasterSlideId );
-}
-}
-else if( sId === aFooterClassName )
-{
-if( this.aMetaSlide.nIsFooterVisible )
-{
-this.aFooterFieldHandler =
-this.initTextFieldHandler( aFooterClassName, aPlaceholderShapeSet,
-aTextFieldContentProviderSet, aDefsElement,
-aTextFieldHandlerSet, sMasterSlideId );
-}
-}
-else if( sId === aHeaderClassName )
-{
-if( this.aMetaSlide.nIsHeaderVisible )
-{
-this.aHeaderFieldHandler =
-this.initTextFieldHandler( aHeaderClassName, 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( sClassName, aPlaceholderShapeSet, aTextFieldContentProviderSet,
-aDefsElement, aTextFieldHandlerSet, sMasterSlideId )
-{
-var aTextFieldHandler = null;
-if( aPlaceholderShapeSet[sClassName] &&
-aPlaceholderShapeSet[sClassName].isValid()
-&& aTextFieldContentProviderSet[sClassName] )
-{
-var sTextFieldContentProviderId = aTextFieldContentProviderSet[sClassName].sId;
-if ( !aTextFieldHandlerSet[ sMasterSlideId ][ sTextFieldContentProviderId ] )
-{
-aTextFieldHandlerSet[ sMasterSlideId ][ sTextFieldContentProviderId ] =
-new TextFieldHandler( aPlaceholderShapeSet[sClassName],
-aTextFieldContentProviderSet[sClassName] );
-aTextFieldHandler = aTextFieldHandlerSet[ sMasterSlideId ][ sTextFieldContentProviderId ];
-aTextFieldHandler.update();
-aTextFieldHandler.appendTo( aDefsElement );
-}
-else
-{
-aTextFieldHandler = aTextFieldHandlerSet[ sMasterSlideId ][ sTextFieldContentProviderId ];
-}
-
-var aTextFieldElement = document.createElementNS( NSS['svg'], 'use' );
-aTextFieldElement.setAttribute( 'class', sClassName );
-setNSAttribute( 'xlink', aTextFieldElement,
-'href', '#' + aTextFieldHandler.sId );
-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( aTextFieldContentElement )
-{
-if( aTextFieldContentElement )
-this.sId = aTextFieldContentElement.getAttribute( 'id' );
-}
-
-function FixedTextProvider( aTextFieldContentElement )
-{
-FixedTextProvider.superclass.constructor.call( this, aTextFieldContentElement );
-this.text = aTextFieldContentElement.textContent;
-}
-extend( FixedTextProvider, TextFieldContentProvider );
-
-
-FixedTextProvider.prototype.update = function( aFixedTextField )
-{
-aFixedTextField.setTextContent( this.text );
-};
-
-function CurrentDateTimeProvider( aTextFieldContentElement )
-{
-CurrentDateTimeProvider.superclass.constructor.call( this, aTextFieldContentElement );
-this.dateTimeFormat = getOOOAttribute( aTextFieldContentElement, aOOOAttrDateTimeFormat );
-}
-extend( CurrentDateTimeProvider, TextFieldContentProvider );
-
-
-CurrentDateTimeProvider.prototype.update = function( aDateTimeField )
-{
-var sText = this.createDateTimeText( this.dateTimeFormat );
-aDateTimeField.setTextContent( sText );
-};
-
-
-CurrentDateTimeProvider.prototype.createDateTimeText = function( sDateTimeFormat )
-{
-var aDate = new Date();
-var sDate = aDate.toLocaleString();
-return sDate;
-};
-
-function SlideNumberProvider( nInitialSlideNumber, sPageNumberingType )
-{
-SlideNumberProvider.superclass.constructor.call( this, null );
-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( nIndex )
-{
-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 );
-
-
-}
-
-function presentationEngineStop()
-{
-alert( 'We are sorry! An unexpected error occurred.\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();
-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( sValue === '.' )
-return undefined;
-var reFloatNumber = /^[+-]?[0-9]*[.]?[0-9]*$/;
-
-if( reFloatNumber.test( sValue ) )
-return parseFloat( sValue );
-else
-return undefined;
-}
-
-function booleanParser( sValue )
-{
-sValue = sValue.toLowerCase();
-if( sValue === 'true' )
-return true;
-else if( sValue === 'false' )
-return false;
-else
-return undefined;
-}
-
-function colorParser( sValue )
-{
-
-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 );
-};
-
-
-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 );
-};
-
-SVGPathElement.prototype.matrixTransform = function( aSVGMatrix )
-{
-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;
-
-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 );
-
-};
-
-
-var SVGPathSeg = typeof SVGPathSeg === 'undefined' ? function() {} : SVGPathSeg;
-
-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;
-
-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';
-}
-}
-
-
-IMPRESS_DEFAULT_NODE                    = 0;
-IMPRESS_ON_CLICK_NODE                   = 1;
-IMPRESS_WITH_PREVIOUS_NODE              = 2;
-IMPRESS_AFTER_PREVIOUS_NODE             = 3;
-IMPRESS_MAIN_SEQUENCE_NODE              = 4;
-IMPRESS_TIMING_ROOT_NODE                = 5;
-IMPRESS_INTERACTIVE_SEQUENCE_NODE       = 6;
-
-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
-};
-
-aImpressNodeTypeOutMap = [ 'default', 'on-click', 'with-previous', 'after-previous',
-'main-sequence', 'timing-root', 'interactive-sequence' ];
-
-
-aPresetClassInMap = {};
-
-
-aPresetIdInMap = {};
-
-
-var RESTART_MODE_DEFAULT            = 0;
-var RESTART_MODE_INHERIT            = 0;
-var RESTART_MODE_ALWAYS             = 1;
-var RESTART_MODE_WHEN_NOT_ACTIVE    = 2;
-var RESTART_MODE_NEVER              = 3;
-
-aRestartModeInMap = {
-'inherit'       : RESTART_MODE_DEFAULT,
-'always'        : RESTART_MODE_ALWAYS,
-'whenNotActive' : RESTART_MODE_WHEN_NOT_ACTIVE,
-'never'         : RESTART_MODE_NEVER
-};
-
-aRestartModeOutMap = [ 'inherit','always', 'whenNotActive', 'never' ];
-
-
-var FILL_MODE_DEFAULT           = 0;
-var FILL_MODE_INHERIT           = 0;
-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;
-
-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
-};
-
-aFillModeOutMap = [ 'inherit', 'remove', 'freeze', 'hold', 'transition', 'auto' ];
-
-
-var ADDITIVE_MODE_BASE          = 0;
-var ADDITIVE_MODE_SUM           = 1;
-var ADDITIVE_MODE_REPLACE       = 2;
-var ADDITIVE_MODE_MULTIPLY      = 3;
-var ADDITIVE_MODE_NONE          = 4;
-
-aAddittiveModeInMap = {
-'base'          : ADDITIVE_MODE_BASE,
-'sum'           : ADDITIVE_MODE_SUM,
-'replace'       : ADDITIVE_MODE_REPLACE,
-'multiply'      : ADDITIVE_MODE_MULTIPLY,
-'none'          : ADDITIVE_MODE_NONE
-};
-
-aAddittiveModeOutMap = [ 'base', 'sum', 'replace', 'multiply', 'none' ];
-
-
-var ACCUMULATE_MODE_NONE        = 0;
-var ACCUMULATE_MODE_SUM         = 1;
-
-aAccumulateModeOutMap = [ 'none', 'sum' ];
-
-var CALC_MODE_DISCRETE          = 0;
-var CALC_MODE_LINEAR            = 1;
-var CALC_MODE_PACED             = 2;
-var CALC_MODE_SPLINE            = 3;
-
-aCalcModeInMap = {
-'discrete'      : CALC_MODE_DISCRETE,
-'linear'        : CALC_MODE_LINEAR,
-'paced'         : CALC_MODE_PACED,
-'spline'        : CALC_MODE_SPLINE
-};
-
-aCalcModeOutMap = [ 'discrete', 'linear', 'paced', 'spline' ];
-
-
-var COLOR_SPACE_RGB = 0;
-var COLOR_SPACE_HSL = 1;
-
-aColorSpaceInMap = { 'rgb': COLOR_SPACE_RGB, 'hsl': COLOR_SPACE_HSL };
-
-aColorSpaceOutMap = [ 'rgb', 'hsl' ];
-
-
-var CLOCKWISE               = 0;
-var COUNTERCLOCKWISE        = 1;
-
-aClockDirectionInMap = { 'clockwise': CLOCKWISE, 'counter-clockwise': COUNTERCLOCKWISE };
-
-aClockDirectionOutMap = [ 'clockwise', 'counter-clockwise' ];
-
-
-UNKNOWN_PROPERTY        = 0;
-NUMBER_PROPERTY         = 1;
-ENUM_PROPERTY           = 2;
-COLOR_PROPERTY          = 3;
-STRING_PROPERTY         = 4;
-BOOL_PROPERTY           = 5;
-
-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'                    },
-
-'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'                  }
-
-};
-
-
-TRANSITION_INVALID              = 0;    // Invalid type
-TRANSITION_CLIP_POLYPOLYGON     = 1;    // Transition expressed by parametric clip polygon
-TRANSITION_SPECIAL              = 2;    // Transition expressed by hand-crafted function
-
-aTransitionClassOutMap = ['invalid', 'clip polypolygon', 'special'];
-
-
-BARWIPE_TRANSITION          = 1;
-BOXWIPE_TRANSITION          = 2;
-FOURBOXWIPE_TRANSITION      = 3;
-ELLIPSEWIPE_TRANSITION      = 4; // 17
-CLOCKWIPE_TRANSITION        = 5; // 22
-PINWHEELWIPE_TRANSITION     = 6; // 23
-PUSHWIPE_TRANSITION         = 7; // 35
-SLIDEWIPE_TRANSITION        = 8; // 36
-FADE_TRANSITION             = 9; // 37
-RANDOMBARWIPE_TRANSITION    = 10; // 38
-CHECKERBOARDWIPE_TRANSITION = 11; // 39
-DISSOLVE_TRANSITION         = 12; // 40
-
-aTransitionTypeInMap = {
-'barWipe'           : BARWIPE_TRANSITION,
-'boxWipe'           : BOXWIPE_TRANSITION,
-'fourBoxWipe'       : FOURBOXWIPE_TRANSITION,
-'ellipseWipe'       : ELLIPSEWIPE_TRANSITION,
-'clockWipe'         : CLOCKWIPE_TRANSITION,
-'pinWheelWipe'      : PINWHEELWIPE_TRANSITION,
-'pushWipe'          : PUSHWIPE_TRANSITION,
-'slideWipe'         : SLIDEWIPE_TRANSITION,
-'fade'              : FADE_TRANSITION,
-'randomBarWipe'     : RANDOMBARWIPE_TRANSITION,
-'checkerBoardWipe'  : CHECKERBOARDWIPE_TRANSITION,
-'dissolve'          : DISSOLVE_TRANSITION
-};
-
-aTransitionTypeOutMap = [ '', 'barWipe', 'boxWipe', 'fourBoxWipe', 'ellipseWipe',
-'clockWipe', 'pinWheelWipe', 'pushWipe', 'slideWipe',
-'fade', 'randomBarWipe', 'checkerBoardWipe', 'dissolve' ];
-
-
-DEFAULT_TRANS_SUBTYPE               = 0;
-LEFTTORIGHT_TRANS_SUBTYPE           = 1;
-TOPTOBOTTOM_TRANS_SUBTYPE           = 2;
-CORNERSIN_TRANS_SUBTYPE             = 3; // 11
-CORNERSOUT_TRANS_SUBTYPE            = 4;
-VERTICAL_TRANS_SUBTYPE              = 5;
-HORIZONTAL_TRANS_SUBTYPE            = 6; // 14
-DOWN_TRANS_SUBTYPE                  = 7; // 19
-CIRCLE_TRANS_SUBTYPE                = 8; // 27
-CLOCKWISETWELVE_TRANS_SUBTYPE       = 9; // 33
-CLOCKWISETHREE_TRANS_SUBTYPE        = 10;
-CLOCKWISESIX_TRANS_SUBTYPE          = 11;
-CLOCKWISENINE_TRANS_SUBTYPE         = 12;
-TWOBLADEVERTICAL_TRANS_SUBTYPE      = 13;
-TWOBLADEHORIZONTAL_TRANS_SUBTYPE    = 14;
-FOURBLADE_TRANS_SUBTYPE             = 15; // 39
-FROMLEFT_TRANS_SUBTYPE              = 16; // 97
-FROMTOP_TRANS_SUBTYPE               = 17;
-FROMRIGHT_TRANS_SUBTYPE             = 18;
-FROMBOTTOM_TRANS_SUBTYPE            = 19;
-CROSSFADE_TRANS_SUBTYPE             = 20;
-FADETOCOLOR_TRANS_SUBTYPE           = 21;
-FADEFROMCOLOR_TRANS_SUBTYPE         = 22;
-FADEOVERCOLOR_TRANS_SUBTYPE         = 23;
-THREEBLADE_TRANS_SUBTYPE            = 24;
-EIGHTBLADE_TRANS_SUBTYPE            = 25;
-ONEBLADE_TRANS_SUBTYPE              = 26; // 107
-ACROSS_TRANS_SUBTYPE                = 27;
-
-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,
-'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,
-'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
-};
-
-aTransitionSubtypeOutMap = [ 'default', 'leftToRight', 'topToBottom', 'cornersIn',
-'cornersOut', 'vertical', 'horizontal', 'down', 'circle',
-'clockwiseTwelve', 'clockwiseThree', 'clockwiseSix',
-'clockwiseNine', 'twoBladeVertical', 'twoBladeHorizontal',
-'fourBlade', 'fromLeft', 'fromTop', 'fromRight',
-'fromBottom', 'crossfade', 'fadeToColor', 'fadeFromColor',
-'fadeOverColor', 'threeBlade', 'eightBlade', 'oneBlade',
-'across' ];
-
-
-TRANSITION_MODE_IN  = 1;
-TRANSITION_MODE_OUT = 0;
-
-aTransitionModeInMap = { 'out': TRANSITION_MODE_OUT, 'in': TRANSITION_MODE_IN };
-aTransitionModeOutMap = [ 'out', 'in' ];
-
-
-REVERSEMETHOD_IGNORE                    = 0;
-REVERSEMETHOD_INVERT_SWEEP              = 1;
-REVERSEMETHOD_SUBTRACT_POLYGON          = 2;
-REVERSEMETHOD_SUBTRACT_AND_INVERT       = 3;
-REVERSEMETHOD_ROTATE_180                = 4;
-REVERSEMETHOD_FLIP_X                    = 5;
-REVERSEMETHOD_FLIP_Y                    = 6;
-
-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[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[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[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[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;
-var EVENT_TRIGGER_ON_SLIDE_END          = 2;
-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;
-var EVENT_TRIGGER_ON_MOUSE_ENTER        = 7;
-var EVENT_TRIGGER_ON_MOUSE_LEAVE        = 8;
-var EVENT_TRIGGER_ON_NEXT_EFFECT        = 9;
-var EVENT_TRIGGER_ON_PREV_EFFECT        = 10;
-var EVENT_TRIGGER_REPEAT                = 11;
-
-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;
-var INDEFINITE_TIMING       = 3;
-var EVENT_TIMING            = 4;
-var SYNCBASE_TIMING         = 5;
-var MEDIA_TIMING            = 6;
-
-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.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.nReapeatCount = 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.nReapeatCount = 1;
-else
-this.nReapeatCount = parseFloat( sRepeatCount );
-if( ( isNaN(this.nReapeatCount) ) && ( sRepeatCount != 'indefinite' ) )
-this.nReapeatCount = 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.nReapeatCount != 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.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 notifee' );
-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();
-};
-
-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.nReapeatCount;
-};
-
-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.getKeyTimes().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.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 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: ' + aTransitionTypeOutMap[ String( this.getTransitionType() ) ];
-
-sInfo += ';  subtype: ' + aTransitionSubtypeOutMap[ 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:
-log( 'createAnimationNode: ANIMATETRANSFORM not implemented' );
-return null;
-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 ) )
-{
-return null;
-}
-}
-}
-}
-
-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 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 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( nValue )
-{
-log( 'SlideChangeBase.performIn: abstract method called' );
-};
-
-SlideChangeBase.prototype.performOut = function( nValue )
-{
-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( nT )
-{
-};
-
-
-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 ELLIPSEWIPE_TRANSITION:
-return new EllipseWipePath( nSubtype );
-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 RANDOMBARWIPE_TRANSITION:
-return new RandomWipePath( 128, true /* bars */ );
-case CHECKERBOARDWIPE_TRANSITION:
-return new CheckerBoardWipePath( 10 );
-case DISSOLVE_TRANSITION:
-return new RandomWipePath( 16 * 16, false /* dissolve */ );
-}
-}
-
-
-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 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 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 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 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.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;
-
-};
-
-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;
-}
-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.getWidth = function()
-{
-return this.nScaleFactorX * this.getBaseBBox().width;
-};
-
-AnimatedElement.prototype.getHeight = function()
-{
-return this.nScaleFactorY * this.getBaseBBox().height;
-};
-
-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.setWidth = function( nNewWidth )
-{
-ANIMDBG.print( 'AnimatedElement.setWidth: nNewWidth = ' + nNewWidth );
-if( nNewWidth < 0 )
-{
-log('AnimatedElement(' + this.getId() + ').setWidth: negative height!');
-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 )
-.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 )
-.scaleNonUniform( this.nScaleFactorX, nScaleFactorY )
-.translate( -this.nBaseCenterX, -this.nBaseCenterY );
-this.updateTransformAttribute();
-
-this.nScaleFactorY = nScaleFactorY;
-};
-
-AnimatedElement.prototype.getOpacity = function()
-{
-return this.aActiveElement.getAttribute( 'opacity' );
-};
-
-AnimatedElement.prototype.setOpacity = function( nValue )
-{
-this.aActiveElement.setAttribute( 'opacity', nValue );
-};
-
-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 !== 'TextShape' )
-{
-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 bCombined = false;
-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;
-}
-if( bCombined )
-return null;
-else
-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: ' + aTransitionTypeOutMap[ String( this.getTransitionType() ) ];
-
-sInfo += ';  subtype: ' + aTransitionSubtypeOutMap[ 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;
-
-if( !this.aRootNode.init() )
-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;
-}
-
-};
-
-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 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( aMouseEvent )
-{
-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.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.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 );
-};
-};
-
-
-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;
-};
-
-
-function ActivityParamSet()
-{
-this.aEndEvent = 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 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.performHook = function( nIndex, nFractionalIndex, nRepeatCount )
-{
-throw ( 'ContinuousKeyTimeActivityBase.performHook: abstract method invoked' );
-};
-
-ContinuousKeyTimeActivityBase.prototype.simplePerform = function( nSimpleTime, nRepeatCount )
-{
-var nAlpha = this.calcAcceleratedTime( nSimpleTime );
-
-var aLerpResult = this.aLerper.lerp( nAlpha );
-
-this.performHook( aLerpResult.nIndex, aLerpResult.nLerp, nRepeatCount );
-};
-
-
-function ContinuousActivityBase( aCommonParamSet )
-{
-ContinuousActivityBase.superclass.constructor.call( this, aCommonParamSet );
-
-}
-extend( ContinuousActivityBase, SimpleContinuousActivityBase );
-
-
-ContinuousActivityBase.prototype.performHook = function( nModifiedTime, nRepeatCount )
-{
-throw ( 'ContinuousActivityBase.performHook: abstract method invoked' );
-};
-
-ContinuousActivityBase.prototype.simplePerform = function( nSimpleTime, nRepeatCount )
-{
-this.performHook( 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.performHook = 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.performHook = function( nModifiedTime, nRepeatCount )
-{
-if( this.isDisposed() || !this.aAnimation  )
-{
-log( 'FromToByActivity.performHook: 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.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 );
-
-
-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.performHook = function( nIndex, nFractionalIndex, nRepeatCount )
-{
-if( this.isDisposed() || !this.aAnimation  )
-{
-log( 'ValueListActivity.performHook: activity disposed or not valid animation' );
-return;
-}
-
-assert( ( nIndex + 1 ) < this.aValueList.length,
-'ValueListActivity.performHook: 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.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 );
-
-
-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:
-log( 'createActivity: discrete calculation case not yet implemented' );
-break;
-
-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' );
-break;
-
-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, 'createFromToByActivity: 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;
-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];
-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;
-}
-
-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();
-};
-
-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();
-
-theMetaDoc.getCurrentSlide().aSlideAnimationsHandler.start();
-this.update();
-}
-};
-
-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.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.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;
-
-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();
-}
-}
-}
-
-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.getSystemTime();
-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.getSystemTime();
-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 http://cgit.freedesktop.org/libreoffice/core/tree/slideshow/source
-*
-*/
-
-]]>
- </script>
 </svg>
\ No newline at end of file