blob: 2a5967eed014017b835ec9ed92c3b97605db510c [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{
Kulanthaivel Palanichamyf210f912015-04-16 18:01:56 -0700354 var pattern1 = /(\$\(([_a-z]{1}[_a-z0-9]*)([:]{1}((([e]{1})(scape)?)|(([n]{1})(oesc)?)|(([u]{1})(nesc)?)))?\))/gi;
355 var pattern2 = /(\$([_a-zA-z]{1}[_a-zA-Z0-9]*))/g;
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800356 var replacer = function () {
357 var name = arguments[2];
358 // TODO: Do the URL escaping here
359 console.log("substituteVariablesInPostfield() found variable : " + arguments[0]);
360 return WMLBrowser.getVar(name);
361 };
Kulanthaivel Palanichamyf210f912015-04-16 18:01:56 -0700362 if (pattern1.test(value)) {
363 return value.replace(pattern1, replacer);
364 } else if (pattern2.test(value)) {
365 return value.replace(pattern2, replacer);
366 }
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800367}
368
369function refreshVariableInSelectElement(select)
370{
371 var options = select.selectedOptions;
372 var value = "";
373 var ivalue = "";
374 var optionsCount = options.length;
375 if (optionsCount > 0) {
376 var op = options[0];
377 value = op.value;
378 ivalue = (op.index + 1);
379 for(var i=1; i<optionsCount; i++) {
380 op = options[i];
381 value += multiSelectSeparator + op.value;
382 ivalue += multiSelectSeparator + (op.index + 1);
383 }
384 }
385 var name = select.name;
386 if (!isBlank(name)) {
387 WMLBrowser.setVar(name, value);
388 console.log("refreshVariableInSelectElement name = " + name + ", value = " + value);
389 }
390 var iname = select.dataset.wml_iname;
391 if (!isBlank(iname)) {
392 if (isBlank(ivalue)) {
393 // An index of zero indicates that no option is selected.
394 ivalue = "0";
395 }
396 WMLBrowser.setVar(iname, ivalue);
397 console.log("refreshVariableInSelectElement iname = " + iname + ", ivalue = " + ivalue);
398 }
399}
400
401function refreshVariablesInControlElements()
402{
403 var inputElements = currentActiveCard.getElementsByClassName('wml_input');
404 for(var i=0, l=inputElements.length; i<l; i++) {
405 var input = inputElements[i];
406 WMLBrowser.setVar(input.name, input.value);
407 console.log("refreshVariablesInControlElements <input> name = " + input.name + ", value = " + input.value);
408 }
409
410 var selectElements = currentActiveCard.getElementsByClassName('wml_select');
411 for(var i=0, l=selectElements.length; i<l; i++) {
412 var select = selectElements[i];
413 refreshVariableInSelectElement(selectElements[i]);
414 }
415}
416
Kulanthaivel Palanichamy1cb7c132014-09-16 16:41:20 -0700417var validateInputValue = function(event) {
418 var input = event.target;
419 var pattern = new RegExp(input.dataset.wml_pattern, "g");
420 var value = input.value;
421 if (!pattern.test(value)) {
422 input.value = input.dataset.old_value;
423 } else {
424 input.dataset.old_value = input.value;
425 }
426}
427
428function parseFormatAttributeInInputtElements() {
429
430 var regex = /(^(([\*]{1})|([0-9]*))([NnXxAa]{1})$)/g;
431 var symbols = "\!\"\#\$\%\&\'\(\)\*\+\,\\.\/\:\;\<\=\>\?\@\\\^\_\`\{\|\}\~\\-\\\\[\\]";
432
433 var inputElements = document.getElementsByClassName('wml_input');
434 for(var i=0, l=inputElements.length; i<l; i++) {
435 var input = inputElements[i];
436 var format = input.dataset.wml_format;
437 var res = regex.test(format);
438 regex.lastIndex = 0;
439
440 if (res) {
441 var pattern = "";
442 var fl = format.length;
443 var count = format.slice(0, fl-1);
444 switch(format.charAt(fl-1)) {
445 case 'A':
446 // WML-1.3: Entry of any uppercase letter, symbol, or punctuation character. Numeric characters are excluded.
447 // RegEx: Everthing else except lowercase letters and nummeric characters.
448 pattern = "[^a-z^0-9]";
449 break;
450 case 'a':
451 // WML-1.3: Entry of any lowercase letter, symbol, or punctuation character. Numeric characters are excluded.
452 // RegEx: Everthing else except uppercase letters and nummeric characters.
453 pattern = "[^A-Z^0-9]";
454 break;
455 case 'N':
456 // WML-1.3: entry of any numeric character.
457 pattern = "[0-9]";
458 input.inputmode = "numeric";
459 break;
460 case 'n':
461 // WML-1.3: entry of any numeric, symbol, or punctuation character.
462 pattern = "[0-9" + symbols + "]";
463 break;
464 case 'X':
465 // WML-1.3: entry of any uppercase letter, numeric character, symbol, or punctuation character.
466 pattern = "[^a-z]";
467 input.inputmode = "verbatim";
468 break;
469 case 'x':
470 // WML-1.3: entry of any lowercase letter, numeric character, symbol, or punctuation character.
471 pattern = "[^A-Z]";
472 input.inputmode = "verbatim";
473 break;
474 }
475
476 if (count == "*") {
477 pattern = "^(" + pattern + "*)$";
478 } else {
479 input.maxLength = count;
480 input.pattern = ".{" + count + "}";
481 pattern = "^(" + pattern + "{0," + count + "})$";
482 }
483 input.dataset.wml_pattern = pattern;
484 input.setAttribute("required", "");
485 input.addEventListener("input", validateInputValue);
486 console.log("WML input format = " + format + ", equivalent pattern = " + pattern);
487 }
488 }
489}
490
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800491function updateVariableInPostfields(form)
492{
493 var postfields = currentActiveCard.getElementsByClassName('wml_postfield');
494 for(var i=0, l=postfields.length; i<l; i++) {
495 var input = postfields[i];
496 input.value = substituteVariablesInPostfield(input.value);
497 console.log("updateVariableInPostfields <postfield> name = " + input.name + ", value = " + input.value);
498 }
499}
500
501/////////////// Navigation ////////////////////
502function navigateToURL(url)
503{
504 console.log("navigateToURL: url = " + url);
505 cancelScheduledTimerTask();
506 currentNavigationType = 1;
507 window.location = url;
508}
509
510function navigateToCard(card)
511{
512 console.log("navigateToCard: card = " + card);
513 cancelScheduledTimerTask();
514 currentNavigationType = 1;
515 window.location.hash = card;
516}
517
518function navigateBack()
519{
520 console.log("navigateBack: currentState = ");
521 console.log(window.history.state);
522 cancelScheduledTimerTask();
523 currentNavigationType = -1;
524 window.history.back();
525}
526
527////////////// WML Tasks //////////////////////
528//<refresh>
529
530function updateWMLVariables()
531{
532 var wmlVariables = currentActiveCard.getElementsByClassName('wml_variable');
533 for(var i=0, l=wmlVariables.length; i<l; i++) {
534 var varElement = wmlVariables[i];
535 // Handle the variable escaping option here
536 var value = WMLBrowser.getVar(varElement.dataset.wml_name);
537 // TODO: Handle nested variable substitution on 'value'
538 var conversion = varElement.dataset.wml_escape;
539 if (!isBlank(value) && !isBlank(conversion)) {
540 if (conversion == "e" || conversion == "E") {
541 value = encodeURIComponent(value);
542 } else if (conversion == "u" || conversion == "U") {
543 value = decodeURIComponent(value);
544 }
545 }
546 varElement.innerHTML = value;
547 }
548}
549
550function internal_executeRefreshTask(root)
551{
552 console.log("internal_executeRefreshTask");
553 var setvarElements = root.getElementsByClassName('wml_setvar');
554 for(var i=0, l=setvarElements.length; i<l; i++) {
555 var setvar = setvarElements[i];
556 WMLBrowser.setVar(setvar.dataset.wml_name, setvar.dataset.wml_value);
557 console.log("<setvar> " + setvar.dataset.wml_name + " = " + setvar.dataset.wml_value);
558 }
559 updateWMLVariables();
560}
561
562function executeRefreshTask(event, node)
563{
564 event.preventDefault();
565 internal_executeRefreshTask(node.parentNode);
566 return false;
567}
568
569// <prev>
570function internal_executePrevTask(node)
571{
572 console.log("internal_executePrevTask");
573 internal_executeRefreshTask(node.parentNode);
574 navigateBack();
575}
576
577function executePrevTask(event, node)
578{
579 event.preventDefault();
580 internal_executePrevTask(node);
581 return false;
582}
583// <option onpick="...">
584function internal_executeOnpickTask(option)
585{
586 var href = option.dataset.wml_onpick;
587 console.log("internal_executeOnpickTask href = " + href);
588 //internal_executeRefreshTask(option.parentNode);
589 //refreshVariablesInControlElements();
590 if (isURLHash(href)) {
591 navigateToCard(href);
592 return true;
593 }
594 navigateToURL(href);
595 return true;
596}
597
598//<go>
Tom Zakrajsekbb6f8942014-04-17 22:05:50 -0700599function addQueryStringKeyValuePairsToForm(form)
600{
601 var href = form.dataset.wml_href;
602 var query;
603
604 // Seperate the query string from the href
605 var queryFragments = href.split("?");
606 if (queryFragments.length === 2) {
607 query = queryFragments[1];
608 } else {
609 queryFragments.shift();
610 query = queryFragments.join("?");
611 }
612
613 // Parse the query string for key/value pairs. Add them to the form
614 // as hidden input elements.
615 // E.g., http://myserver/test.wml?p1=foo&p2=bar
616 // would add the following to the form:
617 // <input type="hidden" name="p1" value="foo">
618 // <input type="hidden" name="p2" value="bar">
619 query.replace(
620 new RegExp( "([^?=&]+)(?:=([^&]*))?", "g" ),
621 function(match, name, value) {
622 var param = document.createElement("input");
623 param.setAttribute("type","hidden")
624 param.setAttribute("name", name)
625 param.setAttribute("value",value)
626 form.appendChild(param)
627 }
628 );
629 return true;
630}
631
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800632function internal_executeGoTask(form)
633{
634 var href = form.dataset.wml_href;
635 console.log("internal_executeGoTask href = " + href);
636 internal_executeRefreshTask(form.parentNode);
637 refreshVariablesInControlElements();
638 if (isURLHash(href)) {
639 navigateToCard(href);
640 return true;
641 }
642 // Substitute variables in <postfield> 'value' attributes before form submission.
643 updateVariableInPostfields();
Tom Zakrajsekbb6f8942014-04-17 22:05:50 -0700644 addQueryStringKeyValuePairsToForm(form);
Kulanthaivel Palanichamy8ccd6722014-02-19 15:48:02 -0800645 form.submit();
646 return false;
647}
648
649function executeGoTask(event, form)
650{
651 event.preventDefault();
652 internal_executeGoTask(form);
653 return false;
654}
655
656//<onevent>
657function executeTimerTask()
658{
659 console.log("executeTimerTask()");
660 activeScheduledTimer = null;
661 // Handle <card ontimer="..."> event first
662 var ontimer = currentActiveCard.dataset.wml_ontimer;
663 if (!isBlank(ontimer))
664 {
665 navigateToURL(ontimer);
666 return;
667 }
668 // Handle <onevent type="timer">... here
669 var tasks = currentActiveCard.getElementsByClassName('wml_onevent_ontimer');
670 if (tasks.length > 0) {
671 var onevent = tasks[0];
672 if (onevent.dataset.wml_task_type == 'wml_task_go')
673 return internal_executeGoTask(onevent);
674 else if (onevent.dataset.wml_task_type == 'wml_task_refresh')
675 return internal_executeRefreshTask(onevent);
676 else if (onevent.dataset.wml_task_type == 'wml_task_prev')
677 return internal_executePrevTask(onevent);
678 else if (onevent.dataset.wml_task_type == 'wml_task_noop')
679 return;
680 }
681 // Handle <template timer="..."> event at the end
682 var templates = currentActiveCard.getElementsByClassName('wml_template');
683 if (templates.length > 0) {
684 var ontimer = templates[0].dataset.wml_ontimer;
685 if (!isBlank(ontimer))
686 {
687 navigateToURL(ontimer);
688 return;
689 }
690 }
691}
692
693function executeOnenterforwardTask()
694{
695 console.log("executeOnenterforwardTask()");
696 // Handle <card onenterforward="..."> event first
697 var onef = currentActiveCard.dataset.wml_onenterforward;
698 if (!isBlank(onef))
699 {
700 navigateToURL(onef);
701 return;
702 }
703 // Handle <onevent type="onenterforward">... here
704 var tasks = currentActiveCard.getElementsByClassName('wml_onevent_onenterforward');
705 if (tasks.length > 0) {
706 var onevent = tasks[0];
707 if (onevent.dataset.wml_task_type == 'wml_task_go')
708 return internal_executeGoTask(onevent);
709 else if (onevent.dataset.wml_task_type == 'wml_task_refresh')
710 return internal_executeRefreshTask(onevent);
711 else if (onevent.dataset.wml_task_type == 'wml_task_prev')
712 return internal_executePrevTask(onevent);
713 else if (onevent.dataset.wml_task_type == 'wml_task_noop')
714 return;
715 }
716 // Handle <template onenterforward="..."> event at the end
717 var templates = currentActiveCard.getElementsByClassName('wml_template');
718 if (templates.length > 0) {
719 var onef = templates[0].dataset.wml_onenterforward;
720 if (!isBlank(onef))
721 {
722 navigateToURL(onef);
723 return;
724 }
725 }
726}
727
728function executeOnenterbackwardTask()
729{
730 console.log("executeOnenterbackwardTask()");
731 // Handle <card onenterforward="..."> event first
732 var oneb = currentActiveCard.dataset.wml_onenterbackward;
733 if (!isBlank(oneb))
734 {
735 navigateToURL(oneb);
736 return;
737 }
738 // Handle <onevent type="onenterbackward">... here
739 var tasks = currentActiveCard.getElementsByClassName('wml_onevent_onenterbackward');
740 if (tasks.length > 0) {
741 var onevent = tasks[0];
742 if (onevent.dataset.wml_task_type == 'wml_task_go')
743 return internal_executeGoTask(onevent);
744 else if (onevent.dataset.wml_task_type == 'wml_task_refresh')
745 return internal_executeRefreshTask(onevent);
746 else if (onevent.dataset.wml_task_type == 'wml_task_prev')
747 return internal_executePrevTask(onevent);
748 else if (onevent.dataset.wml_task_type == 'wml_task_noop')
749 return;
750 }
751 // Handle <template onenterbackward="..."> event at the end
752 var templates = currentActiveCard.getElementsByClassName('wml_template');
753 if (templates.length > 0) {
754 var oneb = templates[0].dataset.wml_onenterbackward;
755 if (!isBlank(oneb))
756 {
757 navigateToURL(oneb);
758 return;
759 }
760 }
761}
762
763