diff --git a/backbone.js b/backbone.js
index 2a5ae147..b16d921d 100644
--- a/backbone.js
+++ b/backbone.js
@@ -588,10 +588,7 @@
if (options.comparator !== void 0) this.comparator = options.comparator;
this._reset();
this.initialize.apply(this, arguments);
- if (models) {
- if (options.parse) models = this.parse(models);
- this.reset(models, {silent: true, parse: options.parse});
- }
+ if (models) this.reset(models, _.extend({silent: true}, options));
};
// Define the Collection's inheritable methods.
@@ -619,7 +616,7 @@
// Add a model, or list of models to the set. Pass **silent** to avoid
// firing the `add` event for every new model.
add: function(models, options) {
- var i, args, length, model, existing;
+ var i, args, length, model, existing, sort;
var at = options && options.at;
models = _.isArray(models) ? models.slice() : [models];
@@ -639,6 +636,7 @@
if (existing || this._byCid[model.cid]) {
if (options && options.merge && existing) {
existing.set(model, options);
+ sort = true;
}
models.splice(i, 1);
continue;
@@ -651,14 +649,15 @@
if (model.id != null) this._byId[model.id] = model;
}
- // Update `length` and splice in new models.
+ // See if sorting is needed, update `length` and splice in new models.
+ if (models.length) sort = true;
this.length += models.length;
args = [at != null ? at : this.models.length, 0];
push.apply(args, models);
splice.apply(this.models, args);
// Sort the collection if appropriate.
- if (this.comparator && at == null) this.sort({silent: true});
+ if (sort && this.comparator && at == null) this.sort({silent: true});
if (options && options.silent) return this;
@@ -800,6 +799,7 @@
// you can reset the entire set with a new list of models, without firing
// any `add` or `remove` events. Fires `reset` when finished.
reset: function(models, options) {
+ if (options && options.parse) models = this.parse(models);
for (var i = 0, l = this.models.length; i < l; i++) {
this._removeReference(this.models[i]);
}
diff --git a/docs/images/jolicloud.jpg b/docs/images/jolicloud.jpg
new file mode 100644
index 00000000..6406f228
Binary files /dev/null and b/docs/images/jolicloud.jpg differ
diff --git a/docs/images/scrollkit.png b/docs/images/scrollkit.png
deleted file mode 100644
index 20aa06d4..00000000
Binary files a/docs/images/scrollkit.png and /dev/null differ
diff --git a/index.html b/index.html
index 058a23fb..d86d5dd4 100644
--- a/index.html
+++ b/index.html
@@ -470,6 +470,7 @@
– Easel
– Prose
– scroll kit
+ - Jolicloud
– Battlefield Play4Free
– Syllabus
– Salon.io
@@ -3217,21 +3218,24 @@ var model = localBackbone.Model.extend(...);
-
+ Jolicloud
- scroll kit is a new kind of website
- builder that makes designing a web page feel more like drawing.
- The workspace is a single-page web application built with Rails and Backbone.js.
- In scroll kit, every DOM element is associated with a Backbone model, so that
- style changes that are made to an element automatically update the model
- and propagate the change across all its views.
- Try it out .
+ Jolicloud is an open and independent
+ platform and operating system
+ that provides music playback, video streaming, photo browsing and
+ document editing — transforming low cost computers into beautiful cloud devices.
+ The new Jolicloud HTML5 app was built
+ from the ground up using Backbone and talks to the
+ Jolicloud Platform , which is
+ based on Node.js. Jolicloud works offline using the HTML5 AppCache, extends
+ Backbone.sync to store data in IndexedDB or localStorage, and communicates
+ with the Joli OS via WebSockets.
diff --git a/test/collection.js b/test/collection.js
index f4e55f1c..113086d1 100644
--- a/test/collection.js
+++ b/test/collection.js
@@ -715,6 +715,60 @@ $(document).ready(function() {
this.ajaxSettings.success([model]);
});
+ test("`sort` shouldn't always fire on `add`", 1, function() {
+ var c = new Backbone.Collection([{id: 1}, {id: 2}, {id: 3}], {
+ comparator: 'id'
+ });
+ c.sort = function(){ ok(true); };
+ c.add([]);
+ c.add({id: 1});
+ c.add([{id: 2}, {id: 3}]);
+ c.add({id: 4});
+ });
+
+ test("#1407 parse option on constructor parses collection and models", 2, function() {
+ var model = {
+ namespace : [{id: 1}, {id:2}]
+ };
+ var Collection = Backbone.Collection.extend({
+ model: Backbone.Model.extend({
+ parse: function(model) {
+ model.name = 'test';
+ return model;
+ }
+ }),
+ parse: function(model) {
+ return model.namespace;
+ }
+ });
+ var c = new Collection(model, {parse:true});
+
+ equal(c.length, 2);
+ equal(c.at(0).get('name'), 'test');
+ });
+
+ test("#1407 parse option on reset parses collection and models", 2, function() {
+ var model = {
+ namespace : [{id: 1}, {id:2}]
+ };
+ var Collection = Backbone.Collection.extend({
+ model: Backbone.Model.extend({
+ parse: function(model) {
+ model.name = 'test';
+ return model;
+ }
+ }),
+ parse: function(model) {
+ return model.namespace;
+ }
+ });
+ var c = new Collection();
+ c.reset(model, {parse:true});
+
+ equal(c.length, 2);
+ equal(c.at(0).get('name'), 'test');
+ });
+
test("update", 5, function() {
var m1 = new Backbone.Model;
var m2 = new Backbone.Model({id: 2});
diff --git a/test/index.html b/test/index.html
index f7a2ba1b..09a39753 100644
--- a/test/index.html
+++ b/test/index.html
@@ -19,17 +19,6 @@
-
diff --git a/test/test-ender.html b/test/test-ender.html
deleted file mode 100644
index 3a10b186..00000000
--- a/test/test-ender.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
- Backbone Test Suite
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test/vendor/ender-jeesh.js b/test/vendor/ender-jeesh.js
deleted file mode 100644
index 70084705..00000000
--- a/test/vendor/ender-jeesh.js
+++ /dev/null
@@ -1,1678 +0,0 @@
-/*!
- * =============================================================
- * Ender: open module JavaScript framework (https://ender.no.de)
- * Build: ender build jeesh
- * =============================================================
- */
-
-/*!
- * Ender-JS: open module JavaScript framework (client-lib)
- * copyright Dustin Diaz & Jacob Thornton 2011 (@ded @fat)
- * https://ender.no.de
- * License MIT
- */
-!function (context) {
-
- // a global object for node.js module compatiblity
- // ============================================
-
- context['global'] = context;
-
- // Implements simple module system
- // losely based on CommonJS Modules spec v1.1.1
- // ============================================
-
- var modules = {};
-
- function require (identifier) {
- var module = modules[identifier] || window[identifier];
- if (!module) throw new Error("Requested module '" + identifier + "' has not been defined.");
- return module;
- }
-
- function provide (name, what) {
- return modules[name] = what;
- }
-
- context['provide'] = provide;
- context['require'] = require;
-
- // Implements Ender's $ global access object
- // =========================================
-
- function aug(o, o2) {
- for (var k in o2) {
- k != 'noConflict' && k != '_VERSION' && (o[k] = o2[k]);
- }
- return o;
- }
-
- function boosh(s, r, els) {
- // string || node || nodelist || window
- if (ender._select && (typeof s == 'string' || s.nodeName || s.length && 'item' in s || s == window)) {
- els = ender._select(s, r);
- els.selector = s;
- } else {
- els = isFinite(s.length) ? s : [s];
- }
- return aug(els, boosh);
- }
-
- function ender(s, r) {
- return boosh(s, r);
- }
-
- aug(ender, {
- _VERSION: '0.2.5',
- ender: function (o, chain) {
- aug(chain ? boosh : ender, o);
- },
- fn: context.$ && context.$.fn || {} // for easy compat to jQuery plugins
- });
-
- aug(boosh, {
- forEach: function (fn, scope, i) {
- // opt out of native forEach so we can intentionally call our own scope
- // defaulting to the current item and be able to return self
- for (i = 0, l = this.length; i < l; ++i) {
- i in this && fn.call(scope || this[i], this[i], i, this);
- }
- // return self for chaining
- return this;
- },
- $: ender // handy reference to self
- });
-
- var old = context.$;
- ender.noConflict = function () {
- context.$ = old;
- return this;
- };
-
- (typeof module !== 'undefined') && module.exports && (module.exports = ender);
- // use subscript notation as extern for Closure compilation
- context['ender'] = context['$'] = context['ender'] || ender;
-
-}(this);
-
-!function () {
-
- var module = { exports: {} }, exports = module.exports;
-
- /*!
- * bean.js - copyright Jacob Thornton 2011
- * https://github.com/fat/bean
- * MIT License
- * special thanks to:
- * dean edwards: http://dean.edwards.name/
- * dperini: https://github.com/dperini/nwevents
- * the entire mootools team: github.com/mootools/mootools-core
- */
- !function (context) {
- var __uid = 1, registry = {}, collected = {},
- overOut = /over|out/,
- namespace = /[^\.]*(?=\..*)\.|.*/,
- stripName = /\..*/,
- addEvent = 'addEventListener',
- attachEvent = 'attachEvent',
- removeEvent = 'removeEventListener',
- detachEvent = 'detachEvent',
- doc = context.document || {},
- root = doc.documentElement || {},
- W3C_MODEL = root[addEvent],
- eventSupport = W3C_MODEL ? addEvent : attachEvent,
-
- isDescendant = function (parent, child) {
- var node = child.parentNode;
- while (node !== null) {
- if (node == parent) {
- return true;
- }
- node = node.parentNode;
- }
- },
-
- retrieveUid = function (obj, uid) {
- return (obj.__uid = uid || obj.__uid || __uid++);
- },
-
- retrieveEvents = function (element) {
- var uid = retrieveUid(element);
- return (registry[uid] = registry[uid] || {});
- },
-
- listener = W3C_MODEL ? function (element, type, fn, add) {
- element[add ? addEvent : removeEvent](type, fn, false);
- } : function (element, type, fn, add, custom) {
- custom && add && (element['_on' + custom] = element['_on' + custom] || 0);
- element[add ? attachEvent : detachEvent]('on' + type, fn);
- },
-
- nativeHandler = function (element, fn, args) {
- return function (event) {
- event = fixEvent(event || ((this.ownerDocument || this.document || this).parentWindow || context).event);
- return fn.apply(element, [event].concat(args));
- };
- },
-
- customHandler = function (element, fn, type, condition, args) {
- return function (e) {
- if (condition ? condition.apply(this, arguments) : W3C_MODEL ? true : e && e.propertyName == '_on' + type || !e) {
- fn.apply(element, Array.prototype.slice.call(arguments, e ? 0 : 1).concat(args));
- }
- };
- },
-
- addListener = function (element, orgType, fn, args) {
- var type = orgType.replace(stripName, ''),
- events = retrieveEvents(element),
- handlers = events[type] || (events[type] = {}),
- originalFn = fn,
- uid = retrieveUid(fn, orgType.replace(namespace, ''));
- if (handlers[uid]) {
- return element;
- }
- var custom = customEvents[type];
- if (custom) {
- fn = custom.condition ? customHandler(element, fn, type, custom.condition) : fn;
- type = custom.base || type;
- }
- var isNative = nativeEvents[type];
- fn = isNative ? nativeHandler(element, fn, args) : customHandler(element, fn, type, false, args);
- isNative = W3C_MODEL || isNative;
- if (type == 'unload') {
- var org = fn;
- fn = function () {
- removeListener(element, type, fn) && org();
- };
- }
- element[eventSupport] && listener(element, isNative ? type : 'propertychange', fn, true, !isNative && type);
- handlers[uid] = fn;
- fn.__uid = uid;
- fn.__originalFn = originalFn;
- return type == 'unload' ? element : (collected[retrieveUid(element)] = element);
- },
-
- removeListener = function (element, orgType, handler) {
- var uid, names, uids, i, events = retrieveEvents(element), type = orgType.replace(stripName, '');
- if (!events || !events[type]) {
- return element;
- }
- names = orgType.replace(namespace, '');
- uids = names ? names.split('.') : [handler.__uid];
-
- function destroyHandler(uid) {
- handler = events[type][uid];
- if (!handler) return;
- delete events[type][uid];
- if (element[eventSupport]) {
- type = customEvents[type] ? customEvents[type].base : type;
- var isNative = W3C_MODEL || nativeEvents[type];
- listener(element, isNative ? type : 'propertychange', handler, false, !isNative && type);
- }
- }
-
- destroyHandler(names) //get combos
- for (i = uids.length; i--; destroyHandler(uids[i])); //get singles
-
- return element;
- },
-
- del = function (selector, fn, $) {
- return function (e) {
- var array = typeof selector == 'string' ? $(selector, this) : selector;
- for (var target = e.target; target && target != this; target = target.parentNode) {
- for (var i = array.length; i--;) {
- if (array[i] == target) {
- return fn.apply(target, arguments);
- }
- }
- }
- };
- },
-
- add = function (element, events, fn, delfn, $) {
- if (typeof events == 'object' && !fn) {
- for (var type in events) {
- events.hasOwnProperty(type) && add(element, type, events[type]);
- }
- } else {
- var isDel = typeof fn == 'string', types = (isDel ? fn : events).split(' ');
- fn = isDel ? del(events, delfn, $) : fn;
- for (var i = types.length; i--;) {
- addListener(element, types[i], fn, Array.prototype.slice.call(arguments, isDel ? 4 : 3));
- }
- }
- return element;
- },
-
- remove = function (element, orgEvents, fn) {
- var k, type, events, i,
- isString = typeof(orgEvents) == 'string',
- names = isString && orgEvents.replace(namespace, ''),
- rm = removeListener,
- attached = retrieveEvents(element);
- if (isString && /\s/.test(orgEvents)) {
- orgEvents = orgEvents.split(' ');
- i = orgEvents.length - 1;
- while (remove(element, orgEvents[i]) && i--) {}
- return element;
- }
- events = isString ? orgEvents.replace(stripName, '') : orgEvents;
- if (!attached || (isString && !attached[events])) {
- if (attached && names) {
- for (k in attached) {
- if (attached.hasOwnProperty(k)) {
- for (i in attached[k]) {
- attached[k].hasOwnProperty(i) && new RegExp('^' + names + '(\\..*)?$').test(i) && rm(element, [k, i].join('.'));
- }
- }
- }
- }
- return element;
- }
- if (typeof fn == 'function') {
- rm(element, events, fn);
- } else if (names) {
- rm(element, orgEvents);
- } else {
- rm = events ? rm : remove;
- type = isString && events;
- events = events ? (fn || attached[events] || events) : attached;
- for (k in events) {
- if (events.hasOwnProperty(k)) {
- rm(element, type || k, events[k]);
- delete events[k]; // remove unused leaf keys
- }
- }
- }
- return element;
- },
-
- fire = function (element, type, args) {
- var evt, k, i, types = type.split(' ');
- for (i = types.length; i--;) {
- type = types[i].replace(stripName, '');
- var isNative = nativeEvents[type],
- isNamespace = types[i].replace(namespace, ''),
- handlers = retrieveEvents(element)[type];
- if (isNamespace) {
- isNamespace = isNamespace.split('.');
- for (k = isNamespace.length; k--;) {
- handlers && handlers[isNamespace[k]] && handlers[isNamespace[k]].apply(element, [false].concat(args));
- }
- } else if (!args && element[eventSupport]) {
- fireListener(isNative, type, element);
- } else {
- for (k in handlers) {
- handlers.hasOwnProperty(k) && handlers[k].apply(element, [false].concat(args));
- }
- }
- }
- return element;
- },
-
- fireListener = W3C_MODEL ? function (isNative, type, element) {
- evt = document.createEvent(isNative ? "HTMLEvents" : "UIEvents");
- evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, context, 1);
- element.dispatchEvent(evt);
- } : function (isNative, type, element) {
- isNative ? element.fireEvent('on' + type, document.createEventObject()) : element['_on' + type]++;
- },
-
- clone = function (element, from, type) {
- var events = retrieveEvents(from), obj, k;
- var uid = retrieveUid(element);
- obj = type ? events[type] : events;
- for (k in obj) {
- obj.hasOwnProperty(k) && (type ? add : clone)(element, type || from, type ? obj[k].__originalFn : k);
- }
- return element;
- },
-
- fixEvent = function (e) {
- var result = {};
- if (!e) {
- return result;
- }
- var type = e.type, target = e.target || e.srcElement;
- result.preventDefault = fixEvent.preventDefault(e);
- result.stopPropagation = fixEvent.stopPropagation(e);
- result.target = target && target.nodeType == 3 ? target.parentNode : target;
- if (~type.indexOf('key')) {
- result.keyCode = e.which || e.keyCode;
- } else if ((/click|mouse|menu/i).test(type)) {
- result.rightClick = e.which == 3 || e.button == 2;
- result.pos = { x: 0, y: 0 };
- if (e.pageX || e.pageY) {
- result.clientX = e.pageX;
- result.clientY = e.pageY;
- } else if (e.clientX || e.clientY) {
- result.clientX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
- result.clientY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
- }
- overOut.test(type) && (result.relatedTarget = e.relatedTarget || e[(type == 'mouseover' ? 'from' : 'to') + 'Element']);
- }
- for (var k in e) {
- if (!(k in result)) {
- result[k] = e[k];
- }
- }
- return result;
- };
-
- fixEvent.preventDefault = function (e) {
- return function () {
- if (e.preventDefault) {
- e.preventDefault();
- }
- else {
- e.returnValue = false;
- }
- };
- };
-
- fixEvent.stopPropagation = function (e) {
- return function () {
- if (e.stopPropagation) {
- e.stopPropagation();
- } else {
- e.cancelBubble = true;
- }
- };
- };
-
- var nativeEvents = { click: 1, dblclick: 1, mouseup: 1, mousedown: 1, contextmenu: 1, //mouse buttons
- mousewheel: 1, DOMMouseScroll: 1, //mouse wheel
- mouseover: 1, mouseout: 1, mousemove: 1, selectstart: 1, selectend: 1, //mouse movement
- keydown: 1, keypress: 1, keyup: 1, //keyboard
- orientationchange: 1, // mobile
- touchstart: 1, touchmove: 1, touchend: 1, touchcancel: 1, // touch
- gesturestart: 1, gesturechange: 1, gestureend: 1, // gesture
- focus: 1, blur: 1, change: 1, reset: 1, select: 1, submit: 1, //form elements
- load: 1, unload: 1, beforeunload: 1, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
- error: 1, abort: 1, scroll: 1 }; //misc
-
- function check(event) {
- var related = event.relatedTarget;
- if (!related) {
- return related === null;
- }
- return (related != this && related.prefix != 'xul' && !/document/.test(this.toString()) && !isDescendant(this, related));
- }
-
- var customEvents = {
- mouseenter: { base: 'mouseover', condition: check },
- mouseleave: { base: 'mouseout', condition: check },
- mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }
- };
-
- var bean = { add: add, remove: remove, clone: clone, fire: fire };
-
- var clean = function (el) {
- var uid = remove(el).__uid;
- if (uid) {
- delete collected[uid];
- delete registry[uid];
- }
- };
-
- if (context[attachEvent]) {
- add(context, 'unload', function () {
- for (var k in collected) {
- collected.hasOwnProperty(k) && clean(collected[k]);
- }
- context.CollectGarbage && CollectGarbage();
- });
- }
-
- var oldBean = context.bean;
- bean.noConflict = function () {
- context.bean = oldBean;
- return this;
- };
-
- (typeof module !== 'undefined' && module.exports) ?
- (module.exports = bean) :
- (context['bean'] = bean);
-
- }(this);
-
- provide("bean", module.exports);
-
- !function ($) {
- var b = require('bean'),
- integrate = function (method, type, method2) {
- var _args = type ? [type] : [];
- return function () {
- for (var args, i = 0, l = this.length; i < l; i++) {
- args = [this[i]].concat(_args, Array.prototype.slice.call(arguments, 0));
- args.length == 4 && args.push($);
- !arguments.length && method == 'add' && type && (method = 'fire');
- b[method].apply(this, args);
- }
- return this;
- };
- };
-
- var add = integrate('add'),
- remove = integrate('remove'),
- fire = integrate('fire');
-
- var methods = {
-
- on: add,
- addListener: add,
- bind: add,
- listen: add,
- delegate: add,
-
- unbind: remove,
- unlisten: remove,
- removeListener: remove,
- undelegate: remove,
-
- emit: fire,
- trigger: fire,
-
- cloneEvents: integrate('clone'),
-
- hover: function (enter, leave, i) { // i for internal
- for (i = this.length; i--;) {
- b.add.call(this, this[i], 'mouseenter', enter);
- b.add.call(this, this[i], 'mouseleave', leave);
- }
- return this;
- }
- };
-
- var i, shortcuts = [
- 'blur', 'change', 'click', 'dblclick', 'error', 'focus', 'focusin',
- 'focusout', 'keydown', 'keypress', 'keyup', 'load', 'mousedown',
- 'mouseenter', 'mouseleave', 'mouseout', 'mouseover', 'mouseup', 'mousemove',
- 'resize', 'scroll', 'select', 'submit', 'unload'
- ];
-
- for (i = shortcuts.length; i--;) {
- methods[shortcuts[i]] = integrate('add', shortcuts[i]);
- }
-
- $.ender(methods, true);
- }(ender);
-
-}();
-
-!function () {
-
- var module = { exports: {} }, exports = module.exports;
-
- /*!
- * bonzo.js - copyright @dedfat 2011
- * https://github.com/ded/bonzo
- * Follow our software http://twitter.com/dedfat
- * MIT License
- */
- !function (context, win) {
-
- var doc = context.document,
- html = doc.documentElement,
- parentNode = 'parentNode',
- query = null,
- specialAttributes = /^checked|value|selected$/,
- specialTags = /select|fieldset|table|tbody|tfoot|td|tr|colgroup/i,
- table = 'table',
- tagMap = { thead: table, tbody: table, tfoot: table, tr: 'tbody', th: 'tr', td: 'tr', fieldset: 'form', option: 'select' },
- stateAttributes = /^checked|selected$/,
- ie = /msie/i.test(navigator.userAgent),
- uidList = [],
- uuids = 0,
- digit = /^-?[\d\.]+$/,
- px = 'px',
- // commonly used methods
- setAttribute = 'setAttribute',
- getAttribute = 'getAttribute',
- trimReplace = /(^\s*|\s*$)/g,
- unitless = { lineHeight: 1, zoom: 1, zIndex: 1, opacity: 1 };
-
- function classReg(c) {
- return new RegExp("(^|\\s+)" + c + "(\\s+|$)");
- }
-
- function each(ar, fn, scope) {
- for (var i = 0, l = ar.length; i < l; i++) {
- fn.call(scope || ar[i], ar[i], i, ar);
- }
- return ar;
- }
-
- var trim = String.prototype.trim ?
- function (s) {
- return s.trim();
- } :
- function (s) {
- return s.replace(trimReplace, '');
- };
-
- function camelize(s) {
- return s.replace(/-(.)/g, function (m, m1) {
- return m1.toUpperCase();
- });
- }
-
- function is(node) {
- return node && node.nodeName && node.nodeType == 1;
- }
-
- function some(ar, fn, scope) {
- for (var i = 0, j = ar.length; i < j; ++i) {
- if (fn.call(scope, ar[i], i, ar)) {
- return true;
- }
- }
- return false;
- }
-
- var getStyle = doc.defaultView && doc.defaultView.getComputedStyle ?
- function (el, property) {
- var value = null;
- if (property == 'float') {
- property = 'cssFloat';
- }
- var computed = doc.defaultView.getComputedStyle(el, '');
- computed && (value = computed[camelize(property)]);
- return el.style[property] || value;
-
- } : (ie && html.currentStyle) ?
-
- function (el, property) {
- property = camelize(property);
- property = property == 'float' ? 'styleFloat' : property;
-
- if (property == 'opacity') {
- var val = 100;
- try {
- val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
- } catch (e1) {
- try {
- val = el.filters('alpha').opacity;
- } catch (e2) {}
- }
- return val / 100;
- }
- var value = el.currentStyle ? el.currentStyle[property] : null;
- return el.style[property] || value;
- } :
-
- function (el, property) {
- return el.style[camelize(property)];
- };
-
- function insert(target, host, fn) {
- var i = 0, self = host || this, r = [],
- nodes = query && typeof target == 'string' && target.charAt(0) != '<' ? function (n) {
- return (n = query(target)) && (n.selected = 1) && n;
- }() : target;
- each(normalize(nodes), function (t) {
- each(self, function (el) {
- var n = !el[parentNode] || (el[parentNode] && !el[parentNode][parentNode]) ?
- function () {
- var c = el.cloneNode(true);
- self.$ && self.cloneEvents && self.$(c).cloneEvents(el);
- return c;
- }() :
- el;
- fn(t, n);
- r[i] = n;
- i++;
- });
- }, this);
- each(r, function (e, i) {
- self[i] = e;
- });
- self.length = i;
- return self;
- }
-
- function xy(el, x, y) {
- var $el = bonzo(el),
- style = $el.css('position'),
- offset = $el.offset(),
- rel = 'relative',
- isRel = style == rel,
- delta = [parseInt($el.css('left'), 10), parseInt($el.css('top'), 10)];
-
- if (style == 'static') {
- $el.css('position', rel);
- style = rel;
- }
-
- isNaN(delta[0]) && (delta[0] = isRel ? 0 : el.offsetLeft);
- isNaN(delta[1]) && (delta[1] = isRel ? 0 : el.offsetTop);
-
- x !== null && (el.style.left = x - offset.left + delta[0] + px);
- y !== null && (el.style.top = y - offset.top + delta[1] + px);
-
- }
-
- function Bonzo(elements) {
- this.length = 0;
- if (elements) {
- elements = typeof elements !== 'string' &&
- !elements.nodeType &&
- typeof elements.length !== 'undefined' ?
- elements :
- [elements];
- this.length = elements.length;
- for (var i = 0; i < elements.length; i++) {
- this[i] = elements[i];
- }
- }
- }
-
- Bonzo.prototype = {
-
- get: function (index) {
- return this[index];
- },
-
- each: function (fn, scope) {
- return each(this, fn, scope);
- },
-
- map: function (fn, reject) {
- var m = [], n, i;
- for (i = 0; i < this.length; i++) {
- n = fn.call(this, this[i], i);
- reject ? (reject(n) && m.push(n)) : m.push(n);
- }
- return m;
- },
-
- first: function () {
- return bonzo(this[0]);
- },
-
- last: function () {
- return bonzo(this[this.length - 1]);
- },
-
- html: function (h, text) {
- var method = text ?
- html.textContent == null ?
- 'innerText' :
- 'textContent' :
- 'innerHTML', m;
- function append(el) {
- while (el.firstChild) {
- el.removeChild(el.firstChild);
- }
- each(normalize(h), function (node) {
- el.appendChild(node);
- });
- }
- return typeof h !== 'undefined' ?
- this.each(function (el) {
- (m = el.tagName.match(specialTags)) ?
- append(el, m[0]) :
- (el[method] = h);
- }) :
- this[0] ? this[0][method] : '';
- },
-
- text: function (text) {
- return this.html(text, 1);
- },
-
- addClass: function (c) {
- return this.each(function (el) {
- this.hasClass(el, c) || (el.className = trim(el.className + ' ' + c));
- }, this);
- },
-
- removeClass: function (c) {
- return this.each(function (el) {
- this.hasClass(el, c) && (el.className = trim(el.className.replace(classReg(c), ' ')));
- }, this);
- },
-
- hasClass: function (el, c) {
- return typeof c == 'undefined' ?
- some(this, function (i) {
- return classReg(el).test(i.className);
- }) :
- classReg(c).test(el.className);
- },
-
- toggleClass: function (c, condition) {
- if (typeof condition !== 'undefined' && !condition) {
- return this;
- }
- return this.each(function (el) {
- this.hasClass(el, c) ?
- (el.className = trim(el.className.replace(classReg(c), ' '))) :
- (el.className = trim(el.className + ' ' + c));
- }, this);
- },
-
- show: function (type) {
- return this.each(function (el) {
- el.style.display = type || '';
- });
- },
-
- hide: function (elements) {
- return this.each(function (el) {
- el.style.display = 'none';
- });
- },
-
- append: function (node) {
- return this.each(function (el) {
- each(normalize(node), function (i) {
- el.appendChild(i);
- });
- });
- },
-
- prepend: function (node) {
- return this.each(function (el) {
- var first = el.firstChild;
- each(normalize(node), function (i) {
- el.insertBefore(i, first);
- });
- });
- },
-
- appendTo: function (target, host) {
- return insert.call(this, target, host, function (t, el) {
- t.appendChild(el);
- });
- },
-
- prependTo: function (target, host) {
- return insert.call(this, target, host, function (t, el) {
- t.insertBefore(el, t.firstChild);
- });
- },
-
- next: function () {
- return this.related('nextSibling');
- },
-
- previous: function () {
- return this.related('previousSibling');
- },
-
- related: function (method) {
- return this.map(
- function (el) {
- el = el[method];
- while (el && el.nodeType !== 1) {
- el = el[method];
- }
- return el || 0;
- },
- function (el) {
- return el;
- }
- );
- },
-
- before: function (node) {
- return this.each(function (el) {
- each(bonzo.create(node), function (i) {
- el[parentNode].insertBefore(i, el);
- });
- });
- },
-
- after: function (node) {
- return this.each(function (el) {
- each(bonzo.create(node), function (i) {
- el[parentNode].insertBefore(i, el.nextSibling);
- });
- });
- },
-
- insertBefore: function (target, host) {
- return insert.call(this, target, host, function (t, el) {
- t[parentNode].insertBefore(el, t);
- });
- },
-
- insertAfter: function (target, host) {
- return insert.call(this, target, host, function (t, el) {
- var sibling = t.nextSibling;
- if (sibling) {
- t[parentNode].insertBefore(el, sibling);
- }
- else {
- t[parentNode].appendChild(el);
- }
- });
- },
-
- css: function (o, v, p) {
- // is this a request for just getting a style?
- if (v === undefined && typeof o == 'string') {
- // repurpose 'v'
- v = this[0];
- if (!v) {
- return null;
- }
- if (v == doc || v == win) {
- p = (v == doc) ? bonzo.doc() : bonzo.viewport();
- return o == 'width' ? p.width :
- o == 'height' ? p.height : '';
- }
- return getStyle(v, o);
- }
- var iter = o;
- if (typeof o == 'string') {
- iter = {};
- iter[o] = v;
- }
-
- if (ie && iter.opacity) {
- // oh this 'ol gamut
- iter.filter = 'alpha(opacity=' + (iter.opacity * 100) + ')';
- // give it layout
- iter.zoom = o.zoom || 1;
- delete iter.opacity;
- }
-
- if (v = iter['float']) {
- // float is a reserved style word. w3 uses cssFloat, ie uses styleFloat
- ie ? (iter.styleFloat = v) : (iter.cssFloat = v);
- delete iter['float'];
- }
-
- var fn = function (el, p, v) {
- for (var k in iter) {
- if (iter.hasOwnProperty(k)) {
- v = iter[k];
- // change "5" to "5px" - unless you're line-height, which is allowed
- (p = camelize(k)) && digit.test(v) && !(p in unitless) && (v += px);
- el.style[p] = v;
- }
- }
- };
- return this.each(fn);
- },
-
- offset: function (x, y) {
- if (typeof x == 'number' || typeof y == 'number') {
- return this.each(function (el) {
- xy(el, x, y);
- });
- }
- var el = this[0],
- width = el.offsetWidth,
- height = el.offsetHeight,
- top = el.offsetTop,
- left = el.offsetLeft;
- while (el = el.offsetParent) {
- top = top + el.offsetTop;
- left = left + el.offsetLeft;
- }
-
- return {
- top: top,
- left: left,
- height: height,
- width: width
- };
- },
-
- attr: function (k, v) {
- var el = this[0];
- if (typeof k != 'string' && !(k instanceof String)) {
- for (var n in k) {
- k.hasOwnProperty(n) && this.attr(n, k[n]);
- }
- return this;
- }
- return typeof v == 'undefined' ?
- specialAttributes.test(k) ?
- stateAttributes.test(k) && typeof el[k] == 'string' ?
- true : el[k] : el[getAttribute](k) :
- this.each(function (el) {
- k == 'value' ? (el.value = v) : el[setAttribute](k, v);
- });
- },
-
- val: function (s) {
- return (typeof s == 'string') ? this.attr('value', s) : this[0].value;
- },
-
- removeAttr: function (k) {
- return this.each(function (el) {
- el.removeAttribute(k);
- });
- },
-
- data: function (k, v) {
- var el = this[0];
- if (typeof v === 'undefined') {
- el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids);
- var uid = el[getAttribute]('data-node-uid');
- uidList[uid] || (uidList[uid] = {});
- return uidList[uid][k];
- } else {
- return this.each(function (el) {
- el[getAttribute]('data-node-uid') || el[setAttribute]('data-node-uid', ++uuids);
- var uid = el[getAttribute]('data-node-uid');
- var o = {};
- o[k] = v;
- uidList[uid] = o;
- });
- }
- },
-
- remove: function () {
- return this.each(function (el) {
- el[parentNode] && el[parentNode].removeChild(el);
- });
- },
-
- empty: function () {
- return this.each(function (el) {
- while (el.firstChild) {
- el.removeChild(el.firstChild);
- }
- });
- },
-
- detach: function () {
- return this.map(function (el) {
- return el[parentNode].removeChild(el);
- });
- },
-
- scrollTop: function (y) {
- return scroll.call(this, null, y, 'y');
- },
-
- scrollLeft: function (x) {
- return scroll.call(this, x, null, 'x');
- }
- };
-
- function normalize(node) {
- return typeof node == 'string' ? bonzo.create(node) : is(node) ? [node] : node; // assume [nodes]
- }
-
- function scroll(x, y, type) {
- var el = this[0];
- if (x == null && y == null) {
- return (isBody(el) ? getWindowScroll() : { x: el.scrollLeft, y: el.scrollTop })[type];
- }
- if (isBody(el)) {
- win.scrollTo(x, y);
- } else {
- x != null && (el.scrollLeft = x);
- y != null && (el.scrollTop = y);
- }
- return this;
- }
-
- function isBody(element) {
- return element === win || (/^(?:body|html)$/i).test(element.tagName);
- }
-
- function getWindowScroll() {
- return { x: win.pageXOffset || html.scrollLeft, y: win.pageYOffset || html.scrollTop };
- }
-
- function bonzo(els, host) {
- return new Bonzo(els, host);
- }
-
- bonzo.setQueryEngine = function (q) {
- query = q;
- delete bonzo.setQueryEngine;
- };
-
- bonzo.aug = function (o, target) {
- for (var k in o) {
- o.hasOwnProperty(k) && ((target || Bonzo.prototype)[k] = o[k]);
- }
- };
-
- bonzo.create = function (node) {
- return typeof node == 'string' ?
- function () {
- var tag = /^<([^\s>]+)/.exec(node);
- var el = doc.createElement(tag && tagMap[tag[1].toLowerCase()] || 'div'), els = [];
- el.innerHTML = node;
- var nodes = el.childNodes;
- el = el.firstChild;
- els.push(el);
- while (el = el.nextSibling) {
- (el.nodeType == 1) && els.push(el);
- }
- return els;
-
- }() : is(node) ? [node.cloneNode(true)] : [];
- };
-
- bonzo.doc = function () {
- var vp = this.viewport();
- return {
- width: Math.max(doc.body.scrollWidth, html.scrollWidth, vp.width),
- height: Math.max(doc.body.scrollHeight, html.scrollHeight, vp.height)
- };
- };
-
- bonzo.firstChild = function (el) {
- for (var c = el.childNodes, i = 0, j = (c && c.length) || 0, e; i < j; i++) {
- if (c[i].nodeType === 1) {
- e = c[j = i];
- }
- }
- return e;
- };
-
- bonzo.viewport = function () {
- return {
- width: ie ? html.clientWidth : self.innerWidth,
- height: ie ? html.clientHeight : self.innerHeight
- };
- };
-
- bonzo.isAncestor = 'compareDocumentPosition' in html ?
- function (container, element) {
- return (container.compareDocumentPosition(element) & 16) == 16;
- } : 'contains' in html ?
- function (container, element) {
- return container !== element && container.contains(element);
- } :
- function (container, element) {
- while (element = element[parentNode]) {
- if (element === container) {
- return true;
- }
- }
- return false;
- };
-
- var old = context.bonzo;
- bonzo.noConflict = function () {
- context.bonzo = old;
- return this;
- };
- context['bonzo'] = bonzo;
-
- }(this, window);
-
-
- provide("bonzo", module.exports);
-
- !function ($) {
-
- var b = bonzo;
- b.setQueryEngine($);
- $.ender(b);
- $.ender(b(), true);
- $.ender({
- create: function (node) {
- return $(b.create(node));
- }
- });
-
- $.id = function (id) {
- return $([document.getElementById(id)]);
- };
-
- function indexOf(ar, val) {
- for (var i = 0; i < ar.length; i++) {
- if (ar[i] === val) {
- return i;
- }
- }
- return -1;
- }
-
- function uniq(ar) {
- var a = [], i, j;
- label:
- for (i = 0; i < ar.length; i++) {
- for (j = 0; j < a.length; j++) {
- if (a[j] == ar[i]) {
- continue label;
- }
- }
- a[a.length] = ar[i];
- }
- return a;
- }
-
- $.ender({
- parents: function (selector, closest) {
- var collection = $(selector), j, k, p, r = [];
- for (j = 0, k = this.length; j < k; j++) {
- p = this[j];
- while (p = p.parentNode) {
- if (indexOf(collection, p) !== -1) {
- r.push(p);
- if (closest) break;
- }
- }
- }
- return $(uniq(r));
- },
-
- closest: function (selector) {
- return this.parents(selector, true);
- },
-
- first: function () {
- return $(this[0]);
- },
-
- last: function () {
- return $(this[this.length - 1]);
- },
-
- next: function () {
- return $(b(this).next());
- },
-
- previous: function () {
- return $(b(this).previous());
- },
-
- appendTo: function (t) {
- return b(this.selector).appendTo(t, this);
- },
-
- prependTo: function (t) {
- return b(this.selector).prependTo(t, this);
- },
-
- insertAfter: function (t) {
- return b(this.selector).insertAfter(t, this);
- },
-
- insertBefore: function (t) {
- return b(this.selector).insertBefore(t, this);
- },
-
- siblings: function () {
- var i, l, p, r = [];
- for (i = 0, l = this.length; i < l; i++) {
- p = this[i];
- while (p = p.previousSibling) {
- p.nodeType == 1 && r.push(p);
- }
- p = this[i];
- while (p = p.nextSibling) {
- p.nodeType == 1 && r.push(p);
- }
- }
- return $(r);
- },
-
- children: function () {
- var i, el, r = [];
- for (i = 0, l = this.length; i < l; i++) {
- if (!(el = b.firstChild(this[i]))) {
- continue;
- }
- r.push(el);
- while (el = el.nextSibling) {
- el.nodeType == 1 && r.push(el);
- }
- }
- return $(uniq(r));
- },
-
- height: function (v) {
- return dimension(v, this, 'height')
- },
-
- width: function (v) {
- return dimension(v, this, 'width')
- }
- }, true);
-
- function dimension(v, self, which) {
- return v ?
- self.css(which, v) :
- function (r) {
- r = parseInt(self.css(which), 10);
- return isNaN(r) ? self[0]['offset' + which.replace(/^\w/, function (m) {return m.toUpperCase()})] : r
- }()
- }
-
- }(ender || $);
-
-
-}();
-
-!function () {
-
- var module = { exports: {} }, exports = module.exports;
-
- !function (context, doc) {
- var fns = [], ol, fn, f = false,
- testEl = doc.documentElement,
- hack = testEl.doScroll,
- domContentLoaded = 'DOMContentLoaded',
- addEventListener = 'addEventListener',
- onreadystatechange = 'onreadystatechange',
- loaded = /^loade|c/.test(doc.readyState);
-
- function flush(i) {
- loaded = 1;
- while (i = fns.shift()) { i() }
- }
- doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () {
- doc.removeEventListener(domContentLoaded, fn, f);
- flush();
- }, f);
-
-
- hack && doc.attachEvent(onreadystatechange, (ol = function () {
- if (/^c/.test(doc.readyState)) {
- doc.detachEvent(onreadystatechange, ol);
- flush();
- }
- }));
-
- context['domReady'] = hack ?
- function (fn) {
- self != top ?
- loaded ? fn() : fns.push(fn) :
- function () {
- try {
- testEl.doScroll('left');
- } catch (e) {
- return setTimeout(function() { context['domReady'](fn) }, 50);
- }
- fn();
- }()
- } :
- function (fn) {
- loaded ? fn() : fns.push(fn);
- };
-
- }(this, document);
-
-
- provide("domready", module.exports);
-
- !function ($) {
- $.ender({domReady: domReady});
- $.ender({
- ready: function (f) {
- domReady(f);
- return this;
- }
- }, true);
- }(ender);
-
-}();
-
-!function () {
-
- var module = { exports: {} }, exports = module.exports;
-
- /*!
- * Qwery - A Blazing Fast query selector engine
- * https://github.com/ded/qwery
- * copyright Dustin Diaz & Jacob Thornton 2011
- * MIT License
- */
-
- !function (context, doc) {
-
- var c, i, j, k, l, m, o, p, r, v,
- el, node, len, found, classes, item, items, token,
- html = doc.documentElement,
- id = /#([\w\-]+)/,
- clas = /\.[\w\-]+/g,
- idOnly = /^#([\w\-]+$)/,
- classOnly = /^\.([\w\-]+)$/,
- tagOnly = /^([\w\-]+)$/,
- tagAndOrClass = /^([\w]+)?\.([\w\-]+)$/,
- normalizr = /\s*([\s\+\~>])\s*/g,
- splitters = /[\s\>\+\~]/,
- splittersMore = /(?![\s\w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^'"]*\])/,
- dividers = new RegExp('(' + splitters.source + ')' + splittersMore.source, 'g'),
- tokenizr = new RegExp(splitters.source + splittersMore.source),
- specialChars = /([.*+?\^=!:${}()|\[\]\/\\])/g,
- simple = /^([a-z0-9]+)?(?:([\.\#]+[\w\-\.#]+)?)/,
- attr = /\[([\w\-]+)(?:([\|\^\$\*\~]?\=)['"]?([ \w\-\/\?\&\=\:\.\(\)\!,@#%<>\{\}\$\*\^]+)["']?)?\]/,
- pseudo = /:([\w\-]+)(\(['"]?(\w+)['"]?\))?/,
- chunker = new RegExp(simple.source + '(' + attr.source + ')?' + '(' + pseudo.source + ')?'),
- walker = {
- ' ': function (node) {
- return node && node !== html && node.parentNode
- },
- '>': function (node, contestant) {
- return node && node.parentNode == contestant.parentNode && node.parentNode;
- },
- '~': function (node) {
- return node && node.previousSibling;
- },
- '+': function (node, contestant, p1, p2) {
- if (!node) {
- return false;
- }
- p1 = previous(node);
- p2 = previous(contestant);
- return p1 && p2 && p1 == p2 && p1;
- }
- };
- function cache() {
- this.c = {};
- }
- cache.prototype = {
- g: function (k) {
- return this.c[k] || undefined;
- },
- s: function (k, v) {
- this.c[k] = v;
- return v;
- }
- };
-
- var classCache = new cache(),
- cleanCache = new cache(),
- attrCache = new cache(),
- tokenCache = new cache();
-
- function array(ar) {
- r = [];
- for (i = 0, len = ar.length; i < len; i++) {
- r[i] = ar[i];
- }
- return r;
- }
-
- function previous(n) {
- while (n = n.previousSibling) {
- if (n.nodeType == 1) {
- break;
- }
- }
- return n
- }
-
- function q(query) {
- return query.match(chunker);
- }
-
- // this next method expect at most these args
- // given => div.hello[title="world"]:foo('bar')
-
- // div.hello[title="world"]:foo('bar'), div, .hello, [title="world"], title, =, world, :foo('bar'), foo, ('bar'), bar]
-
- function interpret(whole, tag, idsAndClasses, wholeAttribute, attribute, qualifier, value, wholePseudo, pseudo, wholePseudoVal, pseudoVal) {
- var m, c, k;
- if (tag && this.tagName.toLowerCase() !== tag) {
- return false;
- }
- if (idsAndClasses && (m = idsAndClasses.match(id)) && m[1] !== this.id) {
- return false;
- }
- if (idsAndClasses && (classes = idsAndClasses.match(clas))) {
- for (i = classes.length; i--;) {
- c = classes[i].slice(1);
- if (!(classCache.g(c) || classCache.s(c, new RegExp('(^|\\s+)' + c + '(\\s+|$)'))).test(this.className)) {
- return false;
- }
- }
- }
- if (pseudo && qwery.pseudos[pseudo] && !qwery.pseudos[pseudo](this, pseudoVal)) {
- return false;
- }
- if (wholeAttribute && !value) {
- o = this.attributes;
- for (k in o) {
- if (Object.prototype.hasOwnProperty.call(o, k) && (o[k].name || k) == attribute) {
- return this;
- }
- }
- }
- if (wholeAttribute && !checkAttr(qualifier, this.getAttribute(attribute) || '', value)) {
- return false;
- }
- return this;
- }
-
- function clean(s) {
- return cleanCache.g(s) || cleanCache.s(s, s.replace(specialChars, '\\$1'));
- }
-
- function checkAttr(qualify, actual, val) {
- switch (qualify) {
- case '=':
- return actual == val;
- case '^=':
- return actual.match(attrCache.g('^=' + val) || attrCache.s('^=' + val, new RegExp('^' + clean(val))));
- case '$=':
- return actual.match(attrCache.g('$=' + val) || attrCache.s('$=' + val, new RegExp(clean(val) + '$')));
- case '*=':
- return actual.match(attrCache.g(val) || attrCache.s(val, new RegExp(clean(val))));
- case '~=':
- return actual.match(attrCache.g('~=' + val) || attrCache.s('~=' + val, new RegExp('(?:^|\\s+)' + clean(val) + '(?:\\s+|$)')));
- case '|=':
- return actual.match(attrCache.g('|=' + val) || attrCache.s('|=' + val, new RegExp('^' + clean(val) + '(-|$)')));
- }
- return 0;
- }
-
- function _qwery(selector) {
- var r = [], ret = [], i, j = 0, k, l, m, p, token, tag, els, root, intr, item, children,
- tokens = tokenCache.g(selector) || tokenCache.s(selector, selector.split(tokenizr)),
- dividedTokens = selector.match(dividers), dividedToken;
- tokens = tokens.slice(0); // this makes a copy of the array so the cached original is not effected
- if (!tokens.length) {
- return r;
- }
-
- token = tokens.pop();
- root = tokens.length && (m = tokens[tokens.length - 1].match(idOnly)) ? doc.getElementById(m[1]) : doc;
- if (!root) {
- return r;
- }
- intr = q(token);
- els = dividedTokens && /^[+~]$/.test(dividedTokens[dividedTokens.length - 1]) ? function (r) {
- while (root = root.nextSibling) {
- root.nodeType == 1 && (intr[1] ? intr[1] == root.tagName.toLowerCase() : 1) && r.push(root)
- }
- return r
- }([]) :
- root.getElementsByTagName(intr[1] || '*');
- for (i = 0, l = els.length; i < l; i++) {
- if (item = interpret.apply(els[i], intr)) {
- r[j++] = item;
- }
- }
- if (!tokens.length) {
- return r;
- }
-
- // loop through all descendent tokens
- for (j = 0, l = r.length, k = 0; j < l; j++) {
- p = r[j];
- // loop through each token backwards crawling up tree
- for (i = tokens.length; i--;) {
- // loop through parent nodes
- while (p = walker[dividedTokens[i]](p, r[j])) {
- if (found = interpret.apply(p, q(tokens[i]))) {
- break;
- }
- }
- }
- found && (ret[k++] = r[j]);
- }
- return ret;
- }
-
- function boilerPlate(selector, _root, fn) {
- var root = (typeof _root == 'string') ? fn(_root)[0] : (_root || doc);
- if (selector === window || isNode(selector)) {
- return !_root || (selector !== window && isNode(root) && isAncestor(selector, root)) ? [selector] : [];
- }
- if (selector && typeof selector === 'object' && isFinite(selector.length)) {
- return array(selector);
- }
- if (m = selector.match(idOnly)) {
- return (el = doc.getElementById(m[1])) ? [el] : [];
- }
- if (m = selector.match(tagOnly)) {
- return array(root.getElementsByTagName(m[1]));
- }
- return false;
- }
-
- function isNode(el) {
- return (el && el.nodeType && (el.nodeType == 1 || el.nodeType == 9));
- }
-
- function uniq(ar) {
- var a = [], i, j;
- label:
- for (i = 0; i < ar.length; i++) {
- for (j = 0; j < a.length; j++) {
- if (a[j] == ar[i]) {
- continue label;
- }
- }
- a[a.length] = ar[i];
- }
- return a;
- }
-
- function qwery(selector, _root) {
- var root = (typeof _root == 'string') ? qwery(_root)[0] : (_root || doc);
- if (!root || !selector) {
- return [];
- }
- if (m = boilerPlate(selector, _root, qwery)) {
- return m;
- }
- return select(selector, root);
- }
-
- var isAncestor = 'compareDocumentPosition' in html ?
- function (element, container) {
- return (container.compareDocumentPosition(element) & 16) == 16;
- } : 'contains' in html ?
- function (element, container) {
- container = container == doc || container == window ? html : container;
- return container !== element && container.contains(element);
- } :
- function (element, container) {
- while (element = element.parentNode) {
- if (element === container) {
- return 1;
- }
- }
- return 0;
- },
-
- select = (doc.querySelector && doc.querySelectorAll) ?
- function (selector, root) {
- if (doc.getElementsByClassName && (m = selector.match(classOnly))) {
- return array((root).getElementsByClassName(m[1]));
- }
- return array((root).querySelectorAll(selector));
- } :
- function (selector, root) {
- selector = selector.replace(normalizr, '$1');
- var result = [], collection, collections = [], i;
- if (m = selector.match(tagAndOrClass)) {
- items = root.getElementsByTagName(m[1] || '*');
- r = classCache.g(m[2]) || classCache.s(m[2], new RegExp('(^|\\s+)' + m[2] + '(\\s+|$)'));
- for (i = 0, l = items.length, j = 0; i < l; i++) {
- r.test(items[i].className) && (result[j++] = items[i]);
- }
- return result;
- }
- for (i = 0, items = selector.split(','), l = items.length; i < l; i++) {
- collections[i] = _qwery(items[i]);
- }
- for (i = 0, l = collections.length; i < l && (collection = collections[i]); i++) {
- var ret = collection;
- if (root !== doc) {
- ret = [];
- for (j = 0, m = collection.length; j < m && (element = collection[j]); j++) {
- // make sure element is a descendent of root
- isAncestor(element, root) && ret.push(element);
- }
- }
- result = result.concat(ret);
- }
- return uniq(result);
- };
-
- qwery.uniq = uniq;
- qwery.pseudos = {};
-
- var oldQwery = context.qwery;
- qwery.noConflict = function () {
- context.qwery = oldQwery;
- return this;
- };
- context['qwery'] = qwery;
-
- }(this, document);
-
- provide("qwery", module.exports);
-
- !function (doc) {
- var q = qwery.noConflict();
- var table = 'table',
- nodeMap = {
- thead: table,
- tbody: table,
- tfoot: table,
- tr: 'tbody',
- th: 'tr',
- td: 'tr',
- fieldset: 'form',
- option: 'select'
- }
- function create(node, root) {
- var tag = /^<([^\s>]+)/.exec(node)[1]
- var el = (root || doc).createElement(nodeMap[tag] || 'div'), els = [];
- el.innerHTML = node;
- var nodes = el.childNodes;
- el = el.firstChild;
- els.push(el);
- while (el = el.nextSibling) {
- (el.nodeType == 1) && els.push(el);
- }
- return els;
- }
- $._select = function (s, r) {
- return /^\s*