var connect = item.on(event, function (ev) {
ev.stopPropagation && ev.stopPropagation();
ev.cancelBubble = true;
ev._stopper && ev._stopper();
dojo.disconnect(connect);
})
item.trigger(event, args)
} else {
item.trigger(event, args)
}
} else {
if (typeof event === 'string') {
event = {
type: event
}
}
event.data = args
event.target = event.target || item;
can.dispatch.call(item, event)
}
}
can.delegate = function (selector, ev, cb) {
if (this.on || this.nodeType) {
dojoAddBinding(new dojo.NodeList(this), selector + ":" + ev, cb)
} else if (this.delegate) {
this.delegate(selector, ev, cb)
}
return this;
}
can.undelegate = function (selector, ev, cb) {
if (this.on || this.nodeType) {
dojoRemoveBinding(new dojo.NodeList(this), selector + ":" + ev, cb);
} else if (this.undelegate) {
this.undelegate(selector, ev, cb)
}
return this;
}
var optionsMap = {
type: "method",
success: undefined,
error: undefined
}
var updateDeferred = function (xhr, d) {
for (var prop in xhr) {
if (typeof d[prop] == 'function') {
d[prop] = function () {
xhr[prop].apply(xhr, arguments)
}
} else {
d[prop] = prop[xhr]
}
}
}
can.ajax = function (options) {
var type = can.capitalize((options.type || "get").toLowerCase()),
method = dojo["xhr" + type];
var success = options.success,
error = options.error,
d = new can.Deferred();
var def = method({
url: options.url,
handleAs: options.dataType,
sync: !options.async,
headers: options.headers,
content: options.data
})
def.then(function (data, ioargs) {
updateDeferred(xhr, d);
d.resolve(data, "success", xhr);
success && success(data, "success", xhr);
}, function (data, ioargs) {
updateDeferred(xhr, d);
d.reject(xhr, "error");
error(xhr, "error");
})
var xhr = def.ioArgs.xhr;
updateDeferred(xhr, d);
return d;
}