View.prototype.removeEventListener = function (arg, callback, thisArg) {
     if (types.isString(arg)) {
         var gesture = gestures.fromString(arg);
         if (gesture && !this._isEvent(arg)) {
             this._disconnectGestureObservers(gesture);
         }
         else {
             var events = arg.split(",");
             if (events.length > 0) {
                 for (var i = 0; i < events.length; i++) {
                     var evt = events[i].trim();
                     var gst = gestures.fromString(evt);
                     if (gst && !this._isEvent(arg)) {
                         this._disconnectGestureObservers(gst);
                     }
                     else {
                         _super.prototype.removeEventListener.call(this, evt, callback, thisArg);
                     }
                 }
             }
             else {
                 _super.prototype.removeEventListener.call(this, arg, callback, thisArg);
             }
         }
     }
     else if (types.isNumber(arg)) {
         this._disconnectGestureObservers(arg);
     }
 };
 View.prototype.addEventListener = function (arg, callback, thisArg) {
     if (types.isString(arg)) {
         arg = getEventOrGestureName(arg);
         var gesture = gestures.fromString(arg);
         if (gesture && !this._isEvent(arg)) {
             this.observe(gesture, callback, thisArg);
         }
         else {
             var events = arg.split(",");
             if (events.length > 0) {
                 for (var i = 0; i < events.length; i++) {
                     var evt = events[i].trim();
                     var gst = gestures.fromString(evt);
                     if (gst && !this._isEvent(arg)) {
                         this.observe(gst, callback, thisArg);
                     }
                     else {
                         _super.prototype.addEventListener.call(this, evt, callback, thisArg);
                     }
                 }
             }
             else {
                 _super.prototype.addEventListener.call(this, arg, callback, thisArg);
             }
         }
     }
     else if (types.isNumber(arg)) {
         this.observe(arg, callback, thisArg);
     }
 };
function isEventOrGesture(name, view) {
    if (types.isString(name)) {
        var eventOrGestureName = getEventOrGestureName(name);
        var evt = eventOrGestureName + "Event";
        return view.constructor && evt in view.constructor ||
            gestures.fromString(eventOrGestureName.toLowerCase()) !== undefined;
    }
    return false;
}
function getComponentModule(elementName, namespace, attributes, exports) {
    var instance;
    var instanceModule;
    var componentModule;
    var moduleId = MODULES[elementName] || UI_PATH + elementName.toLowerCase();
    try {
        instanceModule = require(types.isString(namespace) && fs.path.join(fs.knownFolders.currentApp().path, namespace) || moduleId);
        var instanceType = instanceModule[elementName] || Object;
        instance = new instanceType();
    }
    catch (ex) {
        throw new Error("Cannot create module " + moduleId + ". " + ex + ". StackTrace: " + ex.stack);
    }
    if (instance && instanceModule) {
        var bindings = new Array();
        for (var attr in attributes) {
            var attrValue = attributes[attr];
            if (isBinding(attrValue) && instance.bind) {
                if (isKnownEvent(attr, instanceModule)) {
                    attachEventBinding(instance, attr, attrValue);
                }
                else {
                    var bindOptions = bindingBuilder.getBindingOptions(attr, getBindingExpressionFromAttribute(attrValue));
                    instance.bind({
                        sourceProperty: bindOptions[bindingBuilder.bindingConstants.sourceProperty],
                        targetProperty: bindOptions[bindingBuilder.bindingConstants.targetProperty],
                        expression: bindOptions[bindingBuilder.bindingConstants.expression],
                        twoWay: bindOptions[bindingBuilder.bindingConstants.twoWay]
                    }, bindOptions[bindingBuilder.bindingConstants.source]);
                }
            }
            else if (isKnownEvent(attr, instanceModule)) {
                var handler = exports && exports[attrValue];
                if (types.isFunction(handler)) {
                    instance.on(attr, handler);
                }
            }
            else if (isGesture(attr, instance)) {
                var gestureHandler = exports && exports[attrValue];
                if (types.isFunction(gestureHandler)) {
                    instance.observe(gestures.fromString(attr.toLowerCase()), gestureHandler);
                }
            }
            else if (attr === ROW) {
                gridLayoutModule.GridLayout.setRow(instance, !isNaN(+attrValue) && +attrValue);
            }
            else if (attr === COL) {
                gridLayoutModule.GridLayout.setColumn(instance, !isNaN(+attrValue) && +attrValue);
            }
            else if (attr === COL_SPAN) {
                gridLayoutModule.GridLayout.setColumnSpan(instance, !isNaN(+attrValue) && +attrValue);
            }
            else if (attr === ROW_SPAN) {
                gridLayoutModule.GridLayout.setRowSpan(instance, !isNaN(+attrValue) && +attrValue);
            }
            else if (attr === LEFT) {
                absoluteLayoutDef.AbsoluteLayout.setLeft(instance, !isNaN(+attrValue) && +attrValue);
            }
            else if (attr === TOP) {
                absoluteLayoutDef.AbsoluteLayout.setTop(instance, !isNaN(+attrValue) && +attrValue);
            }
            else if (attr === DOCK) {
                dockLayoutDef.DockLayout.setDock(instance, attrValue);
            }
            else {
                var attrHandled = false;
                if (instance.applyXmlAttribute) {
                    attrHandled = instance.applyXmlAttribute(attr, attrValue);
                }
                if (!attrHandled) {
                    var valueAsNumber = +attrValue;
                    if (!isNaN(valueAsNumber)) {
                        instance[attr] = valueAsNumber;
                    }
                    else if (attrValue && (attrValue.toLowerCase() === "true" || attrValue.toLowerCase() === "false")) {
                        instance[attr] = attrValue.toLowerCase() === "true" ? true : false;
                    }
                    else {
                        instance[attr] = attrValue;
                    }
                }
            }
        }
        componentModule = { component: instance, exports: instanceModule, bindings: bindings };
    }
    return componentModule;
}
function isGesture(name, instance) {
    return gestures.fromString(name.toLowerCase()) !== undefined;
}