blob: 9b35023233015404bea2fc6681939951a88b5e09 [file] [log] [blame]
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -08001/*
2 * Copyright (c) 2014, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30var cardElements;
31var currentActiveCard = null;
32var defaultActiveCard = null;
33// Forward navigation >= 0, backward navigation == -1, unknown navigation == -2
34var currentNavigationType = -2;
35var blankRegEx = /^\s*$/;
36
37var WMLBrowser = {
38 name: "WMLBrowserContext",
39 variables: new Object(),
40 setVar: function (key, value) {
41 this.variables[key] = value;
42 },
43 getVar: function (key) {
44 var value = this.variables[key];
45 if (value == null)
46 value = '';
47 return value;
48 },
49 newContext: function () {
50 this.variables = new Object();
51 },
52}
53
54function isBlank(str) {
55 return (!str || blankRegEx.test(str));
56}
57
58function isURLHash(str) {
59 return (!isBlank(str) && str.length > 1 && str.indexOf("#") == 0);
60}
61
62function getIdFromURLHash(hash) {
63 return hash.substr(1);
64}
65
66window.onhashchange = function()
67{
68 console.log("window.onhashchange currentNavigationType = " + currentNavigationType);
69 var newHash = window.location.hash;
70 if (!isURLHash(newHash)) {
71 currentActiveCard.style.display = "none";
72 defaultActiveCard.style.display = "initial";
73 currentActiveCard = defaultActiveCard;
74 } else {
75 showCardById(newHash.substr(1));
76 }
77 updateWMLVariables();
78 scheduleTimerTaskIfNeeded(currentActiveCard);
79 handleOnNavigationIntrinsicEvent();
80};
81
82window.onload = function()
83{
84 // Consider all the load/reload on this deck as forward navigation.
85 currentNavigationType = 1;
86 var cardHash = window.location.hash;
87 console.log("window.onload card = " + cardHash);
88 cardElements = document.getElementsByClassName('wml_card');
89 defaultActiveCard = cardElements[0];
90 // All the cards are hidden by default.
91 // Show the active card onload.
92 if (isURLHash(cardHash)) {
93 var cardId = cardHash.substr(1);
94 for(var i=0, l=cardElements.length; i<l; i++) {
95 var card = cardElements[i];
96 if (card.getAttribute("id") == cardId) {
97 currentActiveCard = card;
98 currentActiveCard.style.display = "initial";
99 break;
100 }
101 }
102 }
103 if (!currentActiveCard) {
104 currentActiveCard = defaultActiveCard;
105 currentActiveCard.style.display = "initial";
106 }
107 replaceVariablesInTextContentBySpan();
108 fixTextContentInAnchorTasks();
109 initializeSelectElements();
Kulanthaivel Palanichamy1cb7c132014-09-16 16:41:20 -0700110 parseFormatAttributeInInputtElements();
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800111 scheduleTimerTaskIfNeeded(currentActiveCard);
112 handleOnNavigationIntrinsicEvent();
113};
114
115function showCardById(cardId, onload)
116{
117 if (currentActiveCard && currentActiveCard.getAttribute("id") == cardId) {
118 // We have nothing to do.
119 return false;
120 }
121 for(var i=0, l=cardElements.length; i<l; i++) {
122 var card = cardElements[i];
123 if (card.getAttribute("id") == cardId) {
124 currentActiveCard.style.display = "none";
125 currentActiveCard = card;
126 currentActiveCard.style.display = "initial";
127 return true;
128 }
129 }
130 return false;
131}
132
133function handleOnNavigationIntrinsicEvent() {
134 var navigationType = currentNavigationType;
135 currentNavigationType = -2;
136
137 if (navigationType >= 0) {
138 executeOnenterforwardTask();
139 } else if (navigationType == -1) {
140 executeOnenterbackwardTask();
141 } else {
142 console.log("WARNING: Cannot determine the navigation event type on this card!");
143 }
144}
145
146////////////////////////// WML Variables ////////////////////////////////////////
147function replaceVariablesInTextContentBySpan()
148{
149 var pattern1 = /(\$\(([_a-z]{1}[_a-z0-9]*)([:]{1}((([e]{1})(scape)?)|(([n]{1})(oesc)?)|(([u]{1})(nesc)?)))?\))/gi;
150 var pattern2 = /(\$([_a-zA-z]{1}[_a-zA-Z0-9]*))/g;
151 var whitespace = /^\s*$/g;
152 var replacer = function () {
153 var name = arguments[2];
154 var escape = "";
155 if (arguments[12])
156 escape = arguments[12];
157 else if (arguments[9])
158 escape = arguments[9];
159 else if (arguments[6])
160 escape = arguments[6];
161 var wml_variable_span = "\<span\ data\-wml\_name\=\"" + name + "\"\ class\=\"wml_variable\" data\-wml\_escape\=\"" + escape + "\"\>\<\/span\>";
162 console.log("replaceVariablesInTextContentBySpan() Found variable " + arguments[0]);
163 return wml_variable_span;
164 };
165
166 var textNodes = [];
167 var treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
168 while(treeWalker.nextNode()) {
169 textNodes.push(treeWalker.currentNode);
170 }
171
172 for(var i=0, l=textNodes.length; i<l; i++) {
173 var curNode = textNodes[i];
174 var text = curNode.nodeValue;
175 if (!(whitespace.test(text))) {
176 var replaced = false;
177 if (pattern1.test(text)) {
178 text = text.replace(pattern1, replacer);
179 replaced = true;
180 }
181 if (pattern2.test(text)) {
182 text = text.replace(pattern2, replacer);
183 replaced = true;
184 }
185 if (replaced) {
186 var mySpan = document.createElement("span");
187 mySpan.innerHTML = text;
188 curNode.parentNode.replaceChild(mySpan, curNode);
189 }
190 }
191 }
192}
193
194////////////////////////// WML Anchor Tasks ////////////////////////////////////////
195// TODO: Optimize this brutal code
196function fixTextContentInAnchorTasks()
197{
198 var anchorTasks = document.getElementsByClassName('wml_anchor_task');
199 for(var i=0, l=anchorTasks.length; i<l; i++) {
200 var container;
201 var taskParent;
202 var task = anchorTasks[i];
203 if (task.dataset.wml_task_type == 'wml_task_go') {
204 taskParent = task.parentNode;
205 container = taskParent.parentNode;
206 } else {
207 taskParent = task;
208 container = task.parentNode;
209 }
210 container.removeChild(taskParent);
211 var anchorText = container.innerHTML;
212 while (container.firstChild) {
213 container.removeChild(container.firstChild);
214 }
215 container.appendChild(taskParent);
216 console.log("fixTextContentInAnchorTasks: anchorText = " + anchorText);
217 task.innerHTML = anchorText + task.innerHTML;
218 }
219}
220
221////////////////////////// WML Timer ////////////////////////////////////////
222var activeScheduledTimer = null;
223function scheduleTimerTaskIfNeeded(card)
224{
225 var timerElements = card.getElementsByClassName('wml_timer');
226 if (timerElements.length > 0) {
227 var timeout = timerElements[0].dataset.wml_value;
228 activeScheduledTimer = window.setTimeout(executeTimerTask, timeout * 100);
229 console.log("Starting WML timer timeout = " + timeout);
230 }
231}
232
233function cancelScheduledTimerTask()
234{
235 if (activeScheduledTimer != null) {
236 window.clearTimeout(clearTimeout);
237 activeScheduledTimer = null;
238 }
239}
240
241////////////////////////////////// <select> & <option> ////////////////////////
242var multiSelectSeparator = ";";
243var selectElementsMap = new Object();
244var WMLSelectElements = {
245 name: "WMLSelectElementsList",
246 options: new Object(),
247 setSelectedOptions: function (key, options) {
248 this.options[key] = options;
249 },
250 getSelectedOptions: function (key) {
251 return this.options[key];
252 },
253};
254
255function initializeSelectElements()
256{
257 var selectElements = document.getElementsByClassName('wml_select');
258 for(var i=0, l=selectElements.length; i<l; i++) {
259 var select = selectElements[i];
260 var iname = select.dataset.wml_iname;
261 // Preselect options based on 'ivalue'
262 var ivalue = select.dataset.wml_ivalue;
263 if (!isBlank(ivalue)) {
264 var options = select.options;
265 var optionsCount = options.length;
266 var ivalueList = ivalue.split(multiSelectSeparator);
267 for(var j=0, ll=ivalueList.length; j<ll; j++) {
268 var index = parseInt(ivalueList[j], 10);
269 if (index > 0 && index <= optionsCount) {
270 options[index-1].selected = 'selected';
271 }
272 }
273 }
274
275 // Keep a copy of selected options to process 'onpick' events
276 var options = select.selectedOptions;
277 var optionsCount = options.length;
278 var optionsList = [];
279 for(var j=0; j<optionsCount; j++) {
280 optionsList.push(options[j]);
281 }
282 var uniqueId = "wml_select_" + i;
283 select.dataset.wml_unique_id = uniqueId;
284 WMLSelectElements.setSelectedOptions(uniqueId, optionsList);
285 }
286}
287
288function handleSelectOnchangeEvent(select)
289{
290 refreshVariableInSelectElement(select);
291 var options = select.selectedOptions;
292 var optionsCount = options.length;
293 var uniqueId = select.dataset.wml_unique_id;
294 var oldSelectedOptions = WMLSelectElements.getSelectedOptions(uniqueId);
295
296 // Update the copy of selected options before we do anything
297 var optionsList = [];
298 for(var j=0; j<optionsCount; j++) {
299 optionsList.push(options[j]);
300 }
301 WMLSelectElements.setSelectedOptions(uniqueId, optionsList);
302
303 // process 'onpick' events if needed
304 for(var i=0; i<optionsCount; i++) {
305 var option = options[i];
306 var onpick = option.dataset.wml_onpick;
307 if (!isBlank(onpick)) {
308 var selectedNewly = true;
309 for(var j=0; j<oldSelectedOptions.length; j++) {
310 if (option.isSameNode(oldSelectedOptions[j])) {
311 selectedNewly = false;
312 break;
313 }
314 }
315 if (selectedNewly) {
316 internal_executeOnpickTask(option);
317 return;
318 }
319 }
320 }
321}
322
323function handleAOnClick(event, node)
324{
325 var href = node.href;
326 var search = node.search;
327 console.log("handleAOnClick <a> href = " + href);
328 refreshVariablesInControlElements();
329 if (!isBlank(search)) {
330 node.search = substituteVariablesInURL(search);
331 } else {
332 node.href = href.split("?")[0];
333 }
334 event.preventDefault();
335 navigateToURL(node.href);
336 return false;
337}
338
339//////////////////////// Variables /////////////////////////
340function substituteVariablesInURL(url)
341{
342 var pattern = /(((\%24)|(\$))\(([_a-z]{1}[_a-z0-9]*)([:]{1}((([e]{1})(scape)?)|(([n]{1})(oesc)?)|(([u]{1})(nesc)?)))?\))/gi;
343 var replacer = function () {
344 var name = arguments[2];
345 // TODO: Do the URL escaping here
346 console.log("substituteVariablesInURL() found variable : " + arguments[0]);
347 return WMLBrowser.getVar(name);
348 };
349 return url.replace(pattern, replacer);
350}
351
352function substituteVariablesInPostfield(value)
353{
354 var pattern = /(\$\(([_a-z]{1}[_a-z0-9]*)([:]{1}((([e]{1})(scape)?)|(([n]{1})(oesc)?)|(([u]{1})(nesc)?)))?\))/gi;
355 var replacer = function () {
356 var name = arguments[2];
357 // TODO: Do the URL escaping here
358 console.log("substituteVariablesInPostfield() found variable : " + arguments[0]);
359 return WMLBrowser.getVar(name);
360 };
361 return value.replace(pattern, replacer);
362}
363
364function refreshVariableInSelectElement(select)
365{
366 var options = select.selectedOptions;
367 var value = "";
368 var ivalue = "";
369 var optionsCount = options.length;
370 if (optionsCount > 0) {
371 var op = options[0];
372 value = op.value;
373 ivalue = (op.index + 1);
374 for(var i=1; i<optionsCount; i++) {
375 op = options[i];
376 value += multiSelectSeparator + op.value;
377 ivalue += multiSelectSeparator + (op.index + 1);
378 }
379 }
380 var name = select.name;
381 if (!isBlank(name)) {
382 WMLBrowser.setVar(name, value);
383 console.log("refreshVariableInSelectElement name = " + name + ", value = " + value);
384 }
385 var iname = select.dataset.wml_iname;
386 if (!isBlank(iname)) {
387 if (isBlank(ivalue)) {
388 // An index of zero indicates that no option is selected.
389 ivalue = "0";
390 }
391 WMLBrowser.setVar(iname, ivalue);
392 console.log("refreshVariableInSelectElement iname = " + iname + ", ivalue = " + ivalue);
393 }
394}
395
396function refreshVariablesInControlElements()
397{
398 var inputElements = currentActiveCard.getElementsByClassName('wml_input');
399 for(var i=0, l=inputElements.length; i<l; i++) {
400 var input = inputElements[i];
401 WMLBrowser.setVar(input.name, input.value);
402 console.log("refreshVariablesInControlElements <input> name = " + input.name + ", value = " + input.value);
403 }
404
405 var selectElements = currentActiveCard.getElementsByClassName('wml_select');
406 for(var i=0, l=selectElements.length; i<l; i++) {
407 var select = selectElements[i];
408 refreshVariableInSelectElement(selectElements[i]);
409 }
410}
411
Kulanthaivel Palanichamy1cb7c132014-09-16 16:41:20 -0700412var validateInputValue = function(event) {
413 var input = event.target;
414 var pattern = new RegExp(input.dataset.wml_pattern, "g");
415 var value = input.value;
416 if (!pattern.test(value)) {
417 input.value = input.dataset.old_value;
418 } else {
419 input.dataset.old_value = input.value;
420 }
421}
422
423function parseFormatAttributeInInputtElements() {
424
425 var regex = /(^(([\*]{1})|([0-9]*))([NnXxAa]{1})$)/g;
426 var symbols = "\!\"\#\$\%\&\'\(\)\*\+\,\\.\/\:\;\<\=\>\?\@\\\^\_\`\{\|\}\~\\-\\\\[\\]";
427
428 var inputElements = document.getElementsByClassName('wml_input');
429 for(var i=0, l=inputElements.length; i<l; i++) {
430 var input = inputElements[i];
431 var format = input.dataset.wml_format;
432 var res = regex.test(format);
433 regex.lastIndex = 0;
434
435 if (res) {
436 var pattern = "";
437 var fl = format.length;
438 var count = format.slice(0, fl-1);
439 switch(format.charAt(fl-1)) {
440 case 'A':
441 // WML-1.3: Entry of any uppercase letter, symbol, or punctuation character. Numeric characters are excluded.
442 // RegEx: Everthing else except lowercase letters and nummeric characters.
443 pattern = "[^a-z^0-9]";
444 break;
445 case 'a':
446 // WML-1.3: Entry of any lowercase letter, symbol, or punctuation character. Numeric characters are excluded.
447 // RegEx: Everthing else except uppercase letters and nummeric characters.
448 pattern = "[^A-Z^0-9]";
449 break;
450 case 'N':
451 // WML-1.3: entry of any numeric character.
452 pattern = "[0-9]";
453 input.inputmode = "numeric";
454 break;
455 case 'n':
456 // WML-1.3: entry of any numeric, symbol, or punctuation character.
457 pattern = "[0-9" + symbols + "]";
458 break;
459 case 'X':
460 // WML-1.3: entry of any uppercase letter, numeric character, symbol, or punctuation character.
461 pattern = "[^a-z]";
462 input.inputmode = "verbatim";
463 break;
464 case 'x':
465 // WML-1.3: entry of any lowercase letter, numeric character, symbol, or punctuation character.
466 pattern = "[^A-Z]";
467 input.inputmode = "verbatim";
468 break;
469 }
470
471 if (count == "*") {
472 pattern = "^(" + pattern + "*)$";
473 } else {
474 input.maxLength = count;
475 input.pattern = ".{" + count + "}";
476 pattern = "^(" + pattern + "{0," + count + "})$";
477 }
478 input.dataset.wml_pattern = pattern;
479 input.setAttribute("required", "");
480 input.addEventListener("input", validateInputValue);
481 console.log("WML input format = " + format + ", equivalent pattern = " + pattern);
482 }
483 }
484}
485
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800486function updateVariableInPostfields(form)
487{
488 var postfields = currentActiveCard.getElementsByClassName('wml_postfield');
489 for(var i=0, l=postfields.length; i<l; i++) {
490 var input = postfields[i];
491 input.value = substituteVariablesInPostfield(input.value);
492 console.log("updateVariableInPostfields <postfield> name = " + input.name + ", value = " + input.value);
493 }
494}
495
496/////////////// Navigation ////////////////////
497function navigateToURL(url)
498{
499 console.log("navigateToURL: url = " + url);
500 cancelScheduledTimerTask();
501 currentNavigationType = 1;
502 window.location = url;
503}
504
505function navigateToCard(card)
506{
507 console.log("navigateToCard: card = " + card);
508 cancelScheduledTimerTask();
509 currentNavigationType = 1;
510 window.location.hash = card;
511}
512
513function navigateBack()
514{
515 console.log("navigateBack: currentState = ");
516 console.log(window.history.state);
517 cancelScheduledTimerTask();
518 currentNavigationType = -1;
519 window.history.back();
520}
521
522////////////// WML Tasks //////////////////////
523//<refresh>
524
525function updateWMLVariables()
526{
527 var wmlVariables = currentActiveCard.getElementsByClassName('wml_variable');
528 for(var i=0, l=wmlVariables.length; i<l; i++) {
529 var varElement = wmlVariables[i];
530 // Handle the variable escaping option here
531 var value = WMLBrowser.getVar(varElement.dataset.wml_name);
532 // TODO: Handle nested variable substitution on 'value'
533 var conversion = varElement.dataset.wml_escape;
534 if (!isBlank(value) && !isBlank(conversion)) {
535 if (conversion == "e" || conversion == "E") {
536 value = encodeURIComponent(value);
537 } else if (conversion == "u" || conversion == "U") {
538 value = decodeURIComponent(value);
539 }
540 }
541 varElement.innerHTML = value;
542 }
543}
544
545function internal_executeRefreshTask(root)
546{
547 console.log("internal_executeRefreshTask");
548 var setvarElements = root.getElementsByClassName('wml_setvar');
549 for(var i=0, l=setvarElements.length; i<l; i++) {
550 var setvar = setvarElements[i];
551 WMLBrowser.setVar(setvar.dataset.wml_name, setvar.dataset.wml_value);
552 console.log("<setvar> " + setvar.dataset.wml_name + " = " + setvar.dataset.wml_value);
553 }
554 updateWMLVariables();
555}
556
557function executeRefreshTask(event, node)
558{
559 event.preventDefault();
560 internal_executeRefreshTask(node.parentNode);
561 return false;
562}
563
564// <prev>
565function internal_executePrevTask(node)
566{
567 console.log("internal_executePrevTask");
568 internal_executeRefreshTask(node.parentNode);
569 navigateBack();
570}
571
572function executePrevTask(event, node)
573{
574 event.preventDefault();
575 internal_executePrevTask(node);
576 return false;
577}
578// <option onpick="...">
579function internal_executeOnpickTask(option)
580{
581 var href = option.dataset.wml_onpick;
582 console.log("internal_executeOnpickTask href = " + href);
583 //internal_executeRefreshTask(option.parentNode);
584 //refreshVariablesInControlElements();
585 if (isURLHash(href)) {
586 navigateToCard(href);
587 return true;
588 }
589 navigateToURL(href);
590 return true;
591}
592
593//<go>
Tom Zakrajsekbb6f8942014-04-17 22:05:50 -0700594function addQueryStringKeyValuePairsToForm(form)
595{
596 var href = form.dataset.wml_href;
597 var query;
598
599 // Seperate the query string from the href
600 var queryFragments = href.split("?");
601 if (queryFragments.length === 2) {
602 query = queryFragments[1];
603 } else {
604 queryFragments.shift();
605 query = queryFragments.join("?");
606 }
607
608 // Parse the query string for key/value pairs. Add them to the form
609 // as hidden input elements.
610 // E.g., http://myserver/test.wml?p1=foo&p2=bar
611 // would add the following to the form:
612 // <input type="hidden" name="p1" value="foo">
613 // <input type="hidden" name="p2" value="bar">
614 query.replace(
615 new RegExp( "([^?=&]+)(?:=([^&]*))?", "g" ),
616 function(match, name, value) {
617 var param = document.createElement("input");
618 param.setAttribute("type","hidden")
619 param.setAttribute("name", name)
620 param.setAttribute("value",value)
621 form.appendChild(param)
622 }
623 );
624 return true;
625}
626
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800627function internal_executeGoTask(form)
628{
629 var href = form.dataset.wml_href;
630 console.log("internal_executeGoTask href = " + href);
631 internal_executeRefreshTask(form.parentNode);
632 refreshVariablesInControlElements();
633 if (isURLHash(href)) {
634 navigateToCard(href);
635 return true;
636 }
637 // Substitute variables in <postfield> 'value' attributes before form submission.
638 updateVariableInPostfields();
Tom Zakrajsekbb6f8942014-04-17 22:05:50 -0700639 addQueryStringKeyValuePairsToForm(form);
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800640 form.submit();
641 return false;
642}
643
644function executeGoTask(event, form)
645{
646 event.preventDefault();
647 internal_executeGoTask(form);
648 return false;
649}
650
651//<onevent>
652function executeTimerTask()
653{
654 console.log("executeTimerTask()");
655 activeScheduledTimer = null;
656 // Handle <card ontimer="..."> event first
657 var ontimer = currentActiveCard.dataset.wml_ontimer;
658 if (!isBlank(ontimer))
659 {
660 navigateToURL(ontimer);
661 return;
662 }
663 // Handle <onevent type="timer">... here
664 var tasks = currentActiveCard.getElementsByClassName('wml_onevent_ontimer');
665 if (tasks.length > 0) {
666 var onevent = tasks[0];
667 if (onevent.dataset.wml_task_type == 'wml_task_go')
668 return internal_executeGoTask(onevent);
669 else if (onevent.dataset.wml_task_type == 'wml_task_refresh')
670 return internal_executeRefreshTask(onevent);
671 else if (onevent.dataset.wml_task_type == 'wml_task_prev')
672 return internal_executePrevTask(onevent);
673 else if (onevent.dataset.wml_task_type == 'wml_task_noop')
674 return;
675 }
676 // Handle <template timer="..."> event at the end
677 var templates = currentActiveCard.getElementsByClassName('wml_template');
678 if (templates.length > 0) {
679 var ontimer = templates[0].dataset.wml_ontimer;
680 if (!isBlank(ontimer))
681 {
682 navigateToURL(ontimer);
683 return;
684 }
685 }
686}
687
688function executeOnenterforwardTask()
689{
690 console.log("executeOnenterforwardTask()");
691 // Handle <card onenterforward="..."> event first
692 var onef = currentActiveCard.dataset.wml_onenterforward;
693 if (!isBlank(onef))
694 {
695 navigateToURL(onef);
696 return;
697 }
698 // Handle <onevent type="onenterforward">... here
699 var tasks = currentActiveCard.getElementsByClassName('wml_onevent_onenterforward');
700 if (tasks.length > 0) {
701 var onevent = tasks[0];
702 if (onevent.dataset.wml_task_type == 'wml_task_go')
703 return internal_executeGoTask(onevent);
704 else if (onevent.dataset.wml_task_type == 'wml_task_refresh')
705 return internal_executeRefreshTask(onevent);
706 else if (onevent.dataset.wml_task_type == 'wml_task_prev')
707 return internal_executePrevTask(onevent);
708 else if (onevent.dataset.wml_task_type == 'wml_task_noop')
709 return;
710 }
711 // Handle <template onenterforward="..."> event at the end
712 var templates = currentActiveCard.getElementsByClassName('wml_template');
713 if (templates.length > 0) {
714 var onef = templates[0].dataset.wml_onenterforward;
715 if (!isBlank(onef))
716 {
717 navigateToURL(onef);
718 return;
719 }
720 }
721}
722
723function executeOnenterbackwardTask()
724{
725 console.log("executeOnenterbackwardTask()");
726 // Handle <card onenterforward="..."> event first
727 var oneb = currentActiveCard.dataset.wml_onenterbackward;
728 if (!isBlank(oneb))
729 {
730 navigateToURL(oneb);
731 return;
732 }
733 // Handle <onevent type="onenterbackward">... here
734 var tasks = currentActiveCard.getElementsByClassName('wml_onevent_onenterbackward');
735 if (tasks.length > 0) {
736 var onevent = tasks[0];
737 if (onevent.dataset.wml_task_type == 'wml_task_go')
738 return internal_executeGoTask(onevent);
739 else if (onevent.dataset.wml_task_type == 'wml_task_refresh')
740 return internal_executeRefreshTask(onevent);
741 else if (onevent.dataset.wml_task_type == 'wml_task_prev')
742 return internal_executePrevTask(onevent);
743 else if (onevent.dataset.wml_task_type == 'wml_task_noop')
744 return;
745 }
746 // Handle <template onenterbackward="..."> event at the end
747 var templates = currentActiveCard.getElementsByClassName('wml_template');
748 if (templates.length > 0) {
749 var oneb = templates[0].dataset.wml_onenterbackward;
750 if (!isBlank(oneb))
751 {
752 navigateToURL(oneb);
753 return;
754 }
755 }
756}
757
758