Files
node/first-project/node_modules/derby/lib/eventBinding.js
2012-05-30 23:00:06 -04:00

110 lines
3.2 KiB
JavaScript

var util = require('racer').util
, lookup = require('racer/lib/path').lookup
, merge = util.merge
, viewPath = require('./viewPath')
, ctxPath = viewPath.ctxPath
, pathFnArgs = viewPath.pathFnArgs
, setBoundFn = viewPath.setBoundFn;
exports.splitEvents = splitEvents;
exports.containsEvent = containsEvent;
exports.addDomEvent = util.isServer ? empty : addDomEvent;
function splitEvents(eventNames) {
var pairs = eventNames.replace(/\s/g, '').split(',')
, eventList = []
, pair, segments, name, eventName, delay, fn;
for (var i = pairs.length; i--;) {
pair = pairs[i];
segments = pair.split(':');
name = segments[0].split('/');
eventName = name[0];
delay = name[1];
fn = segments[1] || '';
eventList.push([eventName, delay, fn]);
}
return eventList;
}
function containsEvent(eventNames, expected) {
var eventList = splitEvents(eventNames)
, eventName;
for (var i = eventList.length; i--;) {
eventName = eventList[i][0];
if (eventName === expected) return true;
}
return false;
}
function addDomEvent(events, attrs, eventNames, name, options) {
var eventList = splitEvents(eventNames)
, args;
if (name) {
if (~name.indexOf('(')) {
args = pathFnArgs(name);
if (!args.length) return;
events.push(function(ctx, modelEvents, dom, pathMap, view) {
var id = attrs._id || attrs.id
, paths = []
, arg, path, pathId, event, eventName, eventOptions, i, j;
options.setValue = function(model, value) {
return setBoundFn(view, ctx, model, name, value);
}
for (i = args.length; i--;) {
arg = args[i];
path = ctxPath(ctx, arg);
paths.push(path);
pathId = pathMap.id(path);
for (j = eventList.length; j--;) {
event = eventList[j];
eventName = event[0];
eventOptions = merge({pathId: pathId, delay: event[1]}, options);
dom.bind(eventName, id, eventOptions);
}
}
});
return;
}
events.push(function(ctx, modelEvents, dom, pathMap) {
var id = attrs._id || attrs.id
, pathId = pathMap.id(ctxPath(ctx, name))
, event, eventName, eventOptions, i;
for (i = eventList.length; i--;) {
event = eventList[i];
eventName = event[0];
eventOptions = merge({pathId: pathId, delay: event[1]}, options);
dom.bind(eventName, id, eventOptions);
}
});
return;
}
events.push(function(ctx, modelEvents, dom, pathMap, view) {
var id = attrs._id || attrs.id
, fnCtx = ctx.$fnCtx || view._appExports
, event, eventName, eventOptions, i, fnName;
for (i = eventList.length; i--;) {
event = eventList[i];
eventName = event[0];
eventOptions = fnListener(dom, fnCtx, event[1], event[2]);
merge(eventOptions, options);
dom.bind(eventName, id, eventOptions);
}
});
}
function fnListener(dom, fnCtx, delay, fnName) {
var listener = {
delay: delay
, fn: function() {
listener.fn = dom.fns[fnName] || fnCtx[fnName] || lookup(fnName, fnCtx);
listener.fn.apply(null, arguments);
}
};
return listener;
}
function empty() {}