'use strict'; var warp10Finalize = require('warp10/finalize'); var eventDelegation = require('./event-delegation'); var win = window; var defaultDocument = document; var events = require('../runtime/events'); var widgetLookup = require('./lookup').widgets; var WidgetDef = require('./WidgetDef'); var registry; // We initialize this later to avoid issues with circular dependencies function invokeWidgetEventHandler(widget, targetMethodName, args) { var method = widget[targetMethodName]; if (!method) { throw Error('Method not found: ' + targetMethodName); } method.apply(widget, args); } function addEventListenerHelper(el, eventType, listener) { el.addEventListener(eventType, listener, false); return function remove() { el.removeEventListener(eventType, listener); }; } function addDOMEventListeners(widget, el, eventType, targetMethodName, extraArgs, handles) { var handle = addEventListenerHelper(el, eventType, function(event) { var args = [event, el]; if (extraArgs) { args = extraArgs.concat(args); } invokeWidgetEventHandler(widget, targetMethodName, args); }); handles.push(handle); } function getNestedEl(widget, nestedId, document) { if (nestedId == null) { return null; } if (nestedId === '') { return widget.getEl(); } if (typeof nestedId === 'string') { if (nestedId.charAt(0) === '#') { return document.getElementById(nestedId.substring(1)); } } return widget.getEl(nestedId); } function initWidget(widgetDef, doc) { var type = widgetDef.$__type; var id = widgetDef.id; var config = widgetDef.$__config; var state = widgetDef.$__state; var scope = widgetDef.$__scope; var domEvents = widgetDef.$__domEvents; var customEvents = widgetDef.$__customEvents; var bodyElId = widgetDef.$__bodyElId; var existingWidget = widgetDef.$__existingWidget; var el; var i; var len; var eventType; var targetMethodName; var widget; var extraArgs; if (!existingWidget) { existingWidget = widgetLookup[id]; } if (existingWidget && existingWidget.$__type !== type) { existingWidget = null; } if (existingWidget) { existingWidget._reset(true /* shouldRemoveDOMEventListeners */); widget = existingWidget; } else { widget = registry.createWidget(type, id, doc); } var els; var rootIds = widgetDef.$__roots; var rootWidgets; if (rootIds) { els = []; for (i=0, len=rootIds.length; i} widgetDefs An array of WidgetDef instances */ function initClientRendered(widgetDefs, doc) { // Ensure that event handlers to handle delegating events are // always attached before initializing any widgets eventDelegation.$__init(); doc = doc || defaultDocument; for (var i=0,len=widgetDefs.length; i