skylark-utils
Version:
An Elegant HTML5 JavaScript Library.
231 lines (204 loc) • 4.97 kB
JavaScript
define([
"./skylark",
"./langx",
"./datax",
"./dnd",
"./eventer",
"./filer",
"./finder",
"./fx",
"./geom",
"./mover",
"./noder",
"./styler"
], function(skylark, langx, datax, dnd, eventer, filer, finder, fx, geom, mover, noder, styler) {
var map = Array.prototype.map,
slice = Array.prototype.slice;
var VisualElement = langx.klass({
klassName: "VisualElement",
"init": function(node) {
if (langx.isString(node)) {
node = document.getElementById(node);
}
this.domNode = node;
}
});
var root = new VisualElement(document.body),
velm = function(node) {
if (node) {
return new VisualElement(node);
} else {
return root;
}
};
function _delegator(fn, context) {
return function() {
var self = this,
elem = self.domNode,
ret = fn.apply(context, [elem].concat(slice.call(arguments)));
if (ret) {
if (ret === context) {
return self;
} else {
if (ret instanceof HTMLElement) {
ret = new VisualElement(ret);
} else if (langx.isArrayLike(ret)) {
ret = map.call(ret, function(el) {
if (el instanceof HTMLElement) {
return new VisualElement(ret);
} else {
return el;
}
})
}
}
}
return ret;
};
}
langx.mixin(velm, {
batch: function(nodes, action, args) {
nodes.forEach(function(node) {
var elm = (node instanceof VisualElement) ? node : velm(node);
elm[action].apply(elm, args);
});
return this;
},
root: new VisualElement(document.body),
VisualElement: VisualElement,
delegate: function(names, context) {
var props = {};
names.forEach(function(name) {
props[name] = _delegator(context[name], context);
});
VisualElement.partial(props);
}
});
// from ./datax
velm.delegate([
"attr",
"data",
"prop",
"removeAttr",
"removeData",
"text",
"val"
], datax);
// from ./dnd
velm.delegate([
"draggable",
"droppable"
], dnd);
// from ./eventer
velm.delegate([
"off",
"on",
"one",
"shortcuts",
"trigger"
], eventer);
// from ./filer
velm.delegate([
"picker",
"dropzone"
], filer);
// from ./finder
velm.delegate([
"ancestor",
"ancestors",
"children",
"descendant",
"find",
"findAll",
"firstChild",
"lastChild",
"matches",
"nextSibling",
"nextSiblings",
"parent",
"previousSibling",
"previousSiblings",
"siblings"
], finder);
velm.find = function(selector) {
if (selector === "body") {
return this.root;
} else {
return this.root.descendant(selector);
}
};
// from ./fx
velm.delegate([
"animate",
"fadeIn",
"fadeOut",
"fadeTo",
"fadeToggle",
"hide",
"scrollToTop",
"show",
"toggle"
], fx);
// from ./geom
velm.delegate([
"borderExtents",
"boundingPosition",
"boundingRect",
"clientHeight",
"clientSize",
"clientWidth",
"contentRect",
"height",
"marginExtents",
"offsetParent",
"paddingExtents",
"pagePosition",
"pageRect",
"relativePosition",
"relativeRect",
"scrollIntoView",
"scrollLeft",
"scrollTop",
"size",
"width"
], geom);
// from ./mover
velm.delegate([
"movable"
], dnd);
// from ./noder
velm.delegate([
"after",
"append",
"before",
"clone",
"contains",
"contents",
"empty",
"html",
"isChildOf",
"ownerDoc",
"prepend",
"remove",
"replace",
"reverse",
"throb",
"traverse",
"wrapper",
"wrapperInner",
"unwrap"
], noder);
// from ./styler
velm.delegate([
"addClass",
"className",
"css",
"hasClass",
"hide",
"isInvisible",
"removeClass",
"show",
"toggleClass"
], styler);
return skylark.velm = velm;
});